본문 바로가기
Back-End/Spring Boot

스프링 DB 접근 기술 - 스프링 통합 테스트

by 달의 조각 2022. 3. 1.
이 글은 김영한 님의 스프링 입문 강의(https://inf.run/hcic)를 수강하며 학습한 내용을 정리한 글입니다.

 

스프링 컨테이너와 DB까지 연결한 통합 테스트

이전에 했던 테스트들은 순수한 자바 코드를 테스트한 것이다
이번 포스트에서는 DB를 스프링 부트가 관여하고 있으므로 이를 고려한다

 

1. DB를 연결한 로직을 테스트하기 위한 테스트 파일 생성

MemberServiceTest 파일을 복사 붙여넣기 하여 MemberServiceIntegrationTest 생성

 

2. 스프링 부트를 통한 테스트

클래스 앞에 어노테이션을 붙여 준다

@SpringBootTest
스프링 컨테이너와 테스트를 함께 실행한다

@Transactional
테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

 

3. 소스 코드 수정

Constructor를 사용하여 Service와 Repository 객체를 넣지 않고 @Autowired를 이용한다

MemoryMemberReposiotory에서 MemberRepository로 변경한다
구현체는 SpringConfig에서 가지고 오게 된다

clearStore()는 @Transactional에 의해 필요가 없어졌다

이외에 불필요한 주석과 테스트 필요가 없어서 작성하지 않은 빈 메서드는 삭제했다

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository; //MemoryMemberRepository에서 변경

//아래 코드 삭제
/*    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    
    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }
*/

 

4. 테스트 실행

🚨 우선 회원가입 메서트를 테스트해 보면 오류가 발생한다
이는 데이터베이스에 Spring이라는 이름이 이미 존재하기 때문(지난 포스팅의 실습 결과)이므로
데이터베이스의 데이터들을 우선 삭제해 준다

(java.lang.IllegalStateException: 이미 존재하는 회원입니다.)

테스트가 한 번 실행하면 테스트하는 데이터가 DB에 저장되고,
이를 다시 테스트 할 때 중복 데이터로 인식하는 문제 발생할 것이다

이를 @AfterEach를 사용하여 테스트하며 저장된 데이터를 삭제하는 소스 코드를 작성해야 할까?

DELETE FROM MEMBER

테스트 실행 시 SpringConfig의 스프링이 실행되고 테스트가 끝나면 내려간다

 

💡 @Transactional

테스트는 반복할 수 있어야 한다

테스트를 실행하면 트랜잭션이 실행되고 데이터가 DB에 저장되는데,
테스트가 끝나면 이를 롤백 해 주어 데이터를 삭제한다

DB에 실제 데이터가 저장되지 않음을 확인할 수 있다

 

단위 테스트: MemberServiceTest과 같은 순수한 자바 코드로 이루어진, 최소 단위의 테스트 - 좋은 테스트 👍

통합 테스트: 스프링 컨테이너, DB 등을 연동한 테스트

댓글