| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- java
- 문자열
- redis
- CS
- 파이썬
- 다이나믹 프록시
- spring security
- Reflection
- 약수
- 최소 신장 트리
- 운영체제
- Junit5
- 백준
- MST
- Deadlock
- Spring
- Python
- 스프링
- 모던 자바 인 액션
- proxy
- 객체지향
- 리플렉션
- OS
- 스프링 시큐리티
- 자바
- test
- 모던자바
- 알고리즘
- BOJ
- 프록시
Archives
- Today
- Total
Dev 달팽이 @_''
Java - 프록시 패턴 본문
Java - 프록시 패턴

Sequence Diagram

프록시 패턴(Proxy Pattern)
- 프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용
- 클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리하거나 부가기능을 제공하거나, 리턴값을 변경할 수도 있음
- 리얼 서브젝트는 자신이 해야 할 일만 하면서(SRP : Single Responsibility Principle,단일 책임 원칙) 프록시를 사용해서 부가적인 기능(접근 제한, 로깅, 트랜잭션 등)을 제공할 때 이런 패턴을 주로 사용
프록시 간단한 예제
Book.java
public class Book {
public String title;
public Book() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
BookService.java
public interface BookService {
void rent(Book book);
}
DefaultBookService.java
public class DefaultBookService implements BookService{
@Override
public void rent(Book book) {
System.out.println("rent : "+ book.getTitle());
}
}
BookServiceProxy.java
public class BookServiceProxy implements BookService{
BookService bookService;
public BookServiceProxy(BookService bookService) {
this.bookService = bookService;
}
@Override
public void rent(Book book) {
System.out.println("this is proxy");
bookService.rent(book);
}
}
BookServiceTest.java
public class BookServiceTest {
BookService bookService = new BookServiceProxy(new DefaultBookService());
@Test
public void di(){
Book book = new Book();
book.setTitle("Spring");
bookService.rent(book);
}
}

- BookServiceTest가 클라이언트
- BookServiceTest가 BookService 인터페이스를 이용
- BookService 인터페이스는 BookServiceProxy를 이용
- BookServiceProxy는 내부적으로 DefaultBookService를 참조
프록시 패턴의 문제점
- 번거로움
- 부가적인 기능을 추가할 때 마다 프록시를 추가해줘야함
- 프록시를 프록시로 감싸는 경우도 생김
- 모든 구현체에서 중복되는 코드가 발생할 수 있음
=> 매번 프록시에 해당하는 클래스를 만드는 것이 아닌 동적으로 런타임에 생성하는 방법(다이나믹 프록시)을 사용,
자바 리플렉션에서 제공하는 기능
'Java&Spring > 더 자바, 코드를 조작하는 다양한 방법' 카테고리의 다른 글
| Java - 클래스의 프록시 (0) | 2022.01.09 |
|---|---|
| Java - 다이나믹 프록시 (0) | 2022.01.09 |
| Java - 간단한 DI 프레임워크 만들기 (0) | 2022.01.09 |
| Java - 리플렉션(클래스 정보 수정 또는 실행) (0) | 2022.01.09 |
| Java - 리플렉션 API(클래스 정보 조회) (0) | 2022.01.09 |