[DDDStart] 4장. 리포지터리와 모델 구현(JPA 중심)

4장. 리포지터리와 모델 구현(JPA 중심)

애그리거트의 논리적인 저장소인 리포지터리를 구현하는 방법을 알아본다

리포지터리 구현

 

매핑 구현

@Entity , @Embeddable, @Embedded 등등…

@Entity, @Embeddable -> 기본 생성자 필요함.

Hibernate 와 같은 JPA 프로바이더는 DB에서 데이터를 읽어와 매핑된 객체를 생성할 때 기본 생성자를 사용해서 객체를 생성함.
-> VO들의 기본생성자를 protected로 만들자!

Q) private쓰면 안되나..??

 

오버라이드

Address.class

@Column(name = "city")
private String city;

@Column(name = "street")
private String street;

@Column(name = "zip_code")
private String zipCode;

기본적으로 db에 컬럼이름을 지정할 수 있다.

 

이를 사용하는 곳에서 추가로 오버라이딩 해서 쓰는 것도 가능

@Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "city", column = @Column(name = "sender_city")),
            @AttributeOverride(name = "street", column = @Column(name = "sender_street")),
            @AttributeOverride(name = "zip_code", column = @Column(name = "sender_zip_code"))
    })
private Address address

 

필드 접근 방식..

@Access(AccessType.PROPERTY)

@Id 가 필드에 위치하면 기본적으로 필드 접근 방식을 사용
@Id 가 getter에 위치하면 메서드 접근 방식을 사용

 

애그리거트 로딩 전략

p135에 보면 루트 애그리거트에 fetch = FetchType.EAGER 로 박아놨는데

이렇게 해버리면 모든 도메인 로직에 EAGER로 가져올거임.

-> 매번 불필요한 조인을 수행하게 됨.

이렇게 하지말고, 루트 애그리거트에 모두 LAZY로 박아놓고, 즉시 로딩이 필요하면 쿼리로 만들어서 사용하자! 라고 들었던 거같음.

김영한님 티아카데미였던가, 백기선님 인프런이던가.. 봤었는데 정확히 기억 안남.

 

4장 대충 넘어가고, 부족한 JPA는 JPA책으로 보자!