ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AOP (Aspect Oriented Programming) (자료: 백기선)
    SPRING 2020. 3. 23. 23:51

    AOP(Aspect Oriented Programming)

    AOP은 공통 된 기능(아래 AAAA, BBBB)을 메소드 실행시 수행하게 만드는 기법. 

    ​즉, AAAA, BBBB 와 같은 코드를 공통으로 관리하기 때문에, 소스관리에 편리하다. 

     

    AOP 주요 개념

    - Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.

    - Target : Aspect를 적용하는 곳 (클래스, 메서드)

    - Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체

    - JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능

    - PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class A { method a() {
                 AAAA 
                 세금게산서 발행
                 BBBB 
             }
     
             method b() { 
                AAAA 
                전자문서 발행 
                BBBB } 
     
    class B { method c() { 
                AAAA 
                메일 재전송
                BBBB 
                } 
            }
     

    실무에서 주로 사용하는 AOP는  @Transactonal 어노테이션을 주로 사용한다.

    @Transactional 은 All or Nothing 개념임.

    예시 : ) 은행 송금을 할때 모든 송금 관련 작업이 끝나지 않으면, 그 전 작업들이 모두 취소 되어 이체되지 않음.

    즉, 송금 관련 기능(작업)이 모두 수행되어야 실제 송금이 되는 개념을 말함.

     

    AOP 예제

    - 메서드 수행 시간을 측정하는 AOP 예제

    - 메서드 수행 시간 측정에 관한 AOP 어노테이션인 @LogExecutionTime을 붙임 (어노테이션 명은 사용자 마음대로...)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        @PostMapping("/owners/{ownerId}/edit")
        @LogExecutionTime
        public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result,
                @PathVariable("ownerId"int ownerId) {
            if (result.hasErrors()) {
                return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
            }
            else {
                owner.setId(ownerId);
                this.owners.save(owner);
                return "redirect:/owners/{ownerId}";
            }
        }
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

    * @LogExecutionTime을 쓰고 alt enter를 누를시에 Quick Quick FIX로 어노테이션 인터페이스가 생성됨.

     

    - 메서드를 타겟으로하고, Runtime시에 실행됨.

    1
    2
    3
    4
    5
    6
    7
    8
    @Retention(RetentionPolicy.RUNTIME)
    public @interface LogExecutionTime {
     
     
     
    }
     
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

    @Component 어노테이션을 붙여서 Bean 등록을 함.

    @Aspect 어노테이션 추가

    - AOP는 jointPoint를 받을 수 있는데 jointPoint가 타겟임.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @Component
    @Aspect
    public class LogAspect {
     
        Logger logger = LoggerFactory.getLogger(LogAspect.class);
     
        // joinPoint 받을 수있음  : jointPoint는 타겟임(LogExecutionTime을 붙인 메서드)
        @Around("@annotation(LogExecutionTime)")
        public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
     
            Object proceed = joinPoint.proceed();
     
            stopWatch.stop();
     
            return proceed;
        }
        
    }
     
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

    AOP가 등록 된 메서드를 호출하면 아래와 같이 수행시간이 console.log에 찍히는 것을 알 수있음.

     

     

    'SPRING' 카테고리의 다른 글

    Component와 ComponentScan 정리  (0) 2020.04.10
    @Autowired 심화 학습(자료 : 백기선)  (0) 2020.04.06
    DI 주입 방법(3가지)  (0) 2020.03.23
    IOC 란? (자료 : 백기선)  (0) 2020.03.22
    ObjectMapper로 Map-> Json 데이터 변환하기  (0) 2020.03.22
Designed by Tistory.