토비의 스프링 reading (3)
AOP란
- AOP는 Ioc, DI, 서비스 추상화와 더불어 스프링의 3대 기반 기술
- 선언적 트랜잭션 기능이 대표적
트랜잭션 코드의 분리
- 비즈니스 로직 전 후에 로직과 전혀 상관없는 트랜잭션 경계를 설정해야 하기 때문에 필연적으로 코드가 지저분해짐
메서드 분리를 이용해 분리
- 비즈니스 로직을 담당하는 코드만 따로 메서드로 추출
- 하지만 여전히 비즈니스 로직이 아닌 보일 필요가 없는 트랜잭션 코드가 남아있음
- 그렇다면 클래스에서 빼서 아예 눈에 안띄게 해버리자
DI를 이용한 클래스의 분리
DI의 기본 아이디어는 실제 사용할 오브젝트의 클래스 정체는 감춘 채 인터페이스를 통해 간접으로 접근하는 것
그 덕분에 구현 클래스는 얼마든지 외부에서 변경 가능
UserService 인터페이스를 상속 받는 클래스를 2 가지로 나눔
- ServiceImpl(비즈니스 담당)
- ServiceTx(트랜잭션 담당)
Impl에선 비즈니스 로직을 담당하는 메서드만 남겨두고 Tx에선 userService를 구현한 다른 오브젝트를 주입 받고 트랜잭션 안에서 동작할 수 있도록 메서드 안에서 트랜잭션 경계를 설정
1 | public void upgardeLevels() { |
DI를 이용한 트랜잭션 경계설정 코드 분리의 장점
- 비즈니스 로직만 담긴 Impl 클래스에선 코드을 작성 시 트랜잭션 같은 비즈니스 로직과 관계 없는 부분에 대해 전혀 신경 쓰지 않아도 됌
- 테스트가 쉬워짐
다시 돌아와 AOP: 애스펙트(aspect) 지향 프로그래밍
- 부가기능 모듈화 작업
- 핵심기능에 부가되어 의미를 갖는 특별한 모듈
- 에스펙트는 부가될 기능을 정의한 코드인 어드바이스, 어드바이스를 어디에 적용할지를 결정하는 __포인터컷__을 함께 갖고 있음
- 위에서 트랜잭션 코드는 비즈니스 로직에 상관없는 기능인데 핵심기능에 침투해 들어가면서 설계와 코드가 모두 지저분해짐
- 이런 부가기능 코든는 여기저기 메서드에 마구 흩어져서 나타나고 코드는 중복됌
- 런타임 시에는 각 부가기능 에스펙트는 자기가 필요한 위치에 다이내믹하게 참여
- 하지만 설계와 개발은 다른 특성을 띤 에스펙트들을 독립적인 관점으로 작성
- AOP는 에스펙트를 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것
- 애플리케이션을 특정한 관점을 기준으로 바라볼 수 있게 해준다는 의미에서 관점 지향 프로그래밍이라고도 함
프록시를 이용한 AOP
- 스프링은 다양한 기술을 조합해 AOP를 지원하는데 가장 핵심은 프록시를 이용한다는 것
- 프록시로 만들어서 DI로 연결된 빈 사이에 적용해 타깃의 메서드를 호출 과정에 참여 해서 부가기능을 제공
- 스프링 AOP의 부가기능을 담은 어드바이스가 적용되는 대상은 오브젝트의 메서드
바이트코드 생성과 조작을 통한 AOP
- AspectJ는 컴파일된 타깃의 클래스 파일 자체를 수정하거나 JVM에 로딩되는 시점을 가로채서 바이트코드를 조작하는 방식을 사용
- 이 때 장점은,
- DI 컨테이너의 도움을 받아서 자동 프록시 생성방식을 사용하지 않아도 AOP 적용 가능하기 때문에 컨테이너가 없는 환경에서도 AOP의 적용 가능
- 프록시 방식보다 훨씬 강력하고 유연한 AOP가 가능, 프록시는 부가기능을 부여할 대상은 클라이언트가 호출 할 떄 사용하는 메서드로 제한되지만, 바이트코드를 직접 조작하기 떄문에 오브젝트의 생성, 필드 값으 조회와 조작, static 초기화등의 다양한 작업에 부가기능 부여 가능
AOP 용어 정리
- 타깃
- 부가기능을 부여할 대상
- 어드바이스
- 타깃에게 제공할 부가기능을 담을 모듈
- 조인 포인트
- 어드바이스가 적용될 수 잇는 위치
- 스프링 AOP의 조인 포인트는 메서드의 실행단계
- 타깃 오브젝트가 구현한 인터페이스의 모든 메서드는 조인 포인트가 됌
- 포인트컷
- 어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈
- 메서드의 시그니처를 비교하는 방법을 주로 사용
- 프록시
- 클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트
- 어드바이저
- 포인트컷과 어드바이스를 하나씩 갖고 있는 오브젝트
- 어떤 부가기능(어드바이스)를 어디에(포인트 컷) 전달할 것인가를 알고 있는 AOP의 가장 기본이 되는 모듈
- 애스펙트
- AOP의 기본 모듈
- 한 개 또는 그 이상의 포인트 컷과 어드바이스를 조합
- 보통 싱글톤 형태의 오브젝트