목차
- 개요
- System.out.println 무엇인가?
- 왜 사용해서는 안되는가?
- 로그를 남기면 안되는 것인가?
- 결론
1. 개요
프로그래밍을 처음 접하면 System.out.println(”Hello World”);
같이 콘솔에 출력하는 것을 배울 것이다.
그러나, 실무에서 System.out.println을 `절대` 사용을 하면 안된다고 한다. 그 이유를 알아보자.
2. System.out.println 무엇인가?
- System.out.println은 Java개발할때 디버깅 용도로 콘솔에 출력하는 메소드 중 하나다.
- System은 java.lang 패키지의 내장된 최종 클래스다.
- out은 System 클래스의 정적 멤버 필드이며 PrintStream입니다.
- println은 PrintStream 클래스의 메서드이고, 표준 콘솔에 전달된 인자와 줄 바꿈을 출력한다.
3. 왜 사용해서는 안되는가?
- 성능 이슈
이유는 크게 2가지로 블로킹 I/O와 멀티쓰레드에서 락이 발생하기 때문이다. System.out.println이 끝날때까지 아무 일을 실행할 수 없고 대기해야 하기에 성능을 저하시킬 수 있다.
- 로그 레벨 관리가 어렵다
로그 레벨을 지정할 수 없기 때문에 디버깅 용도로 사용되는 경우, 어떤 로그 레벨로 출력되는지 확인하기 어렵다. 로그 레벨이 제대로 관리되지 않으면, 프로덕션 환경에서도 불필요한 디버깅 정보가 출력되어 시스템의 안정성과 보안에 문제가 생길 수 있다.
- 유지보수성 저하
출력 메시지가 코드에 하드코딩되어 있으면 나중에 메시지를 수정하거나 삭제하는 등의 변경 작업이 어려울 수 있다.
public class Main {
public static void main(String[] args) {
System.out.println("hello World");
}
}
System.out.println("hello World");를 살펴보자
- synchronized block에 의해 호출되는 객체는 thread-safe하게 동작한다.
- System.out.println을 더 자세히 알고 싶다면 여기를 방문하자.
어느 사이트의 화면 선택시 총 소요시간을 나타낸 표를 살펴보자
응답 시간 | 개선율 | |
변경 전 | 1,242ms | - |
변경 1 | 893ms | 39% |
변경 2 | 504ms | 146% |
- 변경 1은 로거를 사용하면서 로그 사용여부를 false했을 경우.
- 변경 2는 모든 로거를 주석 처리하고 System.out.println 을 제거한 경우.
- 각각 변경 1은 39%의 개선가 변경 2는 146%가 개선된 것을 볼 수 있다.
- 따라서, 시스템 로그를 프린트하면 반드시 성능에 영향을 주게 된다.
개선율이란 튜닝 전과 후의 차이를 수치로 나타낸 것이다. 다음의 공식으로 구한다.
(튜닝 전 응답 속도 - 튜닝 후 응답 속도) * 100 / 튜닝 후 응답 속도 = 개선율(%)
4. 로그를 남기면 안되는 것인가?
그렇다면 로그를 남기고 싶다면 뭘써야할까?
- 로거(Logger)를 사용하여 로그를 남기자.
- 흔히, 현업에서 로그를 남길때 로깅프레임워크로 logback이나 log4j를 많이 사용한다.
5. 결론
- 운영 시스템에서는 System.out.println을 절대 사용해서는 안된다.
- 로그를 남기고 싶다면 로깅프레임워크를 사용하여 적절한 로그 레벨을 지정하여 출력하는 것이 좋다.
- 로깅프레임워크에 대해 더 알아보려면 해당링크로 넘어와서 보자.
참고