본문 바로가기
프로그래밍/Spring Boot

[SpringBoot] 관점 지향 프로그래밍(AOP)이란?

by 카프카뮈 2021. 8. 30.

이 글은 다음의 목적을 바탕으로 작성되었다.

  • AOP가 무엇인지 알아본다.
  • Spring에서 AOP를 활용하는 방법을 알아본다.

AOP란?

AOP관점 지향 프로그래밍(Aspect-Oriented Programming)의 약자이다. 

AOP는 횡단 관심사(cross-cutting concern)의 분리를 허용해 모듈성을 증가시킨다.

이때 횡단 관심사가 무엇일까? 아래의 그림을 먼저 보자.

우리가 서버를 하나 만들고, 그 안에 여러 가지 로직들을 추가했다고 가정하자.

이때, 각각의 모듈마다 중복되는 로직이 존재한다. 예를 들자면,

  • 로깅 로직
  • 트랜잭션 시작/종료 로직
  • 보안 인증 로직

설령 보안 인증을 해주는 클래스를 모듈로 분리하더라도, 각각의 서비스마다 해당 클래스를 호출하고 사용해줘야 한다.

그렇기 때문에, 기존의 종단(상-하로 떨어지는) 플로우를 바탕으로 보면 이러한 로직들은 중복될 수 밖에 없다.

 

그런데 관점을 바꿔, 위의 그림처럼 이러한 로직이 언제 삽입되는지에 신경을 써 보면 어떨까?

만약 여러 개의 서비스가 트랜잭션을 필요로 한다면,

해당 서비스가 시작될 때, 종료될 때 트랜잭션 로직이 공통적으로 실행된다.

유사하게, 어떤 요청이 들어올 때 컨트롤러에서 로깅을 남기고 싶다면,

컨트롤러의 RequestMapping이 되어 있는 모든 메서드는 시작 시 로깅 로직이 실행되는 것이다.

 

이러한 것을 횡단 관심사라고 한다. 그리고 AOP의 목표는, 횡단 관심사의 분리를 허용하는 데에 중점이 있다.

만약 위에서 예로 든 인증 로직이나 로깅 로직이 우리가 원하는 타이밍에 실행되도록 할 수 있다면,

코드와 해당 모듈의 의존성도 낮추고, 각각의 모듈성이 강화되어 유지보수도 쉬워진다.


스프링과 AOP

스프링 어플리케이션은 특별한 경우를 제외하면, 아래의 세 가지 레이어로 나뉜다고 할 수 있다.

  • Web Layer: REST API 로직, Client 종속적인 로직 등이 속한다.
  • Business Layer: 서비스의 내부 정책에 따른 비즈니스 로직 개발
  • Data Layer: DB 연동이나 기타 외부 연동 등

이 때, 각각의 레이어마다 필요한 횡단 관심사가 생긴다.

  • 웹 레이어의 경우, 요청과 응답에 대한 로깅이나 DTO의 유효성 검사, 직렬화 작업 등이 공통적으로 사용된다.
  • 비즈니스 레이어의 경우, 트랜잭션의 설정과 해제가 공통적으로 사용된다. 또한 비즈니스 로직에 필요한 검증 로직 등이 포함된다.
  • 데이터 레이어도 마찬가지로 트랜잭션 설정이 필요하다. 또한 DB 연결/해제 등이 공통적으로 사용될 수 있다.

이러한 경우를 간편하게 처리하기 위해, 스프링은 AOP 라이브러리를 준비하고 있으며, 또한 실제 기능에 사용하기도 한다. 비즈니스 레이어(서비스 레이어)에서 자주 쓰이는 @Transactional 어노테이션이 그 예이다!

김영한님의 [자바ORM표준 JPA프로그래밍] 579p 인용

 


AOP의 개념과 용어

이제 AOP를 활용하기 앞서, 관련된 개념과 용어를 간단히 살펴보자.

출처 : https://www.baeldung.com/spring-aop

Aspect

Aspect는 여러 클래스를 가로지르는 관심사, 즉 횡단 관심사의 모듈화된 결과물이다. 

Aspect는 횡단 관심사가 필요한 비즈니스 로직에 붙어 자신의 기능을 수행한다.

그런데, Aspect와 로직을 어떻게 연결할까? 이에 대한 여러 가지 용어가 존재한다.

  • 조인포인트(JoinPoint)는 Advice를 적용 가능한, 프로그램 실행의 여러 단계를 이야기한다.
    스프링 AOP에서는 프록시 패턴을 사용하기 때문에, 메소드 호출 타이밍만 JoinPoint로 지원한다.
  • 포인트컷(PointCut)은 JoinPoint 중 실제로 Aspect가 적용되는 지점을 의미한다.
  • 어드바이스(Advice)는 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의한다. 즉, Aspect를 어느 JoinPoint에 적용할지를 결정하는 액션이라고 할 수 있다.

PointCut의 여러 표현식에 대해 더 알고 싶다면, 이 링크를 참조하시길 추천한다.

또한 Advice의 경우, Spring에서는 다음과 같은 5가지 종류를 지원하고 있다.

종류 설명
Before Advice 대상 객체의 메소드 호출 전에 Aspect를 실행한다.
After Returning Advice 대상 객체의 메소드가 예외 없이 실행된 이후 Aspect를 실행한다.
After Throwing Advice 대상 객체의 메소드를 실행하는 도중 예외가 발생한 경우에 Aspect를 실행한다.
After Advice 예외 발생 여부와 상관없이 대상 객체의 메소드 실행 후 Aspect를 실행한다.
Around Advice 대상 객체의 메소드 실행 전, 후, 혹은 예외 발생 시점까지 모두 포함하여 Aspect를 실행한다.

이번 글에서는 AOP의 기본 개념과 등장 배경에 대해, 또한 Spring에서 사용하는 방법에 대해 이야기했다.

다음 글에서는, 실제로 로깅 작업을 Aspect로 분리하여 Spring AOP로 적용하는 예제를 만들어 보려고 한다.

 

잘못된 내용이 있다면 댓글 부탁드립니다

반응형

댓글