분류 전체보기
-
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. ORM과 투명한 영속성 1부JAVA/DDD 2021. 1. 23. 13:02
DDD 이터니티 조용호 님의 블로그를 보고 다시 한번 공부하기 위해서 정리하게 되었습니다! 뒤돌아보기 “우리는 주문 시스템이 필요해요.” 고객은 주문 시스템을 원한다. 이 시스템이 무엇을 해야 하는지는 아직 잘 모르지만 주문이라는 개념이 도메인의 핵심을 이루는 것 같다. 팀을 구성하고 계획을 세우면서 지속적으로 고객과의 대화를 통해 시스템의 전체적인 윤곽을 그려나간다. 고객들과의 지속적인 협력을 통해 도메인을 구성하는 중요 개념들을 식별하고 이를 화이트보드 상에 간단한 UML로 스케치하여 짧은 검토회의를 거친다. 고객들은 적은 시간의 교육만으로도 UML의 클래스 다이어그램과 오브젝트 다이어그램을 이해하게 된다. 개발자들은 UML을 구현 명세가 아닌 설계 스케치 용도로 사용함으로써 회의 참가자들이 시스템에..
-
DDD - Dependency Injection과 AOP 6부 7부JAVA/DDD 2021. 1. 23. 12:40
관점을 바꾸자 ProductRepository의 경우와 마찬가지로 CustomerRepository와 OrderRepository에 EXTRACT INTERFACE리팩토링을 수행하자. 즉 CustomerRepository, OrderRepository 인터페이스와 CollectionCustomerRepository, CollectionOrderRepository 클래스로 분리하자. Registrar에 대한 setter 메소드를 추가한 후 이들을 Spring 빈 컨텍스트에 정의한다. 기존의 테스트 케이스들이 Spring 경량 컨테이너의 지원을 받을 수 있도록 테스트 케이스를 수정하자. 우선 OrderTest 클래스를 ProductRepositoryTest와 동일한 방식으로 getConfigLocations..
-
클래스와 멤버의 접근 권한을 최소화하라JAVA/Effective java 2021. 1. 23. 01:41
어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉, 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적다. 정보 은닉 자체가 성능을 높여주지는 않지만 성능 최적화에 도움을 준다. 다른 컴포넌트에..
-
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의 기능을 메모리 컬렉션에 대한 오퍼레이션으로 바라보는 것은 도메인 모델을 단..
-
DDD - Dependency Injection과 AOP 2부JAVA/DDD 2021. 1. 22. 21:41
객체 그리고 영속성(Persistence) 모든 객체는 생성자가 호출되는 시점에 생성된다. VALUE OBJECT의 수명은 짧다. 생성된 후 잠시 다른 REFERENCE OBJECT 또는 VALUE OBJECT에 의해 사용되다가 다른 VALUE OBJECT로 대체된다. 갈 길을 잃은 VALUE OBJECT는 가비지 컬렉터에게 넘겨진 후 조용히 생을 마감한다. VALUE OBJECT에 비해 REFERENCE OBJECT의 수명은 상대적으로 길다. REFERENCE OBJECT는 다양한 이벤트에 반응함에 따라 상태가 변한다. 일단 고객 객체가 생성되면 시스템은 고객이 탈퇴할 때까지 고객 객체를 참조하고 추적할 수 있어야 한다. 이를 위해 도메인 모델에 추가되는 PURE FABRICATION이 REPOSITO..
-
Comparable을 구현할지 고려하라JAVA/Effective java 2021. 1. 21. 17:54
Comparable 인터페이스의 유일무이한 메서드인 compareTo를 알아보자. compareTo는 Object의 메서드가 아니다. compareTo는 Object의 equals와 비슷하지만 두 가지가 다르다. 단순 동치성 비교에 더해 순서까지 비교할 수 있으며 제네릭하다. Arrays.sort(a); Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻하고 따라서 Comparable을 구현한 객체들의 배열은 다음처럼 손쉽게 정렬할 수 있는 것이다. 검색, 극단값 계산, 자동 정렬 컬렉션 관리 역시 쉽게 할 수 있다. 다음 프로그램은 명령줄 인수들을 알파벳순으로 출력한다. String이 Comparable을 구현한 덕이다. 사실상 자바 플랫폼 라이브러리의 모든 값 ..