얼마 전 인생 첫 기술 면접을 볼 기회가 있었습니다.
질문 중 예외 처리와 관련된 질문이 있었는데, 면접을 보고 난 후 곰곰히 생각해보니 제가 예외와 오류가 정확히 뭔지 잘 모르고 있었던 것 같습니다. 심지어 완전히 잘못 답변한 오개념도 꽤 많았습니다.

그래서 정리를 위해 이렇게 글을 씁니다...

이 글에서 다루는 것은 아래와 같습니다.

  1. 오류와 예외가 정확히 뭘까요?
  2. try-catch등으로 예외 처리Exception Handling를 하는 것과 에러 코드를 반환하는 것에 어떤 장단점이 있을까요?
  3. Assertion과 Exception은 어떤 관련이 있을까요?

Error

컴퓨터 프로그램 상에서의 오류Error는 프로그램이 프로그래머가 의도하지 않은 잘못된 결과를 내는 것을 의미합니다. 오류의 발견 시점 기준으로, 컴파일 오류Compilation Time Error와 런타임 오류Runtime Error로 나눌 수 있고, 오류의 원인을 기준으로, 구문 오류Syntax Error나 논리적 오류Logical Error 등등으로 나눌 수 있습니다.

비슷한 용어로, 버그Bug나 결함Defect이 있고, Failure나 Fault, Issue도 있습니다. 전부 비슷하게 사용되는 용어이긴 합니다만, 사용되는 맥락에 조금씩 차이가 있습니다. (ISTQB 기준인데, 사실 별로 중요한 것 같지는 않습니다.)

  • Error : 주로 잘못된 구문, 잘못된 로직등의 원인으로 인해 프로그램이 정상적으로 실행되지 않는 것을 Error라고 부릅니다. ISTQB에 따르면 프로그래머에 의해 발생한 인적 오류만 Error라고 부른다고는 하는데, 불리는 맥락에 따라 인적 오류만을 의미할 때도 있고, 어떤 원인에 의해서든 발생하는 부정확한 동작 전반을 의미할 때도 있습니다.
  • Bug / Defect / Fault : 프로그램이 요구사항이나 예상된 동작을 수행하지 않고 잘못된 결과를 내는 것을 의미하며, 예상 결과와 실제 작동 사이의 편차입니다. 즉, Error(잘못된 실행)에 의해 Bug(예상과 결과의 편차)가 발생한다고 볼 수 있습니다. 제가 본 글들에서는 발견 시점에 따라 Defect, Fault, Bug를 분리해서 설명하는 경우도 있었는데, 이 글에서는 그렇게 까지 자세히 용어 차이에 대해 생각하지는 않으려고 합니다.
  • Failure : 잘못된 결과가 최종 사용자에게 노출되는 것, 그러한 결과로 인해 결과적으로 소프트웨어가 작동 불능 상태로 빠지는 것을 Failure라고 합니다. 모든 Bug가 Failure로 이어지는 것은 아니지만, Failure는 Bug에 의해 발생합니다.
  • Issue : 이슈Issue는 버그/오류를 포함하여, 성능 문제, 문서화 등 프로그램에서 해결해야하는 전반적인 과제를 의미합니다.

버그는 오류로 인한 것이지만, 모든 오류가 버그인 것은 아닙니다. 예를 들어, 실시간 대전 게임을 하던 중 랜선을 뽑았다고 생각해 봅시다. 게임에서는 인터넷이 끊겼다는 오류가 발생하겠지만, 이것은 격투 게임을 프로그래밍한 개발자가 의도한 예상대로의 결과이므로 버그인 것은 아닙니다. 게임을 하던 중 게임 코드가 잘못되어 갑자기 게임이 멈춰버리는 오류가 발생한다면, 버그라고 할 수 있습니다.

오류를 복구 가능한 오류Recoverble Error와 버그 (복구 불가능한 오류Non-recoverble Error)로 나누어서 설명하는 관점도 존재합니다. 프로그램이 잘 작성되어 있어도 어떤 작업은 항상 실패할 가능성이 있습니다. 예를 들면, 사용자의 입력이 잘못되었거나, 위의 격투 게임의 예시처럼 네트워크 연결이 갑자기 끊기는 경우를 들 수 있습니다. 이러한 경우 개발자는 이러한 오류를 사용자에게 어떻게 전달할지 결정하고, 작업을 재시도 하는 등으로 오류를 복구할 수 있습니다.
하지만 어떤 오류(버그)는 개발자가 예상하지 않았던 부분에서 발생할 수 있습니다. 사용자의 입력을 실수로 검증하지 않았거나, 프로그램의 로직이 잘못 작성된 경우 등입니다. 그러한 오류는 프로그램 전체로 전파되어 심각해질 수 있고, 보안 취약점이 되기도 합니다.

Error Handling

프로그램은 어떠한 이유에서든 오류가 발생할 가능성이 있습니다. 그렇게 정상적이게 실행되지 않은 부분에 대해 프로그래머는 어떻게 처리해야할지 결정해야하는데, 이를 오류 처리Error Handling라고 부릅니다. 이러한 오류 처리의 모델은 Fail-Fast (빠르게 실패하기)와 Fail-Safe (안전하게 실패하기)라는 두 가지 방식으로 제공됩니다.

Fail-Fast

Fail-Fast는 프로그램에서 오류가 발생하면 그 즉시 프로그램을 종료하고

References

Previous Post