[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 처리

sas-study.tistory.com/233

 

[Spring] @Transactional 어노테이션 사용 및 예제!

트랜잭션 - 비즈니스로직에서 쪼개질 수 없는 하나의 단위작업 - 한 번에 이루어지는 작업의 단위 - 알아두면 좋은 ACID 원칙 원자성(Atomicity) 하나의 트랜잭션은 모두 하나의 단위로 처리해야 한��

sas-study.tistory.com

 

 

Reference

- coding-factory.tistory.com/226

- sas-study.tistory.com/233