본문 바로가기
java/기타

java - Exception과 logging이 성능에 미치는 영향

by 권성호 2021. 10. 8.

1.  서론

 

개인 프로젝트는 사용자가 많은 경우가 드물기 때문에 부하가 있을 때 성능적으로 어떤 문제가 발생할지 경험하기 어렵고 따라서 고민도 덜 하게 되는 것 같다. 

반면, 회사에서 개발을 해 보면서 위에서 언급한 부분에 대해 자연스럽게 더 고민하게 된다.

Exception과 logging에 대한 고민도 이러한 맥락에서 출발한다.

 

2.  Exception

spring framework로 개발하면서, controller advice라는 기능을 활용해 Exception을 멋지게 처리할 수 있다는 것을 알게 되었다. 분리되어 있던 Excption에 대한 처리 로직을 한 곳에서 관리할 수 있어 매우 깔끔하다고 생각했다.

공부한 것을 적극 반영하고 싶었던 나는 비즈니스 로직에 많은 부분에서 Exception을 발생시키고 Controller advice기능을 활용해 Exception Handler기능을 구현했다.

 

그런데, Exception은 비싸다는 사실을 뒤늦게 알게 되었다. 비싼 이유는 다음과 같다.

  1. Exception을 던질 때 stack-trace를 얻을 수 있는데, 이 말은 java가 call-stack을 뒤져야 한다는 것을 의미한다.
  2. 그런데 call-stack은 생각보다 많이 쌓여 있을 수 있다. => 많이 뒤져야 한다는 말이다. 

비용이 비싸다는 것은, 더 싼 비용으로 처리할 수 있다면 그 방법이 더 좋다는 말과도 같다.

따라서, Exception이 정말 필요한 곳에만 Exception을 사용하도록 하자.(어느 로직에  Exception이 필요한지 잘 판단하는 것도 실력..)

Exception을 사용해야만 하는 상황에서도 조금 더 최적화할 수 있는 방법이 있는 것 같다. 아래 링크를 참고해 보자.

https://meetup.toast.com/posts/47

 

Java Exception 생성 비용은 비싸다. : NHN Cloud Meetup

Java Exception 생성 비용은 비싸다.

meetup.toast.com

 

3.  logging(SLF4J)

 

개발을 하면서 코드 분석이 필요할 때, 디버거로 직접 코드 라인을 따라가며 런타임에 무슨 일이 일어나고 있는지 분석하기도 하지만 매번 이러기에는 귀찮다.(한계가 있다.

 

이에 대한 대안으로 로그를 찍어볼 수 있다. 이야기에 앞서 로그의 특징 하나를 집고 넘어가야 한다.

 

  1. 로그는 대부분 실제 로직과 무관한, 단순 정보성 작업이다.
  2. 로그를 찍는다는 것은 IO를 발생시킨다는 의미이다.

즉, 로깅은 완성된 소프트웨어 입장에서 잘못 사용되면 불필요하게 비용을 발생시킬 수 있는 요인이다.

 

로깅의 목적을 단순히 코드 분석하는 것을 넘어 세분화할 수 있다. 

예를 들면, 개발 단계에서 디버깅의 목적으로 할 수도 있고 운영 단계에서 꼭 봐야 하는 에러를 출력하기 위함일 수 있다. 

slf4j는 로깅 목적을 5단계로 세분화하여 목적에 맞게 최적으로 사용할 수 있도록 기능을 제공한다.

 

위에서 언급한 불필요한 로깅을 제거하는 방법은 아래 글 참고

http://dveamer.github.io/backend/HowToUseSlf4j.html

 

Dveamer

현실에서 살고 있지만 이상에 대한 꿈을 버리지 못한 몽상가의 홈페이지 입니다. 개인적인 기록을 주 목적으로 하며 일상과 프로그래밍 관련 글을 포스팅합니다.

dveamer.github.io

 

 

4.  결론

  • 정말 필요할 때에만 Exception을 던진다.
  • Exception을 던져야 말할 때에도 효율적으로 사용할 수 있는 방법을 고려해 보자
  • 목적에 맞게 로깅 level을 조절해서 사용하자
  • 어디서 어떻게 Exception을 던져야 할지 / 어디서 어떤 수준에 level로 로깅할지에 대한 판단은 경험이 필요한 요소..

Exception과 logging을 주의해서 해야한다는 사실 정도를 알게 되었다.

앞으로 이 부분에 대해 더 깊게 공부해서 적절히 사용하도록 해야 한다.

 

 

5.  추가 내용

1. Exception을 throw하는 비용도 있지만 해당 exception의 stack trace를 모두 write 하는 것도 비용이다.

    상황에 따라서는 throw하지만 모든 stack trace를 안찍고 싶을 때도 있을 것이다.

  • Exception.java 클래스를 보면 아래와 같은 생성자가 있다.

  • writableStackTrace 인자를 주의해서 보자
    • 해당 값이  true일 경우 stack tace는 무조건 write된다.
    • stack trace를 만들더라도 write 안하고 싶다면 해당 값을 false 로 주면 된다.

'java > 기타' 카테고리의 다른 글

[Collection Framework] 정리  (0) 2022.01.04
Thread pool vs Reactive  (0) 2021.12.01
JDBC Connection pool 모니터링 지표에 대한 이해  (0) 2021.12.01
java - InputStream& OutputStream close  (0) 2021.09.28
Java - Enum  (0) 2021.09.24

댓글