본문 바로가기
프로그래밍/Web.

[Spring] AOP(Aspect Oriented Programming)

by _Chavi 2020. 1. 16.

AspectJ를 이용한 AOP 구현 예시입니다.

저의 경우 사용자의 권한 체크 기능을 구현하는데 이용했습니다.

 

Maven - pom.xml 설정

Maven Repository(https://mvnrepository.com/artifact/org.aspectj/aspectjweaver) 기준 1.9.5 버전이 최신 버전입니다.

  ...
  <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.9.5</version>
  </dependency>
  <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.5</version>
  </dependency>
  ...
  

 

Aspect Class

  @Aspect
  @Componet
  public class SampleAspect {

      @Pointcut("excution(public * com.package.chavi..*Controller.*(..))")
      private void samplePointcut() {}

      /* Around must return 'Object(== 처리결과)' */
      @Around("samplePointcut()")
      public Object sampleAround1(ProceedingJoinPoin joinPoint) throws Throwable {

          try {
              /* TODO : Logic */
          } catch(Throwable t) {
              throw new CustomExcption();
          }

          if(/* TODO : Flag */) {
              throw new CustomExcption();
          }

          return joinPoint.proceed();

      }

      /* Around must return 'Object(== 처리결과)' */
      @Around("samplePointcut()")
      public Object sampleAround2(ProceedingJoinPoin joinPoint) throws Throwable {

          /* TODO : Logic_1 */

          Object data = joinPoint.proceed(); // 호출된 메서드 실행

          /* TODO : Logic_2 */

          return data;

      }

  }
  

 

@Pointcut : 작성한 관점의 적용 범위를 지정합니다. 

표현식 의미
execution(private * *(..)) private의 모든 메서드에 적용
execution(* set*(..)) 메서드명이 set*인 모든 메서드에 적용
excution(public * com.package.chavi..*Controller.*(..)) public의 패지키 하위 모든 *Controller들의 메서드에 적용
within(com.package.chavi.*) 패키지의 모든 메서드에 적용
within(com.package.chavi..*) 패키지의 하위 모든 메서드에 적용
bean(*) 모든 빈에 적용
execution(* set*(..)) || execution(* get*(..))
메서드명이 set*이거나 get*인 모든 메서드에 적용

이 외에도 여러 표현식이 있으며, 각 표현식은 &&, ||를 이용해 연결할 수 있습니다.

 

@Around : 지정된 Pointcut의 실행 전, 후의 동작을 작성할 수 있습니다.

  ※Around의 경우 무조건 Object 객체를 리턴하여야 합니다. 위경우엔 처리된 Response를 리턴했습니다.

@Before: 지정된 Pointcut의 실행 전의 동작을 작성할 수 있습니다.

@After: 지정된 Pointcut의 실행 후의 동작을 작성할 수 있습니다.

'프로그래밍 > Web.' 카테고리의 다른 글

[JSTL] replace - 개행문자 처리하기  (0) 2020.03.09
[Tomcat] it set 'X-Frame-Options' to 'deny'. 오류 해결법  (0) 2020.02.18
[Spring] Apache PDFBox  (0) 2020.02.13
[Spring] Maven - 501 Error  (0) 2020.02.10
[JavaScript] Cookie  (0) 2020.01.21

댓글