ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프록시 패턴 - 백기선
    Java & 배경지식/패턴 2020. 6. 14. 17:42
    반응형

    • 프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용한다.
    • 클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리거나 부가기능을 제공하거나, 리턴값을 변경할 수도 있다.
    • 리얼 서브젠트는 자신이 해야 할 일만 하면서(SRP) 프록시를 사용해서 부가적인 기능(접근 제한, 로깅, 트랜잭션, 등)을 제공할 때 이런 패턴을 주로 사용한다.

     

    예제

    public class Book {
    	String title = "clean code";
    
    	public String getTitle() {
    		return title;
    	}
    
    	public void setTitle(String title) {
    		this.title = title;
    	}
    
    }

     

    public interface BookService {
    	void rent(Book book);
    
    	void returnBook(Book book);
    }

     

    @Service
    public class DefaultBookService implements BookService {
    
    	@Override
    	public void rent(Book book) {
    		System.out.println("전 ");
    		System.out.println("rent : " + book.getTitle());
    		System.out.println("이후 ");
    	}
    
    	@Override
    	public void returnBook(Book book) {
    		// TODO Auto-generated method stub
    	}
    
    }

     

    public class BookServiceProxy implements BookService {
    
    	BookService bookService;
    
    	public BookServiceProxy(BookService bookService) {
            this.bookService = bookService;
    	}
    
    	@Override
    	public void rent(Book book) {
    		System.out.println("프록시 테스트 rent");
    		bookService.rent(book);
    	}
    
    	@Override
    	public void returnBook(Book book) {
    		System.out.println("프록시 테스트 return book");
    		bookService.returnBook(book);
    
    	}
    
    }

     

     

    테스트 코드

    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class BookServiceTest {
    
    	@Autowired BookService bookService;
    	
    	@Test
    	public void di() {
    		Book book = new Book();
    		book.setTitle("spring");
    		bookService.rent(book);
    	}
    	
    }

     

    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class BookServiceTest {
    
    //	@Autowired BookService bookService;
    	BookService bookService = new BookServiceProxy(new DefaultBookService());
    	
    	@Test
    	public void di() {
    		Book book = new Book();
    		book.setTitle("spring");
    		bookService.rent(book);
    	}
    	
    }

     

    반응형

    'Java & 배경지식 > 패턴' 카테고리의 다른 글

    프록시 패턴  (0) 2020.02.17
    데코레이터 패턴  (0) 2020.02.17
    Strategy Pattern(전략패턴)  (0) 2020.02.13
    Session Facade 패턴  (0) 2020.02.10
    Transfer Object 패턴(Value Object)  (0) 2020.02.10
Designed by Tistory.