ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring 입문 7~8주차
    BackEnd/Spring 2022. 8. 12. 04:38

    ✅ 섹션8은 다음 강의 로드맵 설명이라 섹션 7, AOP(Aspect Orient Programming) 내용을 정리하려 한다. 

     

    🧃 AOP? 

    - 공통 관심사항과 핵심 관심사항을 분리하는 것.

    - 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화한다.

    - 소스 코드 상에서 다른 부분에 반복해서 쓰는 코드들을 흩어진 관심사로 정의하고 이들을 Aspect로 모듈화한다.이로써 핵심적인 비즈니스 로직에서 분리가 가능하다. 

    - AOP 또한 스프링 빈에만 적용 가능하므로 Spring.Config파일에 Bean으로 등록하거나 @Component 어노테이션을 추가해줄 것. 

     

    🤔 공통 관심사와 핵심 관심사를 분리하는 것이란? 

    - 예를 들어, 모든 메소드의 수행시간을 측정하고 싶다 가정.

    - 메소드의 수행시간을 측정하는 것은 모든 코드에 적용되는 공통적인 기능이므로, 각 비즈니스 로직에 똑같이 들어가게 된다. 

    - 이를 따로 "공통 관심사"로 정의하고 핵심 비즈니스 로직으로부터 분리한다. 

     

    🧃 용어들

    Aspect : 흩어진 관심사들을 모듈화 한 것
    Target : Aspect를 적용하는 곳 -> @Around가 타겟 메서드를 감싸서 특정 Advice를 실행하겠다는 의미
    Advice : 어떤 일을 해야할지 부가기능을 담은 구현체
    JointPoint : Advice가적용될 위치(메서드 진입지점, 생성자 호출시점 등)
    PointCut : JointPoint의 상세한 스펙을 정의한 것

     

    🧃 예제 코드

    @Aspect
    @Component
    public class TimeTraceAop {
    
        @Around("execution(* hello.hellospring..*(..))")
        public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
            long start = System.currentTimeMillis();
            System.out.println("START : " + joinPoint.toString());
            try {
                return joinPoint.proceed();
            } finally {
                long finish = System.currentTimeMillis();
                long timeMs = finish - start;
                System.out.println("END : " + joinPoint.toString() + " " + timeMs + "ms");
            }
    
        }
    }

    📌 @Around로 어떤 로직 실행시 인터셉트를 걸지 원하는 적용대상을 선택할 수 있으며, 보통 패키지 단위로 지정함.
    Ex ) hello.hellospring.service 이런식으로 쓰면 서비스 하위만 측정 된다. 

    해당 빈의 모든 메소드의 적용한다던가, 어떤 어노테이션이 붙은 로직만 적용한다던가 지정이 가능. 

    'BackEnd > Spring' 카테고리의 다른 글

    Dependency Injection  (0) 2022.08.14
    Spring Intro  (0) 2022.08.12
    Spring Component Scan  (0) 2022.08.07
    Spring 입문 4 ~ 6주차  (0) 2022.08.05
    Spring Container  (0) 2022.07.31
Designed by Tistory.