[SPRING:이론] 10 : Entity 연관 관계 - 3

김승수·2024년 5월 30일
0

SPRING

목록 보기
10/27

⏰ 2024. 05. 30 목

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. 지연 로딩과 즉시 로딩
  2. 영속성 전이
  3. 고아 Entity 삭제

지연 로딩과 즉시 로딩

  • 연관 관계가 맵핑된 테이블들에서는 한쪽의 테이블의 정보만 조회하려고 해도 자동으로 JOIN문을 사용하여 반대쪽의 테이블의 정보도 가져온다.

  • JPA에서는 연관 관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때만 가져올지를 정할 수 있다.

  • Fetch Type 의 옵션 2가지 지연 로딩(LAZY), 즉시 로딩(EAGER) 가 있다.

즉시 로딩

  • 즉시 로딩은 Entity 연관 관계에서 JOIN된 테이블의 정보를 즉시 가져오는 것을 의미하고, Fetch TypeEAGER로 설정할 수 있다.

  • @ManyToOne 애너테이션은 Fetch Type의 default 값이 EAGER로 설정되어 있다.

  • 관계 애너테이션의 뒤쪽에 One 일 경우는 default 값이 EAGER로 설정되어 있다.

지연 로딩

  • 지연 로딩은 Entity 연관 관계에서 JOIN된 테이블의 정보를 필요한 시점에 가져오는 것을 의미하고, Fetch TypeLAZY로 설정할 수 있다.

  • @OneToMany 애너테이션은 Fetch Type의 default 값이 LAZY로 설정되어 있다.

  • 관계 애너테이션의 뒤쪽에 Many 일 경우는 default 값이 LAZY로 설정되어 있다.

⚡ 지연 로딩은 영속성 컨텍스트가 존재해야 사용 가능하다.

  • 조회하는 메서드에서 영속성 컨텍스트가 존재해야 하려면, 결국 트랜잭션(@Transactionl)을 설정 해야한다.

영속성 전이

  • JPA에서는 여러 개의 맵핑된 Entity의 처리를 한번에 가능한 영속성 정이(CASCADE)PERIST 옵션을 제공한다.

영속성 전이

  • 영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파되는 상황을 의미한다.

  • 연속성 전이를 적용해서 자동으로 저장하려는 연관된 Entity에 추가한 연관 관계 애너테이션에 CASCADEPERIST 옵션을 설정하면 된다.

  • 연속성 전이를 적용해서 삭제하려는 연관된 Entity도 자동으로 삭제하려면, CASCADEREMOVE 옵션을 설정하면 된다.

  • CASCADEPERIST 옵션과 CASCADEREMOVE 옵션을 둘 다 적용하면 자동으로 저장할 수도 있고, 삭제할 수도 있다.

cascade = {CascadeType.PERIST, CascadeType.REMOVE}

고아 Entity 삭제

고아 Entity 삭제

  • CASCADEREMOVE 옵션을 적용하면 해당 Entity 객체를 삭제 했을 때, 연관된 Entity 객체들을 자동으로 삭제할 수 있었지만, REMOVE 옵션 같은 경우 연관된 Entity 관계를 제거했다고 해서 자동으로 해당 Entity가 삭제 되지는 않는다.

  • 이를 간단하게 처리하는 방법으로 JPA에서는 orphanRemoval 옵션을 제공한다.

  • orphanRemoval 옵션을 사용하려면 연관 관계 애너테이션에 true로 작성하면 된다.

  • orphanRemoval 옵션은 REMOVE와 마찬가지로 연관된 Entity를 자동으로 삭제해 준다.

❗ 주의

  • orphanRemovalREMOVE 옵션을 사용한 Entity에서 삭제하려고 할때, 연관된 Entity가 다른 곳을 참조하고 있는지 아닌지 꼭 확인해야 한다.
  • 연관된 Entity도 자동으로 삭제되기 때문에, 참조하고 있던 Entity가 사라져 문제가 발생할 수 있다.
  • 따라서 @ManyToOne 애너테이션이 설정된 Entity는 해당 Entity 객체를 참조하는 다른 Entity 객체들이 있을 수 있기 때문에 orphanRemoval를 가지고 있지 않다.
profile
개발하는 미어캣

0개의 댓글