취뽀몽

[Java] System.out.println 사용을 현업에서 피해야 하는 이유 본문

java

[Java] System.out.println 사용을 현업에서 피해야 하는 이유

허몽구 2024. 4. 6. 00:43

System.out.println 메소드는 개발 중 간단한 디버깅이나 데이터 확인 용도로 유용할 수 있다.

자바를 처음 배울 때, System.out.println 을 통해 "Hello, World!" 를 출력하는 걸 가장 먼저 해볼 만큼 쉽게 접할 수 있는 메소드이다.

하지만 현업에서는 다양한 기술적, 관리적, 그리고 성능상의 문제 때문에 사용을 권장하지 않는다.

 

우선 System.out.println 메소드의 구성 요소에 대해 알아보도록 하자.

 

1) System 클래스

java.lang 패키지에 포함된 final class로, 다양한 유틸리티 메서드와 정적 필드를 제공한다.

시스템 관련 속성 및 표준 입출력 스트림에 접근할 수 있도록 설계되어 있다.

 

2) out 필드

System 클래스에 정의된 정적(static) 필드로, PrintStream 객체를 참조한다.

표준 출력 스트림으로 설정되어 있으며, 기본적으로 콘솔에 출력한다.

 

3) println 메서드

PrintStream 클래스에 정의된 메서드로, 전달된 인자를 출력한 뒤 자동으로 줄 바꿈을 수행한다.

정수나 문자열 등 다양한 데이터 타입을 출력할 수 있는 오버로드(overload) 메서드를 제공한다.

 

데이터를 출력하도록 도와주는 메소드인 것 같은데, 왜 사용을 권장하지 않는 것일까?

가장 큰 문제로 성능 문제가 있다.

 

1) Synchronization(동기화) 로 인한 병목

System.out.println은 위에 언급한 것처럼 내부적으로 PrintStream의 메소드를 호출하며, 이는 synchronized로 구현되어 있다.

다중 스레드 환경에서 여러 스레드가 동시에 System.out.println을 호출하면, 하나의 스레드만 출력 작업을 수행하고 나머지는 대기 상태에 들어가게 된다.

 

따라서, 멀티스레드 애플리케이션의 병목 현상이 발생하여 성능이 저하될 수 있게 된다.

 

2) 입출력(I/O) 작업의 높은 비용

콘솔 출력은 내부적으로 I/O 작업과 관련이 있으며, 이는 상대적으로 비용이 높은 작업이다.

데이터 출력 작업이 많아질수록 비지니스 로직 처리나 DB 쿼리 실행 등 애플리케이션의 주요 작업이 지연될 가능성이 크다.

 

또한 로그 수준을 관리하기 어려워지는 문제점도 있다.

System.out.println은 출력 메시지의 중요도를 구분할 수 없다.

디버깅 메세지나 에러 메세지를 모두 동일한 방식으로 출력하기 때문에, 각각의 개발자가 직접 메세지를 필터링해야 하므로 유지보수성이 저하된다.

 

또한 로그 수준이 제대로 관리되지 않으면, 실제 운영 환경에서도 불필요한 정보가 출력되어 보안상의 문제가 발생할 수 있게 된다.

 

 

실제로 println 메서드의 내부를 확인해 보면, PrintStream 클래스에서 호출되지 않은 경우에는 synchronized (동기화 블록) 내에서 처리된다.
이 동기화 처리로 인해, 여러 스레드가 동시에 println 메서드에 접근하지 못하고 락(Lock)이 걸리게 된다.

 

따라서 하나의 스레드가 메서드를 사용하는 동안 다른 스레드들은 대기 상태가 되는 것이다.

이로 인해 스레드 간의 작업 처리 속도가 느려지고, 전체 애플리케이션의 성능이 저하될 수 있다.


 

최근에 sout이 덕지덕지 붙은 코드를 경험했어서................ 정리할 겸 글을 작성해보았다.

포스팅에 나와있는 문제들로, 현업에서는 log4j 같은 로깅 프레임워크를 사용하여 로그를 남긴다.

Logger를 사용하는 습관을 들이자...

 

 

 

'java' 카테고리의 다른 글

[Java] Synchronized  (0) 2024.05.22
[Java] Reflection 개념 및 사용법  (0) 2024.04.15
[Java] OOME(Out of Memory Error)란?  (0) 2024.03.27
[Java] 커스텀 어노테이션 만들기  (0) 2024.02.21
[Java] CompletableFuture 클래스  (0) 2024.02.13