성실한 사람이 되자

성실하게 글쓰자

This is spear

JAVA_SPRING

SPRING - 프록시

Imaspear 2021. 12. 28. 20:44
728x90

@Scope(value = “request”, proxyMode = ScopedProxyMode.TARGET_CLASS) 스프링이 조작해서 만든 빈이 등록이 되어있다. 즉 껍데기 구현체를 집어 넣고, 기능이 실제 호출하는 시점에서 진짜 객체를 찾아 넣는 작업을 한다.

CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다.

 

  • @Scope 애너테이션의 proxyMode = ScopedProxyMode.TARGET_CLASS 명령어를 설정하면 스프링 컨테이너는 CGLIB 라는 바이트코드를 조작하는 라이브러리를 사용해 MyLogger를 상속받은 가짜 프록시 객체를 생성한다.
  • 결과를 확인하면 우리가 등록한 순수한 MyLogger 클래스가 등록되는 것이 아닌 스프링이 바이트 코드를 조작한 가짜 프록시 객체가 만들어져 등록된다.
  • 나중에 빈을 조회해도 프록시 객체가 조회된다.

 

의존관계 주입도 가짜 프록시 객체가 주입되어 실행되게 때문에, 요청이 있어야 실행하는 request 스코프도 오류 없이 실행 시킬 수 있고, 실제 요청이 들어와 작업을 할 필요가 있을 떄, 프록시 객체는 실제 필요한 객체를 가져와 작업을 하도록 도와준다. 가짜 프록시 객체는 요청이 오면 그때 내부에서 진짜 빈을 요청하는 위임 로직이 들어있다.

 

프록시 빈은 내부에서 실제 객체를 찾아오는 방법을 가지고 있다. 클라이언트가 해당 프록시 빈을 호출할 때, 가짜 프록시 객체의 메서드를 호출한 것이고, 이 호출을 받을 떄, 프록시 빈은 request 스코프를 호출해 해당 작업을 실행한다.

 

어떻게 이게 가능한가?

프록시 객체는 원본 클래스를 상속 받아 만들어지기 때문에 해당 객체를 사용하는 클라이언트 입장에서 프록시를 볼 때, 다형성의 특징(실제 객체와 동일하게 사용할 수 있는 특징)을 가지고 있기 때문에 가능한 일이다.

 

정리

  • 프록시를 이용하면 싱글톤을 사용하 듯 편리하게 request 스코프를 사용할 수 있다.
  • 사실 Provider를 사용하든 프록시를 사용하든 핵심 아이디어는 진짜 객체 조회를 꼭 필요한 시점까지 지연처리 한다는 점이다.
    • 진짜 HTTP 요청이 올 때까지 버티는 상황이다.
  • 단지 애너테이션 설정 변경만으로 원본 객체를 프록시 객체로 대체할 수 있다. 이것이 바로 다형성과 DI 컨테이너가 가진 큰 장점이다.
  • 꼭 웹 스코프가 아니더라도 프록시를 사용할 수 있다.

 

주의점

  • 마치 싱글톤을 사용하는 것 같지만 다르게 동작하기 때문에 결국 주의해서 사용해야 한다.
  • 이런 특별한 스코프는 꼭 필요한 곳에만 최소화해서 사용하자!! 무분별하게 사용하면 유지보수가 힘들다.

'JAVA_SPRING' 카테고리의 다른 글

스프링에서 로깅  (0) 2022.01.18
SPRING - 스프링 기본 원리 정리를 끝으로 생각 정리  (0) 2021.12.28
SPRING - 웹 스코프  (0) 2021.12.28
SPRING - 빈 스코프  (0) 2021.12.28
SPRING - 빈 생명 주기  (0) 2021.12.28