Transaction 처리와 try catch를 같이 쓴다면 어떻게 될까
내가 파일 저장과 관련된 부분에 대해 오류가 생겨 찾아보던 중 아래의 글을 찾게 되었고, 굉장히 도움이 된다고 생각해서 정리 해 놓았다.
https://okky.kr/articles/1231694
Transaction 처리
- Transaction 처리는 간단하게 말해, 한번에 이루어져야하는 작업의 묶음이다.
- 즉 전체가 완료되던가 전체가 실패해야 한다.
- 일부 작업의 성공은 허용 하지 않는다.
@Transactional
public void unitOfWork() {
aService.doA();
bService.doB();
cService.doC();
}
위와 같은 메서드가 있을 때, 순차 적으로 처리하다가 doB() 에서 예외가 발생한다면, doA()는 이미 실행 되었음에도 rollback된다. 일부 작업의 성공을 허용하지 않는다
그리고 트랜잭션 처리가 의미가 있으려면 aService ~ cService까지 모두 트랜잭션 메커니즘을 지원해야한다.
DB는 이런 트랜잭션 메커니즘을 지원한다.
일반적으로 @Transactional은 DB 상태의 일관성을 지키기 위해 사용한다.
try catch 구문
- 예외는 코드 동작의 범위를 벗어났을 때 발생
- try catch 구문은 이 예외를 내가 받아서 처리한다는 의미이다.
- 즉 예외를 던지지 않고 내가 받아서 다른 방식으로 처리하겠다는 의미이다.
아래는 예시 코드이다.
public void readBook(String bookTitle){
try{
person.findBook(bookTitle);
} catch(BookExistenceException e) {
System.Out.println("There is no book with that title")
}
}
여기서 person은 findBook을 실행했을 때 책이 없는 경우(BookExistenceException)을 다룰수 없다.
코드의 동작 범위를 벗어낫기 때문에 에러를 던진거다.
readBook 메서드는 책이 없는 경우를 다룰 수 있고, 에러를 던지지 않고 문구를 출력하게 된거다.
즉 에러는 다룰 수 없을 때 일어난다. 다룰수 있다면(catch) 에러는 발생하지 않는다
만약 여기에서 다른 에러(PersonHungryException)이 발생한다면 어떨까,
이 경우는 person도 readBook메서드도 동작 범위 밖이기 때문에 에러를 그대로 발생시킨다.
public void readBook(String bookTitle) throws BookExistenceException{
person.findBook(bookTitle);
}
여기서 처럼 상위 클라이언트로 에러를 전파할 수도 있다.
try catch와 Transaction을 같이 쓰면 어떻게 될까?
여기까지 읽었으면 어느정도 감이 왔을 수 있다.
@Transactional
public void unitOfWork() {
try {
aService.doA();
bService.doB();
cService.doC();
} catch(Exception e) {
sendMailToAdmin("unitOfWork에서 예외가 발생했습니다.");
}
}
Exception은 모든 Exception의 조상이므로 이경우 @Transactional은 작동하지 않는다.
아래의 경우는 어떨까
@Transactional
public void insertBoard(boardDto){
try{
boardMapper.insertBoardContents(boardDto);
boardMapper.insertBoardFiles(boardDto); //여기서 에러발생
} catch(Exception e){
log.debug("insertBoard에서 에러 발생 Transaction 처리되었습니다");
sendMailToAdmin("에러!!");
throw new Exception("에러 메시지");
}
}
이 경우 에러가 발생하면 로그를 남기고 이메일도 보내고 트랜잭션 처리를 할 수 있다.
사실 이쯤 되면 event나 aop를 적용시키는게 어떨까 싶지만 어쨌든 오늘의 주제인만큼 이렇게 글을 마치겠다.
'SpringBoot > 에러처리, Transaction' 카테고리의 다른 글
[Transaction] File저장과 DB저장을 함께 Transaction 하고 싶다. (0) | 2022.11.04 |
---|