[Spring Boot]6.AOP정리

※스프링 부트 시작하기 책에 있는 내용 정리

1.AOP는 OOP(Object Oriented Programming:객체지향 프로그래밍)를 더욱 OOP답게 사용하도록 도와주는개념

2.AOP는 관점지향 프로그래밍이라고 하는데 자신의 관점에서 보는것이 아닌 제3자가 보는 관점에서 바라본다고 생각하면 된다.

3.AOP는 어떤 로직을 기준으로 핵심적인 관점,부가적인 관점으로 나눠서 보고 그 관점을 기준으로 각 모듈화를 하여 사용한다.

※AOP에대한 용어를 정리

  • 관점(Aspect) : 공통적으로 적용될 기능을 의미한다. 횡단 관심사의 기능이라고 할수 있고, 한개이상의 pointcut과 advice의 조합으로 만들어진다.

  • 어드바이스(Advice) : 관점의 구현체로 조인 포인트에 삽입되어 동작하는 것을 의미한다. 스프링에서 사용하는 어드바이스는 동작하는 시점에 따라 다섯종류로 구분된다.

  • 조인포인트(joinpoint) : 어드바이스를 적용하는 지점을 의미한다. 스프링 프레임워크에서 조인포인트는 항상 메서드 실행 단계만 가능하다.

  • 포인트컷(pointcut) : 어드바이스를 적용할 조인포인트를 선별하는 과정이나 그 기능을 정의한 모듈을 의미 정규표현식이나 AspectJ의 문법을 이용해서 어떤 조인포인트를 사용할 것인지 결정

  • 타깃(Target) : 어드바이스를 받을 대상을 의미한다.

  • 위빙(weving) : 어드바이스를 적용하는 것을 의미한다. 즉, 공통 코드를 원하는 대상에 삽입하는 것을 뜻한다.

 

※어드바이스(Advice) 동작시점에 따른 다섯가지 종류

  • Before Advice(@Before) : 대상 메서드가 실행되기 전에 적용할 어드바이스를 정의

  • After returning Advice(@AfterReturning) : 대상 메서드가 성공적으로 실행되고 결과값을 반환한 후 적용할 어드바이스를 정의한다.

  • After throwing Advice(@AfterThrowing) : 대상 메서드에서 예외가 발생 했을때 적용할 어드바이스를 정의한다. try/catch문의 catch와 비슷한 역할을 한다.

  • After Advice(@After) : 대상 메서드의 정상적인 수행 여부와 상관없이 무조건 실행되는 어드바이스를 정의. 즉 예외가 발생하더라도 실행되기 때문에 자바의 finally와 비슷한 역할을 한다.

  • Around Advice(@Around) : 대상 메서드의 호출 전후, 예외 발생등 모든 시점에 적용할수 있는 어드바이스를 정의한다. 가장 범용적으로 사용할 수 있는 어드바이스입니다.

※PointCut(포인트컷)에 대한 명시자 정리

  • excution : 가장 대표적이고 강력한 지시자로 접근 제어자, 리턴 타입 ,타입패턴 ,메서드,파라미터 타입,예외타입등을 조합해서 가장 정교한 포인트컷을 만든다.(예)select*)
    (..)은 0개이상의 파라미터,메서드,패키지등 모든것을 의미한다.
    사용예)
    excution(void select*(..))
    excution(* board.controller.*())
    excution(* board.controller.*(..))
    excution(* board..select*(*))
    excution(* board..select*(*,*))
    - 리턴타입이 void이면서 메서드 명이 select로 시작하며 파라미터가 0개 이상메서드
    - board패키지 밑에 파라미터가 없는 모든 메서드
    - board패키지 밑에 파라미터가 0개이상 모든 메서드
    - board패키지의 모든하위 패키지에 있는 select로 시작하고 파라미터가 한개인 모든 메소드
    - board패키지의 모든 하위 패키지에 있는 select로 시작하고 파라미터가 두개인 모든 메서드

  • withub : 특정 타입에 속하는 메서드를 포인트컷으로 설정합니다.
    사용예)
    within(board.service.boardServiceImpl)
    within(board.service.*ServiceImpl)
    - board.service 패키지 밑에 있는 boardServiceImpl 클래스의 메서드가 호출 될때
    - board.service 패키지 밑에 있는 ServiceImpl이라는 이름으로 끝나는 메서드가 호출될때

  • bean : 스프링의 빈 이름의 패턴으로 포인트 컷을 설정합니다.
    bean(boardServiceImpl)
    bean(*ServiceImpl)
    - boardServiceImpl이라는 이름을 가진 빈의 메서드가 호출 될때
    - ServiceImpl이라는 이름으로 끝나는 빈의 메서드가 호출 될때

 

1.아래와 같이 로그 출력시에 대한 AOP를 적용

2.적용하면 아래와 같이 노출이 된다.

 

댓글을 작성해보세요.