Spring Boot에서는 System.out.println() 대신 Logger를 사용한다.
처음에는 println이 더 직관적이고 간편하게 느껴질 수 있지만, 실제 서비스 운영 환경에서는 다음과 같은 요구 사항이 생긴다:
- 로그 중요도 구분 (DEBUG, INFO, ERROR 등)
- 로그 파일 저장 및 관리
- 다양한 환경별 로그 수준 조절
- 멀티스레드 환경에서도 안정적 동작
- 일관된 포맷, 성능 최적화
이를 위해 Spring Boot는 기본적으로 SLF4J(Simple Logging Facade for Java) + Logback 조합을 내장하여 제공한다.
이 글에서는 왜 Logger를 사용해야 하는지, 어떻게 사용하는지, 그리고 실전에서 어떻게 설정하고 활용할 수 있는지 정리한다.
1. System.out.println()의 한계
한계 | 설명 |
❌ 로그 레벨 없음 | 출력의 중요도 구분 불가 |
❌ 파일 저장 불가 | 운영 환경에서 로그 추적 어려움 |
❌ 포맷 제어 어려움 | 일관성 없는 출력 |
❌ 조건부 출력 불가 | 모든 로그가 항상 출력됨 |
❌ 성능 문제 | 대량 출력 시 성능 저하 가능 |
2. Logger의 장점
- 로그 레벨별로 출력 제어 가능 (TRACE ~ ERROR)
- 파일, 콘솔, 네트워크 등 다양한 출력 대상 지정 가능
- 환경에 따라 다른 로그 설정 가능 (ex. dev vs prod)
- 포맷 지정, 필터링, async logging 가능
- 성능 최적화: DEBUG 로그 비활성화 시 실행 자체를 생략
3. Logger 사용법
Lombok의 @Slf4j 사용
- 로그 선언을 직접 할 필요 없이, log 객체가 자동 생성된다.
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
public class UserController {
@GetMapping("/hello")
public String hello() {
log.info("Hello 요청됨");
return "Hello";
}
}
수동 선언 (Lombok 없이)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyService {
private static final Logger log = LoggerFactory.getLogger(MyService.class);
public void execute() {
log.debug("실행됨");
}
}
* 개념 정리
용어 | 설명 |
SLF4J | 로그 API 인터페이스 (Simple Logging Facade for Java) |
Logback | Spring Boot 기본 내장 로그 구현체 |
Logger | 로그 출력을 담당하는 객체 |
* 로그 레벨 종류
레벨 | 용도 |
trace | 가장 상세한 로그 (디버깅 초반) |
debug | 개발 시 디버깅용 |
info | 운영 시 정상 흐름 기록 |
warn | 문제는 아니지만 주의할 상황 |
error | 예외, 에러 발생 시 |
4. 로그 설정 방법 (application.properties)
# 전역 로그 레벨 설정
logging.level.root=info
# 특정 패키지 로그 수준 설정
logging.level.com.example.demo=debug
# 로그 파일 저장
logging.file.name=app.log
5. 실전 팁
"문자열 결합" 대신 "{}" 형식 사용
log.info("사용자: {}", username); // 권장
log.info("사용자: " + username); // 비권장
DEBUG 로그는 운영 환경에서 꺼두기
spring.profiles.active=prod
logging.level.root=info
로그 포맷 커스터마이징 가능 (예: 시간, 클래스명 등 표시)
'Spring > 문법' 카테고리의 다른 글
테스트 코드 개념 (0) | 2025.06.11 |
---|---|
JSON 포맷 변경하기: Jackson 설정 커스터마이징 (1) | 2025.05.23 |
Spring Boot 환경별 설정 관리하기 – application-{profile}.properties (0) | 2025.05.23 |
다중 데이터소스 설정 하기 (feat. DB 여러 개 연결하기) (0) | 2025.05.12 |
정적 팩토리 메서드 (Static Factory Method) (0) | 2025.05.09 |