You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
섹션10. 스프링 AOP 개념
1️⃣ AOP 소개 - 핵심 기능과 부가 기능
✅ 핵심 기능과 부가 기능
애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있다.
OrderService의 핵심 기능은 주문 로직이다.✅ 여러 곳에서 공통으로 사용하는 부가 기능
능이 여러 곳에 동일하게 사용된다는 뜻이다.
✅부가 기능 적용 문제
그런데 이런 부가 기능을 여러 곳에 적용하려면 너무 번거롭다. 예를 들어서 부가 기능을 적용해야 하는 클래스가 100개면 100개 모두에 동일한 코드를 추가해야 한다.
부가 기능을 별도의 유틸리티 클래스로 만든다고 해도, 해당 유틸리티 클래스를 호출하는 코드가 결국 필요하다. 그리고부가 기능이 구조적으로 단순 호출이 아니라
try~catch~finally같은 구조가 필요하다면 더욱 복잡해진다.만약 부가 기능에 수정이 발생하면, 100개의 클래스 모두를 하나씩 찾아가면서 수정해야 한다.
여기에 추가로 부가 기능이 적용되는 위치를 변경한다면 어떻게 될까?
예를 들어서 부가 기능을 모든 컨트롤러, 서비스, 리포지토리에 적용했다가, 로그가 너무 많이 남아서 서비스 계층에만 적용한다고 수정해야하면 어떻게 될까? 또 수 많은 코드를 고쳐야 할 것이다.
부가 기능 적용 문제를 정리하면 다음과 같다.
소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되어야 한다. 그런데 부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 OOP 방식으로는 해결이 어렵다.
2️⃣ AOP 소개 - 애스펙트
✅ 핵심 기능과 부가 기능을 분리
었는데 이것이 바로 애스펙트(aspect)이다.
애스펙트는 우리말로 해석하면 관점이라는 뜻인데, 이름 그대로 애플리케이션을 바라보는 관점을 하나하나의 기능에서
횡단 관심사(cross-cutting concerns) 관점으로 달리 보는 것이다.
이렇게 애스펙트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP(Aspect-Oriented Programming)이라한다.
참고로 AOP는 OOP를 대체하기 위한 것이 아니라 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.
🗒️AspectJ 프레임워크
AOP의 대표적인 구현으로 AspectJ 프레임워크(https://www.eclipse.org/aspectj/)가 있다. 물론 스프링도
AOP를 지원하지만 대부분 AspectJ의 문법을 차용하고, AspectJ가 제공하는 기능의 일부만 제공한다.
AspectJ 프레임워크는 스스로를 다음과 같이 설명한다.
3️⃣ AOP 적용 방식
✅크게 3가지 방법이 있다.
.java소스 코드를 컴파일러를 사용해서.class를 만드는 시점에 부가 기능 로직을 추가할 수 있다. 이때는AspectJ가 제공하는 특별한 컴파일러를 사용해야 한다..class를 디컴파일 해보면 애스펙트 관련 호출 코드가 들어간다. 이해하기 쉽게 풀어서 이야기하면 부가 기능 코드가 핵심 기능이 있는 컴파일된 코드 주변에 실제로 붙어 버린다고 생각하면 된다.
용 대상인 경우에 부가 기능 로직을 적용한다.
✅ 컴파일 시점 - 단점
컴파일 시점에 부가 기능을 적용하려면 특별한 컴파일러도 필요하고 복잡하다.
✅ 클래스 로딩 시점
.class파일을 JVM 내부의 클래스 로더에 보관한다. 이때 중간에서.class파일을조작한 다음 JVM에 올릴 수 있다..class를 JVM에 저장하기 전에 조작할 수 있는 기능을 제공한다. 궁금한 분은 java Instrumentation를 검색해보자.✅클래스 로딩 시점 - 단점
java -javaagent)을 통해 클래스 로더 조작기를 지정해야 하는데, 이 부분이 번거롭고 운영하기 어렵다.✅ 런타임 시전
✅부가 기능이 적용되는 차이를 정리하면 다음과 같다.
4️⃣ AOP 용어 정리
조인 포인트(Join point)
포인트컷(Pointcut)
타켓(Target)
어드바이스(Advice)
애스펙트(Aspect)
여러 어드바이스와 포인트 컷이 함께 존재
어드바이저(Advisor)
위빙(Weaving)
포인트컷으로 결정한 타켓의 조인 포인트에 어드바이스를 적용하는 것
위빙을 통해 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가 할 수 있음
AOP 적용을 위해 애스펙트를 객체에 연결한 상태
컴파일 타임(AspectJ compiler)
로드 타임
런타임, 스프링 AOP는 런타임, 프록시 방식
✅ AOP 프록시
Beta Was this translation helpful? Give feedback.
All reactions