Dandy Now!
  • [Spring Boot]점프 투 스프링부트 실습 중 h2 db에 insert가 되지 않는 현상
    2023년 07월 31일 13시 53분 38초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    점프 투 스프링부트 실습을 진행하고 있습니다. 실습 프로젝트를 깃허브를 통해 관리하고 있는데요, 데스크톱에서 작업하던 프로젝트를 노트북에서 계속 진행하려고 환경 설정을 새롭게 하고 있었습니다. 그런데 db에 insert가 되지 않는 문제로 인해 애를 먹었습니다.

    db에 insert 시도는 JUnit 테스트를 이용해서 진행하였습니다. 해당 실습 내용은 "점프 투 스프링부트"의 2-05 레포지터리(https://wikidocs.net/160890)입니다.

    문제의 원인은 @Transactional 때문이었습니다. 해당 어노테이션을 주석 처리하니 데이터가 정상적으로 insert가 잘되었습니다. JUnit 테스트가 성공인데 데이터는 들어가지 않고 아주 애를 먹었었는데 이 어노테이션이 롤백을 시킨 것이 아닐까 추축이 되었습니다.

     

    @Transactional // 롤백 수행
    @Test
    void testJpa() {        
        Question q1 = new Question();
        q1.setSubject("sbb가 무엇인가요?");
        q1.setContent("sbb에 대해서 알고 싶습니다.");
        q1.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q1);  // 첫번째 질문 저장
    
        Question q2 = new Question();
        q2.setSubject("스프링부트 모델 질문입니다.");
        q2.setContent("id는 자동으로 생성되나요?");
        q2.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q2);  // 두번째 질문 저장

    위 코드를 JUnit으로 실행 후 DB를 조회하면 [그림 1]과 같이 데이터가 추가되지 않을 것을 확인할 수 있습니다(ID 1, 5, 6은 기존에 등록되어 있던 데이터).

     

    [그림 1] @Transactional 롤백으로 인해 데이터가 추가 되지 않음

     

    @Transactional
    @Rollback(value = false) // 추가
    @Test
    void testJpa() {        
        Question q1 = new Question();
        q1.setSubject("sbb가 무엇인가요?");
        q1.setContent("sbb에 대해서 알고 싶습니다.");
        q1.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q1);  // 첫번째 질문 저장
    
        Question q2 = new Question();
        q2.setSubject("스프링부트 모델 질문입니다.");
        q2.setContent("id는 자동으로 생성되나요?");
        q2.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q2);  // 두번째 질문 저장

    위 코드와 같이 @Rollback(value = false) 추가 후 @Transactional을 주석 처리하지 않아도 [그림 2]와 같이 데이터가 추가되었습니다. 

     

    [그림 2] ID 9, 10이 추가 되었음

     

    참고한 내용

    https://ugo04.tistory.com/126

     

    spring-boot JUnit Test시 유의 할 점

    1. Junit 5 에서의 예외상황 Test 테스트 코드 작성시에 예외 상황을 테스트할 때 Junit 4 까지는 해당 테스트의 @Test에 속성으로 excepted=예외클래스이름.class 로 지정하여 해당 예외를 예상하는데 사용

    ugo04.tistory.com

     

    728x90
    반응형
    댓글