분류 전체보기
-
변경 가능성을 최소화하라JAVA/Effective java 2021. 2. 11. 13:10
불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. 자바 플랫폼 라이브러리에도 다양한 불변 클래스가 있고 String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecial이 있다. 불변으로 설계하는 이유는 그럴만한 이유가 있다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적어 훨씬 안전한다. 클래스를 불변으로 만들려면 다음 5가지 규칙을 따르자. 1. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 2. 클래스를 확장할 수 없도록 한다. 이는 하위 클래스에서 객체의 상태를 변하게 하는 것을 막는다. 3. 모든 필드를 fi..
-
public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라JAVA/Effective java 2021. 2. 1. 22:00
다음과 같은 Point 클래스는 데이터 필드에 직접 접근할 수 있어 캡슐화의 이점을 제공하지 못한다. API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다. 하지만 package-private 클래스 혹은 private 중첩 클래스라면 데이터 필드를 노출한다 해도 하등의 문제가 없다. 그 클래스가 표현하려는 추상 개념만 올바르게 표현해주면 된다. public 클래스 필드가 불변이라면 직접 노출할 때의 장점이 조금 줄어들지만, 여전히 결코 좋은 생각은 아니다. API를 변경하지 않고는 표..
-
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과 투명한 영속성 3부JAVA/DDD 2021. 1. 23. 13:49
ENTITY의 생명 주기 엔터프라이즈 어플리케이션을 구성하는 도메인 객체의 생명 주기를 바라보는 시각은 크게 두 가지로 나눌 수 있다. 첫 번째는 도메인 객체의 생명주기를 구현 기술에 종속적인 시각으로 바라보는 것이다. 예를 들어 퍼시스턴스 메커니즘으로 JDBC를 직접 사용하는 TRANSACTION SCRIPT 패턴 기반의 어플리케이션을 생각해 보자. 경우 도메인 로직은 TRANSACTION SCRIPT 내에 절차적 방식으로 구현되고 도메인 개념들은 getter/setter만을 가지는 Anemic Domain Model로 구성된다. Anemic Domain Model은 도메인 개념을 반영한 클래스명과 속성명을 가지지만 단순히 레이어 간의 데이터 전달을 위해서만 사용되는 가짜 객체를 의미한다. Anemic..