[Spring] @Transactional
2020. 10. 10. 03:45ㆍ웹개발/Spring
Transaction 정의
º 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산
Transaction 성질
1. Atomicity(원자성)
º 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 한다. (모두 성공 또는 모두 실패)
2. Consistency(일관성)
º 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
3. Isolation(독립성)
º 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.
º 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
4. Durablility(영속성)
º 성공적으로 완료된 트랜잭션의 결과는 시스템이 이상있더라도 영구적으로 반영되어야 한다.
Transactional 예시코드
(1) Token값 오류
@DisplayName("인증 메일 확인 - 입력값 정상")
@Test
void checkEmailToken() throws Exception {
Account account = Account.builder()
.email("test@email.com")
.password("12345678")
.nickname("keesun")
.build();
Account newAccount = accountRepository.save(account);
newAccount.generateEmailCheckToken(); //<- token 생성
mockMvc.perform(get("/check-email-token")
.param("token",newAccount.getEmailCheckToken()) //<- @Transactional 없을시 token값이 저장이 안됨(null로 반환)
.param("email",newAccount.getEmail()))
.andExpect(status().isOk())
.andExpect(model().attributeDoesNotExist("error"))
.andExpect(model().attributeExists("nickname"))
.andExpect(model().attributeExists("numberOfUser"))
.andExpect(view().name("account/checked-email"))
.andExpect(authenticated().withUsername("keesun")); //시큐리티 인증
}
(2) 실제 DB Transaction 처리
Reference