자바 ORM 표준인 JPA를 이용해서 리포지터리와 애그리거트를 구현하는 방법에 대해 살펴보자
모듈 위치
라포지터리 인터페이스는 도메인 영역, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다
4.3.3 필드 접근 방식 이용
엔티티에 프로퍼티를 위해 공개 get/set 메서드를 추가하면 도메인의 의도가 사라지고 객체가 아닌 데이터 기반으로 엔티티를 구현할 가능성이 높아진다
그래서 JPA 매핑 처리를 프로퍼티가 아닌 필드 방식으로 선택하여 불필요한 get/set 메서드를 구현하지 말자
@Entity
@Access(AccessType.FIELD)
public class Order {
@EmbeddedId
private OrderId id;
...
// cancel(), changeShippingInfo() 등 도메인 기능 구현
}
4.3.4 AttributeConverter를 이용한 밸류 매핑 처리
두 개 이상의 프로퍼티를 가진 밸류 타입을 한 개 칼럼에 매핑하려면 @Embeddable 어노테이션으로는 처리할 수 없다
이럴 때 AttributeConverter 사용함
밸류 타입과 칼럼 데이터 간의 변환을 처리하기 위한 기능을 정의한다
// javax.persistence 에서 제공하는 기능
public interface AttributeConverter<X, Y> {
public Y convertToDatabaseColumn (X attribute);
public X convertToEntityAttribute (Y dbData);
}
@Converter(autoApply = true)
public class MoneyConverter implements AttributeConverter<Money, Integer> {
@Override
public Integer convertToDatabaseColumn(Money money) {
return money == null ? null : money.getValue();
}
@Override
public Money convertToEntityAttribute(Integer value) {
return value == null ? null : new Money(value);
}
}
AttributeConverter 인터페이스를 구현한 클래스는 @Converter 어노테이션을 적용한다
autoApply = true로 한다면 모델에 출현하는 모든 Money 타입의 프로퍼티에 대해 MoneyConverter를 자동으로 적용해 준다