소개
게시글
질문&답변
의존관계 주입 가능 질문
제 생각에는 크게 2가지 이유가 있을 것 같네요! 우선 첫번째로는 적어주신대로 JDK 동적 프록시 같은 경우에는 인터페이스를 반드시 필요로하기 때문입니다. 실제 개발을 하다보면 인터페이스 없이 구체 클래스에 의존하는 경우도 많은데, CGLib 덕분에 AOP를 적용하기 위한 모든 빈들에게 인터페이스를 만들어주지 않아도 되기 때문입니다. 그리고 두번째로는 JDK 프록시를 적용한다면 인터페이스 주입만 가능한 반면에 CGLib을 적용하면 인터페이스 주입과 구체 클래스 주입이 모두 가능하기 때문입니다. 그러므로 구현체(구체 클래스)에 의존해야 하는 경우가 있다면 유연하게 대처할 수 있습니다. 만약 JDK 프록시가 적용되었을 때 구체 클래스를 주입받으려고 하면 빈을 찾을 수 없어서 에러가 발생하기 때문입니다. 혹시 잘못된 내용이나 부족한 설명 있으면 영한님께서 교정해주시면 좋을 것 같네요!감사합니다:)
- 0
- 1
- 297
질문&답변
프록시 적용 시 Controller 동작 원리
저도 궁금해서 조금 찾아봤었는데 찾아본 내용 공유해드릴께요! 아시다시피 RequestMappingHandlerMapping은 초기화될 때 HttpMethod, URI 등의 조건들과 함께 처리할 대상 정보(HandlerMethod)을 찾아서 관리를 해둡니다. 그리고 컨트롤러의 메소드는 리플렉션을 통해 호출되므로 당연히 HandlerMethod에는 Method 객체도 존재합니다. (사진) 마찬가지로 프록시 클래스도 핸들러 메소드로 등록될 후보군이므로 위와 같이 mappingReistry에 등록되는 작업이 진행됩니다.(여기서 mappingRegistry는 API 요청이 왔을 때 HttpMethod, URI 등을 조합하여 요청을 처리할 대상 정보를 관리하는 객체라고 이해하시면 됩니다.) 위의 mappingReistry에 등록하는 작업은 컨트롤러에 존재하는 Method들을 분석하여 처리되는데, 이때 스프링이 자체적으로 만든 AnnotationScaners라는 클래스가 사용됩니다. 그리고 이 클래스를 통해서 상위 메소드의 어노테이션 정보(@RequestMapping)까지 얻어오게 됩니다. 그러므로 오버라이딩된 프록시 클래스의 메소드는 상위 메소드의 @RequestMapping에 의해 스프링의 mappingRegistry에 등록이 되어 요청이 왔을 때 디스패처 서블릿에 의해 응답이 가능해집니다. 그래서 결국 질문 주신 내용의 답변을 정리하면 프록시 컨트롤러가 스프링 빈으로 등록되는 것이며, 프록시 컨트롤러의 오버라이딩 된 메소드는 부모 메소드 어노테이션까지 파싱하므로 이러한 동작이 가능하다라고 이해하시면 될 것 같습니다. 최대한 짧고 간단하게 설명드리려고 했는데 간단한 내용이 아니라서 잘 전달되었는지 모르겠습니다.혹시 잘못된 내용이 있으면 영한님께서 교정해주시면 좋을 것 같네요!감사합니다:)
- 0
- 1
- 209