본문으로 바로가기
반응형

 

 

 

▶ AOP란?

 

Aspect Oriented Programming의 약자로, 직역하자면 관점 지향 프로그래밍이라는 뜻을 가졌다.

쉽게 말해 비즈니스 로직을 구현할 때, 

그 로직을 담당하는 핵심 관심 사항(core concern)

로직외에 적용하고자 하는 공통 관심 사항을 분리 하는 것이다.

 

 

 

 

 

 

말로 설명하기엔 이해하기가 어렵다.

 

 

실제 사례를 보고 코드를 작성하면서 알아보고자 한다.

 

 

 

 

 

 

 


ex. 회원가입 서비스 로직을 동작하는 데 걸리는 시간

 

 

회원가입 로직을 작성하고

로직이 수행되는데 걸리는 시간을 구하고자 한다.

 

 

public Long join(Member member) {
 	long start = System.currentTimeMillis();
    
 	try {
 		validateDuplicateMember(member); //중복 회원 검증
 		memberRepository.save(member);
 		return member.getId();
 	} finally {
 		long finish = System.currentTimeMillis();
 		long timeMs = finish - start;
 		System.out.println("join " + timeMs + "ms");
 	}
 }

시작 시간과 끝 시간을 이용해서 어렵지 않게 알 수 있다.

 

 

 

 


 

 

하지만,

 

전체 서비스 로직(클래스)에 각각 걸리는 시간을 모두 다 알고 싶다면??

 

 

개인용 프로젝트이면 괜찮지만,

기업에서 쓰는 프로젝트는 어마어마한 서비스 로직을 갖고 있다.

 

 

그러면 각각의 서비스에 위에 코드처럼 작업을 수행해줘야 한다.

 

 

 

 

 

다행히도 Spring에는 AOP를 활용하여 이를 손쉽게 해결할 수 있다.

 

 

 

 

 

 

 

 


● AOP 적용

 

 

 

기존 프로젝트에 비즈니스 로직에 적용하는 코드의 작성 공간을 

별도로 하나 만들어준다.

 

 

 

 

 

 

TimTraceAop.java

package hello.hellospring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect // AOP 사용하려면
/* AOP 등록방법
   2. @Component 사용 */
@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");
        }

    }
}

 

AOP 문서대로 작성하면 크게 어려울 건 없다. 주석 설명을 참고하면 된다.

 

 

중요한 것은 joinPoint.proceed() 이다.

이것은 실제 비즈니스 로직(클래스)를 수행한다는 말이다.

(ex. pubilc void join() {}  <- 클래스 실행)

 

 

 

 

 

 

 

 

 

 

 

● 실행 결과

 

 

 

이제 모든 클래스에 시간 측정 AOP가 적용되었다.

이를 테스트해보고자 브라우저에서 서비스 로직을 실행하는 요청을 보내보고자 한다.

 

 

 

 

ex) 회원 목록 조회

 

 

회원 목록 조회를 눌러 

서비스 로직을 실행하면,,

 

 

 

 

 

 

서비스 로직 실행 시작 시간과 끝 시간이 측정되었다.

 

 

 

 

 

 

 

 


● AOP 동작원리

 

 

 

출처: 인프런 김영한 스프링 입문 강의

웹 개발을 할 때, 기본적으로  

controller  ->   service 로 요청을 한다.

 

 

 

 

 

 

 

AOP는 

controller에서 service로 넘어갈 때, 프록시라는 기술을 이용하여

가상 service를 만든다. 

 

이때 가상 service에서 join.proceed()를 할 경우

원래의 service가 실행된다.

(aop로 인해 생성된 service는 실제 웹서비스에 반영이 안됨)

반응형