불변 밸류와 불변 엔티티

today 2017-06-04 face Posted by appkr turned_in Learn & Think forum 0

상수는 변하지 않는 값, 변수는 변하는 값이라고 배웠습니다. 객체에서도 마치 상수처럼 한 번 생성된 이후에 상태를 변경할 수 없는 객체를 불변(Immutable) 객체라고 합니다.

1. 불변성에 대한 개념 익히기

아래 예제를 살펴 볼까요?

<?php

$a = 1;
$b = $a;
$b = 3;
var_dump($a);

위 코드의 실행 결과는 int(1)입니다. 변수 $b에 변수 $a의 값을 할당한 후, $b에 새로운 값 3을 할당했습니다. 당연히 $b에는 3이 담겨 있고, $a에는 1이 담겨 있을 겁니다. 아주 쉽죠?

그런데, 객체 컨텍스트에서도 이 규칙이 그대로 적용될까요? 클래스는 변수와 함수로 구성된 템플릿이며, 객체란 그 템플릿에 필요한 값을 채워서 완성한 실체입니다. 여튼 위의 예제와 똑같이 동작해야 하지않을까요?

<?php

$a = new stdClass;
$a->name = 'Foo';
$b = $a;
$b->name = 'Bar';
var_dump($b);
// class stdClass#696 (1) {
//   public $name =>
//   string(3) "Bar"
// }
var_dump($a);
// class stdClass#696 (1) {
//   public $name =>
//   string(3) "Bar"
// }

변수 $b$a에 담긴 객체를 그대로 할당한 후, $b$name 속성을 변경했습니다. $b::name 속성 값만 "Bar"로 바뀔 것이라 생각했지만, $a::name 속성 값도 "Bar"로 변경되어버렸습니다. var_dump()로 출력된 결과물에 객체 번호를 보면 힌트를 얻을 수 있습니다. $a$b 모두 #696으로 같습니다. 즉, 객체 $b는 객체 $a의 메모리 번지를 그냥 참조하고 있다고 볼 수 있습니다.

해결법은 의외로 간단합니다. 복제하는거죠. clone 키워드와 객체 번호가 #696, #697로 서로 다름을 확인해주세요.

<?php

$a = new stdClass;
$a->name = 'Foo';
$b = clone $a;
$b->name = 'Bar';
var_dump($b);
// class stdClass#697 (1) {
//   public $name =>
//   string(3) "Bar"
// }
var_dump($a);
// class stdClass#696 (1) {
//   public $name =>
//   string(3) "Foo"
// }

DDD Memo

today 2017-05-02 face Posted by appkr turned_in Learn & Think forum 0

http://www.yes24.com/24/Goods/27750871

1. 도메인 모델 시작

p7. 아키텍쳐 구성

  • 사용자 인터페이스 또는 표현 (UI, Presentation)
  • 응용 (Application)
  • 도메인 (Domain)
  • 인프라스트럭처 (Infrastructure)

p11. 도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것이다.

p17. 엔티티와 밸류

  • 엔티티의 가장 큰 특징은 식별자를 갖는다는 점.
  • 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용한다 (예: “받는 사람”이란 밸류는 이름과 전화번호 속성으로 구성됨).
  • 밸류 객체의 데이터를 변경할 때는 기존 데이터를 변경하기보다는 변경한 데이터를 갖는 새로운 밸류 객체를 생성한다(Immutable).
  • 엔티티 타입의 두 객체가 같은지 비교할 때 주로 식별자를 사용한다면, 두 밸류 객체가 같은지 비교할 때는 모든 속성이 같은지 비교해야 한다.

p32. 도메인 객체가 불완전한 상태로 사용되는 것을 막으려면 생성 시점에 필요한 것을 전달해 주어야 한다. 즉, 생성자를 통해 필요한 데이터를 모두 받아야 한다.

AWS ECS/ECR을 이용한 서비스 배포

today 2017-02-12 face Posted by appkr turned_in Work & Play forum 0

AWS ECS(EC2 Container Service)는 갓마존이 제공하는 도커 기반 서비스 인프라입니다. EC2 인스턴스 위에 도커 엔진을 올려 놓은 것이라 생각하면 쉽습니다. AWS ECR(Container Registry)은 빌드한 도커 이미지를 올리고 내릴 수 있는 사설 도커 허브라 생각할 수 있습니다.

아래는 ECS 랜딩 페이지에 걸린 공식 유튜브 동영상입니다(그림을 클릭하여 재생).

Introduction to Amazon EC2 Container Service (ECS) - Docker Management on AWS

AWS에서 어떤 협찬도 받지 않았지만, 필자가 느낀 ECS의 장점은 다음과 같습니다(협찬 좀…).

  1. 이미 익숙한 AWS Console 및 서비스를 그대로 이용할 수 있다.
  2. Service Discovery나 Container Orchestration등을 위해 쿠버네티스(Kubernetes)와 같이 어려운 도구를 다룰 필요가 없다.

그런데 아직 서울 지역는 오픈되지 않았습니다. 빨리 좀 오픈해 주세요~ 갓마존.

이 포스트에서는 ECS에 라라벨 서비스를 배포하는 방법을 다룹니다. 사실 다른 플랫폼이나 프레임워크라고 해도 Dockerfile 레시피만 달라질 뿐 ECS를 사용하는 방법 자체에는 큰 차이가 없습니다.

데이터베이스 쿼리 성능 차이를 이해하기 위한 실험

today 2017-02-11 face Posted by appkr turned_in Work & Play forum 0

많은 양의 데이터를 체계적으로 저장하기 위해 데이터베이스를 사용합니다. 필요할 때마다 빠르게 꺼내 보거나, 수정하고, 불필요해지면 삭제하기도 합니다. 이처럼 데이터베이스는 수 많은 레코드셋에서 원하는 레코드만 빠르게 추출해 낼 수 있는데, 내부에서 어떻게 작동하는 지는 완전 블랙박스죠?

가령 ‘인덱스를 걸면 빠르다’, ‘조인은 느리다’처럼 일반적으로 알려진 상식이 있고, 이런 상식에 따라 모델링을 하면 대체적으로 잘 돌아가지만…

최근 회사에서 관련된 일도 있었고 해서, 스물스물 호기심이 발동하기 시작했습니다.

MySQL은 소스코드가 깃허브에 완전 공개되어있어 블랙박스라 할 수는 없지만, 죽을 때까지 코드를 까볼 생각은 없습니다. 대신 간단한 배열을 이용해서 데이터베이스를 흉내내고, 기본 키(Primary Key), 문자열 컬럼에 대한 풀 스캔, 바이너리 스캔, 인덱스, 조인 등에서 성능 차이가 발생하는 이유를 추측해보기로 했습니다.

이 실험을 위한 소스코드는 이곳에서 다운로드 받을 수 있습니다.

keyboard_arrow_up