아직도 println? — SLF4J 3가지 #shorts #SAP #CAP
Moderator
이 글이 답하는 질문
- CAP Java에서 System.out.println 뭐가 문제인가?
- SLF4J 어떻게 쓰나?
- 실무에서 꼭 알아야 할 logging 패턴 3가지는?
println을 쓰면 안 되는 이유
- 로그 레벨 없음 — DEBUG/INFO/WARN/ERROR 구분 불가
- 운영 환경에서 끌 수가 없음 → 성능 저하
- 타임스탬프, 스레드명, 클래스 정보 없음
- 구조화 로그(JSON) 불가 → 로그 수집 시스템(ELK, Loki) 연동 어려움
직접 해보기
1. SLF4J Logger 선언
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component
public class OrderHandler {
private static final Logger log =
LoggerFactory.getLogger(OrderHandler.class);
// ❌ 이렇게 쓰지 마세요
// System.out.println("Order: " + orderId);
// ✅ 이렇게 쓰세요
// log.info("Order created: {}", orderId);
}
2. 로그 레벨별 사용 패턴
log.debug("입력값 확인: {}", request); // 개발용
log.info("주문 생성: {}", orderId); // 정상 흐름
log.warn("재고 부족: {}", productId); // 주의 필요
log.error("결제 실패", exception); // 장애 상황
3. MDC로 요청 ID 추적
import org.slf4j.MDC;
public void processOrder(String requestId) {
MDC.put("requestId", requestId);
try {
log.info("처리 시작"); // requestId 자동 포함
// ... 비즈니스 로직
} finally {
MDC.clear(); // 반드시 정리
}
}
삽질 노트
- 파라미터는
{}플레이스홀더 사용 — 문자열 연산은 레벨 체크 전에 실행되어 성능 저하 - exception은 마지막 파라미터로 —
log.error("실패", e)로 스택트레이스 자동 포함 - MDC.clear() 누락 시 다음 요청에 이전 requestId가 오염될 수 있음
핵심 한 줄
println은 끄지 못하고, SLF4J는 운영에서 DEBUG만 꺼도 성능이 달라진다.
더 파볼 주제
- CAP Java + Logback 설정으로 JSON 구조화 로그 출력
- SAP BTP Cloud Logging 서비스와 연동