학습 배경
자바를 공부하면서 나에게 가장 고마운 문장은 System.out.println()이다. 내 블로그와 깃에서 알 수 있는 것처럼 나는 상당히 이 로깅 기법을 좋아하는데, 이유는 간단하게 sysout 이라고만 치면 자동으로 완성까지 해주고 내가 짠 코드가 어디까지 왔나 확인도 할 수 있음과 동시에 값 역시 출력할 수 있기 때문이다.
그런데 다른 사람드의 자바 코드를 보면 System.out.println() 이걸 쓰는 사람은 몇 안되었다. 왜지...? 편하게 출력 가능한 System.out.println()를 놔두고 사람들은 로깅 프레임워크를 사용하는 거지? ? ? ? 그래서 한번 찾아봤다. 로깅 기법은 언제 쓰는 것이 적당한지를! 근데 놀랍게 찾아보는 와중에 모두가 System.out.println()를 회사에서는 사용하지 말라더라.. 아무도 그렇게 안 쓴다고...ㅎㅠ 지금부터 그 이유를 설명해 볼까 한다.
휘발성
System.out.println() 은 로그가 파일로 저장 되지 않고 서버를 실행할 때 딱 한번 실행된다. 즉 휘발된다는 의미이다. 로그는 에러가 발생한 상황을 기록하고 추후 확인하여 문제를 고치기 위해 사용되는데 System.out.println() 은 그 역할 을 할 수 없다.
로그 출력 레벨X
로컬에서는 개발할 때 디버깅을 위한 상세한 정보가 필요하다. 따라서 로깅 라이브러리는 정보에 따라 로그 레벨이라는 기능을 제공한다.
하지만 System.out.println() 는 이런 기능을 제공하지 않는다. 단순하게 문자열만 찍는 메서드라 어떤 환경이든 그냥 동일한 로그만 냅다 출력되는 것이다. 프로덕션에서 이런 로그들을 제거하려면 하나하나 찾아서 지우던가 주석처리를 해야 한다는 번거로움이 있다.
성능저하
System.out.println() 의 println은 synchronized로 동기화 처리가 되어있어 오버헤드가 발생할 수 있다. 즉, synchronized 된 블록은 한 시점에 1개의 스레드만 접근이 가능하다는 뜻이다. System.out.println() 메서드에 여러 스레드를 사용하게 된다면 오버헤드가 발생하여 프로세스 처리가 늦어지게 된다.
'JAVA' 카테고리의 다른 글
[Cron] 크론(cron) 표현식 정리 (0) | 2023.08.16 |
---|---|
로그 레벨로 로그를 효율적으로 사용하기 (0) | 2023.08.14 |
[JAVA] LocalDate 날짜 비교하기 .isBefore() / .isAfter() / .isEqual() (0) | 2023.08.11 |
[Java] LocalDate에날짜 더하기고 빼기 (plusMonth, minusWeeks) (0) | 2023.08.10 |
[Java] LocalDate, LocalTime, ChronoUnit 을 이용한 시간 표현 (0) | 2023.08.06 |