본문 바로가기
👨‍🏫일문일답

System.out.println() (sysout 또는 sout) vs. Logger

by 캔 2022. 3. 18.

자바 개발을 할 때, 결괏값이나 변수의 값을 콘솔 창에 출력하는 경우가 있다. 이유는 다양하겠지만, 애플리케이션을 실행할 때 콘솔 창을 통해 출력하는 방법은 System.out.println()을 사용하거나 Logger를 사용한다. 물론 각 방법에 장점이 있어 두 가지 방법 모두 사용해도 되지만, 적어도 규모가 있는 프로젝트에서는 Logger를 사용을 권장한다. 이번 글에서는 System.out.println() (이하 sysout)와 Logger 중 어느 것을 사용해야 할지 비교해본다.

 

System.out.println()

sysout의 최대 장점은 사용이 쉽고 별도의 라이브러리 추가가 필요 없다는 것이다. 자바를 처음 배울 때, sysout을 통해 문자열을 출력한다. 다만, 그 이외의 장점은 없고, 로거의 이점들을 커버하지 못한다. sysout을 사용하면 모든 경우에 콘솔을 통해 문자열을 출력한다.

Logger

Log4j2나 Logback 등의 로거를 사용할 경우 외부 라이브러리이기 때문에 빌드 도구에 의존성을 추가하거나 라이브러리 파일을 추가해줘야 하기는 하지만, 로거를 사용할 경우 로그로 출력할 내용을 필터링할 수 있다. 이는 모든 내용을 출력해야 하는 sysout과 차별되는 점이다. All, Trace, Debug, Info, Warn, Fatal 등 로그 레벨이 존재하여 해당 로그 레벨 이하의 로그가 출력되는 것을 막는다. 콘솔에 문자열을 출력하는 것은 결국 시스템에 부하가 된다. sysout을 사용하거나 로그를 출력하는 행위 자체가 시스템의 부하를 늘리고 레이턴시를 증가시킨다. 따라서, 웹 애플리케이션을 실제로 서비스할경우 로그 레벨을 높여서 치명적 오류 등과 같이 꼭 필요한 오류만 골라서 출력시키도록 하면 시스템 부하와 레이턴시를 줄일 수 있다. 추가적으로 카프카나 일래스틱 서치 등의 DBMS에도 로그를 내보낼 수 있다.

 

자바 애플리케이션도 마찬가지겠지만, 특히 웹 애플리케이션의 경우 갈수록 요청 수가 많아지고 응답 속도가 중요해지는 상황에서 항상 메시지를 출력해야 하는 것은 시스템 부하를 늘리고 서버 레이턴시를 증가시키기 때문에 지양해야 한다. 그렇기 때문에 sysout보다 logger를 쓰라고 하는 것이다. 하지만 프로젝트 규모가 작거나, 아니면 로컬 테스트에서만 테스트를 할 경우에는 sysout을 써도 무방하기는 하다. 다만, 역시 운영서버에서 사용할 때는 sysout을 제거해야 한다. 이는 귀찮은 작업이기도 하고, 애초에 로거를 사용했으면 그럴 필요가 없다.

 

참고: https://www.baeldung.com/java-system-out-println-vs-loggers