📌 들어가기 전에 정리
- 로그인 체크 기능을 구현하면서 필터와 인터페이스에 대해 조사한 적이 있었다. 그때 항상 같이 등장하던 것이 AOP였는데, 그 당시 이해하기 어려워서 (아직도 어려움😂) 일단 미뤄두었다가 이제 다시 정리해보려고 한다.
- 처음 들었을 땐 그냥 필터 같은 존재구나! 이 정도였는데 당당히 스프링의 3대 요소에 포함되는 AOP였다.
(3대 요소 : IoC, DI, AOP)
- 스터디 중 멘토에게 많이 조언 받았던 점 중에 하나가 단일 책임 원칙이었다. 하나의 메소드는 하나의 기능만 충실하게 잘 할 것, 하나의 클래스가 너무 많은 책임을 갖지 않도록 노력할 것!
- 요구 사항에 대한 코드 외에 부가적인 코드들 ( 로그 처리, 보안 처리, 트랜잭션 처리 등)이 많아지면 가독성도 떨어지고 유지 보수하기도 어렵기 때문.
- 이를 위해 AOP라는 관점 지향 프로그래밍을 사용하는데
- 요구사항에 대한 비즈니스 로직
- 개발자가 필요한 코드 등 (보통 로그, 보안, 트랜잭션 처리)
예를 들자면 이런 식으로 관점에 따라 깔끔하게 코드를 분리할 수 있다. 이 정도로 정리하고 제대로 알아보자.
📌 AOP (Aspect-Oriented Programming)
AOP는 Aspect-Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
- 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
- 횡단 관심사 : 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들
- 핵심 기능과 부가 기능이란 관점에서 바라볼 때, 부가 기능 관점에서 공통된 요소를 추출할 수 있다. A,B,C 노란색 부분, A,C는 파란색 부분, A,B는 빨간색 부분을 공통적으로 사용하고 있다. 보통 이런 부분이 로그 처리, 보안 처리 , 트랜잭션 처리 같은 것들이다.
📌 OOP와 AOP
OOP : 비지니스 로직의 모듈화
AOP : 인프라 혹은 부가 기능의 모듈화 ( 주목적 외에 필요한 부가적인 기능들)
📌 AOP 주요 개념
- Aspect : 흩어진 관심사를 모듈화 한 것. 주로 부가 기능을 모듈화
- Target : Aspect를 적용하는 곳 (클래스, 메소드 등)
- Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가 기능을 담은 구현체
- JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에 서 값을 꺼내올 때 등 다양한 시점에 적용 가능
- PointCut : 어디에 적용해야 하는지에 대한 정보
❗ spring AOP의 JointPoint에서는 메서드가 실행될 때만으로 한정하고 있다.
📌 AOP의 구현 방법
▶ 컴파일 타임에 적용
컴파일 시점(.java 파일을 .class 파일로 만들 때)에 바이트 코드를 조작하여
AOP가 적용된 바이트 코드를 생성
▶ 클래스 로드 시
순수하게 컴파일 한 뒤, 클래스를 로딩하는 시점에
클래스 정보를 변경 (Load Time Weaving, 로드타임 위빙)
▶ 프록시 패턴
스프링 AOP가 사용하는 방법.
A 클래스 타입의 Bean을 만들 때 A 타입의 Proxy Bean을 만들어
Proxy Bean이 Aspect 코드를 추가하여 동작
📌 AOP의 구현체 (자바)
| spring AOP | AspectJ |
목표 | 간단한 AOP 기능 제공 | 완벽한 AOP 기능 제공 |
join point | 메서드 레벨만 지원 | 생성자, 필드, 메서드 등 다양하게 지원 |
weaving | 런타임 시에만 가능 | 런타임은 제공하지 않음
compile-time, post-compile, load-time 제공 |
대상 | Spring Container가 관리하는 Bean에만 가능 | 모든 Java Object에 가능 |
📌 Spring AOP 특징
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가 기능을 추가하기 위함
- 스프링 빈에만 AOP를 적용 가능
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 중복코드 , 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 등 이런 문제들에 대한 해결책을 지원하는 것이 목적
📌 마치며
- AOP를 공부하기 전에는 그냥 딱 필터 정도 ? 생각했었는데 그런게 아닌듯.
- 필터와 인터셉터가 AOP에 포함된다고도 봤고 .. AOP를 하기 위해 필터와 인터셉터를 썼다는 말이 맞는 표현인 것 같기도 하다.
- proxy에 대해서 더 공부해봐야겠다.
- 현재 적용되어 있는 로그인 필터를 AOP로 바꾸는 작업을 하면서 적용 시점, 적용 방법 같은 것들을 다시 한번 정리해야겠다. 😀
reference!
[10분 테코톡] 🌕제이의 Spring AOP
스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP
위키백과AOP(Aspect Oriented Programming)란 무엇일까?
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP