프록시

  • 멤버만 가져오고 싶을 때도 있다.

  • 프록시를 사용하면, 사용될 때 가져온다.

em.find(), em.getReference()

  • em.find() : 직접 database에 접근해서 data를 가져옴

  • em.getReference() : proxy를 통해서 가져옴. 가짜 클래스

프록시란

  • 실제 클래스를 상속받아서 만들어짐

  • 겉모양이 같다

  • 실제 Member를 가져오는 것이 아니라, 가져온 Member를 통해 간접적으로 접근한다.

  • 만약 em.find로 미리 찾아온 Member가 있다면, 굳이 proxy를 생성하지 않고, 영속성 콘텍스트에 올라온 Member를 가져온다

  • 만약 proxy가 만들어 놓은 상태에서, em.clear()를 시키고 나서 proxy를 찾으면 조회가 되지 않는다.

  • m1 = em.find(member)
    m2 = em.getReference(member)
    위와 같이 둘다 동시에 찾을 때, m1==m2 가 되도록 하기 위해 움직인다. ( 무슨 소리인지 잘 모르겠다)

지연로딩

  • 지연로딩 LAZY를 사용해서 프록시로 조회

  • 실제 Team을 사용하는 시점에 초기화
    ---> Member 따로, Team 따로 쿼리가 따로 나간다.

  • 만약에 거의 같이 쓰는 경우에는 EAGER를 써서 함께 쿼리가 나가도록 해야 한다.

실무에서는 지연 로딩만 사용

  • 즉시 로딩을 사용하면 예상치 못한 SQL이 발생

@ManyToOne, @OneToOne 은 Default가 EAGER -> LAZY로 바꾸어 주어야 한다.

@OneToMany, @ManyToMany는 기본이 LAZY

  • JPQL에서 N+1 문제를 일으킴

    em.createQuery("select m from Member m") 에서, Member를 조회할 때 Team 쿼리도 같이 나간다

영속성 전이 CASCADE

부모 Entity를 저장할 때, 자식 Entity도 같이 저장할 때 사용

Parent.class

@OneToMany(mappedBy="parent", cascade=CascasType.PERSIST)
private List<Child> childList;

위와 같은 상황일 때, parent를 생성하면 child도 생성된다.

  • 영속성 전이는 연관관계를 Mapping하는 것과 아무 관계가 없다.

  • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐 그 이상도, 그 이하도 아니다.

  • ALL, PERSIST 보통 2개만 사용.
    -> PERSIST : 저장할 때만 맞추는 것

  • Child가 Parent로만 관리되면 상관없는데, Child가 다른 Entity로 관리가 추가로 되면 ,사용하면 안된다. ( 소유자가 하나일 때 )
    -> 단일 Entity에 종속적일때만 사용

  1. LifeCycle이 똑같을 때

  2. 단일 소유자 일때

만 사용할 것.

고아객체

부모 Entity와 끊어진 연관관계가 끊어진 자동 Entity를 자동으로 삭제. orphanRemoval = true

Parent.class

@OneToMany(mappedBy="parent", cascade=CascasType.PERSIST,orphanRemoval = true)
private List<Child> childList;
Cascade=CascasType.ALL,orphanRemoval = true

위와 같이 ALL, true를 주게 되면, 부모 Entity를 통해서 자식의 생명주기를 관리할 수 있다.
( 자식의 생성과 삭제, 조회를 모두 부모 Entity를 통해서 할 수 있다. 부모 Entity는 영속성 콘텍스트에 의해, 자식 Entity는 부모에 의해 관리가 될 수 있다. 도메인 주도 설계 (DDD)할 때 유용하다. )

  • 고아객체 역시 CASCADE와 마찬가지로,
  1. LifeCycle이 똑같을 때

  2. 단일 소유자 일때

사용한다.

  • 개념적으로 부모를 제거하면 자식은 고아가 되므로, 자식도 함께 제거된다. 그래서 이것은 CascadeType.REMOVE 처럼 동작한다.
profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN