JPA 스터디 6주차

반응형
반응형

생각보다 시간이 빨리 지나갔다.
내가 스터디를 진행하면 가장 정상적인? 스터디라 생각이 든다.
이번에 공부한 주제는 [프록시와 연관관계 관리] 부분이다.

프록시

프록시는 과연 무엇을 말하는 것일까?
프록시는 대리자라는 뜻을 가지고 있다.

그렇다면 프록시 서버, 프록시 클래스 등등 이런 용어를 해석해보면,
대리 서버, 대리 클래스 뭐 이런식으로 해석이 가능하다.
더 깊게 공부를 하면 이것 보다 더 복잡하겟지만, 알다시피  프록시를 공부하는 시간이 아니라 JPA를 공부하는 시간이기 때문에
언급만 하고 넘어갈 예정이다.

그러면 JPA에서는 프록시라는 걸 어디에서 이용을 하게 될까?
바로 지연로딩 (FetchType.LAZY)이곳에서 사용된다.

근데 이름이 지연 로딩일까? 이건 어쩔 수 없이 프록시라는 것을 다시 이야기 해야 하는데 
프록시의 특징 때문이다. 프록시에는 특징이 많다.
디자인 패턴에도 프록시라는 특성을 살려서 프록시 패턴과 데코레이터 패턴 이렇게 두 종류로 구분되어서 프록시를 설명하고 있다.

위에서 말했듯이 프록시는 대리자다. 혹은 다른 말고 비서인데
현실세계에서 비서가 어떤일을 하는지 생각을 해보자.
비서가 하는 일은 비서를 고용한 사람의 일을 하나 둘, 대신 처리해준다. (내가 비서일을 안 해봐서 잘 모르겠지만, TV속에 보여지는 비서의 이미지는 아무튼 이렇다.)

이쪽 바닥에서는 이것을 가짜 클래스라고 부르는데 그 이유가 과연 무엇까?

@Entity
public class Member {

  @Id @GeneratedValue
  private Long idx;
  private String userName;

  @ManyToOne()
  private Team team;
  
}
@Entity
public class Team {
  @Id @GeneratedValue
  private Long idx;

  private String name;
  
}

여기 두 가지 엔티티가 존재한다.

멤버가 팀을 검색한다고 생각해보자.
그러면 당연히 join문으로 맴버와 팀을 검색해줄 것이다.

근데 나는 맴버만 검색하고 싶다고 가정해보자.
다른건 생각하지말고 프록시인 LAZY로 되어있다고 해보자.
그러면 맴버를 검색할때 팀 엔티티는 프록시 엔티티(가짜 객체)로 들어올 것이다.
이게 가짜 객체이기 때문에 실제로 팀을 검색한것이 아니기 때문에 팀이라는 sql은 보이지 않는다.

왜냐하면 팀을 실제로 검색하지 않았기 때문이다. 그러다 팀을 검색을 해야 하는 상황이라면, 그제서야 조인이 걸리고 
팀이 검색이 되어진다.

근데 아이러니하게도 ToOne시리즈는 전부

FetchType fetch() default EAGER;

이걸로 되어 있다. 이론적으로는 하나만 검색하는 경우라면 이걸로만으로도 충분하지만 다수를 검색하는 상황이라면 레이지로 검색하는 것이 좋다는 것이다. 하지만 실제로는 전부 레이지로 도배를 해야 한다고 한다.

이것은 1+N문제 때문인데 1+N문제는 1개의 쿼리에 N개의 쿼리가 추가적으로 나온다는 뜻다.
물론 레이지로 한다고 이것을 해결되는건 아니지만 어느정도는 커버가 가능하다고 한다.
이것에 대해서는 정확히 잘모르겠지만 나중에 기회가 된다면 이것에 대해 집중적으로 공부하고는 싶다.

 

반응형

'JPA' 카테고리의 다른 글

쿼리 메소드 기능(1)  (0) 2022.04.01
JPA 스터디 7주차  (0) 2022.02.26
JPA 스터디 5주차  (0) 2022.02.11
JPA 스터디 4주차  (0) 2022.02.02
JPA 스터디 3주차  (0) 2022.01.26

댓글

Designed by JB FACTORY