반응형

Spring FrameWork에서 우리는 애노테이션을 사용하여 하나의 서비스에 대한 트랜잭션 관리를 하게 된다. 로직이 단순할 경우에는 트랜잭션 롤백에 대한 필요성이 적어질 수 있지만, 비즈니스 로직이 클 경우에는 롤백에 대한 중요성이 정말 크다. 예를 들어, A부터 Z까지 비즈니스 로직이 있는데, K 에서 에러가 나면 그 전에 DB에서 작업했던 것들을 취소해야 할 경우 트랜잭션 롤백이 필요하다. 이번 글에서는 정말 간단할 수 있겠찌만, 이런 트랜잭션 롤백 예외 처리하는 것에 대해 기록한다.


목차

1. Exception
2. Transactional
3. 트랜잭션 롤백 예외 처리 하는 방법

1. Exception

우리가 롤백을 하려고 할 때, 사용하는 것이 Exception이다. throw 명령문을 사용하여 특정 Exception을 던져 롤백을 하곤 한다. 물론, 그 비즈니스 로직 메서드 위에는 Transactional이라는 애노테이션이 있어야 하는 건 당연한거다.

throw new XXXException("RollBack");

 

즉, 아래의 메서드와 같이, 비즈니스 로직에 @Transactional 애노테이션을 선언한 다음에 롤백처리를 한다.

@Transactional
public HashMap TEST01(HashMap map) throws SQLException, JCoException{
    HashMap test = new HashMap();

    return test;
}

 

2. Transactional

롤백에 대한 기준은 @Transactional을 선언한 다음부터에 대한 적용이다. 즉, 위의 메서드에서 @Transactional을 선언하여 트랜잭션이 적용되고 있고, 메서드가 비정상적으로 종료 직전에 롤백을 하고, 정상적으로 끝나 종료 직전에 커밋을 한다. 그렇기 때문에, 트랜잭션의 이해가 있어야 롤백이나 커밋을 하는 순간에 대한 것을 알 수 있다.

 

3. 트랜잭션 롤백 예외 처리 하는 방법

트랜잭션 롤백 예외 처리 하는 방법은 정말 간단하다. 원하는 위치에 exception을 던져서 메서드를 종료시키면 된다.

 

즉, A부터 Z까지의 비즈니스 로직이 있을 때, H 부분에서 분기 처리를 한다. 성공이면 I로 넘어가고, 성공하지 않으면 지금까지 DB에 작업을 했던 것들을 롤백시키는 것.

@Transactional(rollbackFor = {RuntimeException.class, Exception.class})
public HashMap TEST01(HashMap map) throws SQLException, JCoException{
    HashMap test = new HashMap();

	...
    
    String str = "H";
    
    if("H".equals(str)) {
    
    	if(성공) {
        	...
        } else {
    		throw new runtimeException("RollBack");
        }
    }
    
    ...
    
    return test;
}

 

즉, 위와 같이 H 단계에서 분기 처리를 하여  성공하면 넘어가지만, 성공하지 않으면 exception을 던진다. 또한, 어떤 exception에서 롤백을 할 것인지에 대해 명시를 해주면 된다.

@Transactional(rollbackFor = {RuntimeException.class, Exception.class})

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기