개발의 가치를 높이자. 개가치

System.out.println 메소드는 실무에서 `절대 사용하지마라.` 본문

자바

System.out.println 메소드는 실무에서 `절대 사용하지마라.`

Jammini 2023. 3. 21. 14:25
728x90

목차

  1. 개요
  1. System.out.println 무엇인가?
  1. 왜 사용해서는 안되는가?
  1. 로그를 남기면 안되는 것인가?
  1. 결론

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. 왜 사용해서는 안되는가?

  1. 성능 이슈

    이유는 크게 2가지로 블로킹 I/O와 멀티쓰레드에서 락이 발생하기 때문이다. System.out.println이 끝날때까지 아무 일을 실행할 수 없고 대기해야 하기에 성능을 저하시킬 수 있다.

  1. 로그 레벨 관리가 어렵다

    로그 레벨을 지정할 수 없기 때문에 디버깅 용도로 사용되는 경우, 어떤 로그 레벨로 출력되는지 확인하기 어렵다. 로그 레벨이 제대로 관리되지 않으면, 프로덕션 환경에서도 불필요한 디버깅 정보가 출력되어 시스템의 안정성과 보안에 문제가 생길 수 있다.

  1. 유지보수성 저하

    출력 메시지가 코드에 하드코딩되어 있으면 나중에 메시지를 수정하거나 삭제하는 등의 변경 작업이 어려울 수 있다.

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-
변경 1893ms39%
변경 2504ms146%
  • 변경 1은 로거를 사용하면서 로그 사용여부를 false했을 경우.
  • 변경 2는 모든 로거를 주석 처리하고 System.out.println 을 제거한 경우.
  • 각각 변경 1은 39%의 개선가 변경 2는 146%가 개선된 것을 볼 수 있다.
  • 따라서, 시스템 로그를 프린트하면 반드시 성능에 영향을 주게 된다.
개선율이란 튜닝 전과 후의 차이를 수치로 나타낸 것이다. 다음의 공식으로 구한다.
(튜닝 전 응답 속도 - 튜닝 후 응답 속도) * 100 / 튜닝 후 응답 속도 = 개선율(%)

4. 로그를 남기면 안되는 것인가?

그렇다면 로그를 남기고 싶다면 뭘써야할까?

  • 로거(Logger)를 사용하여 로그를 남기자.
  • 흔히, 현업에서 로그를 남길때 로깅프레임워크로 logback이나 log4j를 많이 사용한다.

5. 결론

  • 운영 시스템에서는 System.out.println을 절대 사용해서는 안된다.
  • 로그를 남기고 싶다면 로깅프레임워크를 사용하여 적절한 로그 레벨을 지정하여 출력하는 것이 좋다.
  • 로깅프레임워크에 대해 더 알아보려면 해당링크로 넘어와서 보자.

참고

반응형