2014-06-10

[Design Pattern] Loan pattern - resource를 안전하게 사용하기

 언젠가 썼던 글에서도 설명했듯이 C++에서는 RAII를 이용하여 Resource의 안전한 해제를 보장하는 것을 넘어 control flow를 제어하는 역할까지 해준다.
 하지만 Garbage Collection을 사용하는 C#이나 Java 같은 언어에서는 언제 메모리가 해제될지 모르기 때문에 RAII pattern을 사용할 수 없다. 그래서 코드의 실행을 보장하기 위하여 finally 구문이 생기게 된 것이다.

 try finally를 사용하는 일반적인 방법은 아래와 같다.

 exception이 발생할 수 있으면 try 구문으로 감싸고 반드시 실행시켜야 하는 코드를 finally에 두는 것이다.

 하지만 위의 코드는 딱 보기에도 재사용성이 떨어진다.
 다른 동작을 하기 위해서는 언제나 try / catch를 써야 해서 boilerplate한 코드가 반복되기도 한다.
 이를 해결하는 방법은 없을까?

 Scala에서는 이를 해결하기 위하여 resource를 빌려주는 방식을 자주 이용한다.
 resource의 management를 하는 함수(lender)가 있고, resource를 사용하는 함수(lendee)에게 빌려주어 잠시 사용하게 해주는 것이다.
 이를 이용하여 API의 encapsulation과 reusability를 올릴 수 있다.
 우선은 다음 예제를 보자.

 위의 예시에서는 executeSql이라는 함수가 connection string과 Statement를 인자로 받는 Function을 인자로 받는다(말은 복잡한데 실제로 복잡한건 아닌데....... 말로 설명하려니 복잡해졌다.).
 첫 번째 인자로 받은 connection string을 이용하여 Statement라는 resource를 만들어 관리하게 된다. 즉, executeSql이 lender가 되는 것이다.
 그리고 두 번째 인자인 Statement를 인자로 받는 Function을 landee로 삼아 자신이 만든 Statement를 빌려주어 원하는 작업을 수행하게 한다.

 이런 pattern을 resource를 관리하는 lender와 빌려서 사용하는 lendee로 나뉘기 때문에 lender-lendee pattern으로 부르는 사람도 있지만, 보통은 loan pattern이라고 부른다.

 loan pattern은 resource의 관리/사용을 구분하였기 때문에 resource를 안전하게 사용하는 것을 보장해준다.
 또한, 변하는 부분인 사용에 해당하는 부분만을 재정의하면 되기 때문에 손쉽게 코드를 재사용 가능하게 만들어주고, 함수를 library로 제공하게 되면 user들에게 resource의 할당과 해제를 숨길 수 있어서 encapsulation이라는 측면에서도 매우 좋다.
 실제로 scala library의 많은 부분은 loan pattern을 사용하고 있다.

댓글 없음:

댓글 쓰기