이번에 알아볼 것은 프록시 Proxy패턴이다.
프록시 패턴이란 뭘까?
먼저 위키백과를 살펴보자 위키 백과에서는 프록시를
일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다.
라고 정의하고 있다.
프록시 패턴은 다른 무언가(리얼 서브젝트)와 서브젝트를 연결하기 위한 연결다리가 되는 클래스가 있는 패턴인데
사진을 보면 조금 더 이해하기가 쉽다.
해당 사진을 보면 프록시와 리얼 서브젝트가 공유하는 인터페이스(Subject)가 있고 클라이언트는 해당 인터페이스 타입으로 프록시를 사용하게 된다.
클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 부가적인 기능을 사용할 수 있고 리턴값도 변경 할 수 있다.
프록시 패턴을 통해서 리얼 서브젝트는 진짜 자신이 해야 할 일만 하는 하게 되고(SRP) 부가적인 기능을 사용할 때 이 패턴을 사용한다. SRP : single-responsibility principle 단일 책임원칙
하나의 클래스에는 하나의 일만 하자!
예를 들어 도서관에서 책을 진열하는 행위와 진열된 책 숫자를 세는 행위는 다른 행위이기 때문에 다른 클래스에 넣어주어야 한다는 것이다.
그럼 SRP하고 프록시 패턴하고 무슨 상관이냐! 한다면 리얼 서브젝트에 해야 할 일만 넣고 프록시에 부가적인 기능을 넣는다면
SRP를 잘 지키면서 개발할 수 있을 것이다.
다시 프록시로 돌아와서
이제 프록시 패턴을 구현해 보도록 하자
ProxyBook
@Data
public class ProxyBook {
private String title;
public ProxyBook(){
}
}
public class DefaultProxyBookService implements ProxyBookService {
@Override
public void rent(ProxyBook proxyBook) {
System.out.println(proxyBook.getTitle());
}
}
BookServiceProxy
public class BookServiceProxy implements ProxyBookService {
ProxyBookService proxyBookService;
public BookServiceProxy(ProxyBookService proxyBookService) {
this.proxyBookService = proxyBookService;
}
@Override
public void rent(ProxyBook proxyBook) {
System.out.println("proxy start");
proxyBookService.rent(proxyBook);
System.out.println("proxy end");
}
}
ProxyBookService
public interface ProxyBookService {
void rent(ProxyBook proxyBook);
}
BookServiceTest
@SpringBootTest
public class BookServiceTest {
ProxyBookService proxyBookService = new BookServiceProxy(new DefaultProxyBookService());
@Test
public void di() {
ProxyBook proxyBook = new ProxyBook();
proxyBook.setTitle("kibong");
proxyBookService.rent(proxyBook);
}
}
결과
proxy start
kibong
proxy end
먼저 값을 변경해 주기 위해 Proxy Book이라는 클래스를 만들고
ProxyBookService이라는 프록시와 리얼 서브젝트가 공유하는 서브젝트를 만들고
DefaultProxyBookService이라는 리얼 서브젝트를 만든다.
그리고 프록시를 통해서 리얼 서브젝트를 접근할 수 있도록 BookServiceProxy을 만들어 주었다.
그럼
이 사진처럼 우리는 프록시 패턴 이용할 수 있게 되었다.
이 패턴의 가장 큰 장점! 리얼 서브젝트를 변형하지 않아도 부가적인 기능을 이용할 수 있는 것이다!
ProxyBookService의
System.out.println("proxy start");
System.out.println("proxy end");
처럼 말이다.
근데 프록시 패턴은 굉장히 할 일이 많다는 것이다.
왜냐하면 프록시 패턴 한번 만들 때 마다 서브젝트 만들고 리얼 서브젝트 만들고 프록시 만들고 해야 해서
되게 할 일이 많다는 것이다.
이런 문제점 때문에 나온 것이 자바 리플랙션 기능을 이용한 다이내믹 프록시이다.
다음에는 다이내믹 프록시를 알아보도록 하겠습니다.
봐주셔서 감사합니다. 감사합니다 Thank you
https://github.com/kibongcoders/java_study
GitHub - kibongcoders/java_study
Contribute to kibongcoders/java_study development by creating an account on GitHub.
github.com
https://www.inflearn.com/course/the-java-code-manipulation/dashboard
더 자바, 코드를 조작하는 다양한 방법 - 인프런 | 강의
여러분이 사용하고 있는 많은 자바 라이브러리와 프레임워크가 "어떻게" 이런 기능을 제공할 지 궁금한적 있으신가요? 이번 강좌를 통해 자바가 제공하는 다양한 코드 또는 객체를 조작하는 방
www.inflearn.com
'Java > 더 자바, "코드를 조작하는 다양한 방법"' 카테고리의 다른 글
애노테이션 프로세서 Annotation Processor (0) | 2023.02.01 |
---|---|
다이나믹 프록시, Dynamic Proxy (0) | 2023.01.19 |
리플렉션 Reflection (0) | 2023.01.11 |
JVM 이해하기 (0) | 2022.12.21 |