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

김상형님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 프록시

프로토타입에 프록시 적용해보기

해결된 질문

작성

·

99

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
강의 프로토타입 예시에 프록시를 적용해 보았습니다.


의도한 대로 다른 인스턴스를 호출해주는 것 까진 되는 걸 확인했습니다.
다만 로그에 CGLIB라는 라이브러리로 상속 받은 가짜 프록시 객체라고 나오지 않는 것 같고, addCount 로직이 적용이 되지 않는 것 같습니다


프로토타입 빈에는 프록시를 적용하면 안되는 걸까요? 왜그런걸까요

image.png


답변 2

0

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

안녕하세요. 김상형님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

김상형님의 프로필 이미지
김상형
질문자

안녕하세요. 답변 해주신 것을 너무 늦게 확인해서 이제야 다시 질문드립니다ㅜ 죄송합니다

 

  1. 문제 영역을 실행할 수 있는 방법

test디렉토리의 hello.core.scope 의 SingletonWithPrototypeTest1 클래스 실행


2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)

 

  • 강의예시에 리퀘스트 스코프로 선언된 빈을 프록시 객체를 통해서 객체 조회를 지연처리 했던 것 처럼 프로토타입 스코프로 선언했던 빈 예시에서도 Provider을 이용한 DL대신 프록시 객체를 통해서 객체 조회 지연처리를 해보고자 하였습니다

 

제가 질문 했었 던 것은 두가지였습니다

 

  1. 프록시 객체를 사용했는데, 로그에 CGLIB라는 라이브러리로 상속 받은 가짜 프록시 객체라고 나오지 않았다는점

    1. 위와 같이 질문 했었는데 다시 확인해본 결과 프록시 객체를 사용한 시점 이후에 객체 주소값을 찍었어서 로그에 CGLIB 라는 표시가 안 나왔었습니다.

       

    2. 프록시 객체 사용 전에 객체 주소값을 찍으면 정상적으로 CGLIB라는 표시가 나왔습니다. 다만 CGLIB$ 이후에 주소값 형태가 아닌 0 이라고 나오는 것이 약간 의문이긴 합니다.

     

  2. addCount메서드가 제대로 동작하지 않고, 로그 출력시 0으로 나옴

     

    1. 이점은 여전히 전혀 모르겠습니다... 프록시 객체와 Provider 가 지연처리를 해주는 점은 같지만 다른 방식으로 동작하기 때문일까요

 

스크린샷 2024-08-15 120741.png

 

스크린샷 2024-08-15 120814.png

해당 부분 코드와 로그 내용입니다
바쁘신 와중에도 신경 써주셔서 감사드립니다!!!

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

안녕하세요. 김상형님

  1. 최신 버전의 스프링에서는 CGLIB 클래스를 출력할 때 마지막에 참조값 대신에 $$SpringCGLIB$$0, $$SpringCGLIB$$1과 같이 0, 1, 2 등의 숫자가 출력됩니다. 이 부분은 조만간 메뉴얼에 업데이트를 해야겠네요 🙂

 

  1. 지금과 같이 프록시를 사용하면 메서드를 호출할 때 마다 스프링 컨테이너에게 새로운 PrototypeBean 생성을 요청하게 됩니다. 예를 들어서 addCount()를 호출할 때도 새로운 ProtytypeBean을 생성하고 그곳에 요청하게 됩니다. prototype을 이런 방식으로는 잘 사용하지 않기 때문에 크게 고민하지 않으셔도 될 것 같아요.

감사합니다.

김상형님의 프로필 이미지
김상형
질문자

아하
원래 교안에서는 PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
이렇게 한번 변수로 받은 다음에 addCount, getCount를 호출하였기 때문에 의도대로 동작했고, 제 코드에서는 그렇지 않았기 때문에 메서드마다 매번 새로운 빈이 생성되어버려서 count가 0이었군요!!!
prototype을 이런 방식으로는 잘 사용하지 않는 다는 것이 어떤 말씀이신지 쪼금 알 것 같습니다

이해했습니다 정말 감사드립니다!!

0

안녕하세요, 인프런 AI 인턴입니다.

ideal0427님의 질문에 관해서는 이전에 비슷한 질문이 있었습니다. 프로토타입 스코프에 프록시를 적용하는 과정에서 발생한 문제를 해결하는 데 도움이 될 수 있는 관련 질문과 답변을 찾았습니다.

  • “프로토타입 빈 프록시” 질문에서는 프로토타입 스코프 빈에 프록시를 적용하는 방법과 프로토타입 빈이 실제 동작하는 방식에 대한 설명이 포함되어 있습니다. 웹 스코프에서 프록시 모드를 사용한 경험을 토대로 프로토타입 빈에도 유사하게 적용할 수 있는지에 대한 질문에 대해 상세한 답변이 제공되었습니다.

핵심 내용:

  • 프로토타입 빈에 프록시를 적용하는 것은 기술적으로 가능합니다.
  • ScopedProxyMode.TARGET_CLASS 옵션을 사용하여 CGLIB 기반의 프록시를 생성할 수 있으며, 이 프록시는 각 메소드 호출 시 새로운 인스턴스를 생성하여 반환합니다.
  • 테스트가 실패한 원인은 프록시 객체가 올바르게 작동하지 않거나, 프록시를 통해 실제 메소드가 호출되지 않기 때문일 수 있습니다.

질문하신 내용과 유사한 문제를 해결한 답변이므로, 연결된 설명을 참고하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김상형님의 프로필 이미지
김상형
질문자

보내주신 링크를 저도 확인했었는데, 제가 제대로 이해한 건진 모르겠지만 질문의 요지가 저랑은 달랐다고 생각했습니다

제 생각에 링크의 요지는 객체가 호출될 때 마다 새로운 인스턴스를 반환하는 이유가 질문자의 생각과 일치하는지 였고 반면에

제가 궁금했던 점은 프록시 객체를 사용했는데, 로그에 CGLIB라는 라이브러리로 상속 받은 가짜 프록시 객체라고 나오지 않았다는점과 addCount메서드가 제대로 동작하지 않는다는 점이었습니다