적당히 잘
(객체 모델
, 상태 다이어그램
등 여러 표현 기법이 있지만, 각 도메인에 맞게 절절한 표현 방식을 취사선택하면 된다.상품
은 상품의 정보를 담고 있는 객체이고, 배송 도메인의 상품
은 현재 고객에게 배송되는 객체를 의미하는 것과 같이, 같은 용어여도 도메인 별로 다른 의미를 가지고 있는 경우가 있다.
일반적인 어플리케이션의 아키텍쳐는 위의 그림과 같다.
계층 | 설명 |
---|---|
표현 UI(Presentation) | 외부의 요청을 처리하고, 정보를 노출시킨다. |
응용 Application | 요청한 기능을 실행하며, 도메인 계층을 조합하여 기능을 실행한다. |
도메인 Domain | 시스템이 제공할 도메인 규칙을 구현한다. |
인프라스트럭쳐 Infrastruture | 데이터베이스나 외부 메세징 시스템과의 연동을 처리한다. |
도메인 모델 패턴은 아키텍쳐 상의 도메인 계층을 객체지향 기법으로 구현하는 패턴을 의미한다.
즉, 도메인의 데이터를 변경하는 기능이나, 도메인이 요구하는 기능은 해당 도메인 영역 내에서 구현되어야 한다는 것을 의미한다.
요구사항과 관련자와의 대화, 합의
를 통해 도메인을 이해해야하며, 개념적으로 도메인 모델의 초안이 완성되어야 개발을 할 수 있다.요구사항
을 탐색하는 과정으로 부터 시작한다.getter
, setter
를 선언할 수 있다.getter
, setter
를 정의할 수 있다.엔티티
와 밸류
로 구분할 수 있다.JAVA
에서 클래스의 equals()
, hashCode()
메서드를 구현할 수 있다.UUID
혹은 Nano ID
와 같은 고유 식별자 생성기를 사용UUID
생성기 혹은 Nano ID
를 사용한다.시퀀스
, DB의 자동 증가 컬럼)auto-increment
기능을 사용하여 식별자를 생성한다.밸류 타입는 개념적으로 완전한 하나를 표현할 때 사용한다.
받는 사람의 이름
, 받는 사람의 전화번호
와 같이 받는 사람
으로 표현된 도메인 개념이 가지고 있는 정보들이 있을 것이다.Receiver
타입으로 묶어 도메인 개념을 표현한다면, 이러한 산재될 수 있는 데이터를 개념적으로 완전한 하나로 표현할 수 있다(아하! 굳).밸류 타입은 내부의 필수적으로 여러 개의 데이터를 가지고 있어야하는 것이 아니다. 의미를 명확하게 표현하기 위해서 하나의 데이터를 밸류 타입으로 사용하는 경우도 있다.
Interger money
라고 되어 있는 데이터를 Money money
로 표현한다면, 의미가 더욱 명확하고, 직관적으로 다가올 것이다.TS
로 개발할 때는 매우 많이 사용했던 것 같은데, 지금 회사에서는 많이 사용하고 있는 편은 아닌 것 같다. 취향차이인가 싶기도 하고,,,또한, 밸류 타입의 객체의 내부 데이터를 변경할 때에는기존의 데이터를 변경하기보단, 변경한 데이터를 가지는 새로운 밸류 타입 객체를 생성하는 방식이 선호된다.
불변(Immutable)
의 성격을 띄어야한다.참조 투명성
부터 안전한 코드, thread-safe
한 코드를 작성하기 위해,setter
를 선언하지 말고, 생성자를 통해서만 필드 주입이 가능하도록 해야한다.엔티티 식별자는 대부분 숫자(
Long
,Integer
), 혹은 문자열(String
)이다. 하지만, 보통의 숫자, 문자열과는 다르게 특별한 의미를 지니는 경우가 많기 때문에, 식별자를 위한 밸류 타입을 사용해주면 식별자의 의미가 더욱 잘 드러나게 할 수 있다. 이를 통해 필드 이름 만으로는 해당 필드가 어떤 필드인지 모호했던 문제가 해결될 가능성이 높다.
setter
를 습관처럼 추가하는 것은 바람직하지 못하다.setter
를 객체에 추가한다.setter
는 도메인의 핵심 개념이나 의도를 코드에서 알아보기 어렵게 한다.setter
는 어떤 객체의 상태를 “설정한다.
”라는 의미가 강하지 “변경한다
”라는 의미는 약하기 때문이다.setter
는 도메인 객체를 생성할 때, 온전하지 않은 상태가 될 수 있다는 점이다.setter
를 호출하여 필요한 값을 설정해주어야한다.private setter
를 통해 진행하면 된다.
DTO
의getter/setter
DTO(Data Transfer Object)
는 표현계층과 도메인계층이 서로 데이터를 주고 받을 때 사용하는 구조체다.- 예전에는
private
필드를 변경해야하는 경우가 있어서getter
,setter
가 필요했다.- 요즘 개발되는 프레임워크에서는 직접
private
필드에 값을 할당해주는 기능이 많이 제공되기 때문에,setter
를 별도로 만들지 않아도되어 불변 객체로 사용할 수 있다.
도메인 용어
)에 대해서 이해가 있어야하고, 이를 코드에 반영해야한다.유비쿼터스 언어
라는 용어를 사용했다.
- 한국인 개발자는 특히나,, 도메인 용어를 영어로 해석하고 필드, 클래스, 메서드 이름을 정의하는데, 이 과정에서 도메인과 어울리는 명명(네이밍)을 찾기 위해 노력을 많이 쓴다. 좋은 현상이다.
- 사실 전 회사에서도 그렇고, 지금 회사에서도 네이밍으로 인한 시간을 많이 쓰는데, 이는 협업하는 개발자들과의 끝나지 않은 회의의 주범이기도 한데, 당연히 필요하고 중요한 과정이니 다들 열심히 참여한다.