자바 기본 문법에서 예외에 대해 내가 아는 지식과 두잇 자바 완전 정복 책과 김영한 선생님의 강의를 종합해서 간단히 정리해본다.
오류 중 개발자가 해결할 수 있는 오류를 '예외(exception)' 라고 한다. 이 예외를 처리하는 것을 '예외 처리' 라고 한다.
1. 예외 와 에러
평소에 예외와 에러를 크게 구분하지 않고 사용했다. 하지만 두가지는 구분이 필요하다.
- 예외: 개발자가 오류가 발생했을 때 어떻게 할 지 정할 수 있다. 처리 가능하다.
- 에러: 메모리가 꽉 찼을 때, 쓰레드가 죽었을 때 등의 상황처럼 개발자가 처리할 수 없는 오류이다.
2. Checked Exception 과 Unchecked Exception
Exception 클래스는 일반 예외 클래스와 실행 예외 클래스로 나뉜다.
일반 예외, 체크 예외 (Checked Exception)
컴파일 전에 예외 발생 문법을 체크하고 예외 처리를 하지 않으면 문법 오류가 발생한다.
그래서 코딩하면서 바로 알아차릴 수 있다.
실행 예외, 언체크 예외(Unchecked Exception)
RuntimeException 클래스를 상속받은 예외 클래스들이 처리하는 예외이다.
컴파일 전이 아니라 실행할 때 발생하는 예외이다. 실행 예외가 발생하면 프로그램은 강제 종료된다.
예외 처리나 예외 던지기를 사용해도 된다. 예외 처리를 하지 않으면 자동으로 예외를 던진다.
예외 처리를 따로 하지 않아도 문법 오류가 발생하지 않는다. 그래서 실행 예외 처리에는 더욱 주의가 필요하다.
3. 예외 처리
3.1. 예외 처리
예외가 발생했을 때 처리하는 방법이다. 예외 처리 구문으로 처리하면 예외가 발생해도 프로그램이 계속 실행된다.
try {
// 일반 예외, 실행 예외 발생 가능 코드
} catch (예외 클래스) {
// 예외 발생시 처리 코드
} finally {
// 무조건 실행하는 코드, 필수 아님.
}
예외가 발생하면 자바 가상 머신이 가장 먼저 인지한다. 자바 가상 머신에서 try{} 에서 발생한 예외 타입을 인지하고 예외 클래스 객체를 생성해서 catch(){} 에 전달한다.
만약에 catch(){} 에서 지정해둔 객체 타입으로 try{} 에서 발생한 예외 객체 타입을 받을 수 없다면 정상적인 예외 처리가 되지 않고 프로그램이 강제 종료된다.
3.2. 다중 예외 처리
try {} 하나에 여러개의 catch(){} 로 세부적으로 처리할 수 있다.
try {
} catch (예외 타입 e1) {
} catch (예외 타입 e2) {
}
...
실행할 catch(){} 블록의 선택 과정은 위에서부터 확인한다.
그러므로 맨 위에 Exception 을 넣으면 그 아래의 예외 타입까지 내려가지 않고 맨 위에의 catch 만 실행된다.
Exception 이 모든 예외의 상위 클래스이기 때문이다.
4. 예외 던지기, 예외 전가
IDE 쓰다보면 선택사항이 try catch 와 throws 두개로 나오는걸 자주 봤을 것이다.
예외 발생시에 예외 처리 말고도 다른 방법이 있다. 바로 예외 던지기이다.
리턴 타입 메서드(매개변수) throws 예외 클래스 {
// 예외 발생 코드
}
예외를 던지면 호출한 메서드가 예외를 처리해야 한다. 상위 메서드로 계속 던질 수 있다.
그렇다면 상위 메서드로 계속 던진다면?
최상위 메서드인 main() 메서드까지 올라가고, main() 메서드에서도 예외를 던지면 자바 가상 머신이 직접 예외를 처리하게 된다.
화면에 발생한 예외 정보를 출력하고 프로그램을 강제 종료한다.
5. 예외 처리 활용 방안 (김영한 선생님 가이드)
- 기본적으로 언체크(런타임) 예외 사용하자.
- 실무에서 발생하는 대부분의 예외는 데이터베이스, 네트워크 와 같은 시스템 레벨에서 올라온 예외들인데 복구가 불가능한 상황이 많아서 애플리케이션 로직에서 처리를 못한다.
- 대신 문서화 잘하기
- 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하자.
- 스프링에서 데이터 접근 관련 예외를 처리할 수 있는 예외를 추상화해서 제공한다.
- 데이터베이스 예외인 SQLException 를 처리하려면 서비스단에서 SQLException 을 사용해야 한다.
그런데 SQLException 은 DB 예외라서 서비스단에서 안쓰는게 좋다.
그래서 스프링에서 추상화된 예외를 사용하면 된다. - 최고 상위 예외: org.springframework.dao.DataAccessException
- 스프링이 제공하는 데이터 접근 계층의 모든 예외는 런타임 예외
- 데이터베이스 예외인 SQLException 를 처리하려면 서비스단에서 SQLException 을 사용해야 한다.
'JAVA SPRING' 카테고리의 다른 글
API 부하테스트 툴 ngrinder (0) | 2024.07.08 |
---|---|
Spring Batch 5 ItemProcessor 에서 return list (0) | 2024.06.02 |
커넥션, 트랜잭션 간단 정리 (0) | 2024.06.02 |
Spring Boot CORS 설정 (0) | 2023.09.03 |