본문 바로가기
Programming/JPA & Spring Data JPA 기초

17. 영속성 전파 & 연관 매핑 고려사항

by JKROH 2023. 3. 29.
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

  • find()로 찾아온 객체를 활용에서 persist()를 하면 에러가 발생하지 않는다.
  • 새로 만든 객체를 활용해서 persist()를 하면 DB에 새롭게 만든 객체의 정보가 없으니까 에러가 발생한다.
  • 그런데 오른쪽처럼 코드를 작성하고 싶으면 어떻게 해야할까?

 

* 영속성 전파

  • 연관된 엔티티에 영속 상태를 전파 : 나와 연관된 엔티티에 나의 영속상태가 바뀌는 것을 전파한다.
    • 예, 저장할 때, 나와 연관된 엔티티도 함께 저장되게 하는 것.
  • Team 클래스에서 확인할 수 있다
  • 연관하는 애너테이션(@OneToOne, @OneToMany, @ManyToMany)에 cascade라는 속성의 값을 CascadeType.PERSIST로 설정한다.
    • 해당 값을 설정하면 Team을 저장할 때 아직 저장되지 않은 Player 객체도 DB에 저장한다.

 

* 영속성 전파 종류

  • 엔티티 매니저가 제공하는 메서드 이름이다.
    • ALL : 아래 다섯가지를 모두 설정한다.
    • PERSIST : 저장할 때 연관된 엔티티도 같이 저장한다.
    • MERGE
    • REMOVE : 삭제할 때 연관된 엔티티도 같이 삭제한다.
    • REFRESH
    • DETACH

 

* 영속성 전파 주의 사항

  • 정말 특별한 이유가 없다면 사용하지 말자.
  • 연관도 어지간하면 안써야하는데, 하물며 영속성 전파까지?

 

* 연관 고려 사항

  • 연관 대신에 id 값으로 참조하는 것을 먼저 고려하자
    • 주문에서 회원을 참조하는데, 주문이 회원을 직접 참조하지 말고 ID값으로 참조하는 것을 고려해보자.
    • 객체 탐색이 쉽다고 연관을 쓰는 것은 안된다.
  • 조회는 전용 쿼리나 구현의 사용을 고려하자 (CQRS)
  • 정말 엔티티 간의 연관인지, 엔티티가 아닌 밸류인지 확인하자.
    • 특히 1-1, 1-N관계에서 이런 경우가 더욱 많다.
  • 정말 어쩔 수 없이 써야 한다면 1-N보다는 N-1
  • 양방향은 절대 쓰지 말자.

 

반응형

댓글