[스프링 입문] AOP의 개념과 적용

김우경·2021년 1월 12일
0

Spring Framework

목록 보기
9/12

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶을때!
    → 이 기능은 핵심 관심 사항이 아니고, 공통 관심 사항이다.
    → 두가지가 섞여있으면 유지보수가 어렵고, 시간측정 로직을 별도의 로직으로 뽑기 어렵다.

→ 변경시에는? (e.g. s → ms) 모든 로직을 찾아들어가서 수정해야됨

핵심 관심 사항 vs 공통 관심 사항

  • 핵심 관심 사항 : 핵심 비즈니스 로직
    → 이의 모듈화? OOP

  • 공통 관심 사항 : 인프라/부가 기능 → 주 목적 외 필요한 부가기능들
    e.g. 로깅, 트랜잭션
    → 이의 모듈화? AOP

AOP의 적용

AOP란?

Aspect Oriented Programming
→ 공통 관심 사항과 핵심 관심 사항의 분리!
→ 어플리케이션 전체에 걸쳐 사용되는 공통 관심사항을 재사용하도록 지원
→ 원하는 곳에 공통 관심 사항을 적용한다.

AOP 적용하기

/aop/TimeTraceAOP

@Aspect
@Component
public class TimeTraceAOP {

    //이 공통 관심사항을 어디에 타겟팅할건지???
    @Around("execution(* hello.hellospirng..*(..))")
    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");
        }
    }
}
  • @Aspect : 핵심기능에 부가되어 의미를 갖는 특별 모듈

  • @Component : AOP를 스프링 빈에 등록하기 → spring config에 등록도 가능

  • @Aruond : 이 공통 관심사항을 어디에 타겟팅할 것인지 지정하기

    @Around("**execution**(* hello.hellospirng..*(..))") 에서

    • execution : 포인트컷 지정자 (부가 기능이 적용될 대상 메소드 선정)
    • * : 리턴 타입 → 현재는 모든 타입 리턴
    • hello.hellospirng..* : 타겟이 되는 메소드 지정
    • (..) : 인자 타입
  • proceed() : 타겟 메소드 지칭 → 이를 실행 시켜야 타겟 메소드가 수행됨

실행 시

→ 어디에 병목이 있는지 확인 가능 !!

AOP의 동작 과정

: 프록시 기술의 사용

  • 프록시 ? 타겟을 감싸서 타겟의 요청을 대신 받아주는 Wrapping Object

  • 클라이언트에서 타겟 호출시 타겟이 아닌 프록시가 호출
    → 호출을 가로챈 후 @Advicde에 등록된 기능 수행 → 타겟 메소드 호출

  • 가짜 스프링빈을 등록 → 끝나면 joinPoint.proceed()호출 후 실제 memberServie 실행

출처

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
조졸두님의 AOP 정리 (1)

profile
Hongik CE

0개의 댓글