이번 포스팅에서는 지난 reflection 소개에 이어서, Java에서 제공하는 reflection 중 하나인 dynamic proxy(이하 proxy)에 대해 알아보도록 하겠습니다.
Proxy라는 단어에서 생각해볼 수 있는 것
웹 서핑을 하다 보면 "프락시 서버"라는 용어를 한 번쯤 들어보셨을 겁니다. 저 서버는 내가 직접 접근할 수 없는 웹 페이지를 나 대신 접근해서 보여주는 서버지요.
그렇다면 Java에서 proxy란 무엇일까요? 위 프락시 서버의 경우와 마찬가지로 어떤 동작들을 대신 해주는 것이라고 어렴풋이 생각해볼 수 있지 않을까요?
간단한 스위치 예제들을 통해서 proxy에 대해 알아보도록 하겠습니다.
1. 대신할 동작 정의하기
먼저, 대신할 동작이 무엇인지 알아야 합니다. Java에서는 동작들을 interface로 정의하지요. 그럼 스위치의 동작을 정의해봅시다.
간단하게 토클 스위치 interface를 정의했습니다.
2. 진짜 스위치 만들기
이제 ToggleSwitch 동작을 구현한 진짜 스위치를 하나 만들어봅시다.
토글할 때마다 on/off 를 출력하는 간단한 스위치입니다.
3. 가짜 스위치 만들기
이제 proxy를 사용한 가짜 스위치를 작성할 텐데요, proxy가 왜 reflection에 해당하는지 아실 수 있을겁니다.
먼저, FakeSwitchHandler는 ToggleSwitch의 toggle() 동작을 실행해주는 객체입니다. ToggleSwitch를 구현하지도 않은, 전혀 관련 없는 클래스라는 점을 기억해주세요.
newInstance()에서는 ToggleSwitch를 구현한 클래스를 실행시간에 생성하고, ToggleSwitch 동작의 실행을 handler(여기서는 FakeSwitchHandler가 되겠죠?)에게 위임합니다. 어떤가요? 뭔가 대신한다는 느낌이 오나요?
두 스위치를 생성해서 사용해보도록 하겠습니다.
결과는 직접 확인해주세요.
마무리
위 예제를 통해 알 수 있는 사실을 정리해보면 아래와 같습니다.
- 어떤 interface를 구현한 클래스를 실행시간에 생성할 수 있다
- 해당 클래스의 동작을 handler에게 위임한다
그렇다면, 이 handler를 실행시간에 조작함으로써 같은 proxy 객체의 같은 메소드를 호출했다고 하더라도, handler의 상태에 따라 다른 동작을 할 수 있지 않을까요? 혹은 기존의 객체를 proxy 객체로 감싸서, 메소드 호출 전/후에 내가 원하는 코드를 끼워 넣을 수 있지 않을까요? 이런 재미있는 놀이 들은 이번에도 역시나 여러분들에게 숙제로 남깁니다.
Posted by Bitnine(비트나인)
'ARCHIVES' 카테고리의 다른 글
Izpack 사용법 (0) | 2015.09.22 |
---|---|
유용한 Nodejs용 프레임워크 (0) | 2015.09.22 |
pg_statsinfo 소개 (0) | 2015.09.22 |
JDO(Java Data Objects)와 Datanucleus 소개 (0) | 2015.09.22 |
Hive의 권한 시스템 (0) | 2015.09.22 |