인프런 커뮤니티 질문&답변

KiddingJust님의 프로필 이미지
KiddingJust

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

간단한 주문 조회 V2: 엔티티를 DTO로 변환

프록시 관련해서 질문이 있습니다.

작성

·

367

1

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
영한님 안녕하세요.
JPA로드맵, 스프링 로드맵 모두 들으면서 기초 개념을 잡아가고 있습니다. 감사합니다.
 
다름이 아니라, 학습을 하면서 프록시 객체의 개념이 많이 등장하는데요, 이런 프록시 객체에 대해 궁금한 점이 생겨서 질문드립니다.
 
스프링이 빈을 싱글톤으로 관리하기 위해 CGLIB 바이트코드 조작을 통해 가짜 프록시 객체를 스프링 빈으로 등록한다고 알고 있습니다.
 
그리고 스프링 AOP 적용 시에, Pointcut의 대상이 되는 객체(pointcut 대상 메서드가 포함된 객체)에 Advice를 적용하기 위해 CGLIB 또는 JDK 동적 프록시 기술로 프록시 객체를 만든다 배웠습니다.
 
마지막으로 여기서 JPA에서 지연로딩을 하기 위해 가짜 프록시 객체를 생성하고 실제 프록시 초기화 시점에 DB에서 쿼리를 불러온다고 보았습니다. (--> 이 프록시 객체는 영속성 컨텍스트가 시작될 때 생성되었다가 사라지는 것 같긴 합니다..)
 
실제로는 더 많은 사례가 있겠지만, 일단 제가 알기로는 이렇게 3가지가 있었던 것 같은데, 이때 생성되는 프록시 객체들은 다 별개의 객체들일까요?
예를 들어 싱글톤 빈으로 등록된 객체가 있는데(CGLIB 프록시), 이 객체가 AOP 적용 대상이라면 CGLIB 혹은 JDK 동적프록시를 통해 또다른 프록시 객체가 생성되는 건지 궁금합니다.
추가로, 지연로딩을 위한 프록시 객체는 영속성 컨텍스트가 시작될 떄 생성되어 영속성 컨텍스트가 종료되면 사라지는 것인지 궁금합니다.
 
질문이 다소 모호해서 죄송합니다.

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. KiddingJust님

Q: 먼저 스프링이 빈을 싱글톤으로 관리하기 위해 CGLIB 바이트코드 조작을 통해 가짜 프록시 객체를 스프링 빈으로 등록한다고 알고 있습니다.

-> 이 부분을 잘못 이해하고 있습니다. @Configuration을 설정하는 설정 객체만 프록시가 적용되는 것이고, 스프링 빈은 순수한 객체로 저장이 되는 것 입니다. 관련해서 스프링 핵심 원리 섹션5. 싱글톤 컨테이너를 복습해주세요^^

Q: 추가로, 지연로딩을 위한 프록시 객체는 영속성 컨텍스트가 시작될 떄 생성되어 영속성 컨텍스트가 종료되면 사라지는 것인지 궁금합니다.

-> 영속성 컨텍스트가 종료되어도 프록시 객체 자체가 사라지지는 않습니다. 그러면 Null 예외가 발생하겠지요? 대신에 영속성 컨텍스트가 없으면, 초기화에 실패하게 됩니다.

감사합니다.

 

KiddingJust님의 프로필 이미지
KiddingJust
질문자

안녕하세요! 주말 늦은 시간까지 답해주셔서 정말 감사합니다. 

해당 강의 다시 보고왔는데, 정말 크게 잘못 이해하고 있었네요 ㅎㅎ... 

Configuration이 붙은 설정 객체에 프록시가 적용돼서, 요청한 객체가 스프링 빈으로 등록되어 있으면 그 객체를 반환하고, 스프링 빈에 등록되어있지 않으면 객체를 생성해서 반환한다고 이해했습니다. 그래서 싱글톤이 보장되는 거구요.. 

답변해주셔서 정말 감사합니다! 

KiddingJust님의 프로필 이미지
KiddingJust

작성한 질문수

질문하기