얼마 전 인생 첫 기술 면접을 볼 기회가 있었습니다.
질문 중 예외 처리와 관련된 질문이 있었는데, 면접을 보고 난 후 곰곰히 생각해보니 제가 예외와 오류가 정확히 뭔지 잘 모르고 있었던 것 같습니다. 심지어 완전히 잘못 답변한 오개념도 꽤 많았습니다.
그래서 정리를 위해 이렇게 글을 씁니다...
이 글에서 다루는 것은 아래와 같습니다.
컴퓨터 프로그램 상에서의 오류Error는 프로그램이 프로그래머가 의도하지 않은 잘못된 결과를 내는 것을 의미합니다. 오류의 발견 시점 기준으로, 컴파일 오류Compilation Time Error와 런타임 오류Runtime Error로 나눌 수 있고, 오류의 원인을 기준으로, 구문 오류Syntax Error나 논리적 오류Logical Error 등등으로 나눌 수 있습니다.
비슷한 용어로, 버그Bug나 결함Defect이 있고, Failure나 Fault, Issue도 있습니다. 전부 비슷하게 사용되는 용어이긴 합니다만, 사용되는 맥락에 조금씩 차이가 있습니다. (ISTQB 기준인데, 사실 별로 중요한 것 같지는 않습니다.)
버그는 오류로 인한 것이지만, 모든 오류가 버그인 것은 아닙니다. 예를 들어, 실시간 대전 게임을 하던 중 랜선을 뽑았다고 생각해 봅시다. 게임에서는 인터넷이 끊겼다는 오류가 발생하겠지만, 이것은 격투 게임을 프로그래밍한 개발자가 의도한 예상대로의 결과이므로 버그인 것은 아닙니다. 게임을 하던 중 게임 코드가 잘못되어 갑자기 게임이 멈춰버리는 오류가 발생한다면, 버그라고 할 수 있습니다.
오류를 복구 가능한 오류Recoverble Error와 버그 (복구 불가능한 오류Non-recoverble Error)로 나누어서 설명하는 관점도 존재합니다. 프로그램이 잘 작성되어 있어도 어떤 작업은 항상 실패할 가능성이 있습니다. 예를 들면, 사용자의 입력이 잘못되었거나, 위의 격투 게임의 예시처럼 네트워크 연결이 갑자기 끊기는 경우를 들 수 있습니다. 이러한 경우 개발자는 이러한 오류를 사용자에게 어떻게 전달할지 결정하고, 작업을 재시도 하는 등으로 오류를 복구할 수 있습니다.
하지만 어떤 오류(버그)는 개발자가 예상하지 않았던 부분에서 발생할 수 있습니다. 사용자의 입력을 실수로 검증하지 않았거나, 프로그램의 로직이 잘못 작성된 경우 등입니다. 그러한 오류는 프로그램 전체로 전파되어 심각해질 수 있고, 보안 취약점이 되기도 합니다.
프로그램은 어떠한 이유에서든 오류가 발생할 가능성이 있습니다. 그렇게 정상적이게 실행되지 않은 부분에 대해 프로그래머는 어떻게 처리해야할지 결정해야하는데, 이를 오류 처리Error Handling라고 부릅니다. 이러한 오류 처리의 모델은 Fail-Fast (빠르게 실패하기)와 Fail-Safe (안전하게 실패하기)라는 두 가지 방식으로 제공됩니다.
Fail-Fast는 프로그램에서 오류가 발생하면 그 즉시 프로그램을 종료하고