본문 바로가기

웹 프로그래밍/스프링

자바 예외 이해

예외 계층

Error: 복구 불가능한 시스템 예외(그냥 둬야함)

애플리케이션 로직은 Exception부터 예외로 잡아야함

 

Exception: 체크 예외

    -애플리케이션 로직에서 사용할수 있는 실직적인 최상위 예외

    -Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크예외(단, RuntimeException 제외)

 

RuntimeException: 언체크 예외, 런타임 예외

    -컴파일러가 체크하지 않는 언체크 예외

    -RuntimeException과 그자식 예외는 모두 언체크 예외

    -RuntimeException과 그 하위 언체크 예외를 통상 런타임 예외라고 부름

 

예외 기본 규칙

1. 예외는 잡아서 처리하거나 던져야 함

2. 예외를 잡거나 던질때 지정한 예외 뿐만 아니라 그 예외의 자식들도 함께 처리됨

    -ex) Exception을 catch로 잡으면 그 하위 예외들도 모두 잡을수 있음

    -ex) Exception을 Throws로 던지면 그 하위 예외들도 모두 던질수 있음

 

Exception을 상속받으면 체크 예외가 됨

RuntimeException을 상속받으면 언체크 예외가 됨

 

 

체크 예외(컴파일러가 검사해줌)는 예외를 잡아서 처리하거나 던지거나 둘중하나를 필수로 선택해야한다.

개발자가 실수로 예외를 누락하지 않도록 컴파일러를 통해 문제를 잡아주는 안전장치이나

모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기때문에 너무 번거로움

 

언체크 예외(컴파일러가 검사 X) 체크 예외와 매커니즘이 동일하나 예외를 던지는 throws를 선언하지 않고 생략할수 있음

(자동으로 예외를 던짐)

신경쓰고 싶지 않은 언체크 예외를 무시할수 있으나 개발자가 실수로 예외를 누락할수 있음

 

체크 예외와 언체크 예외(런타임 예외)의 차이는 예외를 처리할수 없을때 예외를 밖으로 던지는것이 필수 인가 생략인가의 차이임

 

언제 체크 또는 언체크를 사용할까?

 

기본 원칙 2가지

1. 기본적으로 언체크(런타임) 예외를 사용하자. 

2. 체크 예외는 비지니스 로직상 의도적으로 던지는 예외에만 사용하자.

    -이 경우 해당 예외를 잡아서 반드시 처리해야 하는 문제일때만 체크 예외를 사용

 

체크 예외를 문제점

데이터베이스 문제 같은 경우 애플리케이션 로직에서 처리할 방법이 없음

-> 여러개 각각을 다 던져줘야함 -> 공통 예외 처리까지 매번 던져줘야함

-> 서비스나 컨트롤러에서 특정 기술(java.sql.SQLException)을 의존해야함(OCP 위반)

 

Exception으로 던지면 문제가 해결되는것 같으나 모든 예외를 다 던지기 때문에 중요한 체크 예외를 놓치게됨(안티패턴)

-> 솔루션으로 런타임 예외로 바꿈

 

예외 포함과 스택 트레이스

예외를 전환할때는 꼭 기존 예외를 포함해야한다(즉 생성자에 파라미터로 넣어줘야함)

로그를 출력할때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할수 있음(log.info("ex", e))

 

 

'웹 프로그래밍 > 스프링' 카테고리의 다른 글

REST  (0) 2024.01.18
스프링 예외 처리  (0) 2023.06.06
스프링 데이터 접근 핵심 원리  (0) 2023.05.08
스프링 MVC(2) 검증 정리  (0) 2023.04.14
스프링 MVC(1) 원리 정리  (0) 2023.04.08