AOP 란? (Aspect Oriented Programming)
(관점 지향 프로그래밍)
AOP(Aspect Oriented Programming)는 프로그램 구조에 대한 또 다른 사고 방식을 제공하여 객체 지향 프로그래밍 OOP(Object Oriendted Programming)를 보완합니다.
객체 지향 프로그래밍에서는 모듈화의 핵심 단위가 클래스인 반면, 관점 지향 프로그래밍에서 모듈화의 단위는 부가 기능적인 측면입니다.
여기서 메서드 aa(), bb(), cc()는 여러 곳에서 쓰이는 공통 기능입니다. 이 공통 기능이 이미지처럼 흩어져 있으면 코드 수정이 있을 때 각각의 메소드의 코드를 다 수정해야 하는 등 유지보수, 재사용을 할 때 불편합니다.
관점 지향 프로그래밍 AOP는 간단하게 이처럼 여러 곳에서 쓰이는 공통 기능을 모듈화(반복 사용되는 로직들을 하나로 묶어)하여 Aspect라는 독특한 모듈로 만들어 사용하는 방법으로, 유지보수와 재사용에 용이하도록 프로그래밍 하는 방식입니다.
AOP의 장점
- 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다는 점
- 다른 서비스 모듈들이 본인의 목적에만 충실하고 그 외 사항들은 신경쓰지 않아도 된다는 점
* Transaction이 AOP 관점이 적용되는 대표적인 사례로 볼 수 있습니다.
(쿼리를 실행하기 전에 트랜잭션을 생성하고, 쿼리 실행 후에 트랜잭션을 커밋하거나 롤백한 다음 트랜잭션을 닫는 과정)
AOP 용어
- Asppect
여러 곳에서 반복 사용되는 로직을 모듈화 한 것입니다. 애스펙트는 부가될 기능을 정의한 Advice와 Advice를 어디에 적용할지를 결정하는 Point cut을 함께 가지고 있습니다.
- Target
Aspect가 적용되는 곳 (클래스, 메서드 등)
- Advice
Aspect의 실질적인 기능에 대한 구현체로 Aspect가 무엇을 언제 할지를 정의합니다.
- Join Point
Advice가 Target에 적용되는 시점을 설정합니다.
(메서드 진입 시점, 생성자 호출 시점, 필드에 값을 꺼내 올 때 등 다양한 시점에 적용 가능하지만 Spring은 프록시 패턴 기반의 AOP를 구현하기 때문에 메서드 호출에 대한 Join Point만 지원합니다.)
- Point Cut
Join Point의 상세 스펙을 정의한 것으로 Advice를 적용할 Target의 메서드를 선별하는 정규표현식입니다.
- Weaving
Point Cut에 의해서 결정된 타겟의 조인 포인트에 부가기능인 Advice를 삽입하는 과정을 뜻합니다. (프록시 객체를 생성하는 과정)
Weaving은 AOP의 핵심 기능인 타겟의 코드에 영향을 주지 않으면서 필요한 부가적인 기능(Advice)를 추가할 수 있도록 해주는 핵심 처리 과정입니다.
(Spring AOP는 기본적으로 Run-time Weaving 방식을 제공합니다.)
- Proxy
타겟을 감싸서 요청을 대신 받아주는 래핑 클래스입니다. Weaving을 통해서 Proxy를 생성하며 Spring AOP에서는 CGLIB Proxy, JDK Dynamic Proxy를 사용합니다. 스프링 AOP는 이 프록시 객체를 통해 작동하게 됩니다.
호출자(클라이언트)에서 타겟을 호출하게 되면 타겟이 아닌 타겟을 감싸고 있는 프록시가 먼저 호출되어 정의된 방식에 따라 어드바이스에 등록된 기능을 선처리 후 타겟 메소드를 호출하거나, 타겟 메소드를 호출 후 어드바이스에 등록된 기능을 실행하게 됩니다.
(자세한 내용은 이어지는 포스팅에서 실제 사용되는 코드와 함께 이야기 하도록 하겠습니다.)
Spring AOP의 특징
- 접근 제어 및 부가 기능을 추가하기 위해서 프록시 패턴 기반의 AOP 구현체를 사용합니다.
- 스프링 빈에서만 AOP를 적용 할 수 있습니다.
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 Ioc와 연동하여 엔터프라이즈 어플리케이션에서 가장 흔한 문제 (중복 코드, 프록시 클래스 작성의 번거로움, 객체들 간의 복잡도 증가 등)에 대한 해결책을 지원하는 것이 목적입니다.
이어지는 관점 지향 프로그래밍 Spring AOP 개념과 사용법 -2
* 참고 자료 (첫 번째 강추)
https://jojoldu.tistory.com/71
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop
https://engkimbs.tistory.com/746
'Programming > Spring Boot' 카테고리의 다른 글
IntelliJ 인텔리제이 properties 파일 한글 깨짐 설정 방법 (0) | 2021.09.04 |
---|---|
관점 지향 프로그래밍 Spring AOP 개념과 사용법 - 2 (0) | 2021.09.01 |
Spring Boot 실행 배너 변경하는 방법 (banner.txt) (0) | 2021.08.31 |
Spring Boot 프로젝트 외부 경로 파일 접근하기 addResourceHandlers (0) | 2021.08.30 |
Spring Boot Logging 이란? (log4j, logback, log4j2) (0) | 2021.08.25 |