본문 바로가기
개발공부/JAVA

[JAVA] System.out.println()을 쓰면 안 되는 이유

by 양히◡̈ 2022. 9. 26.

나의 경우 로깅에 대해 진지하게 고민해 본 적도 없었거니와, 학원에서도 회사에서도 System.out.println을 자주 활용했었기 때문에 당연하게 생각하고 있었다.

그런데 System.out.println을 쓰면 안 된다니? 처음 듣고 충격을 받아서, 더 자세하게 알아보고자 몇 가지 글을 찾아봤다.

 

우선 몇 가지의 이유가 있었는데, 로그가 표준으로 출력되기 때문에 어떠한 파일로 저장되지 않고 한 번 출력된 후 휘발되기 때문에 에러가 났을 때 추적하기 어렵다는 것과, 인자로 전달한 문자열만 출력되기 때문에 문제가 발생한 일시, 문제 발생 위치 등에 대한 정보는 알기가 어렵다는 것도 있었다.

 

 

 

System.out.println() 성능 저하 문제

그 중에서도 주목해볼 문제는 '성능저하'에 대한 것이었다.

 

println()의 구동원리를 살펴보면 이해할 수 있다.

println 메소드는 다음과 같이 PrintStream 클래스 안에 구현되어 있다.

 

/**
 * Terminates the current line by writing the line separator string.  The
 * line separator string is defined by the system property
 * {@code line.separator}, and is not necessarily a single newline
 * character ({@code '\n'}).
*/
public void println() {
    newLine();
}

 

 

그렇다면 newLine()은 어떻게 구현되어 있을까?

 

private void newLine() {
    try {
        synchronized (this) {
            ensureOpen();
            textOut.newLine();
		// ...

 

newLine 메소드에 synchronized 키워드가 걸려있는 것을 볼 수 있다.

지난 학습에서 synchronized 키워드가 걸려있으면 왜 느린지에 대해 공부를 했었다.

 

멀티 스레드 환경에서 특정 스레드가 해당 키워드가 붙은 메소드를 실행하면 lock이 걸려 다른 스레드에서 접근이 불가능하다. 

다른 스레드는 실행중인 스레드가 실행을 완료하고 lock을 풀어야만 접근이 가능해지는데, 이렇게 오버헤드가 걸리는 것이다.

 

 

스프링을 실행하는 Tomcat도 멀티 스레드로 동작하기 때문에, System.out.println을 사용하는 만큼 오버헤드가 발생하면서 처리속도가 느려진다.

따라서, 로깅을 System.out.println()로 하는 것을 지양하고, 대신 로깅 프레임워크를 적극 활용하는 것이 다방면에서 좋을 것 같다.

 

 


Reference ▼

 

로깅을 System.out.println() 로 하면 안되는 이유

학습 배경 우테코 레벨3 팀프로젝트 3차 데모데이 요구사항 중 하나는 ‘디버깅할 수 있는 로그 파일 출력’ 이다. 이전까지는 로깅에 대해 전혀 신경쓰지 않고 있었는데, 슬슬 로깅에도 신경써

hudi.blog

 

'개발공부 > JAVA' 카테고리의 다른 글

Thread  (0) 2023.05.24
[JAVA] ArrayList 내부 구현  (0) 2022.09.26
[JAVA] String, StringBuilder, StringBuffer  (1) 2022.09.22
[JAVA] equals() 와 hashCode()  (0) 2022.09.21
[JAVA] 메모리 구조(Stack/Heap)  (2) 2022.09.21

댓글