해결된 질문
작성
·
742
4
DI를 이용한 Decorator, Proxy 패턴 듣고있는데요.
강의자료에 프록시 패턴의 프록시와 일반적용 용어 프록시, 자바의 다이나믹 프록시가 동일한 건 아니다. 이게 혹시 어떤내용인지 좀 더 알 수 있을까요?
답변 1
3
프록시라는 말은 일반적으로 대리자를 뜻합니다. 실제 대상을 대신해서 다른 역할을 해주는 것을 말하는 것이죠. 프록시 서버 같은 식으로 쓰기도 합니다. 일반적인 용어이지요.
자바의 다이나믹 프록시라고 불리는 것은 java.reflect.Proxy를 말하는 것인데 런타임시에 어떤 인터페이스를 구현한 인스턴스를 만들어 동적으로 기능을 부여하게 해줍니다. 이와 유사하게 인터페이스 없이 클래스를 상속하는 방식으로 구현해주는 클래스 프록시를 만들어주는 라이브러리, cglib 같은 것이 사용되기도 합니다.
그런데 GoF의 객체지향 디자인 패턴에 나오는 프록시 패턴과 데코레이터 패턴 두 가지는 다 자바의 다이나믹 프록시를 이용해서 동적으로 자바 프록시를 만들어서 구현할 수 있습니다. 물론 직접 코드를 만들어서 동적으로 연결을 시켜주는 방식도 가능하죠. 데코레이터 패턴은 대상 오브젝트에 책임을 동적으로, 재귀적으로 추가해주는 용도에 쓰이는 패턴인데 기능 추가보다는 접근제어나 보안, 지연로딩 같은 목적으로 쓰이는 프록시 패턴과는 목적 자체가 조금 다릅니다. 그런데 둘 다 구조가 비슷하고, 자바의 다이나믹 프록시를 이용해서도 만들 수가 있습니다. 그래서 데코레이터 패턴을 자바의 프록시를 이용해서 구현했다, 이런 표현이 가능한 것입니다.
그래서 스프링이 사용하는 인터페이스 프록시(다이나믹 프록시)나 클래스 프록시를 썼다고 해서 무조건 "프록시 디자인 패턴"을 썼다고 하면 뭔가 이상하겠죠? 어떤 경우엔 자바 프록시를 이용해서 "데코레이터 패턴"을 적용했다고 할 수도 있으니까요. 같은 단어지만 두 가지 프록시가 조금 다른 의미로 쓰이는 것이다라는 걸 이해하면 좋겠습니다.
JPA에서도 프록시를 사용하는데, 이건 디자인 패턴으로 치면 어떤 패턴에 해당할지도 한번 생각해보세요. 디자인 패턴에서 중요한 건 각 패턴의 목적 또는 의도입니다. 구조는 대부분 유사하기 때문에 목적으로 구분을 해야하죠.
답변 감사합니다!!