반응형
🌱 스프링 삼각형
이전 포스팅 중 '스프링 개요'에서 스프링을 구성하는 핵심 요소에 대하여 알아봤었다.
오늘은 그중에서 AOP에 대하여 조금 더 상세하게 포스팅하려고 한다.
🌱 AOP(Aspect Oriented Programming)
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
흩어진 관심사(Crosscutting Concerns)를 모듈화하여 제공하는 프로그래밍 기법이다.
아래의 그림을 통해서 자세하게 살펴보자.
Class A, Class B, Class C의 주황, 파랑, 빨강 부분은 각 클래스에서 동일한 코드라고 가정해보자.
만약 주황색 블록에 해당하는 코드를 수정해야 한다면 Class A, Class B, Class C의 주황색 부분을 일일이 찾아 수정해야 한다.
이는 SOLID원칙에 위배되며 유지보수를 어렵게 만드는 요소일 것이다.
이런 식으로 핵심 비즈니스 로직이 아닌데 반복해서 사용되는 부분들을 흩어진 관심사(Crosscutting Concerns)라고 일컫는다.
결국 각 각의 관점을 기준으로 흩어진 관심사를 모듈화하겠다는 의미다.
기준에 따라 관심사를 Aspect X, Aspect Y, Aspect Z로 모듈화하게 될 경우, 필요에 따라 각 각의 Class에 적용할 수 있다.
🌱 AOP 적용 방법
AOP의 적용 방식에는 크게 3가지 방법이 있다.
- 컴파일 시점
- .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가 기능 로직을 추가하는 방식이다.
- 모든 지점에 적용 가능하다.
- AspectJ가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별할 컴파일러가 필요한 점과 복잡하다는 단점이 있다. - 클래스 로딩 시점
- .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가 기능 로직 추가하는 방식이다.
- 모든 지점에 적용 가능하다.
- 특별한 옵션과 클래스 로더 조작기를 지정해야하므로 운영하기 까다롭다. - 런타임 시점
- 스프링이 사용하는 방식으로 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식이다.
- 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용된다.
- 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능하다.
- 특정 컴파일러, 복잡한 옵션, 클래스 로더 조작기 등을 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있다.
🌱 AOP 관련 용어
- Aspect
- 여러 핵심 기능에 적용될 관심사 모듈을 뜻한다.
- Aspect는 구체적인 기능을 구현한 Advice와 Advice가 어디에서 적용될지를 결정하는 PointCut의 포괄적인 개념이다. - JoinPoint
- 추상적인 개념으로 Advice가 적용될 수 있는 모든 위치를 뜻한다.
- 애플리케이션의 어떤 지점에 AOP를 사용하여 추가적인 로직을 삽입할 지 정의한다. - Advice
- JoinPoint에서 실행되는 코드를 말한다.
- 로그 출력이나 트랜잭션 관리 등의 코드가 기술된다. - Target
- Aspect를 적용할 대상을 뜻한다.
- 적용 방식에 따라 클래스, 메서드 등이 될 수 있다. - Pointcut
- JoinPoint 중에서 Advice가 적용될 위치를 선별하는 기능이다.
- 이를통해 메서드명에 'service' 라는 문자열이 있을때만 어드바이스를 호출되도록 기술하는 것이 가능해진다. - Advisor
- 스프링 AOP에서만 사용되는 용어로 Advice + Pointcut 한 쌍을 일컫는다. - Weaving
- Pointcut으로 결정한 타겟의 JoinPoint에 Advice를 적용하는 것을 뜻한다.
🌱 스프링 AOP 특징
- 순수 자바로 구현되었기 때문에 특별한 컴파일 과정이 필요하지 않다.
- 프록시 기반 AOP를 지원한다.
- Spring은 타겟(target) 객체에 대한 프록시를 만들어 제공한다.
- 타겟을 감싸는 프록시는 실행시간(Runtime)에 생성된다. - Spring AOP는 메서드 조인 포인트만 지원한다.
- Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원한다.
- 핵심기능(타겟)의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다.
- 반면에 AspectJ 같은 고급 AOP 프레임워크를 사용하면 객체의 생성, 필드값의 조회와 조작, static 메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용 할 수 있다.
🌱 스프링 AOP Advice 종류
- @Before
- JointPoint가 실행되기 이전 시점에 실행된다. - @After
- JointPoint의 정상 완료 여부에 상관없이 항상 실행된다. - @AfterRetruning
- JointPoint가 정상 완료된 후 실행된다. - @Around
- 메서드 호출 전후에 실행된다. - @AfterThrowing
- 메서드가 예외를 던지는 경우 실행된다.
🌱 스프링 AOP 사용 이점
- 높은 재사용성
- 중복된 코드를 최대한 제외하여 기능이 필요할 때만 호출하여 쓰기 때문에 재사용성이 높다. - 유지보수 측면에서의 유리함
- 애플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리되어 보다 유지보수가 수월하다. - 비즈니스 로직에 집중
- 핵심 로직과 부가 기능의 명확한 분리로, 개발자는 핵심 로직에 집중할 수 있게 된다.
References.
1. 하세가와 유이치(한빛미디어), 스프링4 입문
2. 김영한(인프런), 스프링 핵심 원리 - 기본편
3. 코드연구소 - [Spring] AOP(Aspect Oriented Programming)란? 스프링 AOP란?
4. backtony.log - Spring - AOP 총정리
반응형
'Spring' 카테고리의 다른 글
[Security] JWT 구현 (0) | 2023.02.16 |
---|---|
[Security] JWT 소개 (0) | 2023.02.12 |
[Spring] 스프링 IoC (0) | 2023.02.05 |
[Spring] 스프링 DI (2) | 2023.02.02 |
[Spring] 스프링 MVC (0) | 2023.01.29 |