개발자 성장 일지

@Transactional 그리고 @Commit

NEWDODORIPYO 2022. 7. 22. 19:52

Spring Boot에서 테스트 코드를 작성하면서 이건 기억하면 좋겠다 싶은 내용이 있어 달려왔습니다 

 

우선 진행하려던 코드는 첨부파일 업데이트 관련 테스트 코드입니다 

@Transactional
@Commit
@Test
public void testUpdateImage(){

    Board board = repository.getById(20);

    board.changeTitle("제목 수정.....20");

    board.clearImages();

    for (int i = 0; i < 3; i++) {

        BoardImage boardImage = BoardImage.builder()
                .fileLink("aaa"+i+"jpg")
                .build();
        board.addImage(boardImage);
    }
    repository.save(board);
}

여기서 체크할 건 어노테이션입니다 

 

✅@Transactional 

@Transactional 은 자주 사용해서 익숙하지만 이참에 다시 한번 정리해 보자면 일련의 작업들을 묶어서 하나의 단위로 처리하고 싶을 때 사용하는 것이 바로 @Transactional  입니다 

 

✅@Commit

그리고 다른 하나인 @Commit ...git할때 많이 보던 Commit 여기서도 볼 줄이야 이 녀석을 어디에 사용될까요? 바로 

Test 환경에서 종종 사용됩니다.

@Test 가 있으면 Spring 은 이 코드는 테스트 코드구나~ 롤백해버려야지라고 생각하기 때문에 테스트는 진행되지만 DB에 실질적인 반영은 이루어지지 않습니다.

DB에 값을 실질적으로 변화시켜 주기 위해서 사용하는 것이 바로 @Commit입니다.

 

✅그렇다면 여기서 롤백은 왜 일어날까?? 

테스트 메서드에 @Transactional을 사용하면 트랜잭션으로 감싸 지면서 메서드가 종료될 때 자동으로 롤백이 됩니다 

 

다들 JPA 테스트에서 확인해 보시고 즐거운 JPA 시간 보내세요 😉