생각해 보자 님의 블로그

에러 핸들링? 좋은 핸들링은 무엇일까? (리스폰스와 로깅의 대하여) 본문

생각할 거리

에러 핸들링? 좋은 핸들링은 무엇일까? (리스폰스와 로깅의 대하여)

woohyuntak 2024. 12. 21. 18:03

서버 개발을 하다 보면, 에러 처리에 대해 고민하게 되는 순간이 많습니다. "에러 핸들링이 잘 되어 있나?" "에러 메시지는 사용자와 개발자가 모두 이해할 수 있을까?"라는 질문이 자연스럽게 떠오르죠. 물론 에러가 발생하지 않는 것이 가장 좋겠지만, 현실은 그렇지 않죠. 그래서 중요한 건, 에러가 발생했을 때 어떻게 처리할 것인가입니다.

오늘은 좋은 에러 핸들링이 무엇인지, 그리고 그 과정에서 중요한 리스폰스로깅에 대해 이야기해보려고 합니다.

1. 에러 핸들링이란?

에러 핸들링은 프로그램이 예상치 못한 상황에서 비정상적으로 종료되는 것을 방지하기 위한 중요한 과정입니다. 즉, 에러가 발생했을 때 시스템이 중단되지 않고 정상적으로 동작을 계속할 수 있도록 처리하는 것이죠. 서버에서 발생하는 에러를 적절히 처리하지 않으면, 사용자에게 불편을 끼칠 뿐만 아니라, 시스템 전체의 안정성도 위협할 수 있습니다.

에러를 잘 처리한다는 것은 단순히 프로그램이 죽지 않도록 막는 것에서 그치지 않습니다. 사용자가 에러를 이해하고, 개발자는 이를 해결할 수 있도록 도와야 합니다.

2. 배경

저는 Express 서버를 개발하면서 프론트엔드 팀과 협업을 하게 되었고, 그 과정에서 에러 핸들링의 중요성을 절실히 느꼈습니다. 특히, 클라이언트와 서버 간의 소통에서 발생한 에러 메시지가 문제였어요.

처음에는 단순히 "서버가 죽지 않으면 된다"는 생각을 했습니다. 하지만 시간이 지나면서, 에러 메시지가 명확하지 않으면 문제를 해결하는 데 많은 시간이 걸린다는 것을 깨달았습니다. 예를 들어, 단순히 "500 Internal Server Error"만 나오면, 사용자는 물론이고 개발자도 문제의 원인을 바로 파악하기 어려워지죠. 그래서 에러 메시지가 어떤 문제를 나타내는지 명확히 알 수 있도록 하는 것이 중요하다는 생각이 들었습니다.

뿐만 아니라, 에러가 발생했을 때 빠르게 대처할 수 있는 방법도 필요하다는 것을 느꼈습니다. 이때 중요한 것이 바로 로깅입니다. 로그는 시스템에서 발생한 에러를 추적하고, 이를 해결하기 위한 힌트를 제공하는 중요한 도구입니다.

3. 좋은 에러 핸들링이란?

1) 에러 메시지의 명확성

좋은 에러 핸들링의 핵심은 바로 명확한 에러 메시지입니다. 에러 메시지가 사용자가 이해할 수 있고, 개발자도 문제를 추적할 수 있도록 해야 합니다. 예를 들어, "잘못된 요청입니다"라는 메시지보다는 "잘못된 요청입니다. 필수 파라미터 username이 누락되었습니다."라고 구체적으로 알려주는 것이 훨씬 유용합니다.

또한, HTTP 상태 코드와 함께 의미 있는 설명을 추가하는 것도 중요합니다. 예를 들어, 404 Not Found나 400 Bad Request와 같은 상태 코드에 맞는 메시지를 같이 보내면, 에러를 이해하는 데 도움이 됩니다.

2) 사용자와 개발자 모두를 고려한 처리

에러 메시지는 사용자와 개발자 모두를 고려해서 작성해야 합니다. 예를 들어, 사용자가 직접 볼 에러 메시지는 너무 기술적이지 않게, 직관적으로 작성하고, 개발자는 로그를 통해 더 자세한 정보를 얻을 수 있도록 합니다. 이렇게 하면, 사용자 경험도 보호하면서, 개발자에게는 문제 해결의 단서를 제공할 수 있습니다.

3) 에러 코드와 메시지의 일관성

팀 내에서 에러 코드와 메시지를 일관되게 사용하는 것도 매우 중요합니다. 예를 들어, 400번대는 클라이언트 오류를 나타내고, 500번대는 서버 오류를 나타내는 식으로 일관된 규칙을 따르면, 협업 시에 에러 메시지를 빠르게 이해하고 대처할 수 있습니다.

4. 로깅의 중요성

1) 문제 해결의 핵심

로깅은 시스템에서 발생한 문제를 추적하고 분석하는 데 필수적인 도구입니다. 문제가 발생했을 때, 로그를 통해 어떤 요청이 들어왔고, 어떤 에러가 발생했는지 확인할 수 있습니다. 이는 문제 해결의 속도를 크게 높여줍니다.

로그에 기록하는 정보는 단순히 에러 메시지에 그치지 않습니다. 요청 정보, 스택 트레이스, 에러 발생 시간 등을 기록하여 문제를 정확히 파악할 수 있도록 해야 합니다.

2) 민감한 정보는 보호하기

로그에 민감한 정보를 기록하는 것은 절대 피해야 합니다. 예를 들어, 비밀번호나 개인정보는 로그에 남기지 않도록 주의해야 합니다. 이를 위해 마스킹(Masking) 기술을 사용하거나, 로그에서 민감한 정보를 필터링하는 방법을 적용해야 합니다.

3) 로그 레벨 설정

로그는 여러 레벨(Level)을 설정하여 기록할 수 있습니다. 예를 들어, DEBUG, INFO, WARN, ERROR, FATAL과 같은 레벨을 사용하여, 각 상황에 맞는 로그를 남길 수 있습니다. 운영 환경에서는 ERROR나 WARN 수준으로만 로그를 남기고, 개발 환경에서는 DEBUG 레벨로 보다 상세한 정보를 남길 수 있죠. 이렇게 레벨을 잘 설정하면, 로그를 관리하기 훨씬 수월해집니다.

5. 에러 핸들링을 더욱 개선하는 방법

에러 핸들링을 잘 하기 위해서는 몇 가지 추가적인 방법을 고려할 수 있습니다:

  • 자동화된 테스트: 다양한 에러 상황을 자동화된 테스트를 통해 미리 확인하고, 문제 발생 시 빠르게 대응할 수 있도록 합니다.
  • 실시간 모니터링 도구 사용: Apm, Sentry와 같은 실시간 모니터링 도구를 활용하여 서버의 상태를 실시간으로 체크하고, 에러 발생 시 즉시 알림을 받을 수 있습니다.

좋은 에러 핸들링로깅 시스템은 단순히 서버가 죽지 않도록 하는 것 이상의 역할을 합니다. 에러 메시지가 명확하고, 로그가 잘 기록되면, 사용자 경험도 개선되고, 문제 해결 속도도 빨라집니다. 결국, 서버 운영의 안정성을 높이는 데 중요한 요소들이죠.

이번 글을 통해, 여러분도 에러 핸들링과 로깅의 중요성을 다시 한번 되새겨보셨으면 좋겠습니다. 여러분의 서버도 더욱 안정적이고, 효율적으로 운영될 수 있을 거예요.