[Practical Testing: 실용적인 테스트 가이드]
섹션 6. Spring & JPA 기반 테스트
Spring MVC 기반에서 가장 많이 사용되는 아키텍처
사용자의 요청이 왔을 때 각 레이어 별로 역할을 준다.
관심사를 분리해서 책임을 나누고 유지보수하기 용이하게 만든다.
프론트에서 Vue.js는 프레임워크, React는 라이브러리라고 말한다.
❓ 무슨 차이로 구분해야 하나?
❗ 라이브러리는 내 코드가 주체가 된다. 필요한 기능이 있다면 외부(라이브러리)에서 끌어와서 사용하게 된다.
프레임워크는 이미 갖춰진 동작을 할 수 있는 환경들이 구성되어있다. 내 코드가 수동적으로 프레임 안에 들어가서 역할을 한다.
스프링 같은 경우는 프레임워크로써 이미 갖춰진 것들, 제공하고 있는 환경들이 있고 그거에 맞춰서 코드를 작성해서 끼워 넣으면 원하는 대로 동작을 하게 구조다.
객체 지향(Object-Oriented)와 관계형 DB(Relational DB) 간에 패러다임이 다르다.
객체 기반으로 코드를 짜고 데이터를 관계형 DB에 저장하려니까 이 객체 기반의 어떤 패러다임은 관계형 DB 패러다임에 들어가지 않는다. 데이터베이스는 테이블 기반의 설계고, 우리는 객체의 협력에 대한 설계를 한다. 그래서 객체 지향으로 코드를 짜놓고 데이터베이스에 넣을 때는 그 객체를 하나하나 필드별로 분리해서 맵핑을 하는 작업이 필요했다.
1. @SpringBootTest
테스트를 실행할 때 Spring 서버를 띄워서 테스트를 할 수 있게 된다.
2. @DataJpaTest
JPA 관련된 빈들만 주입을 해줘서 Spring 서버를 띄우고 테스트
@SpringBootTest보다 가볍고 속도가 빠르다.
하지만 강사님은 @DataJpaTest보다 @SpringBootTest을 더 선호한다고 하신다.
@DataJpaTest에는 트렌젝션이기 때문에 실패 시 자동으로 롤백이 되기 대문이다.
단위 테스트에서 넘어와서 스프링 환경에서의 통합 테스트를 스프링 서버를 띄워서 한다. 하지만 레이어별로 끊어서 봤을 때는 persistence layer는 데이터베이스에 엑세스 하는 계층이다 보니 기능 단위로 보자면 단위 테스트 성격을 갖고 있다.
Persistence Layer와 Business Layer를 통합하여 테스트
📑 출처