Spring Boot 공부 일기 <18> - AOP(관점 지향 프로그래밍)

이동휘·2024년 9월 11일

Spring Boot

목록 보기
18/21

1. IDE

Intellij

2. 오늘 공부 내용

AOP(관점 지향 프로그래밍)

  • 횡단 관심사를 분리하여 모듈화하는 프로그래밍 패러다임
  • 로깅, 트랜잭션 관리, 보안, 예외 처리와 같은 비지니스 로직과는 독맂겅니 횡단 관심사를 쉽게 처리할 수 있도록 지원
  • 비즈니스 로직 외의 로직을 별도로 관리하고 유지보수성을 높이기 위해 효과적으로 사용

AOP 주요 개념

  • Aspect(애스펙트):
    • 횡단 관심사를 모듈화한 단위입니다. 애스펙트는 보통 특정한 기능(예: 로깅, 보안, 트랜잭션 관리 등)을 가짐
    • Spring에서는 애스펙트를 구현하기 위해 @Aspect 애노테이션을 사용
  • Join Point(조인 포인트):
    • 애플리케이션 실행 중에 애스펙트가 적용될 수 있는 지점입니다. 예를 들어 메서드 호출, 객체 생성 등이 조인 포인트가 될 수 있음
  • Advice(어드바이스):
    • 애스펙트가 특정 조인 포인트에서 수행하는 동작을 정의한 코드입니다. 어드바이스는 애스펙트가 언제 실행될지를 정의

      어드바이스 유형:

    • Before Advice: 조인 포인트 전에 실행됨.

    • After Advice: 조인 포인트가 끝난 후 실행됨.

    • Around Advice: 조인 포인트 전후로 실행됨.

    • After Returning Advice: 정상적으로 메서드가 완료된 후 실행됨.

    • After Throwing Advice: 예외가 발생했을 때 실행됨.

  • Pointcut(포인트컷):
    • 특정 조인 포인트를 선정하는 기준입니다. 포인트컷을 통해 어디에 어드바이스를 적용할지 설정할 수 있습니다.
    • Spring AOP에서 포인트컷 표현식을 사용해 대상 메서드를 정의
  • Weaving(위빙):
    • 애플리케이션 코드에 애스펙트를 적용하는 과정입니다. 위빙은 컴파일 타임, 로드 타임, 런타임 중에 발생할 수 있으며, Spring AOP는 런타임 위빙을 사용합니다.

동작 원리

  • 프록시를 기반으로 동작
  • 실체 객체 앞에 프록시 객체를 생성하여 어드바이스가 적용된 로직을 실행

사용 예시

  1. Aspect 정의
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod() {
        System.out.println("메서드 실행 전 로그");
    }

    @After("execution(* com.example.service.*.*(..))")
    public void logAfterMethod() {
        System.out.println("메서드 실행 후 로그");
    }
}
  1. 포인트컷 설정
  • 위 코드에서 "execution( com.example.service..*(..))"은 포인트컷 표현식으로, com.example.service 패키지에 있는 모든 클래스의 모든 메서드가 AOP의 대상이 됩니다.
  1. Service 클래스
import org.springframework.stereotype.Service;

@Service
public class ExampleService {
    public void exampleMethod() {
        System.out.println("실제 비즈니스 로직");
    }
}
  1. 실행 결과
  • exampleMethod()가 호출되면 AOP를 통해 먼저 "메서드 실행 전 로그"가 출력되고, 실제 비즈니스 로직이 실행된 후 "메서드 실행 후 로그"가 출력됩니다.
메서드 실행 전 로그
실제 비즈니스 로직
메서드 실행 후 로그

장단점

  • 장점
    • 중복 코드 제거: 횡단 관심사를 별도의 모듈로 분리함으로써 중복되는 코드를 제거할 수 있습니다.
    • 유지보수성 향상: 로깅, 보안 등의 기능이 여러 곳에서 필요할 때, 각각의 로직에 중복 코드를 삽입하는 대신 AOP로 처리하여 유지보수가 쉬워집니다.
    • 모듈화: 비즈니스 로직과 독립적인 관심사를 별도의 애스펙트로 모듈화할 수 있습니다.
  • 단점
    • 복잡성 증가: 지나치게 남용하면 코드의 흐름을 파악하기 어려워지고, 디버깅이 복잡해질 수 있습니다.
    • 성능 문제: AOP를 사용하면 프록시 객체를 생성하기 때문에 성능이 저하될 수 있습니다.

0개의 댓글