예외 이해하기

2024. 8. 8. 16:52· 백엔드 Backend/기본 개념
목차
  1. 예외 계층 파악하기
  2. ✔️ Throwable
  3. ✔️ 오류 (Error)
  4. ✔️ 예외 (Exception)
  5. 체크 예외
  6. ✔️ 체크예외는 일반적으로 사용하지 않는다.
  7. 언체크 예외
  8. 📈 흐름
  9. ✔️ 체크 예외의 단점 해결

예외 계층 파악하기

✔️ Throwable

최상위 예외

✔️ 오류 (Error)

오류는 메모리부족(StackOverflow, OutOfMemory)이나 심각 시스템 오류로 발생합니다.

애플리케이션에서 복구가 불가능합니다.

✔️ 예외 (Exception)

예외는 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생합니다.

오류와 달리 개발자가 미리 상황에 맞게 예외 처리를 할 수 있습니다.

이 때, 지정한 예외 뿐만 아니라 하위에서 발생한 것까지 모두 처리됩니다.

개발자가 예외를 미리 처리하지 못하면, WAS가 오류를 처리해 페이지를 반환합니다. (500/404 페이지 등)

 

1. 체크 예외 (Checked Exception)

  • 컴파일러가 체크하는 처리해야하는 예외로, 어플리케이션 실행 전에 확인할 수 있습니다.
  • try-catch나 throw로 처리할 수 있습니다.
  • 애플리케이션 로직에서 사용할수있는 실질적 최상위 예외입니다.

2. 언체크 예외 (Unchecked Exception)

  • 컴파일러가 처리하지 않는 처리하지 않아도 되는 예외로, 애플리케이션 실행 중에 발생하는 예외입니다.
  • RuntimeException 하위의 모든 예외가 해당됩니다. (NullPointer, Index…)
  • 클라이언트의 요청 시 개발자의 필요와 로직에 의해 관리되는 예외입니다.

 


체크 예외

public void method() **throws CustomExecption** {...}

체크 예외는 컴파일러가 체크하는 예외로서, 명시적으로 체크 예외를 지정해서 처리해야합니다.

try-catch로 처리하거나 throws로 던져야하기 때문에, 의존관계에 따른 단점과 번거로움이 존재합니다. (하위-상위 관계까지 모두 처리해주어야 함)

 

✔️ 체크예외는 일반적으로 사용하지 않는다.

체크예외는 계좌이체 실패 예외, 결제시 포인트부족예외, 로그인 불일치 예외와 같이 개발자가 판단할 때 심각한 문제가 있을 것으로 예상하는 경우에 사용할 수 있습니다.

하지만 다음과 같은 문제점으로 인해 일반적으로 사용하지 않습니다.

 

1. 복구가 불가능한 예외 문제

대부분의 예외는 복구가 불가능합니다. 이 때 예외를 계속 throws로 던지다보면, 결국 WAS가 문제를 처리하게됩니다.

이를일관적으로 공통처리할 수 없기 때문에 개발자의 의도대로 로직을 구현하기 어렵습니다.

  • 예시로 SQLException이 해당됩니다. 서비스와 컨트롤러 모두 예외를 처리할 수 없어 throws로 던지게되면, 결국 WAS가 처리하게되어 개발자의 의도대로 로직을 구성할 수 없습니다.

2. 의존관계 문제

예외를 try-catch나 throws를 통해 던지게 되면, 특정 계층에서만 의존하던 Exception을 다른 계층에서도 의존하게 됩니다.

  • 앞선 예시와 같이 SQLException의 경우, JDBC 기술을 사용하다가 JPA를 사용하게 되면, 모든 컨트롤러와 서비스에서 해당 기술의 Exception으로 일일이 수정해주어야 합니다.
  • throws Exception으로 모든 예외를 퉁칠 수 있지만, 모든 예외를 다루기 때문에 개발자의 의도를 알 수 없게 되기 때문에 사용을 지양합니다.

 


언체크 예외

public void method() {
	**throw new CustomException();**
}

앞선 체크예외의 단점으로 인해, 기본적으로 사용되는 예외 처리 방법입니다.

언체크 예외는 컴파일러가 체크하지 않는, 애플리케이션 실행 도중 일어나는 예외입니다.

  • 명시적으로 메소드에 throws 예외를 선언하지 않아도 됩니다.
  • 예외를 선언하지 않으면 자동으로 예외를 던지고, 필요한 경우 잡아서 처리합니다.

 

📈 흐름

  1. Controller → Service → Repository, NetworkClient
  2. 위의 흐름에서 예외 발생 → Service 예외 전달 → Controller 예외 전달 → 예외 공통처리 (ControllerAdvice 등)

✔️ 체크 예외의 단점 해결

1. 복구 불가능한 예외를 공통 처리 가능

복구 불가능한 대부분의 예외를 런타임 예외를 사용하여 처리하게됩니다.

ControllerAdvice나 Filter, Interceptor를 사용하여 던져진 예외를 일관성 있게 처리하기 때문에, 서비스나 컨트롤러와같은 비즈니스 로직에서는 예외 관리를 신경쓰지 않아도 됩니다.

 

2. 처리할 수 없는 예외 무시

언체크 예외는 처리할수 없는 예외는 무시하기 때문에, 의존관계와 상관 없이 동작합니다.

 

⚠️ 주의점

런타임 예외는 상속하거나 커스텀이 자유롭기 때문에 포함하는 예외나 스택트레이스 등에 대한 문서화를 잘 해야 의도에 맞게 사용할 수 있습니다.

 

'백엔드 Backend > 기본 개념' 카테고리의 다른 글

final 키워드 사용하기  (0) 2024.08.08
SSH Key 동작 원리  (0) 2024.08.08
아키텍처  (0) 2024.08.07
멀티 모듈 / MSA 구조 이해하기  (0) 2024.08.05
Http 요청 이해하기  (0) 2024.08.02
  1. 예외 계층 파악하기
  2. ✔️ Throwable
  3. ✔️ 오류 (Error)
  4. ✔️ 예외 (Exception)
  5. 체크 예외
  6. ✔️ 체크예외는 일반적으로 사용하지 않는다.
  7. 언체크 예외
  8. 📈 흐름
  9. ✔️ 체크 예외의 단점 해결
'백엔드 Backend/기본 개념' 카테고리의 다른 글
  • final 키워드 사용하기
  • SSH Key 동작 원리
  • 아키텍처
  • 멀티 모듈 / MSA 구조 이해하기
달래dallae
달래dallae
백엔드를 열심히 갈고 닦아서 광내봅시다 ~_~
달래dallae
머루랑달래랑
달래dallae
전체
오늘
어제
  • 분류 전체보기 (54)
    • 프로젝트 Project (14)
    • 백엔드 Backend (27)
      • 기본 개념 (13)
      • 서버 Server (9)
      • 스프링 Spring (1)
      • JPA (3)
    • 데이터베이스 Database (6)
      • MySQL (1)
      • Oracle (5)
    • 언어 Language (0)
      • 자바 Java (0)
      • 파이썬 Python (0)
    • 알고리즘 Algorithm (1)

블로그 메뉴

  • 홈
  • 글쓰기
hELLO · Designed By 정상우.v4.2.2
달래dallae
예외 이해하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.