코테나 프로젝트 개발할 때 가장 많이 쓰던 코드는 System.out.println( ) 이었다. (가장 직관적인 방법이었으니..)
하지만 실무에서는 sout보다 로깅 라이브러리를 사용한다고 하는데 그 이유가 뭘까?
1. 애플리케이션의 성증 저하(Thread Blocking)
System.out의 내부 코드를 타고 들어가 보면 아래와 같은 구조를 가지고 있다.
// java.io.PrintStream 내부 코드 예시
public void println(String x) {
synchronized (this) { //병목 지점!
print(x);
newLine();
}
}
sout는 내부적으로 synchronized 블록으로 감싸져 있다. 즉 하나의 쓰레드가 콘솔에 로그를 출력하는 동안 다른 쓰레드들은 자기 순서가 올 때까지 차례를 기다리며 멈춰있게 된다.(Blocking) 사용자가 몰리는 운영 서버에서 sout를 남발하게 된다면? 애플리케이션의 전체적인 처리 속도가 느려지고 병목 현상일 발생하게 된다. 반면, SLF4J(Logback)는 비동기(Asynchronous) 버퍼링 지원 등을 통해 대용량 요청에서도 시스템 리소스를 효율적으로 사용할 수 있다.
2. 로그 레벨 관리 불가능
sout은 한 번 작성하면 무조건 콘솔에 출력된다. 하지만 개발할 때 필요한 로그와 실제 서비스를 운영할 때 필요한 로그는 엄연히 다르다.
| 로그 레벨 | 설명 | 주요 사용 환경 |
| TRACE / DEBUG | 개발 단계에서 상세한 로직 흐름이나 변수 값을 확인할 때 | 로컬 개발 환경 |
| INFO | 애플리케이션의 정상적인 상태 변경, 중요 이정표 | 운영 환경 (기본) |
| WARN | 당장 에러는 아니지만, 잠재적 문제가 발생할 수 있는 경고 | 운영 환경 |
| ERROR | 시스템에 심각한 문제가 발생하여 즉시 확인이 필요한 에러 | 운영 환경 (무조건 출력) |
스프링 부트에서는 application.properties 또는 application.yml 파일 설정 코드 한 줄만으로 로컬에서는 DEBUG 레벨까지 다 보다가 운영 서버를 배포할 때는 INFO 레벨 이상만 출력되도록 제어할 수 있다.
만약 sout를 썼다면? 배포할 때마다 일일이 코드를 찾아다니며 주석 처리하거나 지워야하는 일이 발생함 😢
3. 로그의 휘발성과 영구 저장 (Logging File)
sout으로 출력된 메시지는 콘솔 창에 한번 표시되면 끝이다. 근데 만약 새벽에 운영 중인 서버가 갑자기 다운되거나 재부팅된다면 콘솔에 찍혀있던 에러 메시지는 영영 사라진다. 원인 분석이 불가능해지는 것.. SLF4J 계열의 로깅 라이브러리를 사용하면 아주 유연하게 로그 파일 관리가 가능합니다.
- 로그 내용을 콘솔뿐만 아니라 server.log 같은 실제 파일로 분리하여 서버에 물리적으로 저장할 수 있다.
- "로그 파일 크기가 10MB를 넘어가면 새 파일로 쪼개기", "날짜가 지나면 옛날 로그는 .zip으로 자동 압축하기" 같은 세부 옵션을 설정만으로 다룰 수 있다.
- 외부 클라우드 시스템(AWS CloudWatch, ElasticSearch 등)과 연동하여 에러 로그만 따로 모아 모니터링할 수도 있다.
4. 부족한 메타데이터 (언제, 어디서?)
System.out.println("결과: " + result);를 실행하면 콘솔에는 딱 결과: 100만 출력됩니다.
에러를 추적할 때는 이 값이 몇 시 몇 분 몇 초에 찍힌 건지, 어떤 쓰레드가 요청을 처리하다가 찍은 건지, 정확히 어느 클래스의 어느 메서드 라인에서 발생한 건지 아는 것이 매우 중요하다.
SLF4J를 사용하면 별도의 문자열 가공 없이도 아래와 같이 메타데이터를 기본적으로 제공한다.
2026-06-26 14:25:31.452 [http-nio-8080-exec-1] INFO com.example.MemberService - 결과: 100
(시간 / 요청을 처리한 쓰레드명 / 로그 레벨 / 클래스명 / 실제 로그 내용이 한눈에 파악됩니다.)
결론
System.out.println()은 혼자 알고리즘 문제를 풀거나 토이 프로젝트를 로컬에서 가볍게 테스트할 때만 사용하는 것!!
실제 작동하는 웹 서비스를 설계하고 운영할 때는 성능 향상, 유지보수의 편리함, 에러 추적의 용이성을 위해 반드시 SLF4J를 활용한 로깅을 생활화해야 할 것.
'개발 공부 > Java' 카테고리의 다른 글
| [PLUS] Spring Cloud Eureka & Load Balancing (0) | 2026.06.29 |
|---|---|
| [TIL]Spring Boot 숙련(3)-RestTemplate와 JPA 연관관계, Fetch 전략 (0) | 2026.06.26 |
| [TIL]Spring Boot 숙련(1)-Spring Security & JWT 인증 (0) | 2026.06.26 |
| [TIL] SpringBoot 심화(1)-소셜 로그인(OAuth), 테스트, AOP, 예외처리 (0) | 2026.06.25 |
| [TIL] Spring Boot 입문(3) - Entity부터 Query Method까지 (0) | 2026.06.24 |
