ddd
-
DDD - ORM과 투명한 영속성 10부 11부JAVA/DDD 2021. 1. 24. 08:10
DDD 이터니티 조용호 님의 블로그를 보고 다시 한번 공부하기 위해서 정리하게 되었습니다! 애초에 아키텍처를 잡을 때 영속성을 고려했어야 했는데 아키텍처의 중요성을 뼈저리게 느끼게 되는 순간이다. 뭔가 망가지지 않았을까? 이럴 때 의지할 수 있는 건 단 하나밖에 없다. 회귀 테스트를 믿으라. 테스트를 실행하기 전에 한가지 더 알려 둘 것이 있다. 가능하면 단위 테스트는 데이터베이스에 의존하지 않은 채로 실행할 수 있어야 한다. 즉, 데이터베이스가 가동되지 않아도 각 클래스만을 고립시켜 테스트할 수 있도록 테스트 케이스를 작성해야 한다. 정확하게 말하면 데이터베이스를 포함시키는 테스트는 단위 테스트가 아니라 통합 테스트이다. 데이터베이스와 연계해야 하는 통합 테스트에서 가장 어려운 문제는 테스트 데이터를 ..
-
DDD - ORM과 투명한 영속성 8부 9부JAVA/DDD 2021. 1. 24. 07:43
OrderLineItem에도 Long 타입의 IDENTITY FILED를 추가한다. @Cofigurable Annotation이 계속 사용되고 있음에 주목하자. @Cofigurable Annotation은 Spring 컨테이너 외부에서 생성되는 객체에 Spring 컨테이너에서 선언된 빈을 의존 삽입하기 위해 사용된다. 여기에서는 Hibernate가 생성하는 OrderLineItem 객체에 ProductRepository 타입의 빈을 의존 삽입하기 위해 사용되고 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Configurable(value="orderLineItem",preConstruction=true) public class OrderL..
-
DDD - ORM과 투명한 영속성 6부 7부JAVA/DDD 2021. 1. 24. 07:17
고객이 새로운 주문을 입력했다고 하자. 시스템 내부에서는 새로운 트랜잭션이 시작되고 Order 객체와 OrderLineItem이 생성된 후 Order에 추가된다. Order 객체가 생성은 되었지만 단지 메모리 상의 객체로만 존재하고 데이터베이스와 관계가 맺어지지 않은 상태를 비영속 상태(transient state)라고 한다. 어플리케이션은 트랜잭션 종료 시점에 OrderRepository.save()를 호출하여 생성된 Order를 데이터베이스에 저장한다. 이 때부터 Order는 데이터베이스 테이블의 한 레코드로 저장되는데 이처럼 데이터베이스와 연관 관계를 가지고 있는 상태를 영속 상태(persistence state)라고 한다. 이제 OrderLineItem에 대해 생각해 보자. 앞에서 OrderRep..
-
DDD - ORM과 투명한 영속성 5부JAVA/DDD 2021. 1. 24. 06:48
객체 관계 맵핑과 도메인 모델 상태와 행위를 함께 가지는 풍부한 객체 모델로 도메인 레이어를 구성하는 것을 DOMAIN MODEL 패턴이라고 한다. DOMAIN MODEL 패턴은 상속, 캡슐화, 다형성과 같은 객체 지향의 장점을 십분 활용함으로써 수정이 용이하고 확장성이 높으며 이해하기 쉬운 시스템을 개발할 수 있도록 한다. DOMAIN MODEL 패턴이 객체 지향의 모든 특징을 활용하기 때문에 영속성 메커니즘을 주도하는 관계형 데이터베이스와의 임피던스 불일치 문제가 발생한다. 임피던스 불일치를 해결하는 가장 좋은 방법은 도메인 로직을 처리하는 도메인 레이어와 영속성 로직을 처리하는 퍼시스턴스 레이어 간에 불일치를 조정하는 중간 레이어를 도입하는 것이다. 중간 레이어가 불일치 사항들을 조정함으로써 객체와..
-
DDD. ORM과 투명한 영속성 4부JAVA/DDD 2021. 1. 24. 06:22
ENTITY의 식별자(Identity) ENTITY는 추적해야할 도메인 개념이 시간과 장소에 따라 다양한 형태를 지닐 수 있다는 개념을 도메인 모델에 도입한다. 따라서 변화되는 ENTITY의 모든 형태가 공유할 수 있는 일반적인 식별자의 개념을 필요로 한다. REFERENCE OBJECT의 경우처럼 식별자를 단순히 객체 생성 시에 할당되는 메모리 주소로만 한정해서 생각한다면 데이터베이스 레코드의 형태를 띈 도메인 개념을 ENTITY로 간주할 수는 없을 것이다. 따라서 생명주기에 걸쳐 구현 기술과 무관하게 각 ENTITY의 유일성을 보장할 수 있는 속성을 식별자로 삼아야 한다. 그렇다면 ENTITY의 식별자로 적당한 속성의 특징은 무엇일까? 무엇이 구현 기술과 무관하게 ENTITY의 유일성을 보장할 수 있..
-
DDD. ORM과 투명한 영속성 2부JAVA/DDD 2021. 1. 23. 13:24
REFERENCE OBJECT의 별칭(aliasing) - ENTITY REFERENCE OBJECT는 시스템 내에 유일하게 존재하고 상태를 추적할 수 있는 도메인 객체를 의미한다. REFERENCE OBJECT는 유일성 및 추적성을 만족시키기 위해 식별자(identity)를 가지며 동일한 객체를 다른 이름으로 참조할 수 있도록 별칭(aliasing)을 허용한다. 별칭은 여러가지 골치 아픈 문제를 야기하지만 그와 동시에 시스템의 모든 부분이 REFERENCE OBJECT의 상태를 공유할 수 있도록 함으로써 도메인의 무결성을 유지하도록 한다. REFERENCE OBJECT의 동일함(identical)을 테스트하기 위해 ‘==’ 연산자를 사용하여 식별자를 비교할 수 있다. ‘==’ 연산자는 객체 생성 시에 ..
-
DDD - Dependency Injection과 AOP 4부 5부JAVA/DDD 2021. 1. 22. 22:17
우선 ProductRepository를 리팩토링하자. 구체적인 클래스에서 인터페이스를 추출하는 EXTRACT INTERFACE를 적용하자. 인터페이스 명은 ProductRepository로 하고 구현 클래스 명은 CollectionProductRepository로 하자. 1 2 3 4 5 6 7 8 9 10 ProductRepository.java public interface ProductRepository { public void save(Product product); public Product find(String productName); } Colored by Color Scripter cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CollectionProduc..
-
DDD - Dependency Injection과 AOP 3부JAVA/DDD 2021. 1. 22. 22:03
영속성(Persistence)과 REPOSITORY REPOSITORY는 도메인 객체 생성 이후의 생명주기를 책임진다. 도메인 객체가 생성되고 상태가 초기화된 후에는 REPOSITORY에게 넘겨진다. REPOSITORY는 객체를 넘겨받아 내부 저장소에 보관하고 요청이 있을 경우 객체를 조회하여 반환하거나 삭제한다. 클라이언트 입장에서 REPOSITORY는 커다란 메모리에 도메인 객체들을 담고 있는 객체 풀(object pool)과 같다. 클라이언트는 생성된 객체를 REPOSITORY에게 전달하고 객체가 필요한 경우 REPOSITORY에게 객체 풀 안의 어딘가에 잠자고 있는 도메인 객체를 찾아 달라고 요청한다. REPOSITORY의 기능을 메모리 컬렉션에 대한 오퍼레이션으로 바라보는 것은 도메인 모델을 단..