김찬진의 개발 블로그
[23/08/31] Spring 이 체크예외는 커밋, 언체크예외는 롤백하는 이유 본문
스프링은 체크예외를 비즈니스 의미가 있는 예외로, 언체크예외는 복구불가능한 예외로 간주한다.
따라서 스프링은 체크예외는 커밋, 언체크예외는 롤백하는 정책을 가진다.
(참고로 정책이기 때문에 꼭 따를 필요는 없는데, 체크예외를 롤백하고 싶은 경우 @Transaction(rollbackFor=…) 를 사용하면 된다.)
체크 예외 즉, 비즈니스 의미가 있는 예외란, 시스템은 정상작동하지만 비즈니스 로직에 벗어났기 때문에 발생한 예외라는 것이다. 만약 비즈니스 로직에서 벗어났기 때문에 롤백함으로써 해당 예외를 처리한다면 방금 사용자가 입력한 데이터가 모두 삭제되어 버린다. 클라이언트에게 조치를 취하도록 유도한 이후에 커밋한다는 점에서 스프링은 비스니스 의미가 있는 예외를 체크 예외로 간주하는 것이다.
반대로 언체크예외는 시스템상 복구불가능한 예외이다. 자바는 언체크예외에 대한 처리(throws 또는 catch)를 강제하지 않고, 만약 언체크예외가 발생하더라도 자동으로 객체를 호출한 곳으로 예외를 던지고, 만약 언체크예외에 대한 처리가 이뤄지지 않더라도 결국 공통예외처리부분까지 도착해 그곳에서 처리되도록 하는 철학을 가지고 있다. 예외에 대한 처리를 번거롭게 강제하지 않고, 처리하지 않더라도 결국 공통예외처리부분에서 처리된다는 점에서 스프링은 시스템상 복구불가능한 예외를 언체크 예외로 간주하는 것이다.
바꿔 말하면 예외를 리턴값으로 사용한다고 말할 수 있다.
체크 예외를 잡으면 커밋, 언체크 예외를 잡으면 롤백하는 로직을 사용한다는 것이다!
정리
체크예외 = 비즈니스 로직상 예외 = 기본적으로 커밋
언체크예외 = 시스템상 예외 = 기본적으로 롤백
'1일1배움 > Spring (김영한 님)' 카테고리의 다른 글
24/01/01 [WAS, 서블릿 컨테이너, 스프링 컨테이너] (0) | 2024.01.01 |
---|---|
[23/09/04] 트랜잭션 하나로 묶기, 트랜잭션 하나에 참여하기(전파) (1) | 2023.09.04 |
[23/06/06] DispatcherServlet, HandlerMapping, HandlerAdapter, ModelAndView, ViewResolver, View, RequestMappingHandlerAdapter, ArgumentResolver, ReturnValueResolver (0) | 2023.06.06 |
[23/05/03] 서블릿 객체와 서블릿 내장 객체 (0) | 2023.05.03 |
[23/05/01] Servlet / JSP / (0) | 2023.05.02 |
Comments