PromleeBlog
sitemap
aboutMe

posting thumbnail
관점 지향 프로그래밍(AOP)의 개념과 활용 사례
Understanding AOP (Aspect-Oriented Programming) and Its Use Cases

📅

🚀

들어가기 전에 🔗

지난 시간에는 의존성 주입(DI)을 통해 객체의 '핵심 책임'을 어떻게 분리하고 유연하게 만드는지 배웠습니다.
오늘은 그와 짝을 이루는 스프링의 또 다른 핵심 기둥, 바로
관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)
에 대해 알아보겠습니다.

우리가 만드는 애플리케이션에는 '회원가입', '상품 주문'과 같은 핵심 기능 외에도, '모든 기능의 실행 시간 측정', '모든 기능에 대한 로그 남기기', '모든 기능에 트랜잭션 걸기'와 같은
부가 기능
들이 필요합니다.
AOP는 이렇게 여러 곳에 흩어져 반복적으로 나타나는 부가 기능들을 어떻게 깔끔하게 분리하고 관리할 수 있는지에 대한 우아한 해법을 제시합니다.

🚀

문제의 시작: 흩어져 있는 '부가 기능' 🔗

우리가 만든 여러 서비스 클래스가 있다고 상상해 봅시다.
MemberService, OrderService, ProductService 모두 각자의 핵심 비즈니스 로직을 가지고 있습니다.
그런데 모든 서비스의 메서드가 시작하고 끝날 때, 실행 시간을 로그로 남겨야 한다는 요구사항이 추가되었습니다.

가장 단순한 방법은 모든 메서드의 시작과 끝에 아래와 같은 코드를 직접 추가하는 것입니다.
public void someMethod() {
    long startTime = System.currentTimeMillis(); // 부가 기능 (시작 시간 측정)
 
    // ... 핵심 비즈니스 로직 ...
 
    long endTime = System.currentTimeMillis(); // 부가 기능 (종료 시간 측정)
    System.out.println("Execution time: " + (endTime - startTime)); // 부가 기능 (로그 출력)
}
이 방식은 몇 가지 심각한 문제를 가집니다.


이처럼 여러 클래스와 메서드에 걸쳐 공통적으로 나타나는 부가 기능을
횡단 관심사(Cross-cutting Concerns)
라고 부릅니다.
AOP는 바로 이 '횡단 관심사'를 핵심 비즈니스 로직으로부터 분리하여 별도의 모듈로 관리하는 기술입니다.

🚀

AOP: 횡단 관심사를 '관점'으로 분리하기 🔗

AOP를 연극 무대에 비유하면 쉽게 이해할 수 있습니다.
AOP는 무대 감독이 "1막이 시작될 때 조명을 켜고, 3막이 끝날 때 커튼을 내려라"라고 지시하듯이,
언제 어디에 어떤 부가 기능을 적용할지
를 별도로 정의하고 실행하는 방식입니다.
배우들은 자신의 연기에만 집중하면 되고, 무대 감독은 전체적인 부가 효과를 관리합니다.

AOP의 핵심 용어 🔗

AOP를 이해하려면 몇 가지 고유한 용어를 알아야 합니다.
이미지 제안: 왼쪽에는 핵심 로직과 부가 기능 코드가 뒤섞인 지저분한 코드 그림. 오른쪽에는 깔끔한 핵심 로직 코드와 별도로 분리된 'AOP 모듈(Aspect)'이 있고, 화살표를 통해 AOP 모듈이 핵심 로직의 특정 지점(Pointcut)에 적용되는 모습을 시각화.

🚀

Spring AOP의 활용 사례 🔗

Spring 프레임워크는 AOP를 매우 적극적으로 활용하여 개발자에게 수많은 편의 기능을 제공합니다.

1. 선언적 트랜잭션 관리 - @Transactional 🔗

Spring AOP의 가장 대표적이고 강력한 활용 사례입니다.
개발자는 트랜잭션 처리를 위한 복잡한 try-catch-commit-rollback 코드를 작성할 필요 없이, 그저 메서드 위에 @Transactional 어노테이션 하나만 붙이면 됩니다.
@Transactional
public void transferMoney(String from, String to, int amount) {
    // ... 출금 및 입금 로직 ...
}
@Transactional 어노테이션이 바로 AOP의 애스펙트입니다.
Spring은 이 어노테이션을 보고, 메서드가 시작하기 전에 트랜잭션을 시작하고(Advice), 메서드가 성공적으로 끝나면 커밋하며(Advice), 예외가 발생하면 롤백하는(Advice) 부가 기능을 자동으로 적용해 줍니다.

2. 로깅 및 성능 모니터링 🔗

위에서 예시로 들었던 메서드의 실행 시간을 측정하는 로직을 AOP로 깔끔하게 구현할 수 있습니다.
특정 패키지 하위의 모든 메서드 실행을 포인트컷으로 지정하고, 실행 전후로 시간을 측정하는 어드바이스를 만들어 적용하면 됩니다.

3. 보안 및 인증 🔗

특정 메서드를 실행하기 전에, 현재 사용자가 해당 기능을 사용할 권한이 있는지 확인하는 로직을 AOP로 구현할 수 있습니다.
Spring Security의 @PreAuthorize 같은 어노테이션이 이러한 방식으로 동작합니다.

🚀

주요 면접 예상 질문 🔗

AOP는 DI와 더불어 스프링의 핵심 철학이므로, 그 이해도를 확인하는 질문이 자주 나옵니다.

1. AOP란 무엇이며, 왜 사용하나요? 🔗

개념과 필요성을 함께 설명하는 것이 중요합니다.
AOP는 관점 지향 프로그래밍의 약자로, 여러 객체에 공통적으로 나타나는
부가 기능(횡단 관심사)
을 핵심 비즈니스 로직으로부터 분리하여 모듈화하는 기술입니다.
AOP를 사용하면 로깅, 트랜잭션, 보안과 같은 부가 기능 코드가 비즈니스 로직에 섞여 발생하는
코드 중복 문제를 해결
하고, 핵심 로직의
가독성과 유지보수성을 크게 향상
시킬 수 있습니다.

2. Spring AOP는 어떻게 동작하나요? 🔗

내부 동작 원리인 '프록시'를 언급하면 깊은 이해도를 보여줄 수 있습니다.
Spring AOP는
프록시(Proxy) 패턴
을 기반으로 동작합니다.
Spring 컨테이너는 AOP가 적용된 타겟 객체에 대한 '프록시 객체'를 대신 생성하여 Bean으로 등록합니다.
클라이언트가 이 프록시 객체의 메서드를 호출하면, 프록시는 먼저 AOP 어드바이스(부가 기능)를 실행한 뒤, 실제 타겟 객체의 메서드를 호출하는 방식으로 동작합니다.
이러한 방식을 통해, 기존 타겟 객체의 코드를 전혀 수정하지 않고도 부가 기능을 적용할 수 있습니다.

🚀

결론 🔗

오늘은 여러 곳에 흩어져 있던 부가 기능들을 하나의 '관점'으로 묶어 관리하는 AOP에 대해 알아보았습니다.

참고 🔗