Java/Kotlin Backend 서버 에러 처리

Published on

개요

Java/Kotlin 으로 백엔드 서버를 개발할때, 소프트웨어 엔지니어 입장에서 에러 처리를 어떻게 하는지 알아보자.

에러의 종류

기술적인 에러 분류

Java 시스템에는 다음과 같은 종류의 예외가 있다.

  • RuntimeException - Unchecked Exception 으로 명시적으로 처리하지 않아도 된다. 메쏘드 시그니쳐에 표시할 필요 없다.
  • Checked Exception - 명시적으로 처리해야 하는 예외이다. 메쏘드 시그니쳐에 표시해야 하고 메쏘드 호출자는 반드시 처리해야 한다.
  • Error - 시스템에 문제가 있어서, 개발자가 처리할 수 없는 예외이다. 메쏘드 시그니쳐에 표시할 필요 없다.

Kotlin 에서는 Checked Exception 이 없다. 모든 예외는 Unchecked Exception 이다.

일반적인 에러 분류

  • 예상하지 못한 에러 - 설계/개발 단계에서 예상하지 못한 에러이다. 사용자의 잘못된 사용, 의도하지 않은 작동, 알지못한 지식에 의한 구현등이 있을 수 있다. 예상하지 못한 에러는 로깅하여, 개선해야 한다.
  • 대응하지 못한 에러 - null point exception, array out of bound exception 등이 있다. 이런 에러는 개발자가 적절한 대응과 정확한 프로그래밍을 하지 못했을 때 발생한다. 어떤 예외 상황을 무시하고 도메인 에러로 처리되지 못한 경우이므로, 이런 에러는 개발과정에서 도메인 에러로 처리하거나, 적절한 로깅을 하고 모니터링하여 개선한다.
  • 불가피한 에러 - IOException 이 대표적인 예, 네트워크나 데이터페이스 접근, 파일 접근시 상황에 따라 항상 발생가능성을 염두에 두고 처리해야 한다. 이 에러는 개발단계에서 처리해야 한다.
  • 도메인 에러 - 예상된 에러이므로, 각 에러에 대해 어떻게 처리할지 이미 설계 단계에서 정의되어야 한다. 이 예외는 적절한 처리 루틴이 이미 있으므로, 그것에 맞게 처리하고 로깅될 필요 없다.
    • 도메인 에러는 자원 제약과 비지니스 문제 정의에 의해 소프트웨어의 제약을 정의하고 적절한 사용자 응답을 제공하는데 중점을 둔다.
    • 예를 들어, 사용자가 로그인을 시도했는데, 비밀번호가 틀린 경우, 이는 도메인 에러이다. 이 경우, 로그인 실패를 알리는 메시지를 보내고, 로그인 화면으로 돌아가게 한다. 이는 아이디 암호 입력 기반의 인증에서 사용자가 항상 자신의 인증을 기억하고 올바르게 입력하도록 기대할 수 없기 때문에 설계에서 적절한 예외에 대한 처리를 제공하는 것이다.

에러 처리

예상하지 못한 에러

  • 예상하지 못한 에러의 처리는 항상 모니터링을 통해, 도메인 에러로 재정의하거나, 인프라 및 소프트웨어 구동 환경을 개선하는 것으로 변경되어야 한다.
  • findById() 를 통해 데이터를 가져오는데, 데이터가 없는 경우 이론적인 로직에서는 발생되지 않을 수 있다. 이런 경우, 외부에 의한 공격일 수도 있고, 데이터베이스에 문제가 있을 수도 있다. 이런 경우, 로깅을 하고, 점진적으로 개선해야 한다.

대응하지 못한 에러

  • 어떤 예외 상황을 무시하고 도메인 에러로 처리되지 못한 경우이므로, 이런 에러는 개발과정에서 도메인 에러로 처리하거나, 적절한 로깅을 하고 모니터링하여 개선한다.

불가피한 에러

  • 시스템에 실패 가능성을 염두에 두고, 견고한 소프트웨어 개발과 백업/복구, 방어 전략등을 수립해야 한다.
  • 개발 단계에서 불가피한 에러 발생에 대한 방어 코드를 넣고, 로깅및 모니터링 되도록 한다.

도메인 에러

  • 설계에서 사용자와 최대한의 커뮤니케이션을 통해, 소프트웨어의 기능 제공 경계를 잘 정의하고, 반영해야 한다.
  • 테스팅에서 여러 전략들을 사용하여, 개발 과정에서 추가적인 도메인 에러 발견하고 처리할 수 있도록 해야 한다.