커피와 개발자

AOP(Aspect Oriented Programming) 설정 본문

프로젝트/Spring Boot

AOP(Aspect Oriented Programming) 설정

광박이 2022. 10. 11. 14:12
728x90

AOP(Aspect Oriented Programming)

AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍입니다. 어떠한 기준을 정하고, 관점을 나누어서 각 관점 별로 모듈화를 하여 사용하는 방식입니다.
비즈니스 로직과 공통 기능으로 구분을 하고, 공통 기능은 필요한 시점에 불러와서 적용하는 프로그래밍 방법입니다.

관심 지향 프로그래밍은 프로그램 로직을 명확한 부분들(이른바 관심사)로 나누는 것을 수반합니다. 거의 모든 프로그래밍 패러다임들은 관심사들을 별도의 독립적인 엔티티로 그룹화하고 캡슐화하는 것을 어느 정도는 지원하며, 이는 이러한 관심사들을 구현, 추상화, 합성하기 위해 사용할 수 있는 추상화(예: 함수, 프로시저, 모듈, 클래스, 메서드)를 제공함으로써 수행됩니다.
일부 관심사들은 프로그램 내의 여러 추상적 개념들에 영향을 미치며 이러한 형태의 구현체를 거역하는데, 이러한 관심사들을 흩어진 관심사(크로스 커팅 관심사, cross-cutting concerns)라고 부릅니다.

AOP 주요 Annotation :

어노테이션 의미
@Aspect AOP를 정의하는 Class에 할당
@Pointcut 기능을 어디에 적용시킬 것인지 지점을 설정
@Before 메소드가 실행되기 이전
@After 메소드가 성공적으로 실행 후, 예외가 발생되더라도 실행
@AfterReturing 메소드 호출 성공 실행시 (Not Throws)
@AfterThrowing 메소드 호출 실패시 예외발생 (Throws)
@Around Before / After 모두 제어

pom.xml - dependency 적용 :

pom.xml 파일에 spring-boot-starter-aop dependency를 적용합니다.

@EnableAspectJAutoProxy 적용 :

최상위 패키지에 있는 Application 클래스에 Annotation을 적용해서 AOP를 찾을 수 있도록 합니다.

Aspect 적용 :

LoggerAspect.java를 생성하고 공통기능을 정의하고 공통기능이 사용될 시점을 정의합니다.

AOP 적용 시점 pointcut 표현식 :

Pointcut JoinPoints
execution(public * *(..)) public 메소드 실행
execution(* set*(..)) 이름이 set으로 시작하는 모든 메소드명 실행
execution(* get*(..)) 이름이 get으로 시작하는 모든 메소드명 실행
execution(* com.pkg.service.AccountService.*(..)) AccountService 인터페이스의 모든 메소드 실행
execution(* com.pkg.service.*.*(..)) service 패키지의 모든 메소드 실행
execution(* com.pkg.service..*.*(..)) service 패키지와 하위 패키지의 모든 메소드 실행
within(com.pkg.service.*) service 패키지 내의 모든 결합점 (클래스 포함)
within(com.pkg.service..*) service 패키지 및 하위 패키지의 모든 결합점 (클래스 포함)
bean(*Repository) 이름이 “Repository”로 끝나는 모든 bean
bean(*) 모든 bean
bean(account*) 이름이 account 로 시작되는 모든 bean
bean(*dataSource) || bean(*DataSource) 이름이 dataSource 나 DataSource 으로 끝나는 모든 bean

결과 확인 :

http://localhost:9090/sample 접속 후 로그 확인

2022-05-21 21:45:35,863 [INFO ] [http-nio-9090-exec-1] s.p.s.c.i.LoggerInterceptor: /********** BEGIN **************************************************
2022-05-21 21:45:35,864 [INFO ] [http-nio-9090-exec-1] s.p.s.c.i.LoggerInterceptor:  * Request URI : /sample
2022-05-21 21:45:35,877 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * AspectJ : Around Logging BEGIN
2022-05-21 21:45:35,878 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * Controller 	 : std.pjt.springboot.sample.controller.SampleController.page()
2022-05-21 21:45:35,879 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * AspectJ : Before Logging BEGIN
2022-05-21 21:45:35,879 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * AspectJ : Before Logging END
2022-05-21 21:45:35,899 [DEBUG] [http-nio-9090-exec-1] s.p.s.s.c.SampleController: SampleController.page debug log
2022-05-21 21:45:35,899 [INFO ] [http-nio-9090-exec-1] s.p.s.s.c.SampleController: SampleController.page info log
2022-05-21 21:45:35,900 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * Service    	 : std.pjt.springboot.sample.service.impl.SampleServiceImpl.getList()
2022-05-21 21:45:35,909 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * AspectJ : AfterReturning Logging BEGIN
2022-05-21 21:45:35,909 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect: 	     * AspectJ : AfterReturning Logging END
2022-05-21 21:45:35,909 [INFO ] [http-nio-9090-exec-1] s.p.s.c.a.LoggerAspect:       * AspectJ : Around Logging END
2022-05-21 21:45:35,910 [INFO ] [http-nio-9090-exec-1] s.p.s.c.i.LoggerInterceptor:  *********** END ***************************************************/
728x90

'프로젝트 > Spring Boot' 카테고리의 다른 글

DataBase 연동 (MariaDB, HikariCP)  (0) 2022.10.11
Argument Resolver 설정  (0) 2022.10.11
jsonView 설정  (0) 2022.10.11
Interceptor 설정  (0) 2022.10.11
log4j2 설정  (0) 2022.10.11
Comments