Springboot/예외처리

Spring boot 예외처리! with Transactional

디비드킴 2021. 8. 16. 12:59

kim's cafe에이어 kim's shop을  만드는 도중 치명적인 오류가 있었다

무려 Transactional어노테이션이 먹히지 않았다..

아예 작동하지 않았다 UPDATE문도 던지지 않고..

근데 업데이트야 뭐 sql문을 던지면 되지만

제일 두려운 게 rollback이었다

어노테이션 덕에 rollback을 쉽게 알아서 해주는데

그걸 사용할 수 없게 된 거 같았다..

 

결론 일단 해결했다

어노테이션 위치가 잘못되어있었다

흐름은 이렇다

프런트(3030)에서 요청->(8080)으로 전달 -> controller->confrimService->senPhone함수-> sendSms함수-> updateconfrim함수

 

이전에 난 updateconfrim에 어노테이션을 붙여 놓았다

즉 마지막에 SET이 이뤄지는 곳에만 붙여 논 것이다

 

그런데 senPhone함수에

붙이니 작동되었다

 

이유는 솔직히 잘 모르겠다

트랜잭션 그 자체에 대해 

조금 더 공부를 해야 할 거 같다

 

service

confrimService.java
confrimService.java
confrimService.java

트랜잭션이 시작되는 제일 위에 함수에만 

어노테이션을 붙여놓았다

 

테스트를 해보자

mysql
vscode

드디어 update문이 날아간다

숫자도 2로 바뀌었다!

 

롤백 테스트를 해보자

 

예를 들어 

여기 오기 전 다른 수정이 필요한 데를

들렀다가 온다고 치자

게시판 글 수정 같은 경우 글+제목+사진 등이 바뀌는데

하나라도 오류가 나면 롤백이 되고 알려줘야 한다

그걸 여기서 테스트해보자 

 

테스트로 그냥 이메일을 바꿔주는 

로직을 넣어놔 주자 중간에

confrimService.java
mysql

인증번호 전송과 함께

kim@kim.com4로 바꿔보자

 

vscode
phone_num=1로테스트했다
mysql

둘 다 제대로 update 됐다

여기서 재밌는 건

코드에서는 userEmail을 먼저 바꾸게 되어있다

하지만 vscode는 제일 마지막 update부터 

update문을 던지는 모습을 보여준다

 

rollbacktest

user->confrim으로 가는 도중 

마지막 confrim에서 예외를 발생시켰을 때

rollback이 되는지 확인해보자

 

confrimService.java

모든 저장이 끝난 후

예외를 고의로 일으켜줘 보자!

errorRestController.java

전역 컨트로러에 설정해주고

http://localhost:3030/singupPage

메시지가 잘 날아왔다

그렇다면 db는 바뀌었을까??

vscode

select 문외에 작동하지 않았다!

이메일 부분을 통과했지만

updatecofrim 함수에서 에러가 나서 

update문이 가지 않았다!

 

후아 겨우 다시 사용할 수 있게 되었다 ㅠㅠㅠ

 

근데 고민이 생겼다

근데 이게 롤백 처리 맞겠지..?

혹시 update문이 날아가고

다시 취소돼야 하는 게 vscode에 올라와야 하는 건가..?

라는 고민이다...