[DDDStart] 4장. 리포지터리와 모델 구현(JPA 중심)
4장. 리포지터리와 모델 구현(JPA 중심)
애그리거트의 논리적인 저장소인 리포지터리를 구현하는 방법을 알아본다
리포지터리 구현
- Repository 인터페이스 생성(OrderRepository)
- Repository 구현체 생성 (OrderRepository) - em을 변수로 가짐, @Repository 붙임.
매핑 구현
@Entity , @Embeddable, @Embedded 등등…
@Entity, @Embeddable -> 기본 생성자 필요함.
- id -> @EmbeddedId
- Enum -> @Enumerated(EnumType.String)
- String으로 안하면 0, 1, 2, 3 … 순서로 저장되는데, 유지보수할 떄 순서꼬이면 망하는거임
Hibernate 와 같은 JPA 프로바이더는 DB에서 데이터를 읽어와 매핑된 객체를 생성할 때 기본 생성자를 사용해서 객체를 생성함.
-> VO들의 기본생성자를 protected로 만들자!
Q) private쓰면 안되나..??
- 하이버네이트는 클래스를 상속한 프록시 객체를 이용해서 지연로딩을 구현한다. VO를 상속하므로 private는 쓸 수 없음. (p114)
오버라이드
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책으로 보자! 응
- 범위 : DDD START! 3~4 장
- 일시 : 190825 (13:00 ~ 15:50)
- 장소 : 잠실 투썸
- 인원 : 2