-
[Spring] 프록시와 연관관계 관리Spring 2022. 1. 18. 22:01
spring에서 연관관계설정시 두가지 설정방법이 있다. eager loading(즉시로딩), lazy loading(지연 로딩)
eager loading은 엔티티 조회 시 한번에 모두 조회된다는 장점이 있으나, 필요없는 연관관계까지 전부 조회를 한다는 단점이 있어 실제로 쓰이진 않는다.
때문에 연관관계를 전부 lazy loading을 하게 되는데, fetchjoin을 하지 않는다면 프록시 객체로 대체된다.
프록시란?
- 실제 클래스를 상속 받아서 만들어짐
- 실제 클래스와 겉 모양이 같다.
- 사용하는 입장에서는 진짜 객체인지 프록시 객체인지는 구분하지 않고 사용할수있음(이론적으로)
- 프로시 객체는 실제 객체의 참조(target)를 보관
- 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출
getName() > Member target에 값이 없다 > 영속성 컨텍스트에 실제 값 가져오라 요청 > db가 그 값을 가져오고, Proxy객체에 진짜 객체를 연결시켜준다. 그래서 target.getName()으로 name을 가져온다.
여기서 좀 헷갈리는 부분은 프록시객체에게 값을 두번이상 요청했을 때다.
프록시 객체에 값을 요청할 때, 영속성 컨텍스트에 값이 없으면 쿼리가 나간다.
주의할 점은 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것이 아닌, 초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근이 가능해지는 것이다.
이때 처음 프록시 객체로 가져왔던 객체에 대해 다시 repository의 get함수를 써 가져오게 된다면, 이는 jpa의 a==a를 보장한다는 특성때문에 실제 객체를 가져오지 않고 프록시객체를 가져오게 된다.
'Spring' 카테고리의 다른 글
[Spring] 개발 편의 오픈소스 spring devtools (0) 2022.01.18 [Spring] Cascade관계에서 추가로 활용하면 좋을 옵션 orphanRemoval (0) 2022.01.18 [Spring] spring boot 라이브러리 버전관리 (0) 2022.01.15 [Spring] MultipleBagFetchExcption 발생 시 해결 방법 (0) 2022.01.09 [Spring] default_batch_fetch_size 대로 in쿼리가 나가지 않는 이유 (1) 2022.01.09