6장 AOP

2023. 4. 2. 21:10스터디/토비 스터디

728x90

# 메소드 분리

 

기존 코드에서 비즈니스 로직을 사이에 두고 트렌젝션 시작과 종료 담당 코드가 전후로 위치한 것을 볼 수 있음.

또한 트랜잭션 경계설정의 코드와 비즈니스 로직 코드 간에 서로 주고받는 정보가 없음

이 두 코드는 성격이 다를 뿐 아니라 서로 주고받는 것도 없는, 완벽하게 독립된 코드

 

## 트랜젝션 경계 설정 코드 분리의 장점

- 비즈니스 로직을 담당하고 있는 코드를 작성할 때 트랜젝션과 같은 기술적인 내용에 전혀 신경을 안써도 .

- 비즈니스 로직에 대한 테스트를 손쉽게 만들어낼 수 있음

 

# 다이나믹 프록시와 팩토리 빈

트랜잭션 기능은 비즈니스 로직과는 성격이 다르기 때문에 아예 그 정용 사실 자체를 밖으로 분리할 수 있었음.

부가기능 외의 나머지 모든 기능은 원래 핵심기능을 가진 클래스로 위임해줘야

부가기능 자신도 같은 인터페이스를 구현한 뒤에 자신이 그 사이에 끼어들어야

프록시 : 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 대리자 역할을 하는 객체

타깃 : 프록시를 통해 최종적으로 요청을 위임받아 처리하는 실제 오브젝트

## 프록시 사용 목적

1. 클라이언트가 타깃에 접근하는 방법을 제어

2. 타깃에 부가적인 기능을 부여

 

## 데코레이터 패턴

부가적인 기능을 런타임 시 다이내믹하게 부여하기 위해 프록시를 사용하는 패턴

즉, 코드상에서는 어떤 방법과 순서로 프록시와 타깃이 연결되어 사용되는지 정해져 있지 않음.

꼭 한 개의 프록시로 제한두지 않음. 프록시가 직접 타깃을 사용하도록 고정시킬 필요도 없음

타깃의 코드를 손대지 않고, 클라이언트가 호출하는 방법도 변경하지 않은 채로 새로운 기능을 추가할 때 유용한 방법

 

## 프록시 패턴

프록시를 사용하는 방법 중에서 타깃에 대한 접근을 제어

프록시는 타깃의 기능을 확장하거나 추가하지 않음

타깃 오브젝트에 대한 레퍼런스가 미리 필요

타깃 오브젝트를 생성하고 요청을 위임

타깃에 대한 접근권한을 제어하기 위해 프록시 패턴을 사용

타깃의 기능 자체에는 관여하지 않으면서 접근하는 방법을 제어해주는 프록시 이용

프록시는 코드에서 자신이 만들거나 접근할 타깃 클래스 정보를 알고 있는 경우가 많음

 

## 프록시 작성의 문제점

1. 인터페이스를 구현하고 위임하는 코드를 작성하기가 번거로움, 부가기능이 필요 없는 메서드도 구현해서 타깃으로 위임하는 코드를 일일이 만들어줘야

2. 부가기능 코드가 중복될 가능성이 많다

 

## 다이나믹 프록시

프록시 팩토리에 의해 런타임 시 다이내믹하게 만들어지는 오브젝트

타깃의 인터페이스와 같은 타입으로 만들어짐

 

DI대상이 되는 다이나믹 프록시 오브잭트는 일반적인 스프링의 빈으로는 등록할 방법이 없음.

사전에 프록시 오브잭트 클래스 정보를 미리 알아내서 스프링의 빈에 정의할 방법이 없음

 

 

## 프록시 팩토리 빈 방식의 장점

프록시 팩토리 빈을 이용하면 프록시 기법을 아주 빠르고 효과적으로 적용

클래스를 일일이 만드는 번거로움 제거

부가기능 코드의 중복 문제도 사라짐

 

### 한계점

프록시를 통해 타깃에 부가기능을 제공하는 것은 메서드 단위로 일어남

허나, 한 번에 여러 개의 클래스에 공통적인 부가기능을 제공하는 일은 불가능

하나의 타깃에 여러 개의 부가기능을 적용하기도 힘듬

거의 비슷한 설정이 자꾸 반복됨

Handler 오브젝트가 프록시 팩토리 빈 개수만큼 들어감

부가기능을 제공하는 동일한 코드임에도 불구하고 새로운 오브젝트를 만들어야

 

## 빈 후처리기

스프링 빈 오브젝트로 만들어지고 난 후에, 빈 오브젝트를 다시 가공

빈 오브젝트의 프로퍼티를 강제로 수정 할 수 있고 별도의 초기화 작업 가능. 빈 오브젝트 자체를 바꿔치기도 가능

빈 후처리기가 등록되어 있으면 스프링은 빈 오브젝트를 만들 떄마다 후처리기에게 빈을 보냄.

빈으로 등록된 모든 어드바이저 내의 포인트컷을 이용해 전달받은 빈의 프록시 적용 대상인지 확인

프록시 적용 대상이면 그때는 내장된 프록시 생성기에게 현재 빈에 대한 프록시 생성

만들어진 프록시에 어드바이저를 연결

빈 후처리기는 프록시가 생성된면 원래 컨테이너가 전달해준 빈 오브젝트 대신 프록시 오브젝트를 컨테이너에 삽입

컨테이너는 최종적으로 빈 후처리기가 돌려준 오브젝트를 빈으로 등록하고 사용 

 

## 용어 정리

타깃 : 핵심 기능을 담은 클래스, 부가 기능을 부여할 대상

어드바이스 : 타깃에게 제공할 부가기능을 담은 모듈, 오브젝트로 정의되기도 하나, 메서드 레벨에서도 정의 가능

조인 포인트 : 어드바이스가 적용될 수 있는 위치

포인트컷 : 어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈

프록시 : 클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트

어드바이저 : 포인트컷 + 어드바이스

에스팩트 : 한 개 이상의 포인트컷와 어드바이스의 조합. 보통 싱글톤 형태의 오브젝트로 존재 

 

728x90

'스터디 > 토비 스터디' 카테고리의 다른 글

5장 서비스 추상화  (0) 2023.03.29
4장 예외  (0) 2023.03.29
3장 템플릿  (0) 2023.03.29
2장 : 테스트  (0) 2023.03.20
1장 : 오브젝트와 의존관계  (0) 2023.03.20