티스토리 뷰
관점 지향 프로그래밍이란 프로그램을 작성할때 구현하고 싶은 프로그램, 부수적 프로그램으로 분리하여 작성하는 것을 의미한다.
중심적 관심사 | 횡단적 관심사 |
구현하고 싶은 프로그램 | 부수적 프로그램 |
대부분 개발자가 직접 작성 | 프레임워크가 알아서 처리해주는 경우가 많음 |
스프링 프레임워크에서 제공하는 AOP 기능을 활용하여 중심적 관심사와 횡단적 관심사를 분리하여 프로그램을 쉽게 만들 수 있다.
AOP의 용어 정리
용어 | 내용 |
어드바이스(Advice) | 횡단적 관심사의 구현(메서드), 로그 출력 및 트랜잭션 제어 등입니다. |
애스펙트(Aspect) | 어드바이스를 정리한 것(클래스)입니다. |
조인포인트(JoinPoint) | 어드바이스를 중심적은 관심사에서 적용하는 타이밍, 메서드(생성자) 실행 전, 메서드(생성자) 실행 후 등 실행되는 타이밍입니다. |
포인트컷(PointCut) | 어드바이스를 삽입할 수 있는 위치, 예를 들어, 메서드 이름이 get으로 시작할 떄만 처리하는 조건을 정의할 수 있습니다. |
인터셉터(Interceptor) | 처리의 제어를 인터셉트하기 위한 구조 또는 프로그램입니다. 스프링 프레임워크에서는 인터셉트라는 메커니즘으로 어드바이스를 중심 관심사에 추가한 것처럼 보이게 합니다. |
타깃(Target) | 어드바이스가 도입되는 대상을 말합니다. |
중심적 관심사에 적용하는 어드바이스의 종류
어드바이스 | 내용 | 어노테이션 |
Before Advice | 중심적 관심사가 실행되기 이전에 횡단적 관심사를 실행 | @Before |
After Returning Advice | 중심적 관심사가 '정상적으로 종료된 후'에 횡단적 관심사를 실행 | @AfterReturning |
After Throwing Advice | 중심적 관심사로부터 '예외가 던져진 후'로 횡단적 관심사를 실행 | @AfterThrowing |
After Advice | 중심적 관심사의 '실행 후'에 횡단적 관심사를 실행(정상 종료나 예외 종류 등의 결과와 상관없이 실행) | @After |
Around Advice | 중앙적 관심사 호출 전후에 횡단적 관심사를 실행 | @Around |
직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있다. 포인트컷 표현식으로 execution 지시자를 사용한다.
execute(반환값 패키지.클래스.메서드(인수))
포인트컷 식은 와일드카드를 이용해여 유연하게 적용 범위를 지정할 수 있다.
와일드카드 | 내용 |
*(애스터리스크) | 임의의 문자열을 나타내고, 패키지를 나타낼 때는 임의의 패키지 한 계층을 나타낸다. 메서드의 인수에서는 한 개의 인수를 나타내 반환값으로 이용할 수 있다. |
..(점 두 개) | 패키지를 나타내는 경우 0개 이상의 패키지를 나타낸다. 메서드의 인수를 표현하는 경우에는 0개 이상의 임의의 인수를 나타낸다. |
+(플러스) | 플래스명 뒤에 기술해 클래스와 그 서브클래스 및 구현 클래스 모두를 나타낸다. |
execution 지시자의 구현 예
구현 예 | 내용 |
execution(* com.example.service.ClassName.*(..)) | ClassName 클래스의 메서드에 어드바이스를 적용한다 |
execution(* com.example.service.ClassName.select*(..)) | ClassName 클래스의 select 로 시작하는 메서드에 어드바이스를 적용한다 |
execution(String com.example.service.ClassName.*(..)) | ClassName 클래스의 반환값이 String 타입인 메서드에 어드바이스를 적용한다. |
execution(* com.example.service.ClassNAme.*(String,..) | ClassName 클래스의 첫 번째 인수가 String 타입인 메서드에 어드바이스를 적용한다. |
execution(* com.example.service.*.*(..)) | 지정된 패키지 아래의 모든 클래스의 메서드에 어드바이스를 적용한다(서브 패키지는 포함하지 않는다) |
execution(* com.example.service..*.*(..)) | service 패키지 바로 아래와 하위 패키지의 모든 클래스에 어드바이스를 적용한다. |
execution(* com.example.service.ClassName.*(*)) | ClassName 클래스의 인수가 하나인 매서드에 어드바이스를 적용한다 |
AOP 를 사용하기 위해서는 gradle 의 구성 파일인 build.gradle 에 다음 코드를 추가해야한다
implementation 'org.springframework.boot:spring-boot-starter-aop' // AOP 추가
구분 | @Before | @After | @Around |
적용위치 | 처리전 | 처리후 | 처리 전후 |
인수(파라미터) | JointPoint | JointPoint | ProceedingJointPoint |
적용 메서드를 호출하는 방법 | X | X | proceedingJointPoint.proceed(); |
반환값 | void | void | Object |
요약
- AOP 에서는 프로그램을 중심적 관심사와 횡단적 관심사로 구성되어 있다고 생각한다.
- 중심적 관심사란 구현해야 할 기능을 나타내는 비즈니스 로직을 말한다.
- 횡단적 관심사란 본직적인 기능은 아니지만 품질이나 유지보수 등의 관점에서 꼭 필요한 기능을 나타내는 프로그램을 말한다.
- 또한 다수의 클래으세 공통적으로 필요한 처리를 '횡단적 관심사'라고 말한다.
- AOP 에서는 횡단적 관심사를 분리함으로써 기존 코드를 수정하지 않아도 프로그램 중에 특정 기능을 추가할 수 잇다.
- 스프링 프레임워크는 다양한 공통 기능을 AOP에서 제공한다
'스프링프레임워크' 카테고리의 다른 글
Spring Initializr (0) | 2025.02.27 |
---|---|
메타 어노테이션 (0) | 2025.02.27 |
어노테이션 역할 (0) | 2025.02.27 |
스프링 프레임워크의 핵심 기능 (0) | 2025.02.26 |
개발에 사용하는 라이브러리 (0) | 2025.02.25 |