스프링에서 아주 간단하게 트랜젝션을 구현하려면 @Transactional 어노테이션을 통해서 쉽게 트랜젝션을 설정할 수 있습니다. (따로 해당 어노테이션을 사용하기 위한 설정 설명은 하지 않겠습니다.)
@Transactional
public int saveArticle(String title, String content) {
// 게시글등록 테이블에 데이터를 저장합니다.
articleDao.setArticle(title, content);
// 최신글 테이블에 데이터를 저장합니다.
newArticleDao.setNewArticle(title, content);
//상태코드 200은 처리완료를 나타냅니다.
return 200;
}
위의 코드와 같이 메소드 위에 @Transactional을 사용함으로서 saveArticle에 트랜젝션을 걸수가 있습니다.
그런데 위와같은 코드는 한가지 문제가 있습니다.
만약 저장되지 않았을때 상태코드를 500(익셉션 발생)을 내보내고 싶다면 어떻게 해야할까요?
@Transactional
public int saveArticle(String title, String content) {
try {
// 게시글등록 테이블에 데이터를 저장합니다.
articleDao.setArticle(title, content);
// 최신글 테이블에 데이터를 저장합니다.
newArticleDao.setNewArticle(title, content);
//상태코드 200은 처리완료를 나타냅니다.
return 200;
} catch(Exception e) {
e.printStackTrace();
return 500;
}
}
위와같이 코딩할수 있습니다. 하지만 이때는 익셉션이 발생하면 try catch로 처리되기 때문에 익셉션이 메소드 밖으로 throw되지 않아 트랜잭션이 실행되지 않습니다.
즉
articleDao.setArticle(title, content); 가 저장되고 난 뒤
newArticleDao.setNewArticle(title, content); 에서 에러가 나면 articleDao.setArticle(title, content);로 저장된 글이 롤백이 되지 않아 article에는 저장되고 newArticle에는 저장이 되지 않게 됩니다.
이때는 Spring Framework의 TransactionAspectSupport 클래스를 통해 rollback을 수동으로 작업해 주면됩니다.
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
public int saveArticle(String title, String content) {
try {
// 게시글등록 테이블에 데이터를 저장합니다.
articleDao.setArticle(title, content);
// 최신글 테이블에 데이터를 저장합니다.
newArticleDao.setNewArticle(title, content);
//상태코드 200은 처리완료를 나타냅니다.
return 200;
} catch(Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return 500;
}
}
이렇게 작성해 주면 익셉션 발생시 해당메소드를 rollback 시킬수 있게 됩니다.
참고로 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 가 실행될때 바로 rollback이 진행되지는 않습니다. setRollbackOnly 메소드는 속성만 변경을 하는 것이기 때문에 실제 rollback이 일어나는 시점은 commit이 되기 직전에 수행되게 됩니다.'Framework > SPRING FRAMEWORK' 카테고리의 다른 글
| [Spring 3.2] @ControllerAdvice를 이용한 익셉션 처리 (0) | 2013.11.29 |
|---|---|
| [Spring Framework] @RequestParam을 사용하여 List형 데이터 받을때 주의점 (2) | 2013.11.14 |
| Spring - Spring + iBatis 연동시 iBatis Transaction 실행 안되는 문제 (0) | 2010.12.13 |
| Spring - Quartz를 사용하여 스케쥴러 구현하기 (12) | 2010.09.29 |
| Spring - get방식일때 한글 깨질때 해결 방법 (1) | 2009.10.26 |