on
스프링 AOP
예제로 배우는 스프링 입문 (개정판)의 내용을 정리하는 포스트
스프링 AOP
AOP가 뭐야?
스프링에는 IoC, AOP, PSA 세 가지 개념을 제공해주는 Spring Triangle
이라고 부르는 개념이 있다.
AOP는 Aspect Oriented Programming
의 약자로 관점 지향 프로그래밍이라는 의미이다.
흩어진 경우
class A {
method a() {
header
예제 문장 1
footer
}
method b() {
header
예제 문장 2
footer
}
}
class B {
method c() {
header
예제 문장 3
footer
}
}
위와 같이 header와 footer라는 일을 행하고 중간 메세지만 다른 경우가 있다고 하자. 이렇게 같은 일을 하는 코드인데 흩어져 있는 경우, 예를 들어 header를 headLine으로 바꾼다고 하면 header가 행해지는 모든 코드를 찾아서 변경해야한다. 심지어 다른 클래스까지 확인해야 한다.
이러한 것을 예방하기 위해서 메소드에서 해야할 일(메세지)는 남겨둔 채, 공통적인 일들을 따로 묶어서 다음과 같이 만들 수 있다.
묶은 경우
class A {
method a() {
예제 문장 1
}
method b() {
예제 문장 2
}
}
class B {
method c() {
예제 문장 3
}
}
class Line {
method line(JoinPoint point) {
header
point.execute()
footer
}
}
이런 것이 AOP이다.
성능을 측정하기 위해서 스프링에서 제공하는 StopWatch
라는 유틸을 다음과 같이 문장을 추가한다고 해보자.
OwnerCollector.java
...
@GetMapping("/owners/new")
public String initCreationForm(Map<String, Object> model) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
...
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
return ...
}
@PostMapping("/")
public String processCreationForm(...) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
...
}
...
이렇게 원하는 위치에 문장을 추가해서 얼마나 걸리는지 측정하는 방식은 AOP가 아니다. 이런 중복된 코드를 제거했지만 해당 코드가 존재하는 것처럼 구현하는 것이 AOP이다.
이러한 AOP를 구현하는 방법은 크게 세 가지가 있다.
컴파일
A.java
라는 파일을 A.class
로 컴파일을 하는 도중에 중간에 AOP를 추가할 수 있다. A.java
코드에는 stopWatch
라는 코드가 없지만, A.class
에는 있는 것처럼 해주는 컴파일러를 AspectJ
가 제공해준다.
바이트코드 조작
A.class
를 사용할 때 런타임에서 클래스로더가 읽어올 때 조작하는 방법이다. A.class
파일에 stopWatch
코드가 없는데 클래스 로딩하는 시점에 추가하여 메모리에 올라갈 때는 stopWatch
가 있는 것처럼 하는데 이것 역시 AspectJ
가 제공한다.
프록시 패턴
이 방법이 스프링 AOP가 사용하는 방법인데, 디자인 패턴을 사용해서 AOP와 같은 효과를 내는 방법이다.
Reference
Comments
SPRING 의 다른 글
-
스프링 타입 컨터버 24 Jun 2022
-
API 예외 처리 17 Jun 2022
-
예외 처리와 오류 페이지 12 Jun 2022
-
로그인 처리 - 인터셉터 08 Jun 2022
-
로그인 처리 - 필터 06 Jun 2022
-
로그인 처리 - 쿠키, 세션 31 May 2022
-
Bean Validation 22 May 2022
-
검증 22 May 2022
-
메시지, 국제화 21 May 2022
-
타임리프 - 스프링 통합과 폼 19 May 2022
-
타임리프 - 기본 기능 10 May 2022
-
스프링 MVC 기본 기능 - 웹 페이지 만들기 02 May 2022
-
스프링 MVC 기본 기능 - HTTP 응답 30 Apr 2022
-
스프링 MVC 기본 기능 - HTTP 요청 24 Apr 2022
-
스프링 MVC 기본 기능 - 요청 매핑 19 Apr 2022
-
스프링 MVC 기본 기능 19 Apr 2022
-
스프링 MVC 구조 이해 14 Apr 2022
-
MVC 프레임워크 만들기 - V4, V5 12 Apr 2022
-
MVC 프레임워크 만들기 - V1, V2, V3 09 Apr 2022
-
서블릿, JSP, MVC 패턴 05 Apr 2022
-
서블릿 29 Mar 2022
-
웹 애플리케이션 이해 24 Mar 2022
-
스프링 웹 계층이란? 05 Nov 2021
-
스프링 시큐리티 공식문서 번역 27 Sep 2021
-
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP 27 Apr 2021
-
SpEL (스프링 Expression Language) 25 Apr 2021
-
데이터 바인딩 추상화 : Converter와 Formatter 21 Apr 2021
-
데이터 바인딩 추상화 : PropertyEditor 12 Apr 2021
-
Validation 추상화 10 Apr 2021
-
Resource 추상화 08 Apr 2021
-
IoC 컨테이너 9부 07 Apr 2021
-
IoC 컨테이너 8부 06 Apr 2021
-
IoC 컨테이너 7부 02 Apr 2021
-
IoC 컨테이너 6부 29 Mar 2021
-
IoC 컨테이너 5부 27 Mar 2021
-
IoC 컨테이너 4부 23 Mar 2021
-
IoC 컨테이너 3부 20 Mar 2021
-
IoC 컨테이너 2부 18 Mar 2021
-
IoC 컨테이너 1부 12 Mar 2021
-
스프링 PSA 07 Jan 2021
-
스프링 @AOP 실습 07 Jan 2021
-
프록시 패턴 06 Jan 2021
-
스프링 AOP 04 Jan 2021
-
의존성 주입(Dependency Injection) 04 Jan 2021
-
스프링 빈(Bean) 02 Jan 2021
-
스프링 IoC 컨테이너 01 Jan 2021
-
스프링 IoC 01 Jan 2021