사실 로깅은 개발자가 신경써야 할 매우 중요한 파트라고 생각해왔고, 그래서 이번 기회에 Spring Boot 어플리케이션의 로깅에 대한 내용을 한 번 정리해보고자 한다. 정리하기 전에 왜 수많은 자바 서적에서 다루는 java.util.logging 을 실제 웹 어플리케이션에서는 사용하지 않는지 의문이 생겼는데, Why not use java.util.logging? 을 보고 대략적인 이유를 알 수 있었다.
@ SLF4J 를 사용했을 때 생기는 일
@Slf4j 는 Lombok에서 제공하는 어노테이션으로, Lombok의 다른 기능들과 마찬가지로 개발자로 하여금 SLF4J를 사용하기 위해 작성해야 하는 코드(Boilerplate code)를 생략할 수 있게끔 해준다. 실제로 어노테이션 내부를 살펴보면, @Slf4j을 선언하는 경우 Lombok 으로 하여금 logger field 를 작성하게끔 한다는 내용이 포함되어 있고, 그 예시는 아래 사진과 같다.
더 나아가, 아래 사진은 SLF4J 공식 매뉴얼에서 SLF4J 를 시작하는 방법을 가져온 건데, 담겨있는 코드를 보면 위에서 살펴본 logger field 와 내용이 같음을 확인할 수 있다.
결국, SLF4J를 사용하기 위해 필요한 이 필드를 @SLF4J 라는 Lombok 어노테이션이 대신 써준다는 말이다 :)
SLF4J (Simple Logging Facade For Java) 의 역할과 장점
그렇다면 어플리케이션 개발자는 어떤 기능을 위해 SLF4J를 사용하고, 이때 SLF4J가 갖는 장점은 무엇일까?
SLF4J 의 역할
SLF4J 는 Simple Logging Facade for Java 의 약자로, 그 이름에서 알 수 있듯 여러 로깅 프레임워크(java.util.logging, logback, Log4j) 의 추상화를 제공해주는 라이브러리다. '추상화를 제공한다'는 번역이 좀 어색하긴 하지만 자바에서 쓰이는 다양한 로깅 프레임워크의 API를 제공하는 개념이라고 보면 될 듯하다.
* Facade는 보통 건축 분야에서 건물의 정면 외벽을 지칭하는 말인데, 소프트웨어 분야에서는 Facade Pattern 이라는 디자인 패턴에서 사용되는 인터페이스를 지칭할 때 쓰인다.
SLF4J 의 장점
앞서 SLF4J 가 다양한 로깅 프레임워크의 API를 제공해준다고 언급했는데, 이러한 이유로 SLF4를 사용하면 구체적인 로깅 프레임워크가 변경 되더라도 별다른 코드의 수정이 불필요해진다. 이를 구체적으로 이해해보면 SLF4J 는 deployment time에 로깅 프레임워크(구현체)와 바인딩 되기 때문에, 경로에 위치한 .jar 파일을 바꿔주는 것으로 간단하게 로깅 프레임워크를 변경할 수 있는 것이다.
예를 들어, java.util.logging을 쓰다가 log4j로 로깅 프레임워크를 변경하고 싶다면, slf4j-jdk14-11.7.36.jar 를 찾아 slf4j-log4j12-1.7.36.jar 로 바꿔주면 된다(버전은 다를 수 있음).
아래 이미지는 SLF4J 공식 매뉴얼에 포함된 이미지인데, 요걸 보면 대충 SLF4J 가 무슨 일을 하는 지 알 수 있다.
Logback 로깅 프레임워크
앞에서 살펴본 바와 같이 SLF4J 는 여러 로깅프레임워크의 인터페이스만을 제공해주는 역할이고, 실제 스프링/스프링부트 기반의 웹어플리케이션에서는 Logback, log4j2 등이 SLF4J의 구현체로 많이 사용된다. 그러니 각종 로깅 설정들은 하고자 할 때는 구체적인 로깅프레임워크의 특성에 대해서도 알아둘 필요가 있다.
이 중 Logback은 log4j 의 후속으로 개발된 로깅 프레임워크이고, 스프링부트에서 starter를 사용하는 경우 기본으로 제공하는 로깅 프레임워크이기 때문에 여러 스프링부트 웹어플리케이션에서 사용되고 있다. 기존 log4j 대비 10배 가량 빠르고, 메모리를 적게 점유하는 특성을 갖고 있고, SLF4J API를 네이티브하게 구현했다는 특징(위의 SLF4J 이미지에서도 확인 가능함)이 있다. 이 외에 Logback이 log4j 1.x 대비 갖는 여러 구체적인 이점은 아래 링크에서 확인할 수 있으니, 개발하는 프로그램에서 사용하고자 한다면 참고해보시길!
(docs) Reasons to prefer logback over log4j 1.x
마무리
예전에 인턴 과제로 백엔드 API를 제공하는 스프링부트 기반의 웹어플리케이션을 개발했었고, 이 포스팅 내용은 당시에 과제를 마무리하며 정리했던 내용이다. 물론 스프링부트에서 기본적인 로깅설정을 해주기도 하고, 롬복까지 사용하는 환경에서는 '@SLF4J를 붙이면 로깅이된다' 정도로만 이해하고 넘어갈 수도 있다. 그러나 실무에서 어플리케이션 성능을 위해 로깅 레벨을 조절해야 하거나, 단순히 콘솔에 로그를 찍는 걸 넘어 로깅 파일을 주요하게 관리해야하는 상황에서는 이러한 배경지식이 도움이 될 수 있지 않을까 싶다.
댓글