
로깅은 개발자가 신경써야 할 매우 중요한 파트라고 생각해왔고, 그래서 이번 기회에 Spring Boot 어플리케이션의 로깅에 대한 내용을 한 번 정리해보고자 합니다. 정리하기 전에 왜 수많은 자바 서적에서 다루는 java.util.logging 을 실제 웹 어플리케이션에서는 사용하지 않는지 의문이 생겼는데, Why not use java.util.logging? 을 보고 대략적인 이유를 알 수 있었으니 이 점이 궁금하신 분들은 참고해주세요!
@Slf4j 는 Lombok에서 제공하는 어노테이션으로, Lombok의 다른 기능들과 마찬가지로 개발자로 하여금 SLF4J를 사용하기 위해 작성해야 하는 코드(Boilerplate code)를 생략할 수 있게끔 해줍니다. 실제로 어노테이션 내부를 살펴보면 @Slf4j을 선언하는 경우 Lombok 으로 하여금 logger field 를 작성하게끔 한다는 내용이 포함되어 있는데요, 아래 이미지와 같습니다.

더 나아가, SLF4J 공식 매뉴얼에서 제공하는 튜토리얼 자료에 담긴 코드를 봐도 위에서 살펴본 logger field 와 내용이 같음을 확인할 수 있습니다.

결국, SLF4J를 사용하기 위해 필요한 이 필드를 @SLF4J 라는 Lombok 어노테이션이 대신 써준다는 말입니다 😀
그렇다면 어플리케이션 개발자는 어떤 기능을 위해 SLF4J를 사용하고, 이때 SLF4J가 갖는 장점은 무엇일까요?
SLF4J 는 Simple Logging Facade for Java 의 약자로, 그 이름에서 알 수 있듯 여러 로깅 프레임워크(java.util.logging, logback, Log4j) 의 추상화를 제공해주는 라이브러리 입니다. '추상화를 제공한다'는 번역이 좀 어색하긴 하지만 자바에서 사용할 수 있는 다양한 로깅 프레임워크의 API를 제공해주는 라이브러리라고 생각하면 될 것 같아요!
💡 Facade는 보통 건축 분야에서 건물의 정면 외벽을 지칭하는 말인데, 소프트웨어 분야에서는 Facade Pattern 이라는 디자인 패턴에서 사용되는 인터페이스를 지칭할 때 쓰임
앞서 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 가 무슨 일을 하는 지 직관적으로 이해할 수 있을 겁니다.

앞에서 살펴본 바와 같이 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를 붙이면 로깅이된다' 정도로만 이해하고 넘어갈 수도 있을 겁니다. 하지만 실무에서 어플리케이션 성능을 위해 로깅 레벨을 조절해야 하거나, 단순히 콘솔에 로그를 찍는 걸 넘어 로깅 파일을 주요하게 관리해야하는 상황에서는 이러한 배경지식이 도움이 될 수 있지 않을까 싶네요!