Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section5_13부

whyWhale 2020. 11. 24.

스프링 AOP : 프록시 기반 AOP  ※ 다이나믹한 방법은 이론 설명만 있음.

AOP :  AOP 는 oop를 보안하는 수단으로 흩어진 Aspect를 모듈화하는 프로그래밍 기법 이다.  

proxy : 네트워크쪽에 사용하는 용어로 중계자, 대리자 라는 뜻을 가지고 보안상 직접 통신하지 않고 두 점사이에서 대리인의 역할을 수행하는 기능이다. 

                -점 - proxy - 점 -> 이렇게 생각할 수 있고 또한 

                - proxy(점) -> 점 으로 생각할 수 있다.(proxy로 감싸있는 점 )

 

AOP의 특징

 

프록시 기반의 AOP 구현체이다.

스프링 빈!에만 AOP를 적용할 수 있다.

모든 AOP의 기능을 적용하는 것이 목적이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에 가장 흔한 문제에 대해 해결책을 제공하는 것을 주 목적으로 한다.

 

프록시 패턴은 왜 사용하는 것일까?

 

 

client - AppRunner  , 이 클라이언트는 프로시 객체를 사용하여 해당 서비스를 제공받는다. 이 프록시 안을 들여다 보면 proxy 와 Real subject 로 나뉘어진다. 자세한 내용은 뒤로 가서 설명.

먼저 Interface 생성

인터페이스 생성(인터페이스 상속 받으면 자동으로 override 됨.

@Serivice 란 빈으로 등록. 

※가정:  메소드의 실행시간을 알고 싶어서 currentTimemilis 사용하여 측정.

interface 를 상속받아 메소드들을 정의. 빈으로 등록. @Service

시간을 측정하는 함수를 사용하는 것이 crossCutting Concern 입니다. 여러 클래스가 있어야 하지만 메소드 측면에서도 가능한 것 같습니다. 각 메소드 측면에서 필요하고 안필요한 것이 있기 때문인 것 같습니다.

proxySimpleServiceEvent 라는 이름을 가지고 클래스를 만들고 똑같이 interface 상속을 받는다.

Autowired로 simpleEventSerivce 의존성을 주입받는다.그리고  가장 상위에 @Primary 라는 애노테이션을 붙인다. 이 애노테이션은 해당 타입 빈들이 여러가지가 있을 경우 가장 먼저 Access하게 되는 애노테이션이다. 즉 이 애노테이션을 먼저 불러오는 것이다.(SImpleEvenetService 가 아닌)

이 전에 나온 SimpleEventService의 의존성을 주입받고 의존성을 받은 객체에 매소드를 전달하기만하고 이제 원본 코드의 변경없이 이 전에 각 메소드들의 실행시간을 측정할 수 있는 currientTimemilies 를 구현한다.

프록시를 쓰는 이유는 여기에서 알수 있듯이 기존의 코드의 변경없이 사용 가능한 것으로 proxy로 감싸고 있는 것을 알수 있다. 하지만 중복인 코드는 여기에서도 발생하는 것을 알수 있다. 모든 메소드를 이렇게 적용하기에도 너무 불편하다.

 

해당 예제를 적용해 볼 수있음을 확인

출력하여 확인.

 

이 예시의 프록시 기반 AOP의 단점

*모든 메소드 전달 해주는 불편함.
* 중복인 코드도 발생.
* 기능으 다른 클래스에 적용될 때.. 모든 클래스에 프록시 클래스 코드 중복 또...?
* 그러한 방법을 줄일수 있는 방법을 다이나믹이나 ,오토팩토리 빈

 

해결방법

* 지금은 동적으로 만드는 방법이 있다.(런타임시!)
* 런 타임 => 애플리케이션이 동작 중에 어떤 객체에 프록시 객체를 만듬.
* 그 기반으로 IoC 방법과 혼합해서 같이 사용해서 이 문제를 간단히 해결한다.
* 그것이 스프링 AOP이다.

 

+ AbstractAutoProxyCreater implements BeanPostProcessor 사용.

BeanPostProcessor -> 새로운 빈 등록시 빈을 가공하는 LifeCycle 이다. 

AbstractAutoProxyCreater라는 것을 이용하면 런타임시 동적으로 프록시 객체를 만드는 방법으로 위의 단점을 해결할 수 있다.

댓글