본문 바로가기

JAVA

Adapter Pattern 과 SLF4J

1. 어댑터 패턴

어댑터 패턴은 어떤 클래스의 인터페이스를 클라이언트에서 구하는 다른 인터페이스로 변환하는 것을 말한다.

일상 생활에서 예시를 들어보면, 돼지코라고 알려진 어댑터 플러그가 어탭터 패턴이 적용된 사례라고 볼 수 있다. 클라이언트(client)는 동그란 모양의 플러그이고, 일본의 11자 모양의 콘센트는 어댑티(adaptee)이다. 11자 모양의 콘센트를 적응시켜주는 돼지코가 어댑터(adapter)이다.

클래스 다이어그램으로 그려보면 위그림과 같다.

클라이언트는 타겟 인터페이스를 사용하여 어댑터의 request를 호출한다. 그러면 어탭티의 specificRequest가 호출되어서 request가 수행되게 된다. 이는 어댑티의 인터페이스를 타겟 인터페이스로 변환 시켜주어, 클라이언트가 어댑티를 사용할 수 있도록 해주는 것이다.

2. SLF4J

slf4j logger library에서 이 어댑터 패턴을 찾아볼 수 있다. slf4j를 사용하여 log4j 2로 동작하는 logger를 사용하기 위해서는 3개의 라이브러리가 필요한데, 각 라이브러리와 역할을 정리해보면 아래 표와 같다.

순번 Library 역할
1 slf4j-api.jar Target interface 
2 log4j-slf4j-impl.jar Adapter
3 log4j-core.jar Adaptee

slf4j는 log4j 2뿐만 아니라 log4j12 (log4j 1.2버전)과 java util logger에서도 adapter를 제공해준다. 그리고 logback의 경우에는 adapter가 존재하지 않고, 직접 구현되어 있다.

SLF4J는 내부적으로는 adapter를 이용해 각 로거들과 연결 시켜주고 있고, 최종적으로는 SLF4J의 Logger 인터페이스를 제공함으로써 다양한 로거들을 통합하여 쉽게 사용할 수 있도록 제공하고 있다. 이렇게 여러 로거들의 통합 인터페이스를 제공하는 것이 Facade Pattern이고, SLF4J의 이름이 The Simple Logging Facade for Java 인 이유가 여기서 나온다.

개인적으로는 slf4j가 완벽한 facade라고는 생각하지 않는다. logback이나 log4j 2를 사용할 때, configuration을 수정해야하는 경우 각각 logback.xml, log4j2.xml 와 같은 설정파일들을 생성해야하기 때문이다. 설정파일에 한해서는 통합 인터페이스를 제공하지 않으므로, 만약 slf4j를 이용해 logback으로 사용하고 있던 프로젝트의 logger를 log4j 2로 변경한다고 하면 library만 변경해주는 것이 아니라 설정파일도 같이 변경해주어야 한다.

반응형