래퍼 라이브러리
라이브러리는 소프트웨어를 개발하는데 사용되는 서브루틴이나 클래스들의 모음이다. 라이브러리는 라이브러리의 클라이언트가 라이브러리 루틴들을 실행하는데 사용할 수 있게 하는 인터페이스들을 노출한다. 래퍼 라이브러리(Wrapper library)는 라이브러리의 현재 인터페이스를 호환되는 인터페이스로 변환하는 코드의 얇은 층(심)으로 이루어져 있다. 이것은 여러 이유들로 인한 것이다:
- 엉성하게 설계되었거나 복잡한 인터페이스를 정제하기 위해.
- 대립되는 데이터 포맷 같이 같이 동작할 수 없는 코드를 동작하게 하기 위해.
- 크로스 랭귀지 또는 런타임 상호운용성을 활성화하기 위해.
래퍼 라이브러리들은 어댑터, 퍼사드 등을 사용해서 구현된다.
구조와 구현[편집]
래퍼 라이브러리가 구현되는 구체적인 방식은 쓰인 환경이나 의도하는 주소에 따라 매우 다르다. 이것은 특히 크로스 랭귀지/런타임 상호운용성이 고려될 때 더 그렇다.
예시[편집]
다음은 일반적인 래퍼 라이브러리 구현을 보여준다. 이 예시에서 C++ 인터페이스는 C 언어 인터페이스를 감싸는 "래퍼"로서 동작한다.
C 인터페이스[편집]
int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr);
int pthread_mutex_destroy (pthread_mutex_t * mutex);
int pthread_mutex_lock (pthread_mutex_t * mutex );
int pthread_mutex_unlock (pthread_mutex_t * mutex );
C++ 래퍼[편집]
class Mutex
{
pthread_mutex_t mutex;
public:
Mutex()
{
pthread_mutex_init(&mutex, 0);
}
~Mutex()
{
pthread_mutex_destroy(&mutex);
}
private:
friend class Lock;
void lock()
{
pthread_mutex_lock(&mutex);
}
void unlock()
{
pthread_mutex_unlock(&mutex);
}
};
class Lock
{
Mutex& mutex;
public:
Lock(Mutex& mutex):mutex(mutex){mutex.lock();}
~Lock(){mutex.unlock();}
};
원래 C-인터페이스는 특히 라이브러리의 사용자가 이미 락된 뮤텍스를 언락하는 것을 잊을 때 오류를 유발한다. 새로운 인터페이스는 새로운 Mutex와 Lock 클래스에서 Mutex가 결국 언락되고 pthread_mutext_t 객체가 자동으로 릴리스된다는 것을 보장하기 위해 효과적으로 RAII를 활용한다.
위의 코드는 boost::thread 라이브러리의 한 부분인 boost::scoped_lock 과 boost::mutex 의 구현을 거의 흉내낸 것이다.
드라이버 래퍼[편집]
크로스-랭귀지/런타임 상호운용성[편집]
몇몇 래퍼 라이브러리들은 클라이언트 애플리케이션과 호환되지 않은 기술을 사용해 쓰여진 라이브러리 사이의 브리지 역할을 위해 존재한다. 예를 들면 자바 애플리케이션은 시스템 호출을 실행할 필요가 있을 것이다. 그러나 시스템 호출은 일반적으로 C 라이브러리 함수들로 표출된다. 이 문제를 풀기 위해 자바는 이러한 시스템 호출들을 자바 애플리케이션에서 호출할 수 있게 래퍼 라이브러리들을 구현하였다.
이 목적을 위해 자바 같은 언어들은 외부 함수 인터페이스라고 불리는 메커니즘을 제공한다. 이러한 예시는 다음과 같다:
- 자바 네이티브 인터페이스 (JNI)
- 자바 네이티브 액세스 (JNA)
- 파이썬을 위한 외부 함수 라이브러리
- SWIG (단순화된 래퍼와 인터페이스 생성기)
존재하는 래퍼 라이브러리들[편집]
현존하는 래퍼 라이브러리들의 예: