[Spring] 빈 후처리기

전현준·2024년 10월 7일
0

Spring

목록 보기
16/17

개요


인프런 강의 [스프링 핵심 원리 - 고급편] 강의를 기반으로 작성한 글 입니다.



저번 시간

저번 시간에 [Spring] 프록시 자동 생성 : 프록시 팩토리에 대해서 공부했었다.

간단히 정리해보면, 프록시 팩토리를 통해서 인터페이스JDK 동적 프록시구체 클래스CGLIB로 자동 생성해주는 방법을 공부했었다.

근데 이 프록시 팩토리는 따로 적용해주어야해서, 컴포넌트 스캔이 되는 클래스는 적용할 수 없었고,
따로 @Configuration을 통해서 @Bean으로 등록해주어야 한다.

자동으로 빈을 등록해주는 스프링부트의 컴포넌트 스캔이 좋은건데, 그것을 무시하고 수동 등록한다?

또한, 모든 클래스를 수동 등록한다?

3개 클래스만 봐도 엄청난데, 클래스 많아지면 어쩔건데.. 수동 설정 파일은 조상님이 써주는 것도 아니고;;

그래서 빈 후처리기를 통해서, 컴포넌트 스캔이 대상이 되어 등록된 클래스도 후처리를 해줄 수 있다.



빈 후처리기

스프링 부트는 자동으로 컴포넌트 스캔 대상이 되면 빈으로 등록해준다.

RestControllerControllerComponent

우리가 흔히 붙이는 @RestController@Controller Annotation이 붙어있고,
@Controller@Component가 붙어있다.

이렇게 @Component Annotation이 붙은 클래스는 자동으로 컴포넌트 스캔 대상이 되어,
빈에 자동으로 등록이 된다.


근데 우리는 수동으로 빈을 등록하고 싶다. 등록된 빈을 나중에 처리하는 빈 후처리기를 사용하면 된다.

빈 후처리기를 이용하여 등록된 빈을 가져와, 추가 처리를 하고, 빈에 등록한다.

우리는 실제 객체 대신 프록시 객체를 등록할 것이다.


빈 후처리기 사용


빈 가져오기

일단 등록된 빈을 가져와보자.

AnnotationConfigApplicationContext 메소드를 이용하여
어플리케이션 컨텍스트 내부에 Configuration로 annotation 선언된 클래스를 가져올 수 있다.

BeanPostProcessorConfig Class 내부에 있는 beanA 이름으로 선언되어 있는, B Class를 가져온다.

그러면 선언되어 있는 클래스들을 살펴보자.

BeanPostProcessorConfig Class 내부에 beanA 이름으로 선언되어 있는 클래스는 A Class이다.

오잉? 분명히 윗 줄에서 B Class를 가져온다고 했는데, 어찌된 일일까?

사실 아래 선언되어 있는 빈이 우선권을 가져서 아래의 빈을 가져온다.
AToBPostProcessor를 상세히 살펴보자

AToBPostProcessorBeanPostProcessor 인터페이스를 구현하여 만들어졌다.

이 인터페이스를 구현하여 postProcessAfterInitialization 메소드를 오버라이드 하면, 우리가 원하는 빈 후처리기가 된다.

그러면 여기서 빈 후처리기에 담긴 로직을 살펴보면,
매개변수로 들어온 객체의 인스턴스 타입이 A이면, B를 Return 하라는 간단한 로직이다.

이렇게 우리가 원하는 빈 후처리기 로직을 담아 인터페이스를 구현하여 작성하면 된다.


이걸 알았다면 떠오르는게 있지 않은가?

객체를 받아서, 프록시 객체를 생성하여 리턴해주면 된다!



실제 적용

다시 윗 내용을 정리해보자.

  1. BeanPostProcessor 인터페이스를 구현한다.
  2. postProcessAfterInitialization 메소드를 오버라이드하여 빈 후처리기에 필요한 로직을 작성한다.
  3. 인터페이스를 구현한 클래스를 빈에 등록하여 사용한다.

1번과 2번을 적용하면 다음과 같다.

그럼 3번을 적용하기 위해, 빈에 등록해주자.

아래 코드처럼 logTracePostProcessor를 빈으로 등록해주고,
아까 선언한 클래스를 리턴하여 빈으로 수동 등록해주었다.

또한, 프록시에서 중요한 [Pointcut, Advice]인 Advisor도 넘겨주어 프록시 로직을 수행한다.

ProxyApplicationConfiguration 클래스를 등록해주어 수동 등록하는 것을 잊지 말자.

이것 말고도, 스프링에서 빈 후처리기를 지원한다.



스프링이 지원하는 빈 후처리기

지금까지는 빈 후처리기 로직을 작성하여, 빈을 등록했다.

사실 우리가 등록하고자 하는 것은 프록시 객체이다. 프록시에 중요한 것은 무엇인가.

어디에 프록시를 적용할 것인지, 어떤 로직으로 적용할 것인지 작성되는
AdvicePointcut로 구성된 Advisor이다.

사실 Advisor를 빈으로 등록하면, 스프링이 알아서 빈 후처리기로 프록시 객체를 등록해준다.
진짜 못하는게 뭐야 스프링 부트

포인트컷과 어드바이스를 등록해두었다.

여기서 볼 수 있는 포인트컷의 표현은
hello.proxy.app 패키지 내부의 하위 클래스, 메소드, 매개변수를 등록한다.

하지만, 메소드 이름이 noLog인 것은 제외한다.

profile
백엔드 개발자 전현준입니다.

0개의 댓글

관련 채용 정보