println을 지양해야 하는 이유

황희윤·2023년 11월 12일

System.out.println() 지양 이유

1. 로그 내용 휘발

  • 파일로 저장되지 않고 휘발된다.

  • 에러가 발생한 시각, 문제의 수준, 에러가 발생한 위치를 기록하지 않는다.

2. 로그 출력 레벨 사용 불가

  • 여러 로깅프레임워크에서는 로그 레벨에 따라 디버깅 정보를 남긴다.

  • 로그 레벨 예시

    • FATAL
    • ERROR
    • WARN
    • INFO
    • TRACE
    • DEBUG
    • ALL
  • System.out.println()은 레벨별 출력이 불가

3. 성능 이슈

  • 로그 레벨 분리가 안되기 때문에 필터링이 불가능해서 모든 정보를 다 출력해야 한다. 반면 로깅프레임워크에서는 필터링이 가능해서 내가 보고 싶은 정보만 출력 가능하다.

  • println() 메소드에는 newLine() 메소드를 호출한다. 또 이 newLine() 메소드 내부를 살펴보면, synchronized 키워드가 붙어있다.

  • 이 때 newLine() 메서드는 임계 영역(Critical Section)이 되어서, 멀티스레드 환경에서 newLine() 메서드가 호출되면 다른 스레드들은 newLine() 메서드의 실행이 끝나서 잠금이 풀린 뒤에야 실행이 가능하다. 즉, 오버헤드가 발생한다.

  • 스프링을 실행하고 멀티스레드로 동작하는 톰캣에서는 치명적이다.

  • .println()은 io 패키지 내에 있는데, I/O 작업에서는 I/O 시스템 콜을 호출해서 커널모드에서 작업을 하기 때문에 시간을 많이 소요해 성능이 좋지 않다.

profile
HeeYun's programming study

0개의 댓글