-
스코프와 프록시spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 12. 21:11
이번에는 프록시 방식을 사용해보자
이전에 굳이 @Scope("request") 로 하지않고, value를 넣은 이유가 있다
이렇게 값이 두개 이상 들어가야 한다면 value를 넣어야 한다
이전에 클라이언트의 요청이 없어서 빈을 생성하지 못하여 에러가 났던 것을 기억할 것이다
현재 그 상태와 동일한 상태에서 위 처럼 프록시모드만을 추가한 상태이다
- 여기가 핵심이다. proxyMode = ScopedProxyMode.TARGET_CLASS 를 추가해주자
- 적용 대상이 인터페이스가 아닌 클래스면 TARGET_CLASS 를 선택
- 적용 대상이 인터페이스면 INTERFACES 를 선택
- 이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 HTTP request와 상관 없이 가짜 프록시 클래스를
다른 빈에 미리 주입해 둘 수 있다실행해보면...
놀랍게도 잘 동작하는 모습이다
myLogger에 어떤 값이 들어갔는지 출력 해보자
가물가물 하지만, 스프링이 객체를 조작할 때 봤던 문구인 SpringCGLIB 가 적혀있는걸 볼 수 있다
CGLIB 라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다
- @Scope 의 proxyMode = ScopedProxyMode.TARGET_CLASS 를 설정하면 스프링 컨테이너는 CGLIB라는
바이트 코드를 조작하는 라이브러리를 사용해서, MyLogger를 상속받은 가짜 프록시 객체를 생성한다
- 결과를 확인해보면 우리가 등록한 순수한 MyLogger를 상속받은 MyLogger$$SpringCGLIB$$0 라는
클래스로 만들어진 객체가 대신 등록된 것을 확인할 수 있다
- 그리고 스프링 컨테이너에 "myLogger"라는 이름으로 진짜 대신에 이 가짜 프록시 객체를 등록한다
- ac.getBean("myLogger", MyLogger.class) 로 조회해도 프록시 객체가 조회되는 것을 확인할 수 있다
- 그래서 의존관계 주입도 이 가짜 프록시 객체가 주입된다
가짜 프록시 객체는 요청이 오면 그때 내부에서 진짜 빈을 요청하는 위임 로직이 들어있다
- 가짜 프록시 빈은 내부에 진짜 MyLogger를 찾는 방법을 알고 있다
- 클라이언트가 myLogger.logic() 을 호출하면 사실은 가짜 프록시 객체의 메서드를 호출한 것이다
- 가짜 프록시 객체는 request 스코프의 진짜 myLogger.logic()를 호출한다
- 가짜 프록시 객체는 원본 클래스를 상속 받아서 만들어졌기 때문에 이 객체를 사용하는 클라이언트 입장에서는
사실 원본인지 아닌지도 모르게, 동일하게 사용할 수 있다
동작 정리
- CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다
- 이 가짜 프록시 객체는 실제 요청이 오면 그때 내부에서 실제 빈을 요청하는 위임 로직이 들어있다
- 가짜 프록시 객체는 실제 request scope와는 관계가 없다. 그냥 가짜이고, 내부에 단순한 위임 로직만 있고,
싱글톤 처럼 동작한다
특징 정리
- 프록시 객체 덕분에 클라이언트는 편리하게 request scope를 사용할 수 있다
- 사실 Provider를 사용하든, 프록시를 사용하든 핵심 아이디어는
진짜 객체 조회를 꼭 필요한 시점까지 지연처리 한다는 점이다
- 단지 에노테이션 설정 변경만으로 원본 객체를 프록시 객체로 대체할 수 있다
이것이 바로 다형성과 DI 컨테이너가 가진 큰 강점이다
- 꼭 웹 스코프가 아니어도 프록시는 사용할 수 있다
주의점
- 마치 싱글톤을 사용하는 것 같지만 다르게 동작하기 때문에 결국 주의해서 사용해야 한다
- 이런 특별한 scope는 꼭 필요한 곳에만 최소하해서 사용하자
무분별하게 사용하면 유지보수가 어려워진다혼자 중얼거리면서 정리하다가 납득이 갈만한 비유가 떠올라서 적어본다
시험장에 들어가면 시험시작 10분 전에 출석체크(스프링 컨테이너에 빈을 등록)를 하는 경우가 있다
프록시 객체는 시험시작까지 자리를 지키며 출석에 응하다가, (지연처리)
실제 시험이 시작하면 진짜 객체와 통신...을 하면 안되지만...
아무튼 진짜 객체의 정보를 내려받아 실행한다 (상속)
'spring > 스프링 핵심 원리 강의 내용 정리' 카테고리의 다른 글
영속성 컨텍스트 (0) 2024.01.23 총 정리 (0) 2023.12.12 스코프와 Provider (0) 2023.12.12 request 스코프 예제 만들기 (0) 2023.12.12 웹 스코프 (0) 2023.12.12