일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 컴퓨터시스템
- 링커
- Kotlin for Java Developers
- DispatcherServlet
- IOC
- 빌드툴
- beanfactory
- 토비의스프링
- 토비의스프링3.1
- exception
- 링킹
- DesignPattern
- AutoConfiguration
- Immutable
- 자바
- ApplicationContext
- springboot
- lambda
- String
- java
- 프록시
- FunctionalInterfaces
- 메이븐
- 클린코드
- Spring
- ORM
- hibernate
- JPA
- springwebmvc
- gradle
- Today
- Total
엔지니어로 가는 길
자바 프록시와 데코레이터 패턴(Decorator Pattern)에 대해 알아보자 본문
프록시
Proxy의 사전적 정의는 대리인이다. 자바에서 프록시는 타겟의 기능을 확장하거나 타깃에 대한 접근을 제어하기 위한 목적으로 사용하는 클래스를 말한다. 여기서는 기능을 확장하는 프록시의 예시를 보도록 한다.
Hello라는 클래스의 메소드가 대문자로 변환된 문자열을 리턴하게 하고 싶다고 해보자. 이때 프록시를 이용하면 Hello의 메소드를 변경하지 않은 채로 ‘대문자로 변환’이라는 부가 기능을 추가할 수 있다. 여러 구현 방법이 있지만 지금은 프록시의 개념을 이해하는 것이 목적이므로 인터페이스를 통해 간단하게 구현하는 방법을 알아보자.
위와 같이 Hello라는 이름의 인터페이스를 만든다.
HelloTarget이라는 클래스를 만들어 Hello를 구현한다.
다음으로 HelloUppercase라는 또 다른 Hello의 구현체를 만든다. 이때 HelloUppercase는 HelloTarget 타입의 객체를 가지고 있으며, 클라이언트에서 Hello의 메소드를 호출할 경우 HelloTarget에게 위임하여 원래의 일을 한 뒤, toUpperCase()라는 메소드를 이용하여 대문자 변환이라는 부가 기능을 덧붙여 이를 리턴한다.
처음부터 클라이언트에게 Hello라는 타입을 제공하고 이를 사용하게했다면, 클라이언트는 자신이 타겟을 직접 사용하고 있는지, 프록시를 사용하고 있는지 알 수도 알 필요도 없게 된다. (클라이언트가 타겟을 호출하는 방법을 바꾸지 않아도 된다.)
다음은 위의 상황을 도식화한 그림이다.
다음은 클라이언트가 Hello 타입의 객체를 사용할 때 일어나는 일을 표현한 의사코드이다.
위와 같은 예시가 프록시를 사용하는 하나의 예시이며, HelloUppercase가 프록시, HelloTarget이 타겟에 해당한다. 프록시를 이용하면 타겟 코드의 수정 없이 타겟의 기능을 확장하거나 부가 기능을 추가할 수 있다.
데코레이터 패턴
프록시는 타겟의 기능을 확장하거나 타깃에 대한 접근을 제어하기 위한 목적으로 사용한다. 앞서 살펴본 예제와 같이 타겟의 기능을 확장하기 위해 프록시를 사용하는 케이스가 바로 데코레이터 패턴이다.
decorator pattern is a design pattern that allows behavior to be added to an individual object, dynamically, without affecting the behavior of other objects from the same class. - wikipedia
다음은 데코레이터 패턴의 예시이다.
InputStream is = new BufferedInputStream(new FileInputStream("a.txt"));
'프로그래밍 > Java' 카테고리의 다른 글
자바 문서 빈출 단어 evaluate, expression, statement, block (0) | 2020.11.26 |
---|---|
자바를 통해 다이나믹 프록시(Dynamic Proxy)를 구현하는 방법 (8) | 2020.10.26 |
Java StringBuilder를 쓰는 이유 (0) | 2020.10.13 |
Java String으로 보는 동일성과 동등성 (0) | 2020.10.11 |
JPA @Embedded, @Embeddable, @ElementCollection 그리고 FetchType (2) | 2020.10.02 |