[기본기] 9-5. 스코프 프록시

khyojun·2022년 10월 16일
0
post-thumbnail

본 게시글은 김영한님의 스프링 핵심 원리 기본편을 정리한 글입니다.


이전까지는 ObjectProvider를 사용하여 주입시점을 특정하여 DL을 통해 주입을 시켰는데 이번에는 스코프 프록시 방식을 활용하여서 해결을 해보자.

📌 스코프 프록시

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger{
}

선언은 다음과 같이 하게 된다. 근데 여기 proxyMode에 TARGET_CLASSINTERFACES를 선택하게 되면 다음과 같은 차이가 있다.

TARGET_CLASS: 적용 대상이 인터페이스가 아닌 클래스
INTERFACES: 적용 대상이 인터페이스

이번에는 클래스에 적용하므로 TARGET_CLASS를 사용하게 되었다. 이렇게 사용할 경우 이제 다른 코드에 있는 ObjectProvider를 예전에 사용하였던 것처럼 다시 MyLogger로 사용을 한다.

📂 LogDemoService

@Service
@RequiredArgsConstructor
public class LogDemoService {
    private final MyLogger myLogger;

    public void logic(String id){
        myLogger.log("service id = " + id);
    }
}

📂 LogDemoController

@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final MyLogger myLogger;


    @RequestMapping("log-demo")
    @ResponseBody
    public void logDemo(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String requestURL = request.getRequestURL().toString();
        System.out.println("myLogger = " + myLogger.getClass());
        myLogger.setRequestURL(requestURL);
        myLogger.log("controller test");
        logDemoService.logic("testId");
        response.getWriter().write("ok");
    }
}

이렇게 진행을 하게 될 경우에는 이전 ObjectProvider를 활용한것처럼 실행이 된다. 그러면 차이점이 어떤걸까? 한 번 확인해보기 위해서 myLogger.getClass()를 통하여서 출력물을 확인해보자.

여기보면 원래라면 practicecore.ptcore.common.MyLogger@53f73b40이렇게 출력됬어야했는데 뒤에 $$EnhancerBySpringCGLIB$$8efa78fa 이렇게 뭔가가 추가됬는데? 이게 뭐지? 이것은 CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입을 해준다고 한다. 이게 어떻게 되는걸까?

일단 한 마디로하면 분신술 느낌이랄까? 가짜 클래스를 만들어서 임의로 일단 의존관계 주입을 시킨다. 그러면 우리가 필요로 할때만 딱 진짜 친구를 꺼내온다고 한다. 결론은 비장의 한 발을 준비하기 위해서 앞으로 가짜를 내보내고 진짜 불러질때만 진짜 객체를 불러온다.

특징

  • 프록시 객체 덕분에 클라이언트는 싱글톤 빈을 사용하는 것처럼 편리하게 request scope를 사용할 수 있다.
  • 사실 Provider를 사용하든, 프록시를 사용하든 핵심은 진짜 객체 조회를 꼭 필요한 시점까지 지연처리를 한다는 것이다.
  • 단지 어노테이션 설정 변경만으로 원본 객체를 프록시 객체로 대체할 수 있다. 이게 다형성, DI 컨테이너가 가진 큰 장점이다.
  • 꼭 웹 스코프가 아니어도 프록시는 사용할 수 있다.

오늘의 결론

오늘 스코프 프록시를 싱글톤이랑 비슷하다고 너무 남발해서 사용하지말자.

출처

  1. 김영한님의 스프링 핵심 원리 기본편(https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8)
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글