목차

    개요

    Spring Boot를 사용하여 프로젝트 구현 때, DB와 관련된 테스트를 진행하기 위한 방법을 연습하고자 했습니다. 분명 테스트 진행 후 롤백시켜서 DB에 영향을 안끼치는 무언가가 있었다는 점을 알고 있었지만 기억이 나지 않아 다시 공부하고 또 찾을 때를 대비해 기록을 남겨 놓고자 합니다.

     

    @DataJPATest

    분명 테스트 진행 후 롤백시켜서 DB에 영향을 안끼치는 무언가를 잊어먹었던 그 무언가는 @DataJPATest입니다. @DataJPATest는 우선 기본적으로 메모리 DB를 사용하도록 되어 있고 @Transactional이 걸려있기에 테스트 이후 롤백되어 DB에 영향을 안미치도록 되어있습니다.

    또한 만약 실제 DB에서의 테스트를 원한다면 설정을 통해 실제 DB 환경에서의 테스트도 가능하다고 합니다.

     

    실습

    실습은 간단하게 Member 클래스를 생성한 후 Member 클래스를 생성하고 조회하는 과정을 테스트해보는 것으로 진행했습니다.

     

    우선 Member 클래스를 생성해 Entity를 만들었습니다.

    @Entity
    @Getter
    @NoArgsConstructor
    public class Member {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @Column(nullable = false)
        private String name;
        @Column(nullable = false)
        private String email;
        @Column(nullable = false)
        private String password;
    
        @Builder
        public Member(String name, String email, String password) {
            this.name = name;
            this.email = email;
            this.password = password;
        }
    
    }

     

    이후 JpaRepository를 상속한 MemberRepository를 생성하여 CRUD가 가능하도록 만들었습니다.

    public interface MemberRepository extends JpaRepository<Member, Long> {
    }

     

    마지막으로 @DataJpaTest를 이용한 테스트를 생성한 후 저장 테스트와 조회 테스트를 진행했습니다.

    @DataJpaTest
    class MemberRepositoryTest {
    
        @Autowired
        private MemberRepository memberRepository;
    
        @Test
        @DisplayName("멤버 DB 저장 테스트")
        void saveMember() {
            Member member = Member.builder()
                    .email("taehee@tistory.com")
                    .name("taehee")
                    .password("1234")
                    .build();
    
            Member savedMember = memberRepository.save(member);
    
            assertThat(member).isSameAs(savedMember);
        }
    
        @Test
        @DisplayName("멤버 DB 조회 테스트")
        void findMember() {
            Member member = Member.builder()
                    .email("taehee@tistory.com")
                    .name("taehee")
                    .password("1234")
                    .build();
    
            Member savedMember = memberRepository.save(member);
    
            Member findMember = memberRepository.findById(member.getId()).orElseThrow(() -> new IllegalArgumentException("Member Not Found, memberId: " + savedMember.getId()));
    
            assertThat(findMember).isSameAs(savedMember);
        }
    
    }

     

    마치며

    정말 간단한 테스트였고 @DataJpaTest를 활용해본다 정도였습니다. 실제 서비스 구현할 때 발생하는 Join이라든가 복잡한 Query로 생성된 결과물을 테스트하는 방법을 실험해봐야 조금 더 감이 잡힐 것 같습니다. 또한 찾아보니 Embedded MongoDB Database라는 것도 있어서 MongoDB를 사용하는 유저에게 유닛 테스트를 위한 인메모리 MongoDB를 지원하는 것으로 보였습니다.

    그리고 Spring Testing Document를 보니 굉장히 뭐가 많던데 하나씩 공부를 해봐야 할 것 같습니다.

     

     

    Reference

    https://dublin-java.tistory.com/49

    https://jiminidaddy.github.io/dev/2021/05/20/dev-spring-%EB%8B%A8%EC%9C%84%ED%85%8C%EC%8A%A4%ED%8A%B8-Repository/

    https://cobbybb.tistory.com/23

    https://0soo.tistory.com/40#Entity%-C%--Repository

    https://docs.spring.io/spring-boot/docs/1.4.2.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test

    https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTest.html