Apache Tomcat / / 2024. 10. 15. 11:27

SLF4J

SLF4J(Simple Logging Facade for Java)는 Java 애플리케이션에서 로깅을 추상화한 프레임워크야. 즉, **여러 로깅 프레임워크(Logback, Log4j, JUL 등)**를 하나의 일관된 API로 통합해서 사용할 수 있게 도와주는 역할을 해. SLF4J는 직접 로깅을 구현하지 않고, 다양한 로깅 프레임워크를 유연하게 연결하는 퍼사드(facade) 역할을 하지.

 

왜 SLF4J를 사용할까?

 

1. 로깅 프레임워크 독립성: SLF4J를 사용하면, 나중에 로깅 프레임워크를 변경할 때 애플리케이션의 코드를 수정할 필요가 없어. 예를 들어, 처음에는 Log4j를 사용하다가 나중에 Logback으로 변경하고 싶어지면, SLF4J를 통해 쉽게 교체할 수 있어.

2. 일관된 API 제공: 다양한 로깅 프레임워크에 대해 하나의 통일된 API를 제공해서, 코드를 쉽게 작성하고 유지보수할 수 있어.

3. 성능 최적화: SLF4J는 문자열 결합을 미리 처리하지 않아서 로깅 성능을 향상시킬 수 있어. 로그 메시지가 출력되지 않으면, 불필요한 문자열 연산이 수행되지 않아 성능 저하를 막을 수 있지.

 

SLF4J의 구조

 

SLF4J는 크게 두 가지 구성 요소로 나뉘어:

 

1. SLF4J API: 애플리케이션이 사용하는 로깅 인터페이스를 제공해. 이 인터페이스는 여러 로깅 프레임워크를 추상화해서, 특정 프레임워크에 의존하지 않게 해.

로깅 인터페이스는 LoggerFactoryLogger가 대표적이야.

예시:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
    private static final Logger logger = LoggerFactory.getLogger(MyApp.class);

    public static void main(String[] args) {
        logger.info("This is an info message");
        logger.error("This is an error message");
    }
}

 

2. 바인딩 (Binding): SLF4J가 실제로 사용할 로깅 프레임워크와 연결되는 부분이야. 다양한 로깅 프레임워크와 연동할 수 있는 바인딩 모듈을 제공해.

예: SLF4J + Logback, SLF4J + Log4j 등

Maven이나 Gradle을 통해 필요한 바인딩을 추가하면 돼.

 

SLF4J의 주요 특징

 

1. 로그 레벨 지원: SLF4J는 다양한 로그 레벨을 지원해. 개발자는 상황에 맞는 로그 레벨을 선택해서 로깅할 수 있어.

TRACE: 가장 상세한 정보.

DEBUG: 디버깅에 필요한 정보.

INFO: 일반적인 정보.

WARN: 경고 메시지.

ERROR: 에러 메시지.

logger.debug("Debugging message");
logger.info("Informational message");
logger.warn("Warning message");
logger.error("Error message");

 

2. Placeholders 사용: SLF4J는 문자열을 직접 결합하지 않고 플레이스홀더({})를 사용하는 방식으로 로그 메시지를 생성해. 이 방식은 불필요한 문자열 연산을 줄여 성능을 최적화하는 데 도움이 돼.

logger.info("User {} logged in at {}", userName, loginTime);

 

3. 바인딩의 유연함: SLF4J는 여러 로깅 프레임워크와 연동할 수 있어. 이를 바인딩이라고 하고, 실제 로깅을 수행하는 로깅 프레임워크를 선택할 수 있지.

Logback: SLF4J와 기본적으로 가장 많이 사용하는 로깅 프레임워크.

Log4j: 많이 사용되는 다른 로깅 프레임워크.

Java Util Logging (JUL): 자바의 기본 로깅 라이브러리.

SLF4J + Logback 조합이 많이 사용되는 이유는, Logback이 성능이 좋고 유연한 설정이 가능해서야.

 

SLF4J 사용 방법

 

1. Maven 또는 Gradle 의존성 추가: SLF4J와 사용할 로깅 프레임워크를 바인딩하기 위해선, 해당 라이브러리들을 의존성에 추가해야 해.

SLF4J API:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>

 

Logback 바인딩:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

 

2. 로깅 설정: Logback을 사용한다면 logback.xml을 통해 세부 로깅 설정을 할 수 있어.

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

 

요약

 

SLF4J는 Java 애플리케이션에서 다양한 로깅 프레임워크를 통합하는 로깅 추상화 라이브러리야. 이를 통해 특정 로깅 프레임워크에 종속되지 않고, 다양한 로깅 시스템을 유연하게 사용할 수 있게 해줘. 성능 최적화, 일관된 API 제공, 로깅 프레임워크의 독립성이 SLF4J의 주요 장점이야.


