아직도 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 서비스와 연동