[내일배움캠프] - DAY19 AOP(Aspect Oriented Programming)에 대해 알아보자

2026. 3. 6. 12:04·TIL & 트러블 슈팅

AOP(Aspect Oriented Programming)

AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍이라고 하며, 프로그램을 핵심 로직과 공통 기능(부가기능) 으로 나누어 관리하는 프로그래밍 방식입니다. 일반적으로 프로그램을 개발하다 보면 핵심 기능 외에도 여러 곳에서 반복적으로 사용되는 기능들이 존재합니다. (ex : 로그 기록, 트랜잭션 처리, 성능 측정)

 

이러한 기능들은 핵심 비즈니스 로직과 직접적인 관계는 없지만 여러 곳에서 반복적으로 사용되는 공통 기능입니다.


AOP를 사용하는 이유

소프트웨어 개발에서는 변경이 발생하는 지점을 최소화하고 하나의 위치에서 관리할 수 있도록 모듈화하는 것이 중요합니다. 하지만 로그 기록, 트랜잭션 처리와 같은 부가 기능은 애플리케이션 전반에 걸쳐 반복적으로 사용되는 경우가 많아 일반적인 OOP(객체 지향 프로그래밍) 방식만으로는 효율적으로 관리하기 어렵습니다. 이러한 문제를 해결하기 위해 핵심 비즈니스 로직과 부가 기능을 분리하는 AOP 방식이 필요합니다. AOP를 사용하면 공통적으로 사용되는 기능을 별도로 관리할 수 있어 코드 중복을 줄이고 유지보수성을 높일 수 있습니다.


AOP 구조

AOP의 구조는 처음 접하면 다소 추상적으로 느껴질 수 있습니다. 따라서 이해를 돕기 위해, 아래에서는 화분을 관리하는 상황에 비유하여 AOP의 구조를 설명해보겠습니다.

 

식물 : 핵심 비즈니스 로직

 

먼저 핵심 비즈니스 로직을 비유를 통해 설명해보겠습니다. 사진에서 가장 중요한 것은 화분이 아니라 화분 안에서 자라고 있는 식물입니다. 식물이 성장하는 것이 이 화분의 본래 목적이기 때문입니다. 이처럼 프로그램에서도 가장 중요한 것은 실제 서비스가 수행해야 하는 핵심 기능, 즉 핵심 비즈니스 로직입니다. 예를 들어 회원 가입, 주문 생성, 결제 처리와 같은 기능들이 핵심 비즈니스 로직에 해당합니다. 따라서 이 비유에서 식물은 핵심 비즈니스 로직을 의미한다고 이해하시면 됩니다.

 


 

화분 관리 시스템 : @Aspect

 

@Aspect 어노테이션은 비유를 통해 설명하자면 화분을 관리하는 관리자를 의미합니다. 이 어노테이션이 붙은 클래스는 AOP 역할을 수행하는 클래스라는 것을 나타냅니다. 즉, 해당 클래스는 공통적으로 필요한 기능을 관리하는 역할을 하며, “나는 공통 기능을 담당하는 관리자입니다.”라고 선언하는 것과 같은 의미를 가집니다.

@Aspect
@Component
public class LogAspect {
}

 


 

관리할 화분 선택(Target) : @Pointcut

 

@Pointcut 어노테이션은 비유하자면 어떤 화분을 관리할지 선택하는 기준(Target)을 정하는 작업이라고 볼 수 있습니다. 사진과 같이 화분이 6개 있을 때 그중에서 특정 화분 하나에만 물을 주고 싶다면 어떤 화분을 관리할지에 대한 기준이 필요합니다. 이처럼 AOP가 적용될 대상을 선택하는 기준이 바로 Pointcut입니다.

 

@Pointcut("execution(* com.example.service..*(..))")
public void servicePointcut() {}

// service 패키지의 모든 메서드에 AOP 적용

 


 

작업 전 할 일 : @Before

 

@Before 어노테이션은 말 그대로 “전에”라는 의미를 가집니다. 비유하자면 식물을 돌볼 때 작업을 시작하기 전에 해야 하는 일이 있는 것과 같습니다. 예를 들어 식물에 물을 주는 작업이 이에 해당합니다. 프로그래밍에서는 메서드가 실행되기 전에 수행되는 작업을 의미하며, 대표적으로 로그 기록이나 권한 검사와 같은 기능이 여기에 해당합니다.

@Before("servicePointcut()")
public void before() {
    System.out.println("메서드 실행 전 로그");
}

 


 

작업이 끝난 후 할 일 : @After

 

@After 어노테이션은 @Before 어노테이션과 반대로 “후에”라는 의미를 가집니다. 비유하자면 식물을 돌보는 작업이 끝난 후 상태를 확인하거나 정리하는 과정과 같은 역할이라고 볼 수 있습니다. 프로그래밍에서는 메서드 실행이 끝난 후 수행되는 작업을 의미하며, 대표적으로 상태 기록이나 정리 작업과 같은 기능이 이에 해당합니다.

@After("servicePointcut()")
public void after() {
    System.out.println("메서드 실행 후 로그");
}

 


 

전체 관리 : @Around

 

@Around 어노테이션은 말 그대로 작업의 전체 과정을 감싸는 역할을 합니다. 비유를 하자면, 식물을 관리할 때 처음 상태를 확인하고 물을 준 뒤, 작업이 끝난 후 다시 상태를 확인하는 것처럼 처음부터 끝까지 관리하는 과정이라고 볼 수 있습니다. 즉, 작업 시작 전과 종료 후를 모두 제어할 수 있는 방식입니다. 프로그래밍에서는 메서드 실행 전과 실행 후를 모두 감싸서 동작하며, 전체 흐름은 “작업 시작 → 실제 작업 실행 → 작업 종료”와 같이 이루어집니다. 대표적으로 실행 시간 측정이나 트랜잭션 처리와 같은 기능을 구현할 때 사용됩니다.

@Around("servicePointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

    long start = System.currentTimeMillis();

    Object result = joinPoint.proceed();

    long end = System.currentTimeMillis();

    System.out.println("실행시간 : " + (end - start));

    return result;
}

AOP와 핵심 비즈니스 로직의 분리 예시

아래에서는 위에서 들었던 예시를 바탕으로 핵심 비즈니스 로직과 AOP가 어떻게 분리되는지를 간단하게 살펴보도록 하겠습니다.

 

핵심 비즈니스 로직 (식물 성장)

@Service
public class PlantService {

    public void growPlant() {
        System.out.println("식물이 자라고 있습니다.");
    }

}

 

위 메서드는 식물이 성장하는 핵심 기능, 즉 핵심 비즈니스 로직입니다. 사용자의 행동에 따라 식물의 성장 단계를 변경하고, 도메인 규칙에 맞게 상태를 업데이트합니다. 이를 통해 식물의 상태 관리와 성장 흐름을 담당합니다.

 

 

화분 관리자 (Aspect)

@Aspect
@Component
public class PlantCareAspect {

    // 어떤 식물을 관리할지 선택
    @Pointcut("execution(* com.example.service.PlantService.*(..))")
    public void plantPointcut() {}

    // 식물을 돌보기 전에 물주기
    @Before("plantPointcut()")
    public void beforeCare() {
        System.out.println("식물 상태를 확인하고 물을 줍니다.");
    }

    // 식물을 돌본 후 상태 확인
    @After("plantPointcut()")
    public void afterCare() {
        System.out.println("식물 관리 후 상태를 확인합니다.");
    }

}

 

위 클래스는 화분을 관리하는 관리자 역할을 하며, 식물을 돌보기 위한 공통 기능을 담당합니다. AOP를 통해 공통 로직을 분리하여 코드 중복을 줄이고, 핵심 비즈니스 로직이 식물 성장 기능에 집중할 수 있도록 합니다.

 

 

실행 흐름

실행 흐름은 식물 상태를 확인하고 물을 줍니다.(@Before) → 식물이 자라고 있습니다.(핵심 비즈니스 로직) → 식물 관리 후 상태를 확인합니다.(@After) 의 순서로 동작합니다. 즉, 핵심 비즈니스 로직(식물 성장)은 그대로 유지하면서, 식물 관리와 같은 부가 기능은 AOP를 통해 분리하여 관리할 수 있습니다.


'TIL & 트러블 슈팅' 카테고리의 다른 글

[내일배움캠프] - DAY21 클라우드 아키텍처 설계 & 배포 프로젝트 트러블 슈팅  (0) 2026.03.12
[내일배움캠프] - DAY20 IP와 네트워크 통신에 대해 알아보자  (0) 2026.03.10
[내일배움캠프] - DAY18 테스트  (0) 2026.03.04
[내일배움캠프] - DAY17 코드 개선 과제  (1) 2026.03.04
[내일배움캠프] - DAY16 일정관리 앱 만들기-2  (1) 2026.02.12
'TIL & 트러블 슈팅' 카테고리의 다른 글
  • [내일배움캠프] - DAY21 클라우드 아키텍처 설계 & 배포 프로젝트 트러블 슈팅
  • [내일배움캠프] - DAY20 IP와 네트워크 통신에 대해 알아보자
  • [내일배움캠프] - DAY18 테스트
  • [내일배움캠프] - DAY17 코드 개선 과제
N_HYUN
N_HYUN
안녕하세요! 현이의 개발 공부방입니다.
  • N_HYUN
    현이의 개발 공부방
    N_HYUN
  • 전체
    오늘
    어제
    • 분류 전체보기 (29)
      • FrontEnd (0)
      • BackEnd (0)
        • Java (0)
      • DataBase (1)
      • TIL & 트러블 슈팅 (24)
      • Etc (4)
        • Theoretical Computer Scienc.. (1)
        • Web & CS (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
N_HYUN
[내일배움캠프] - DAY19 AOP(Aspect Oriented Programming)에 대해 알아보자
상단으로

티스토리툴바