@Slf4j는 Lombok에서 제공하는 애너테이션으로, 클래스에 Logger 객체를 자동으로 생성해주는 역할을 합니다. 이 애너테이션을 사용하면 코드에서 Logger 객체를 생성하는 번거로움을 줄이고 간결하게 로그를 처리할 수 있습니다.
Slf4j(Simple Logging Facade for Java)는 Java의 로깅 프레임워크를 통합하기 위한 추상화 계층입니다.
Slf4j 자체는 로깅을 처리하지 않고, 실제 로깅 구현체(e.g., Logback, Log4j)를 연결하여 사용합니다.
장점: Slf4j를 사용하면 로깅 구현체를 변경하더라도 코드 수정 없이 설정만으로 변경이 가능합니다.
로깅은 애플리케이션의 실행 과정 중 중요한 정보를 기록하는 작업입니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Example {
private static final Logger log = LoggerFactory.getLogger(Example.class);
public void doSomething() {
log.info("This is an info log");
log.error("This is an error log");
}
}
@Slf4j를 사용하면 Lombok이 Logger 객체를 자동으로 생성합니다.import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Example {
public void doSomething() {
log.info("This is an info log");
log.error("This is an error log");
}
}
자동 생성된 Logger 필드: private static final org.slf4j.Logger log
Slf4j를 통해 다양한 로그 레벨로 메시지를 기록할 수 있습니다.
| 로그 레벨 | 설명 | 예제 |
|---|---|---|
TRACE | 가장 세부적인 로그. 디버깅에 유용. | log.trace("Trace message"); |
DEBUG | 디버깅 정보를 제공. 개발 중 유용. | log.debug("Debug message"); |
INFO | 일반적인 실행 정보. 상태 확인 용도. | log.info("Info message"); |
WARN | 잠재적인 문제 경고. | log.warn("Warning message"); |
ERROR | 오류 발생. 중요한 문제. | log.error("Error message"); |
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-logging' // 기본적으로 Logback 포함
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
application.properties 또는 application.yml에서 로그 레벨을 설정합니다.logging.level.root=INFO
logging.level.com.example=DEBUG
Java 애플리케이션에서 로그 메시지를 출력하기 위해 System.out.println()과 Slf4j 로거를 사용할 수 있습니다. 하지만 둘 사이에는 기능, 성능, 사용 편의성 등 여러 측면에서 차이가 있습니다.
| 구분 | System.out.println() | Slf4j 로거 |
|---|---|---|
| 로그 레벨 | 없음. 모든 메시지는 동일하게 출력. | TRACE, DEBUG, INFO, WARN, ERROR 제공. |
| 유연성 | 표준 출력(콘솔)로만 출력. | 콘솔, 파일, 네트워크 등 다양한 출력 가능. |
| 성능 | 느림. 모든 메시지를 즉시 출력. | 메시지 출력 전에 조건을 체크하여 불필요한 연산 최소화. |
| 포맷팅 | 기본적으로 문자열 연결 필요. | {}를 사용한 효율적인 포맷팅 제공. |
| 설정 | 설정 불가. | 로그 출력 포맷, 레벨, 파일 경로 등을 설정 가능. |
| 멀티스레드 지원 | 지원 부족. | 스레드 안정성을 고려하여 설계됨. |
| 장기적 관리 | 대규모 애플리케이션에서는 적합하지 않음. | 대규모 시스템의 로그 관리에 적합. |
if (log.isDebugEnabled()) {
log.debug("This is a debug log");
}
log.debug("User ID is {}", userId); // 문자열 연결 작업이 없으므로 성능 최적화.System.out.println("Application started");
System.out.println("User ID: " + userId);
log.info("Application started");
log.debug("User ID: {}", userId);
차이점:
System.out.println은 문자열 연결 연산이 항상 실행됨.- Slf4j는 로그 레벨 조건에 따라 출력 여부를 결정하며, 문자열 연결 연산을 생략할 수 있음.
DEBUG, INFO, WARN, ERROR로 구분하여 관리 가능.DEBUG 로그를 비활성화하고, ERROR 로그만 남길 수 있음.System.out.println은 대규모 애플리케이션에서 관리하기 어렵지만, Slf4j는 체계적인 로깅 관리가 가능.운영 환경에서 디버깅 메시지가 계속 출력되면 다음과 같은 문제가 발생:
Slf4j를 사용하면 로그 레벨과 설정 파일로 쉽게 제어 가능.
System.out.println()은 간단한 디버깅 용도로 사용하기엔 적합하지만, 대규모 애플리케이션에서는 유지보수와 성능 측면에서 한계가 있음.