스프링 입문-AOP

AOP란?

AOP(Aspect Oriented Programming)은 공통 관심 사항(어느 메서드던 들어갈 수 있는 호출 시간 측정, 로깅 등의 로직)과 핵심 관심 사항(핵심적인 비즈니스 로직)을 분리하고, 원하는 곳에 공통 관심 사항을 적용할 수 있는 기술이다.
AOP를 사용하면 핵심 관심 사항을 깔끔하게 유지가 가능하고, 원하는 곳에만 적용이 가능하며, 공통 관심 사항에 수정이 있어도 해당 AOP만 수정하면 된다는 많은 장점들이 있다.

package hello.hello_spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.hibernate.annotations.Comment;
import org.springframework.core.task.TaskRejectedException;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeTraceAop {
    @Around("execution(* hello.hello_spring..*(..))")
    public Object execut(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() + " " + "ms");
        }
    }
}

호출 시간 측정 로직을 AOP로 구현한 코드이다. hello_spring 패키지 하위 메서드들에 적용하도록 되어있다. 이렇게 AOP를 구현하면 리포지토리와 서비스의 많은 메서드들의 호출 시간을 일일이 메서드를 수정하지 않아도 측정해주는 것을 볼 수 있었다.
이러한 AOP의 작동 원리는 다음과 같다.

AOP

기존의 의존관계와 달리, AOP를 적용하면 스프링 빈에 등록된 해당 메서드를 불러오는 것이 아닌, 프록시 기술로 구현된 가짜 메서드=위의 코드를 불러온다. AOP로 등록된 해당 코드를 먼저 실행한 이후, joinPoint.proceed()로 진짜 메서드를 가져와 실행하는 방식이다.
위의 방식으로 별도의 공통 로직으로 만들기 까다로운 시간 측정과 같은 로직을 공통 로직과 같이 분리하여 구현할 수 있다. 해당 프록시가 실제로 작동하는지는 메서드 호출 시에 메서드 명을 출력하도록 구현하면 해당 메서드가 아닌 끝에 CGLib이 붙은 프록시 메서드가 호출된 것을 볼 수 있다.

여담

스프링 입문 강의가 이번 단원을 끝으로 끝이 났다. 더 이상 무엇을 공부하고 어떻게 프로젝트를 해야 하는지, 백엔드에선 기술들이 굉장히 많은데 어떤 기술을 공부해야 하고 그것이 어떻게 쓰이는지, 도대체 알 수 없고 길을 잃은 듯한 상황이었던 나에게 매우 도움이 된 강의였다.
스프링 컨테이너와 함께 자주 사용되는 기술들을 넓고 얕게 배우며, 그리고 직접 코드를 짜보며 해당 기술들이 어떻게, 왜 사용되는지를 배울 수 있었고, 앞으로의 학습 로드맵도 대략적으로 짜볼 수 있었다.
무엇보다도 아주 기초적이게나마 MVC등이 적용된 웹 개발을 실제로 해보았다는 것이 큰 경험이었던 것 같다. HTTP 등의 이론만 배우는 것과는 확실히 차이가 있었다.
앞으로 스프링 강의 로드맵을 따라 계속 들으며 완강한 후 개인 프로젝트를 해 볼 생각이다. 주제로는 ‘AI 생성 그림을 판매하는 쇼핑몰’로 기획 중이고, 해당 프로젝트를 하며 CRUD와 DB연동, 리팩토링 등을 진행해 볼 예정이다. 강의를 일단 열심히 듣자.