키워드
→AOP, CGLib, JDK Dynamic Proxy
노트
- AOP
- Aspect Oriented Programming, 관점 지향 프로그래밍
- 기존의 객체지향 프로그래밍은 관심사별로 객체를 묶어주는 역할을 수행한다. 그러나 이러한 객체들간에 공통적으로 쓰이는 횡단 관심사들이 존재할 수 있다. 이러한 횡단 관심사를 어떻게 처리할 것인가?로 부터 시작한 프로그래밍 패러다임이다.
- AOP는 Spring Framework의 핵심기술이기도 하다. AOP라는 개념은 Spring에 종속적인 개념은 아니다. Java 프로그래밍 생태계 전반에 걸쳐 언급되는 하나의 기술 또는 개념에 가깝다.
- Spring에서는 AOP를 처리하기 위한 여러가지 방법들을 제공한다.
- 컴파일 타임에서 부가기능을 구현(추가)하기
- 런타임에서 부가기능을 구현(추가)하기
- 여기서 전자를 CTW(Compile Time Weaving) 기법, 후자를 RTW(Runtime Weaving)으로 언급한다.
- 컴파일 타임에서 구현하는 방법은 바이트 코드를 조작하는 방식
- 런타임에서 구현하는 방법은 프록시를 사용하는 방식
- Spring에서는 트랜잭션, 비동기 등을 AOP 로 구현하고 있다.
- 부가 기능 중 트랜잭션을 예로 들어보자. 만약 트랜잭션을 AOP가 아니라 일반 비즈니스 로직과 함께 구현한다고 생각해보자.
- 위와 같이 비즈니스 로직과 섞이면
- 매번 수정해야하고
- 매번 복사 붙여넣기를 해야한다.
- Spring은 런타임에서 어떻게 부가기능 코드를 추가하는 것일까? 바로 Dynamic Proxy와 Reflection을 이용해 처리한다.
- Dynamic Proxy란 무엇인가?
- 프록시 객체(프록시 패턴과는 다른 개념이다)는 대상 객체에 대한 접근과 제어를 위임하는 객체를 말한다. 그런데 이러한 프록시 객체를 만드려면, 상용구 코드가 여럿 필요하다.(인터페이스, 클래스, 메서드). 특히 원본 객체가 늘어나면 똑같이 프록시 객체도 여러개 만들어줘야 한다.
- 이건 불편하다. 그래서 나오는 대안이 바로 Dynamic Proxy 이다. Dynamic Proxy는 말 그대로 프록시를 동적으로 만들어주는 역할을 수행한다.
- Dynamic Proxy는 어떻게 작동하는가?
- 구현하기 위한 두가지 대표 라이브러리가 존재한다.
- JDK Dynamic Proxy
- CGLib
- JDK Dynamic Proxy
- 인터페이스 기반으로 프록시를 생성한다.
- Reflection을 기반으로 처리한다
- CGLib
- 구체 클래스 기반으로 프록시를 생성한다
- 바이트 코드를 조작하여서 처리한다
- 스프링 4.0 이후 버전부터 Default로 사용하는 프록시 라이브러리
요약
요약: 요약 어려움