Spring AOP로 관심사 분리하기

Spring AOP로 관심사 분리하기

객체지향 프로그래밍(OOP)은 클래스를 모듈성의 단위로 삼아요. 그런데 로깅, 트랜잭션, 보안처럼 여러 타입과 객체에 걸쳐 퍼지는 관심사는 클래스 하나로 깔끔하게 담기 어려워요. 이런 걸 횡단 관심사(crosscutting concern)라고 하는데, Spring은 관점 지향 프로그래밍(AOP)으로 이 문제를 다뤄요.

출처: Aspect Oriented Programming with Spring

AOP에서의 모듈성 단위

OOP가 클래스를 기본 단위로 삼는다면, AOP의 기본 단위는 **애스펙트(aspect)**예요. 애스펙트는 트랜잭션 관리처럼 여러 타입과 객체에 걸쳐 흐르는 관심사를 한곳에 모듈화해 줘요.

Spring의 AOP 프레임워크는 Spring의 핵심 구성 요소 중 하나예요. 다만 Spring IoC 컨테이너는 AOP에 의존하지 않아요. 원하지 않으면 AOP를 안 써도 된다는 뜻이에요. 대신 AOP가 IoC를 보완하면서 강력한 미들웨어 솔루션을 제공해요.

Spring Framework에서 AOP는 크게 두 가지 목적으로 쓰여요.

  • 선언적 엔터프라이즈 서비스 제공 — 가장 중요한 것은 트랜잭션 관리를 선언적으로 처리하는 거예요.
  • 사용자 정의 애스펙트 구현 — OOP 사용을 보완하는 나만의 애스펙트를 만들 수 있어요.

언제까지 깊게 봐야 할까

트랜잭션 관리 같은 제네릭한 선언적 서비스만 쓰려는 경우라면 Spring AOP의 내부를 직접 다룰 필요는 없어요. 선언적 트랜잭션 관리는 대부분 어노테이션 하나로 충분하니까요. 이 장의 대부분은 그런 선언적 기능에 관심이 없으면 건너뛰어도 돼요.

핵심은 이거예요. "여러 클래스에 흩어지기 쉬운 공통 로직을 애스펙트로 묶어서, 비즈니스 로직에서는 제거하고 선언적으로 적용한다" — 그게 Spring AOP가 주는 가치예요.

더 알아보기