Layered Architecture 구조의 레이어별 테스트 작성법을 알아보았습니다.
레이어별로 1) 어떤 특징이 있고, 2) 어떻게 테스트를 하면 좋을지, 자기만의 언어로 다시 한번 정리해 볼까요?
Persistence Layer
persist라는 뜻은 "지속하다"라는 뜻을 갖고 있다
프로그램에서 데이터의 persistence는 영속성을 뜻하며 프로그램이 종료되더라도 사라지지 않는 데이터의 성질을 의미한다
이 개념을 살려서 JPA에서는 영속성, 영속화라는 특징을 갖고 있고, 편리하게 만든 hibernate의 data jpa가 아닌 순수 JPA에서도 EntityManager가 persist해서 엔티티를 데이터베이스에 저장하는 책임을 갖고 있다
말이 길었지만, JDBC를 사용하던, Mybatis를 사용하던, JPA를 사용하던, 이 Persistence Layer의 책임은 데이터베이스에 데이터가 잘 저장되고, 읽어올 수 있고, 수정할 수 있고, 삭제할 수 있는 것이다
그래서 테스트에 비즈니스 로직이 들어가거나, Mapping 과정 등이 있으면 안된다
Persistent Layer만을 테스트하기 위해서 관련 빈들만 띄울 수 있는 @DataJpaTest(JPA), @DataMongoTest(Mongo) 어노테이션이 존재하고, 내부적으로 스프링을 띄워서 스프링 컨텍스트 관련 모든 빈을 띄워서 사용하는 @SpringBootTest를 사용할 수도 있다
다만, SpringBootTest는 @Transactional 어노테이션이 붙어있지 않다.
@DataJpa 내부에는 @Transactional이 존재하고, @DataMongoTest에서 트랜잭션을 사용하고 싶다면 @ImportAutoConfiguration(TransactionAutoConfiguration.class)를 같이 써주면 된다
Business Layer
"개발자는 비즈니스의 문제를 코드로 풀어내는 직군이다"라는 말이 있듯, Persistent레이어와 맞물려서 상위 레이어에서 애플리케이션에 녹아있는 비즈니스 코드에 대해서 테스트를 하는 계층이다
이 영역에서 중요시하는 포인트들은 다음과 같다(개인적 생각)
1. 도메인이 녹아있는 코드를 수행할때 트랜잭션 처리가 잘 되는가?(물리-논리 트랜잭션 묶음. 전파 등 원자성 ACID)
2. 개발자가 만들어놓은 비즈니스 예외를 특정 상황에 던지는가?
3. 서비스의 클래스의 정상 동작(매핑과정 등)
이 과정들을 검증하기 위해서, 주요 관심사가 아니면서 이미 persistence layer에서 검증된 repository의 행위는 Mocking을 하는 경우도 있다. 실제 행위를 검증하기 위해서는 Spy로 실제 객체로 테스트하기도 한다
또한 주요 관심사가 아닌 외부시스템과의 연동도 실제호출은 리소스관점에서 비싸고, 시간도 잡아먹는 것이기때문에 결과를 Stubbing해서 테스트를 한다
이 Business Layer를 테스트할때는 스프링 애플리케이션이 필요하기 때문에 @SpringBootTest를 선언한다
또한 테스트간 순서나 의존이 생기면 안되기때문에 @BeforeEach, @BeforeAll, @AfterEach, @AfterAll 등을 사용해서 data cleansing 작업도 필요하다
Persentation Layer
표현(응용) 계층으로서, Contoller로 들어오는 Client의 요청을 받아서 검증을 거치고, Service를 호출해서 비즈니스 로직을 잘 수행하는지를 테스트 하는 영역이다
이 영역에서 테스트를 하는 방법은 되게 다양한데, 대표적으로 mockMVC를 활용한 SliceTest가 있다
또한 실제 E2E(End-To-End) 테스트를 할 시에는 RestAssured를 사용하는 방법이 있다
비동기(Reactive) 환경을 테스트할때는 WebTestClient를 사용한다고 알고있다
테스트에 순서를 줘서 진행하는 시나리오 테스트도 수행이 이루어질 수 있는 영역이다
요청객체와 응답객체를 만들고, 관련 동작에 필요한 Service는 MockBean으로 만들어서, 컨트롤러의 동작을 검증한다
스프링을 띄우는 비용이 비싸기 때문에 통합환경을 만들어서 테스트를 위한 스프링서버를 최소한으로 띄우기도 한다
테스트가 수행된 후, 프론트개발자와의 소통을 위해 RestDocs 라이브러리 등을 사용할 수도 있다
- 그림 출처
'Study > 인프런 스터디' 카테고리의 다른 글
3주차 회고 발자국 🐾 (0) | 2024.10.23 |
---|---|
2주차 회고 발자국 🐾 (2) | 2024.10.13 |
1주차 회고 발자국 🐾 (6) | 2024.10.06 |
댓글