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