프로그래밍에서 예외 - 기초 개념
예외란?
프로그램의 동작이 정상적인 처리 범주에서 벗어난 경우 “ 예외(Exception)
가 발생했다.” 라고 말한다. 예상하지 못한 사건의 발생이라고 볼 수 있다. 예외는 언제 발생하고 우리는 어떤 마음가짐으로 대해야할까?
일반적으로 프로그램을 구현할때는 목적과 실행범위가 있다.
아래 플로우차트를 살펴보자
매우 간단해보이지만 구현에 들어가게되면 고려할 사항이 많아진다.
올바른 유저인지판단, 눈이온다면?, 기상청api연동실패, 지각인지 확인하기, 출퇴근기록하기…
보여지는 내용보다도 훨신 다양한 경우의 수를 맞이하게된다.
true/false 2개로 이루어진 선택지가 10개만 되더라도 2^10 인 1000개이상 경우의 수가 나오고, 이 모든경우에 대응할수 있어야한다.
그리고 구현하는 개발자가 이같은 모든 상황에 대응할수는 없기때문에 예외가 발생
하게된다.
물론 system이 처리 할수없는경우에서도 발생한다. out of memory, thread full 같은 경우이다.
예외의 발생
예외는 매우 다양하게 발생한다.
대표적으로 필요한 데이터가 없을때 발생한다.
예외가 발생했을때 대응이 가능한 경우도 있는반면 대응을 할 수 없는 경우도 있다.
아래 예시를 통해 살펴보자
NullPointException(NPE)
대표적인 Exception인 NullPointException(NPE)
을 살펴보자
1 | User user = null; |
위경우라면 null 여부를 체크하여 대응을 할수도 있지만, 그렇게 하지 않은 경우 예외가 발생한다.
외부연동
외부 데이터를 연동하기위해 api를 호출했다가 Timeout
이발생하는 경우도 생길 수 있다.
이런 경우는 내가 만든 application에서는 미리 대비할수 없다.
결과에 따라서 대응할수 있는 방법만 있다.
상황에 따라서 다르겠지만 선택지는 있다.
- 기본값을 적용하여 처리
- 처리할수 없으니 기능 수행 불가
- 동작중지 (쇼핑몰 물건 구입시 이용시 카드이용불가)
- 이 동작을 생략할수 있다면 건너뛰기 (쇼핑몰 물건 구입시 - 로깅, 문자보내기- 상대적으로 덜중요)
예외가 발생하면?
개발자는 소프트웨어를 만든다.
가장 중요한것은 의도한대로 동작하는 프로그램고, 그다음이 좋은 프로그램을 만드는 것이다.
예외처리는 이 둘의 중간정도 영역이라고 생각한다.
오류로인해 데이터의 정합성이 꼬여서 복구하기가 매우 힘든 상황이 되어 동작하지 않는 프로그램이 될 수 있다.
사용자에게 “네트워크 오류입니다 다시 시도해주세요” 라는 문구를 보여주는것 대신에 “time out exception ….” 같은 문구가 노출되어 프로그램의 신뢰성이 낮아지기도한다.
안정적인 프로그램을 만드는것은 개발자의 필수적인 역량이다.
예외에 대한 대처
예외가발생했다면 오류
인지 확인하는것이 필요하다.
모든 예외가 오류는 아니다. 하지만 오류가 있다면 예외를 통해서 알 수 있다.
오류의 수정
처음부터 완벽한 프로그램을 만들 수 있으면 좋지만… 이는 거의 불가능하다.
예외가 발생했다는 뜻은, 프로그램이 의도하지 않는 동작을 했다는 의미가된다.
처리가 불가능하여 의도적으로 예외로 처리한경우도 있을것이다.
경우에 따라서는 취약점을 유발 할 수도 있기때문에 원인을 파악하고, 보완하도록 하자.
그렇게 하기 위해선 오류의 탐지가 매우 중요하다.
오류의 탐지
아래 사항들이 준비되어있다면 좋다.
- 운영중인 서비스라면 - 오류가 났을때 알람을 빠른시간내에 받을수 있도록 한다. (문자,메일,메신저 등)
- 오류의 등급은? - application전체장에, 일부기능장애, 장애아님 ..
- 왜 발생했는지 ?
- 소스코드의 어느부분에서 발생했는지?
대응
오류의 심각한정도와 시간적 여유에 따라 대응은 달라진다
- 오류가 없는것이 확인된 이전버전으로 롤백
- 눈에 보이는 증상을 해결하도록 방어코드 추가
- 원인을 파악하여 수정
관련포스트
프로그래밍에서 예외 - 기초 개념
java에서 exception
wep api 서비스 application에서 exception