728x90
반응형
728x90
자바 예외 Exception
- 자바의 예외도 객체로 Object의 하위 클래스
- Throwable: 예외의 최상위 클래스, 하위에 Exception과 Error가 있음
- Error: 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외, catch를 통해 사용자가 예외를 처리해선 안됨, 주로 JVM에 의해 발생하는 심각한 문제
- Exception: 애플리케이션 로직에서 사용가능한 실질적 최상위 예외, 하위에 체크 예외와, 언체크(런타임) 예외가 있음
- 체크 예외
- 컴파일러가 체크해 주는 예외
- 예외에 대한 처리를 해주지 않으면 컴파일러 오류가 발생하여 사용자가 직접 처리를 해야 함
- try catch를 통해 예외에 대한 처리를 실행
- 예외에 대한 처리를 하지 않을 경우 필수적으로 상위 클래스에 예외를 전파해야 함
- SQLException, IOException, ClassNotFoundException, FileNotFoundException ... etc
- 장점: 컴파일러가 알려주는 예외이기 때문에 개발자가 실수로 누락할 일이 없음
- 단점: 모든 체크 예외를 반드시 처리하거나 밖으로 전파해야 하므로 번거롭고 의존관계에 문제가 발생
- 언체크(런타임) 예외
- 컴파일러가 체크하지 않는 예외
- 실행 중 발생하는 예외
- 사용자가 예외에 대한 처리나 상위 클래스에 예외를 전파할 필요가 없음
- NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException ... etc
- 장점: 신경 쓰고 싶지 않은 예외를 무시할 수 있음, 의존관계를 참조하지 않음
- 단점: 개발자가 예외를 실수로 누락할 가능성이 있음
체크 예외의 의존관계 문제
- 체크 예외는 무조건 해당 클래스나 메서드에서 예외를 처리하거나 밖으로 전파해야 함
- 예외를 처리하지 않고 밖으로 전파할 경우 서비스 계층에서 외부 기술에 대한 예외가 넘어오게 됨
- 서비스 계층에선 해당 기술의 예외를 처리할 방법을 알지 못하고 예외를 밖으로 전파할 수밖에 없음
- 또한 특정 기술에 의존하는 예외가 서비스 계층에 포함되면서 추상화가 무너지고 특정 기술에 의존하게 됨
- 예외가 계속 전파되어 공통적으로 예외를 처리하는 부분에서 정확한 어떤 이유로 문제가 발생했는지 알 수 없음
해결법
- 특정 기술의 체크 예외를 언체크 예외, 런타임 예외로 기존 예외를 변환하여 전파
- 대부분의 예외는 복구 불가능한 예외이기 때문에 런타임 예외로 변환하고 예외에 대한 로그를 남김
- 런타임 예외로 변경하여 전파할 경우 의존성 문제가 해결되고 예외를 무시할 수 있음
스프링 예외 추상화
- 스프링은 데이터 접근 계층에 대한 수십 가지 예외를 정리해서 일관된 예외 계층을 제공
- 각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있음
- 데이터베이스 접근으로 생기는 예외인 SQLException의 경우 SQL Error Code를 스프링이 변환
- SQLExceptionTranslator 인터페이스와 SQLErrorCodeSQLExceptionTranslator 구현체를 사용
- translate() 메서드를 통해 SQL문을 받아 ErrorCode에 맞는 적절한 스프링 데이터 접근 예외로 변환
- 주요 스프링 예외 클래스
- DataAccessException: 데이터 액세스 관련 모든 예외의 부모 클래스
- DuplicateKeyException: 중복된 키 삽입 시 발생
- EmptyResultDataAccessException: 결과가 비어있을 때 발생
- DataIntegrityViolationException: 데이터 무결성 위반 시 발생
JDBC Template
- JDBC를 사용하는 경우 반복 문제를 해결하기 위한 템플릿 콜백 패턴
- 커넥션 조회, 커넥션 동기화, 파라미터 바인딩, 쿼리 실행, 결과 바인딩, 예외 처리 등을 템플릿을 통해 해결
- 처리할 sql문과 파라미터만 넣으면 템플릿이 모든 과정을 알아서 실행
스프링 DB 1편 - 데이터 접근 핵심 원리 강의 | 김영한 - 인프런 (inflearn.com) 강의 내용 참고
728x90
'백엔드 > Spring' 카테고리의 다른 글
[Spring] MyBatis (1) | 2024.09.01 |
---|---|
[Spring] JDBC Template (3) | 2024.08.31 |
[Spring] 트랜잭션 Transaction (4) | 2024.08.28 |
[Spring] 커넥션 풀 (0) | 2024.08.27 |
[Spring] JDBC (0) | 2024.08.26 |