티스토리 뷰
noRollbackFor 찾게된 썰
프로젝트 개발 중 '로그인 실패횟수를 카운트하는 요구사항'이 있었다
처음에는 실패횟수 카운팅을 간과하고 단순히 로그인을 구현하고자 Spring Security 통해 username/password가 유효한지 판단하는 AuthenticationPrivider 클래스를 구현하였다.
그런데, AuthenticationPrivider에서 로그인정보가 False임을 리턴했을때, 예외가 발생하면서, 트랜잭션이 롤백되었고, 실패횟수를 DB에 저장할수 없었다.
그래서 서비스 단에서 비밀번호를 검증하고 예외처리가 아닌 응답값을 리턴하는 방식으로 수정하였다.
다른 서비스에서는 이러한 로직을 어떤식으로 구현하는지 궁금해서 리서치하는 도중에 noRollbackFor 옵션을 발견하게되었고,서비스 단에서 AuthenticationPrivider에서 org.springframework.security.authentication.BadCredentialsException 가 발생하였을때 예외처리를 하면 되겠구나 라고 생각하게되었다.
트랜잭션 특징
트랜잭션의 대표적인 특징으로는 ACID가 존재한다.
- Atomicity(원자성) : 한 트랜잭션에서 실행한 작업들은 하나의 단위로 수행된다. 모두 commit 또는 rollback
- Consistency(일관성) : 트랜잭션은 일관성있는 데이터베이스 상태를 유지한다
- Isolation(고립성) : 동시에 수행되는 트랜잭션 간에 서로 영향을 끼치지 않도록 격리해야한다
- Duarability(영속성) : 트랜잭션을 성공적으로 수행되면 결과가 항상 저장되어야한다
이 중에서 @Transactional의 noRollbackFor 옵션은 원자성을 예외처리하는 Spring boot의 지원 기능이다.
noRollbackFor 사용하기
1
2
3
4
5
|
@Transactional(noRollbackFor = { ExceptionA.class, ExceptionB.class })
public void insertItem() {
...
}
|
cs |
사용하는 방법은 굉장히 간단하다.
기존 정의한 서비스 메소드 상단에 우리는 당연하게 @Transactional 어노테이션(선언적 트랜잭션)을 작성했을것이다.
그 옵션으로 noRollbackFor = { 발생해도 롤백하지 않을 Exception 클래스 } 를 넣어주기만 하면 된다.
그러면, 해당 트랜잭션에서는 지정한 Exception이 발생하여도 롤백처리를 하지 않는다.
너무 쉬운거라..막상 작성하니 민망...하다.... 그럼 20000
참고한 블로그
https://bamdule.tistory.com/51
https://starkying.tistory.com/entry/Transactional%EC%9D%98-noRollbackFor-%EC%86%8D%EC%84%B1
'FrameWork > Spring' 카테고리의 다른 글
Jasypt를 이용한 프로퍼티 암호화하기 (0) | 2023.01.30 |
---|---|
JPA IDENTITY 전략에서 JdbcTemplate으로 Batch Insert/Update 하기, 그리고 성능 끌어올리기 (0) | 2022.12.23 |
REST API 버전관리 필요성과 그 방법 (0) | 2022.01.22 |
ElasticSearch 대신 OpenSearch 사용기, 그리고 예제 (3) | 2021.12.17 |
SQL Injection 서블릿 필터를 이용해 처리하기 - 2 (0) | 2021.07.13 |
- Total
- Today
- Yesterday
- 개발중캐시삭제
- 백준퇴사
- 런타임에러
- boj
- 퇴사
- 백준14501
- C++
- 프론트엔드개발자
- 캐시삭제
- 프론트엔드
- script버전
- C# java 차이점
- html꿀팁
- 백준
- html
- 선언적트랜잭션 #noRollbackFor #@Transactional
- c#
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |