Spring Boot/관점 지향 프로그래밍(AOP), 다양한 모듈

[Spring boot] 관점 지향 프로그래밍(AOP)

재윤 2025. 7. 21. 15:54
반응형

관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)

  • 객체지향 프로그래밍(OOP : Object-Oriented PRogramming)과 다른 것

AOP란?

  • AOP는 관점을 기준으로 묶어 개발하는 방식을 의미 == 핵심 로직과 부가 기능을 분리해서 코드를 깔끔하게 관리하는 방식
  • 여기서 관점(aspect)이란 어떤 기능을 구현할 때 그 기능을 ‘핵심 기능’과 ‘부가 기능’으로 구분해 각각을 하나으로 보는 것을 의미

그럼 ‘핵심 기능’과 ‘부가 기능’의 의미를 알아보자

핵심 기능

  • 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다.
  • ex → 클라인어트로부터 상품 정보 등록 요청을 받아 DB에 저장하고 그 상품 정보를 조회하는 비즈니스 로직을 구현했다면 (1) 상품 정보를 데이터베이스에 저장하고, (2) 저장된 상품 정보 데이터를 보여주는 코드가 핵심 기능

부가 기능

  • 핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드를 예로 들 수 있다.

일반적인 OOP 형식으로 비즈니스 로직을 작성하면 그림 1.1과 같이 비즈니스 동작 흐름이 발생한다.

  • 상품 정보 등록, 상품 정보 조회는 다른 기능이기에 각자 로직이 구현돼 있다.
  • 하지만 유지 보수 목적이나 DB에 접근을 위해 작성된 로깅과 트랜잭션 영역은 상품 정보를 등록 할 때나 상품 정보를 조회할 때 동이란 기능을 수행할 확률이 높다

현재 이 그림에서 핵심 기능을 구현한 두 로직에 동일한 코드가 포함되어 있다.

 

OOP 방식의 애플리케이션 로직

AOP 관점으로 만든다면

  • 이처럼 여러 비즈니스 로직에서 반복되느 부가 기능을 하나의 공통 로직으로 초리하도록 모듈화해 삽입하는 방식을 AOP라고 한다.

AOP 방식의 애플리케이션 로직

코드 예시

  • AOP 없이 모든 기능을 직접 넣은 코드
public void placeOrder() {
    System.out.println("[Log] 주문 시작");      // 로그
    checkAuth();                                  // 인증 검사
    orderService.order();                         // 핵심 기능
    System.out.println("[Log] 주문 완료");      // 로그
}

 

  • AOP로 부가 기능 분리
  • 로그 기록, 인증, 트랜잭션 같은 공통 로직은 AOP에서 따로 처리함
  • 핵심 로직은 더 간단하고 읽기 쉬워짐
@LogExecutionTime // AOP로 감싼 로그 어노테이션
public void placeOrder() {
    orderService.order();  // 핵심 로직만 남음!
}

 

AOP 구현 방식 3가지

  • 컴파일 과정에 삽입하는 방식
  • 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식
  • 프락시 패턴을 이용한 방식

스프링 AOP의 목적은 OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 로직을 구현하는 데만 집중할 수 있게 도와주는 것

반응형