leelee.log

[Spring] @annotaion으로 Spring AOP 기능 구현 본문

개발/Backend

[Spring] @annotaion으로 Spring AOP 기능 구현

leeleelee3264 2020. 2. 18. 20:41

spring framework

 AOP를 쓸 때 대부분 Aspect용 class를 만들어서 거기다가 @Around, @Before 등을 이용해서 Controller나 Service의 로그를 찍는 걸 봤는데 아예 AOP용 어노테이션을 만들어서 진행하는 게 너무 좋아보여서 다음에도 써보려고한다. Aspect class 를 만들었을 땐 몰랐는데 아예  코드에 명시가 되어있으니 직관적이다.

 

 

 

 어노테이션을 직접 만들 수 있다는게 놀랍다. @Target은 java의 어디 부분에 쓸꺼냐는 뜻인데 나는 상세하게 보기 위해 Controller의 메소드들에 찍어볼테니 ElementType.METHOD가 되고 Retention은 저 어노테이션이 언제까지 살아있냐는 뜻.

 

 

 Aspect class에 와서 AOP 상세 조정을 해준다. AOP에 관련된 클래스라는 걸 알려주기 위해 @Aspect 어노테이션을 사요용했고 얘도 bean으로 만들어서 IoC가 관리를 하기 위해 @Component를 붙였다. @Bean은 내가 직접 수정이 불가능한 외부 라이브러리의 기능이 들어있는 객체를 빈으로 만들기 위한 어노테이션이고, @Component는 아예 클래스 전체를 머리부터 발 끝까지 다 내 맘대로 만드는 객체다.

 ProceedingJoinPoint는 여기서는 내가 어노테이션을 추가해준 메소드들을 실행을 관리하는 객체인가 싶다. proxy pattern으로 위아래를 StopWatch로 감싸주고 Clinet코드는 Client코드대로 작동이 되게 한다.

 

 실제로 사용하기 위해서는 Controller에 있는 메소드들에 어노테이션을 써주기만 하면 된다. 아예 Aspect class에서 다 처리해버리면 aop 써서 로그 찍는다는걸 모를텐데 여기처럼 아예 써버리면 얘가 지금 aop로 찍히고 있구나 확실히 보이겠다 싶다.

 

 

Aspect.java의 일부

 Aspect class에 들어가보면 옆에 m자로 빨간 동그라미가 생겼는데 저걸 눌러보면 이 aop가 어느 메소드에 적용이 되었는지 한꺼번에 다 볼 수 있다. 편함!

'개발 > Backend' 카테고리의 다른 글

[Spring] Bean LifeCycle  (0) 2020.03.13
[Spring] PSA란 무엇인가?  (2) 2020.03.05
[Spring] IoC 컨테이너와 Bean, DI  (0) 2020.02.23
[Spring] Spring AOP를 구현하는 Proxy Pattern  (0) 2020.02.16
[Spring] Inversion of Control  (0) 2020.02.08