Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby에서 사용자 정의 예외 마스터하기: 오류 처리와 관찰 가능성 향상

소프트웨어 개발 과정에서 예외를 커스터마이징하는 일은 흔히 신경 쓰지 않는 부분입니다. 하지만 관찰 가능성(Observability) 도구에서 오류를 포착했는데 문제를 빠르고 정확하게 파악할 수 없다면, 예외에 대한 더 많은 정보와 세부 사항이 필요하다는 신호입니다.

이 글에서는 Ruby에서 예외를 커스터마이징하는 방법과, 오류 정보 부족으로 인해 발생할 수 있는 잠재적 문제를 미리 예방하는 방법을 소개합니다.

바로 시작해 보겠습니다!

간단한 참고 사항

이 글은 'AppSignal로 Ruby 디버깅하기' 시리즈의 자연스러운 연장선에 해당합니다. 디버깅의 전반적인 개요와 커스텀 예외 소개가 궁금하다면 먼저 해당 글을 읽어보시길 권합니다.

Ruby에서 예외 rescue 처리하기

Ruby에는 Exception이라는 클래스가 있으며, 오류 처리 클래스들이 이 클래스를 상속받습니다. 이번 섹션에서는 커스텀 예외를 만들기 전에 Ruby의 예외 처리 구조를 먼저 살펴보겠습니다.

Exception은 Ruby의 대표적인 예외 클래스이며, rescue Exception을 사용하면 Exception을 상속받는 모든 예외를 잡아냅니다. 하지만 애플리케이션에서 이렇게 사용하는 것은 좋지 않은 습관입니다. Ruby 내부에서 사용되는 모든 예외까지 함께 잡아버리기 때문입니다.

Ruby에서 예외를 가장 간단하게 rescue 처리하는 방법은 아래 예시처럼 begin ... rescue 코드 블록을 작성하는 것입니다.


Exception은 모든 예외를 잡아내므로, 원하는 오류만 필터링해서 가져오려면 더 구체적인 클래스를 사용하는 것이 좋습니다. 대표적인 예가 StandardError 클래스입니다. 이 클래스는 Ruby의 내부 예외는 무시하고 애플리케이션 코드 오류와 관련된 예외만 잡는 표준 rescue 처리기 역할을 합니다.

StandardError를 잡으려면 아래처럼 작성할 수 있습니다.


또한 별도의 예외 클래스를 지정하지 않으면, Ruby는 기본적으로 StandardError가 처리하는 예외들을 반환합니다.


Ruby에서 커스텀 예외를 만들려면 일반적으로 StandardError를 상속받는 클래스를 생성합니다. 자세한 내용은 다음 섹션에서 다루겠습니다.

예외에 대해 더 깊이 알아보고 상속할 최적의 클래스를 찾고 싶다면, Ruby 공식 문서의 예외 목록을 확인해 보세요.

Ruby 예외에 추가 정보 담기

관련 정보 없이 새로운 예외를 생성하는 것만으로는 문제를 효과적으로 디버깅하거나 파악·수정하는 데 큰 도움이 되지 않습니다. 오류의 세부 정보를 반드시 함께 담아야 합니다. 여기서는 객체에서 커스텀 예외로 정보를 전달하는 방법을 살펴보겠습니다.

먼저 로그에 남기고 싶은 데이터를 받기 위한 새로운 커스텀 예외를 만들어 보겠습니다. 앞서 언급했듯이 커스텀 예외는 StandardError를 상속해야 합니다.

간단한 Rails 프로젝트로 이 구현을 테스트할 수 있습니다. Rails 프로젝트의 app 폴더 안에 exceptions라는 폴더를 만들고, 그 안에 custom_exception.rb라는 클래스 파일을 생성하세요.


이 예외 클래스에서는 로그에 표시할 모든 정보를 정의할 수 있으며, 여기서는 데이터를 위해 네 가지 속성을 사용했습니다.

  • 예외를 구분하기 위한 코드(code)
  • 예외의 이름(name)
  • 사용자에게 안내하는 메시지(message)
  • Ruby가 이미 제공하는 예외의 내부 세부 정보(details)

