본문 바로가기
Spring Study/DataBase

[DataBase] 자바 예외 (Exception)

by 정재인 2023. 9. 20.

예외 계층

예외 계층 그림

Error언체크 예외이며, 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다.

이 예외는 잡으려고 해서는 안된다. 따라서 Error의 상위인 Throwable 예외도 잡으면 안된다. 애플리케이션은 이러한 이유로 Exception부터 필요한 예외로 생각하고 잡아야 한다.

 

Exception체크 예외이며, 애플리케이션 로직에서 사용할 수 있는 실직적인 최상위 예외이다.

Exception과 그 하위 예외는 모두 체크 예외이지만 RuntimException언체크 예외이다.

 

예외 기본 규칙

1. 예외는 잡아서 처리하거나 던져야 한다.
2. 예외를 잡거나 던질 때는 지정한 예외 뿐 아니라 자식들도 함께 처리된다.

 

예외 처리

 

예외 던짐

예외를 처리하지 못하면 호출한 곳으로 예외를 계속 던지게 된다.

 


체크 예외 (Checked Exception)

Exception을 상속받은 예외는 체크 예외가 된다.

static class MyCheckedException extends Exception {
      public MyCheckedException(String message) {
          super(message);
      }
}

MyCheckedException은 Exception을 상속받았기 때문에 체크 예외가 된다.

RuntimeException을 상속받으면 언체크 예외가 된다.

 

체크 예외를 잡아서 처리하는 코드

try{
    repository.call();
} catch(MyCheckedException e){
    //예외 처리 로직
}

체크 예외를 잡아서 처리하려면 catch(. . .)를 사용하면 된다.

 

 

체크 예외를 밖으로 던지는 코드

public void callThrow() throws MyCheckedException{
    repository.call();
}

체크 예외를 처리할 수 없을 때는 'method() throws 예외'를 사용해서 밖으로 던질 예외를 필수로 지정해준다.

 

 

체크 예외 장단점

장점

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

단점

모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에, 번거롭다.

 


언체크 예외 (Unchecked Exception)

- RuntimeException과 그 하위 예외를 언체크 예외로 분류한다.
- 말 그대로 컴파일러가 예외를 체크하지 않는다는 뜻이다.

 

체크 예외 (Checked Exception) VS 언체크 예외 (Unchecked Exception)

체크 예외 (Checked Exception)

예외를 잡아서 처리하지 않으면 항상 throws에 던지는 예외를 선언해야 한다.

언체크 예외 (Unchecked Exception)

예외를 잡아서 처리하지 않아도 throws를 생략할 수 있다.

 

 

언체크 예외를 잡아서 처리하는 코드

try{
    repository.call();
} catch(MyUncheckedException e){
	//예외 처리 로직
    log.info("error", e);
}

언체크 예외도 필요한 경우 잡아서 처리할 수 있다.

 

 

언체크 예외를 밖으로 던지는 코드 (생략)

public void callThrow(){
	repository.call();
}

언체크 예외는 'throws 예외'를 선언하지 않아도 된다.

 

 

언체크 예외를 밖으로 던지는 코드 (선언)

public void callThrow() throws MyUncheckedException{
	repository.call();
}

언체크 예외도 'throws 예외'를 선언해도 된다.

 

 

언체크 예외 장단점

장점

신경쓰고 싶지 않은 언체크 예외를 무시할 수 있다.

단점

언체크 예외는 개발자가 실수로 예외를 누락할 수 있다. (컴파일러 X)

 


체크 예외 활용

1. 기본적으로 언체크(런타임) 예외를 사용한다.
2. 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용한다.
    체크 예외 ex) 계좌 이체 실패, 결제 포인트 부족, 로그인 ID,PW 불일치 등..

 

체크 예외 문제점

1. 복구 불가능한 예외
2. 의존 관계에 대한 문제

 

언체크 예외 활용

- SQLException을 런타임 예외인 RuntimeSQLException으로 변환했다.

- ConnectException을 런타임 예외인 RuntimeConnectException으로 변환했다.

- 런타임 예외이기 때문에 예외들을 처리할 수 없다면 별도의 선언없이 그냥 두면 된다.

 

런타임 예외 - 복구 불가능한 예외

시스템에서 발생한 예외는 대부분 복구 불가능 예외이다. 런타임 예외를 사용하면 서비스나 컨트롤러가 이런 복구 불가능한 예외를 신경쓰지 않아도 된다.

 

런타임 예외 - 의존 관계에 대한 문제

런타임 예외는 해당 객체가 처리할 수 없는 예외는 무시하면 되기 때문에, 체크 예외처럼 강제로 의존하지 않아도 된다.

 

런타임 예외를 사용하면 중간에 기술이 변경되어도 해당 예외를 사용하지 않는 컨트롤러, 서비스는 코드를 변경하지 않아도 된다.

 


예외 포함과 스택 트레이스 (Stack Trace)

예외를 전활할 때는 꼭 기존 예외를 포함해야 한다. (스택 트레이스를 확인할 때 문제가 발생)

@Test
void printEx(){
	Controller controller = new Controller();
    try{
    	controller.request();
    } catch(Exceptoin e){
    	//e.printStackTrace();
        log.info("ex", e);
    }
}

로그를 출력할 떄 마지막 파라미터에 예외를  넣어주면 로그에 스택 트레이스를 출력할 수 있다.

 

기존 예외를 포함하는 경우

public void call(){
	try{
    	runSQL();
    } catch(SQLException e){
    	throw new RuntimeSQLException(e);  //기존 예외(e) 포함
    }
}

 

기존 예외를 포함하지 않는 경우

public void call(){
	try{
    	runSQL();
    } catch(SQLException e){
    	throw new RuntimeSQLException();  //기존 예외(e) 제외
    }
}

'Spring Study > DataBase' 카테고리의 다른 글

[DataBase] 데이터 접근 기술  (0) 2023.09.22
[DataBase] 예외 처리  (0) 2023.09.21
[DataBase] 트랜잭션 (Transaction)2  (0) 2023.09.19
[DataBase] 트랜잭션 (Transaction)  (5) 2023.09.18
[DataBase] Connection Pool / DataSource  (2) 2023.09.14

댓글