SLF4J 애노테이션은 SLF4J 로깅을 쉽게 사용할 수 있도록 도와주는 Lombok 라이브러리에서 제공하는 기능이야. Lombok을 사용하면 코드를 자동으로 생성해주는 다양한 애노테이션들을 사용할 수 있는데, 그 중 하나가 SLF4J 로그 객체를 자동으로 만들어주는 @Slf4j 애노테이션이야.

 

1. @Slf4j 애노테이션의 역할

 

@Slf4j 애노테이션은 클래스에 붙이면, SLF4J의 Logger 객체를 자동으로 생성해줘. 이 애노테이션 덕분에 직접 Logger 객체를 만들 필요 없이 편리하게 로깅을 사용할 수 있어.

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyApp {

    public static void main(String[] args) {
        log.info("This is an info message");
        log.debug("This is a debug message");
        log.error("This is an error message");
    }
}

 

위 코드에서 @Slf4j 애노테이션을 사용했기 때문에, 별도의 Logger 객체 생성 없이 바로 log라는 객체를 사용할 수 있게 돼. **log**는 Lombok이 자동으로 생성해준 SLF4J 로거 객체야.

 

2. @Slf4j 사용 이유

 

코드 간소화: Logger 객체를 직접 만들지 않아도 되므로, 코드가 깔끔해지고 간결해져.

자동 생성: @Slf4j를 사용하면 Lombok이 알아서 Logger 객체를 생성해주기 때문에, 실수로 Logger를 놓치거나 잘못 생성할 일이 없어.

다양한 로깅 프레임워크 지원: Lombok은 SLF4J 외에도 다양한 로깅 프레임워크를 지원해. 예를 들어, Log4j나 JUL을 사용하는 경우에도 대응하는 애노테이션이 있어.

 

3. 다른 Lombok 로깅 애노테이션들

 

Lombok은 SLF4J뿐만 아니라 다른 로깅 프레임워크도 지원해. 상황에 맞게 아래 애노테이션을 사용할 수 있어.

 

@Log: Java Util Logging (JUL) 기반의 로거 객체를 생성해.

@Log4j: Apache Log4j 로거 객체를 생성해.

@Log4j2: Apache Log4j2 로거 객체를 생성해.

@CommonsLog: Apache Commons Logging 로거 객체를 생성해.

@JBossLog: JBoss Logging 로거 객체를 생성해.

 

4. Maven/Gradle 설정

 

@Slf4j 애노테이션을 사용하려면 Lombok을 의존성으로 추가해야 해. 그리고 Lombok은 SLF4J 로깅을 위해 SLF4J 라이브러리도 필요해.

 

Maven 의존성 설정:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

 

Gradle 의존성 설정:

implementation 'org.projectlombok:lombok:1.18.22'
compileOnly 'org.slf4j:slf4j-api:1.7.30'
runtimeOnly 'ch.qos.logback:logback-classic:1.2.3'
annotationProcessor 'org.projectlombok:lombok:1.18.22'

 

5. 자동 생성된 코드

 

@Slf4j 애노테이션을 사용하면 내부적으로 Lombok이 자동으로 Logger 객체를 생성해주고, 이 객체는 log라는 이름으로 사용할 수 있어.

 

실제로 Lombok이 아래와 같은 코드를 자동으로 생성해주는 거야:

private static final Logger log = LoggerFactory.getLogger(MyApp.class);

 

이 과정을 Lombok이 자동으로 처리해주기 때문에, 별도로 Logger를 정의하지 않아도 되는 거지.

 

요약

 

@Slf4j 애노테이션은 Lombok에서 제공하는 기능으로, SLF4J 기반의 로거 객체를 자동으로 생성해 줘. 이를 통해 로깅 코드를 간결하게 유지하고, 직접 로거 객체를 생성할 필요 없이 바로 log 객체를 사용해 로그를 기록할 수 있어. Lombok은 SLF4J 외에도 다양한 로깅 프레임워크에 대응하는 애노테이션을 제공해, 여러 로깅 방식에 맞춰 쉽게 적용할 수 있어.

'Apache Tomcat' 카테고리의 다른 글

Apache Tomcat 전체 흐름  (2) 2024.10.15
MVC Config API  (0) 2024.10.15
Enable MVC Configuration  (0) 2024.10.15
@RequestMapping handler method  (0) 2024.10.11
@GetMapping, @PostMapping  (0) 2024.10.08
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유