이제 begin...rescue 블록에서 CustomException을 발생시키고, 매개변수를 예외 속성에 전달해 보겠습니다.


꽤 유용해 보이죠? 계속해서 이 데이터를 활용해 예외 로그를 직접 커스터마이징해 보겠습니다.

Ruby에서 예외 확장하기

예외를 확장하면 커스터마이징 수준을 더 구체적이고 재사용 가능한 단계로 끌어올릴 수 있습니다. Ruby가 오류 유형별로 여러 예외를 제공하듯이, 우리 시스템에서도 같은 방식으로 설계할 수 있습니다.

다음으로, 예외를 어떻게 오버라이드하고 확장이 필요한 상황에서 활용하는지 알아보겠습니다.

로그 속에서 필요한 정보를 찾는 일은 생각보다 고통스러운 작업입니다. 개발자들은 종종 오류에 대한 충분한 정보나 검색·필터링에 도움이 될 만한 데이터를 미리 넣어두지 않은 자신을 탓하곤 합니다. 이런 기능을 제공하는 모니터링 도구를 사용하지 않고 있다면, 의미 있는 데이터를 로그에 포함해 두는 것이 먼 미래에 큰 도움이 될 수 있습니다.

프로 팁: AppSignal에서 커스텀 예외를 설정하고 추적하는 방법이 궁금하다면 'AppSignal로 Ruby 디버깅하기' 포스트의 'AppSignal로 Ruby 예외 디버깅하기' 섹션을 참고하세요.

아래 예시에서는 로그에 표시되는 예외 출력 형식을 커스터마이징해 보겠습니다. 처음에는 그저 데이터를 예쁘게 보여주는 가벼운 기능이라고 생각할 수 있습니다. 하지만 데이터에 사용된 키워드야말로 오류를 찾아내고, 애플리케이션을 모니터링하는 사람을 돕는 핵심 요소입니다.

Gemfile에 아래 코드를 추가해 colorize 젬을 프로젝트에 포함하세요.


bundle 명령을 실행해 colorize 젬을 설치한 후, Rails 애플리케이션을 실행합니다.


이제 예외 클래스에서 젬을 불러오고, 속성들을 보기 좋게 포맷팅하여 출력합니다. 그러면 중요한 오류를 한눈에 확인하고 빠르게 찾을 수 있습니다.


이러한 시각적 커스터마이징 결과를 확인해 보고, 여러 옵션을 직접 테스트하면서 나만의 포맷과 스타일을 만들어 보세요.

Ruby에서 사용자 정의 예외 마스터하기: 오류 처리와 관찰 가능성 향상

마무리 및 다음 단계

이번 글에서는 Ruby 예외를 커스터마이징하고 로그에서 눈에 잘 띄게 표시하는 방법을 다뤘습니다. 그 외에도 다양한 커스터마이징이 가능하지만, 가장 중요한 것은 애플리케이션과 관련된 예외를 적절하게 처리하는 것입니다. 그리고 Rails가 이미 해주듯이 모든 예외에 동일한 포맷 스타일을 일괄 적용하지 않도록 주의하세요.

즐거운 코딩 되세요!

P.S. Ruby Magic 포스트를 발행 즉시 읽고 싶다면 Ruby Magic 뉴스레터를 구독하고 어떤 글도 놓치지 마세요!

Ruby에서 사용자 정의 예외 마스터하기: 오류 처리와 관찰 가능성 향상

브레나 몬테이로(Brena Monteiro)

게스트 저자인 브레나는 신입 개발자 멘토링에 열정을 가진 테크 리드로, 고성능 팀을 구축하고 이끈 경험이 풍부합니다. 확장 가능한 API 구축과 클라우드 서비스 간 통합 개발 경험을 보유하고 있으며, 진화형 아키텍처에 큰 관심을 가지고 있고 XR(확장 현실) 어프렌티스로도 활동 중입니다.