- Spring에서 프록시 사용 22022년 11월 14일
- starryeye
- 작성자
- 2022.11.14.:07
이번 포스팅에서는 JDK 동적 프록시에 대해 알아보겠다.
이전 포스팅까지는..
적용 대상의 숫자 만큼 프록시 클래스를 직접 만들어 줘야 했다..
-> 프록시의 코드는 동일하지만... 적용 대상이 다르기 때문에 적용 대상 갯수 만큼 모두 만들어줘야 했다..
이를 해결하는..
동적 프록시 기술!
동적 프록시 기술을 사용하면 개발자가 직접 프록시 클래스를 만들지 않아도 된다..
(런타임에 객체를 동적으로 만들어준다...)
그 중..
JDK 동적 프록시는 인터페이스 기반으로 프록시를 동적으로 만들어준다.
-> 따라서 인터페이스가 필수이다.
JDK 동적 프록시에 적용할 로직은 위 캡쳐 사진의...
InvoationHander 인터페이스를 구현하여 개발하면 된다.
즉, 프록시의 proxy/decorate 로직과 실제 객체의 호출을 담은 메서드가 바로 invoke 메서드이다.
파라미터는..
Object proxy : 프록시 자신을 뜻한다..
Method method : 호출한 메서드를 뜻한다..
Object[] args : 메서드를 호출할 때 전달한 인수를 뜻한다...
(위와 같이.. 프록시이므로 타겟에 대한 정보들이 파라미터로 들어온다.)
실제 구현 예시를 보며 익혀 보자..
line 9, InvocationHandler를 Realization하고 있다..
line 11, 생성자 파라미터로 실제 객체를 받아서 맴버 객체로 가지고 있게 하였다.
line 13, invoke 메서드를 오버라이딩 하였으며..
line 22, method.invoke(target, args);
-> reflection을 사용하여.. target 인스턴스의 메서드를 실행한다.
(target의 동적으로 받은 메서드를 실행한다는 의미)
-> args는 그대로 넘겨주었다.
line 27, line 22에서 반환 받은 값을 그대로 반환하고 있다.
이렇게 구현한.. 공통 Proxy 로직에 해당하는 InvocationHandler를..
프록시를 적용하고 싶은 클래스에 동적으로 적용하는 방법(런타임에 프록시 객체가 생성)을 알아보자..
14 line, 실제 target 객체를 생성
16 line, 공통 Proxy 로직에 해당하는 InvocationHandler 객체를 생성
18 line, Proxy.newProxyInstance로 프록시 객체를 생성한다.
-> AInterface.class.getClassLoader() : 클래스 로더의 정보이다.
-> new Class[]{AInterface.class} : 실제 target 객체의 인터페이스를 넣어준다.
-> handler : 프록시가 호출할 메서드를 담은 클래스
19 line, 코드 상 AInterface proxy의 call() 이라는 메서드가 호출 되지만..
실제로는 handler의 invoke 구현 메서드가 호출 된다.
22 line에서 로그는.. ~~ $Proxy1 의 형태로 출력 된다.
-> 프록시 객체가 생성된 것을 알 수 있다..
이처럼..
개발자가 직접 프록시 클래스를 개발하지 않아도 JDK 동적 프록시 기술로 런타임에 클래스를 만들어 낼 수 있다..
(물론 당연하게도.. 프록시에 들어갈 공통 로직은 당연히 InvokeHandler에 개발은 해야된다.)
-> SRP 원칙 지킴
-> 프록시 공통 로직을 한 클래스에 다 몰아 넣을 수 있다.
주의사항..
프록시의 공통로직에 해당하는 .. InvokationHandler 클래스나
프록시 객체를 생성하는 부분을 자세히 본다면..
어떤 객체에 프록시를 적용할지는 선택하는데..
어느 메서드에 적용할지는 설정하지 않고 있다..
이는..
프록시 대상 객체를 선정하면 모든 메서드에 프록시가 적용된다는 말이다.
-> 따라서 개발자는 어떤 메서드에 프록시를 적용할지 고려하는 메서드를 InvocationHandler에 부가적으로 개발해야한다.
-> AOP의 포인트컷 개념으로 확장됨.
한계..
JDK 동적 프록시 기술은 인터페이스가 있어야 한다는 제약사항이 있다.
구체클래스만 있는 경우 동적으로 프록시를 만들 수 없다...
그리고..
현재 프록시를 만들때 여전히.. 뭔가 복잡하다..
(@Configuration에서 수동 빈 등록을 해주면서 프록시를 직접 만들어내는 코드를 작성 해줘야함)
'Spring > Core' 카테고리의 다른 글
Spring에서 프록시 사용 4 (0) 2022.11.19 Spring에서 프록시 사용 3 (0) 2022.11.14 Spring에서 프록시 사용 1 (0) 2022.11.05 Spring에서 자주 쓰이는 디자인 패턴 5 (0) 2022.11.05 Spring에서 자주 쓰이는 디자인 패턴 4 (0) 2022.11.05 다음글이전글이전 글이 없습니다.댓글