도메인
- 소프트웨어로 해결하고자 하는 문제 영역 = 도메인
- 특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야할 모든 기능을 구현할 필요는 없다. 각각의 실무적 상황에 맞게 직접 구현할 수도, 다른 업체 (솔루션?)을 사용해서 구현할 수도 있다.
- 하위 도메인은 필수가 아니다. 해당 업체의 규모가 크지 않은 경우는 굳이 소프트웨어의 힘을 빌리지 않고 수작업으로 해결하도록 풀어나갈 수도 있다.
도메인 모델
도메인 모델 = 특정 도메인을 개념적으로 표현한 것, 도메인을 이해하기 위한 도구
- 사용하면 좋은 점: 여러 관계자들이 도메인에 대한 같은 모습을 알게 되고 지식을 공유하는 데 도움이 됨
- 예시
- 객체기반 모델링
- 상태 다이어그램을 통한 도메인 모델링
- 사실 표현방식은 중요하지 않다. 모두가 이해할 수 있는 표현방식이라면 어떤 것이라도 좋다.
도메인 모델 패턴
마틴 파울러가 정의한 "아키텍쳐상의 도메인 계층을 객체 지향 기법으로 구현하는 태턴"
구성
- 사용자 인터페이스 or 표현
- 사용자의 요청 처리, 정보 표현
- 응용 / application
- 사용자가 요청한 기능 실행, 도메인 계층을 조합하여 기능을 실행함. 비즈니스 로직 존재하지 않음
도메인
- 시스템이 제공할 도메인의 규칙을 구현
- 도메인의 핵심 규칙을 구현
- 규칙이 바뀌거나 규칙을 확장해야 할 때 다른 코드에 영향을 덜 주고 변경내역을 모델에 반영할 수 있게 됨
- ex) 주문취소는 배송 전에만 할 수 있다 / 출고 전에 배송지를 변경할 수 있다.
인프라스트럭쳐
- 데이터베이스, 메시징 시스템과 같은 외부 시스템과의 연동처리
개념 모델과 구현 모델
- 개념모델: 순수하게 문제를 분석한 결과물.
- 성능,데이터베이스, 트랜잭션 처리, 등과 같이 구현 기술을 고려하지 않기 때문에 실무에 바로 적용하기에는 무리가 있다.
도메인 모델 도출
핵심 구성요소, 규칙, 기능을 찾는것이 기본작업이다. 그리고 이런 과정은 요구사항에서 출발한다.
각 종 예시를 들면서 요구사항으로부터 구현수준의 코드를 뽑아낼 수있다는 것을 보여줌
엔티티와 밸류
도출한 모델은 엔티티와 밸류로 구분할 수 있다.
엔티티
- 식별자를 가짐
- 식별자는 바뀌지 않고 고유한 값이기 때문에 두 엔티티 객체의 식별자가 같으면 두 엔티티는 같다고 판단할 수 있다. → equals(), hashCode() 와 같은 메소드 구현 가능
- 식별자의 생성
- 특정 규칙에 따라 생성
- UUID 사용
- 값을 직접 입력 (그런데 고유해? → 회원의 아이디, 비밀번호가 대표적인 예 / 중복체크 필수)
- 일련번호 사용 (시퀀스나 DB 자동증가 컬럼 사용)
- 자동증가 컬럼 사용 이외의 다른 생성방식은 먼저 식별자를 생성하고 엔티티 객체를 생성할 때 식별자를 전달 할 수 있다.
밸류 타입
- 개념적으로 완전한 하나를 표현할 때 사용
- ex) receiverName, receiverPhoneNumber → Receiver (name, phoneNumber)
- 같은 개념을 지닌 필드들을 묶어서 표현할 수 있다.
- 꼭 두 개 이상의 데이터를 가질필요는 없다. 의미를 명확하게 표현하기 위해서 사용하여도 된다.
- 하나로 묶은 밸류타입은 해당 밸류타입만의 기능을 구현할 수 있다. (ex. 돈계산)
- 밸류객체의 데이터를 변경할 때는 기존 데이터를 변경하기 보다는 변경한 데이터를 갖는 새로운 밸류 객체를 생성하는 방식을 선호함. → immutable (보다 안전한 코드를 작성할 수 있음)
- 불변객체는 참조 투명성과 스레드에 안전한 특징을 가지고 있다.
- 불변 객체는 멀티 스레드 프로그래밍에서도 유용하다. 데이터가 불변 객체에 저장돼 있다면 복수의 스레드에 의해서 특정한 스레드의 데이터가 변경될 우려없이 데이터에 접근할 수 있다. 즉, 배타 제어(mutual exclusion)를 할 필요가 없다. 쉽게 말해 불변 객체가 가변 객체보다 스레드 세이프(Thread-safe) 하다고 생각하면 된다.
엔티티 식별자와 밸류 타입
- 도메인에서 특별한 의미를 지니는 식별자들의 경우에는 밸류타입을 사용해서 의미가 잘 드러나도록 변경 할 수 있다. ex) 주문번호 String orderNo → OrderNo id;
도메인 모델에 set 메서드 넣지 않기
- 습관적으로 get/set 메소드를 추가하지 말자!
- set메소드의 남용은 도메인의 핵심 개념/의도를 코드에서 사라지게 한다.
- 관련 도메인의 값 설정은 해당 도메인에 맡기는 것이 좋다.
- 상태 값만 변경하는 것인지, 아니면 그에 따른 다른 처리도 함께 구현하는 것인지 애매하게 된다.
- 도메인 객체를 생성할 때 완전한 상태가 아닐 수도 있다. (불완전한 상태)
- 불완전한 상태에서 사용될 가능성이 있다. → 불필요한 데이터에 대한 체크가 들어가야 한다.
- 도메인 객체 생성 시점에 필요한 것을 모두 전달해 주는 방법으로 위와 같은 상황을 방지 할 수 있다.
- 도메인 객체를 생성할 때 완전한 상태가 아닐 수도 있다. (불완전한 상태)
- public set 메소드 X
도메인 용어
코드의 가독성을 높여, 분석, 이해하는 시간을 절약할 수 있다
ex) OrderState의 enum value를 명확하게 알아볼 수 있도록 명명하는 방법
반응형