백엔드/Spring

[Spring] 예외 처리

kwang2134 2024. 8. 30. 16:16
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