관점 지향 프로그래밍(AOP, Aspect Oriented Programming)는 Spring Framework에서 핵심적인 기능 중 하나로, 애플리케이션의 횡단 관심사(Cross-Cutting Concerns)를 효과적으로 분리하여 코드의 중복을 줄이고, 유지보수성을 높이는 데 사용되고 있다고 한다. AOP를 한번 알아보자 ~
관점 지향 프로그래밍(AOP)은 특정 기능(로깅, 보안, 트랜잭션 관리 등)을 코드의 핵심 비즈니스 로직과 분리하여 모듈화하는 프로그래밍 패턴이다.

AOP는 이런 횡단 관심사를 별도의 모듈로 분리해 애플리케이션 전체에 적용할 수 있도록 설계되어 있다.
애플리케이션 개발 시 로깅, 보안, 트랜잭션 관리 같은 기능은 여러 클래스에서 반복적으로 등장한다. 만약 이를 각 클래스마다 구현한다면, 코드가 중복되고 관리가 어려워진다.
AOP를 사용하지 않은 예시
public class UserService {
public void createUser() {
System.out.println("트랜잭션 시작");
// 사용자 생성 로직
System.out.println("트랜잭션 종료");
}
}
이 방식은 클래스 마다 동일한 로직을 반복적으로 추가해야하므로 유지보수가 어렵다.
AOP 적용 시
public class UserService {
public void createUser() {
// 사용자 생성 로직
}
}
예시 코드처럼 트랜잭션 관리에 대한 코드는 별도의 AOP 모듈에서 처리되므로 핵심 로직만 유지할 수 있다.
1. Aspect
횡단 관심사를 모듈화한 것. 로깅, 트랜잭션 관리 등이 Aspect로 구현된다.
2. Join Point
Aspect가 적용될 수 있는 지점. Spring에서는 메서드 호출, 필드 접근 등이 Join Point가 된다.
3. Advice
Join Point에서 실행되는 코드로, Aspect의 실제 동작을 정의한다.
4. Pointcut
Join Point 중 특정 지점을 필터링 하는 표현식. 예를 들어, 특정 클래스나 메서드에만 AOP를 적용할 수 있다.
5. Weaving
Aspect와 핵심로직을 결합하는 과정. Spring에서는 런타임 위빙 방식을 사용한다.
Spring AOP는 프록시(Proxy)를 사용하여 동작한다.
Spring 컨테이너는 대상 객체(Target Object)를 프록시 객체로 감싸고, 프록시 객체가 Join Point에서 Advice를 실행하도록 한다.
메서드 호출 → 프록시 객체 실행 → Advice 실행 → 핵심 비즈니스 로직 실행 → 필요 시 추가 Advice 실행
Maven 설정
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
로그 기록 Aspect
@Aspect
@Component
public class LoggingAspect {
// Pointcut: 특정 패키지의 모든 메서드 실행 시 Advice 적용
@Pointcut("execution(* com.example.service.*.*(..))")
public void logPointcut() {}
// Before Advice
@Before("logPointcut()")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("메서드 실행 전: " + joinPoint.getSignature().getName());
}
// After Advice
@After("logPointcut()")
public void afterMethod(JoinPoint joinPoint) {
System.out.println("메서드 실행 후: " + joinPoint.getSignature().getName());
}
}
서비스 클래스
@Service
public class UserService {
public void createUser() {
System.out.println("사용자 생성 로직 실행");
}
}
실행결과
메서드 실행 전: createUser
사용자 생성 로직 실행
메서드 실행 후: createUser
관점 지향 프로그래밍(AOP)은 비즈니스 로직과 공통 기능을 분리하여 애플리케이션의 유지보수성과 확장성을 크게 향상시킬 수 있다. 이를 잘 활용하면 더 깔끔하고 효율적인 코드를 작성할 수 있을 것이다 !