본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.
이번에는 BookRepository 테스트를 위한 테스트 코드를 작성해보자.
도메인 폴더에 만들어 두었던 BookRepository.java
에 다음의 코드를 작성하자.
BookRepository.java
package site.metacoding.junitproject.domain;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BookRepository extends JpaRepository<Book, Long> {
}
이제 기본적인 것들을 테스트 해보아야한다. 기본적인 것이라함은 서비스에 있어서 필수적인 등록, 조회, 수정, 삭제 (CRUD) 이다.
그런데 일단 테스트는 어떤 순서로 이루어져야할까?
스프링에는 웹 계층이 존재하는데 이는
Web(Controller) Layer
, Service Layer
, Repository Layer
이다.
여기서 잠깐 짚고 넘어가자.
: 흔히 사용하는 컨트롤러(@Controller
) 와 JSP 등의 뷰 템플릿 영역. 이외에도 필터(@Filter
), 인터셉터 등 외부 요청과 응답에 대한 전반적인 것들을 처리하는 계층이다.
: @Service
에 사용되는 서비스 영역. 일반적으로 Controller와 DAO의 중간 영역. @Transactional
이 사용되어야 하는 영역이기도 하다.
: Database 와 같이 데이터 저장소에 접근하는 영역. DAO라고 이해하면 쉽다.
위의 계층 구조 기반을 통해 테스트를 진행하려고 한다면 Repository
-> Service
-> Controller
순으로 진행하는 것이 좋다.
Repository
테스트를 통해 DB쪽에 저장이 잘 되는지 (쿼리가 잘 날아가는지) Service
테스트를 통해 기능들이 트랜잭션을 거쳐 잘 실행되는지, Controller
테스트를 통해 클라이언트와 요청을 주고 받으며 이를 잘 처리할 수 있는지 (null 처리 등) 처럼 각 영역에 해당하는 테스트를 생성하고 진행하는 것이 핵심이라고 할 수 있다.
서론이 길었다. BookRepository
테스트를 구현해보자. test 폴더 하위에 domain 폴더에 만들어두었던 BookRepositoryTest.java
를 열어보자.
BookRepositoryTest.java
package site.metacoding.junitproject.domain;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@DataJpaTest // 0.
public class BookRepositoryTest {
// 1. 책 등록
// 2. 책 목록 보기
// 3. 책 한건 보기
// 4. 책 수정
// 5. 책 삭제
}
💡
DataJpaTest
어노테이션
스프링 부트는 테스트를 실행하지 않는다. 테스트는 테스트 환경에서 실행될 뿐이다. 이 때, 테스트 환경에서Controller
,Service
,Repository
를 메모리에 모두 띄워서 테스트하는 것을 통합 테스트라고 한다. 그러나 우리는 지금 이 세 영역을 모두 띄울 필요는 없다.
다시 말해, Repository(DB)
만 부분적으로 테스트하려고 할 때, DataJpaTest
는 현재 DB와 관련된 컴포넌트들만 메모리에 로드 시켜준다. 즉, Controller
, Service
는 메모리에 뜨지 않는다는 얘기다.
간단하게 구현만 하고 print 문을 통해 테스트 해보자.
BookRepositoryTest.java
package site.metacoding.junitproject.domain;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@DataJpaTest
public class BookRepositoryTest {
@Autowired
private BookRepository bookRepository;
// 1. 책 등록
@Test
public void 책등록_test() {
System.out.println("책등록_test 실행");
}
// 2. 책 목록 보기
// 3. 책 한건 보기
// 4. 책 수정
// 5. 책 삭제
}
@Autowired
: 스프링이 관리하는 빈(Bean)을 주입받기 위해 사용하는 어노테이션 (DI). 당연히 bookRepository
를 테스트 해야 하기 때문에 bookRepository
를 주입해주는 것이다.
@Test
: 테스트를 실행시킬 수 있는 어노테이션
이제 테스트를 진행시키기 위해 클래스 옆에 세모버튼을 눌러보자.
테스트 성공.
디버그 콘솔창을 통해 우리가 입력한 "책등록_test 실행" 에 대한 로그도 볼 수 있다.