Presentation Layer
- 외부 세계 요청을 가장 먼저 받는 계층
- 파라미터에 대한 최소한의 검증을 수행한다.
그런데 Presentation Layer 를 검증하려면 Business Layer가 필요하고 → Business Layer는 또 Persistence Layer가 필요하다. 나는 파라미터 검증 하나만 하려 했는데 준비 해야 할 사항이 너무 많아져 버린다.
이때 사용할 수 있는게 바로 Mock(가짜)이다.
Mock
MockMvc
- Mock(가짜) 객체를 사용해 스프링 MVC 동작을 재현할 수 있는 테스트 프레임워크
CQRS
- Command/ Query의 분리 : Command는 CUD , Query는 Read를 의미한다.
- 보통의 경우 Read의 빈도가 훨씬 많다. (90% 이상)
- 그런데 Read에 트래픽이 많이 일어나면 이로 인해 Command가 작동하지 않으면 큰 장애가 발생한다. (반대의 경우도 마찬가지)
- Command와 Query를 분리하여 서로 연관이 없게 하자 → CQRS
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Service
public class ProductService {
@Transactional
public ProductResponse createdProduct(ProductCreateRequest request) {
}
public List<ProductResponse> getProduct() {
}
}
- readOnly를 통해 애플리케이션 단에서 Command와 Query 서비스를 구분할 수 있다.
- DB대한 엔드포인트를 구분할 수 있다.
- 예로 MySql의 경우 Read DB인 슬레이브와, 변경하는 마스터 DB가 나눠져있는데, 이러한 readOnly = true 를 통하여 구분할 수 있게 된다.
- DB 엔드포인트를 구분하면 장애 경계 포인트를 구분하기 쉬어진다.
- 성능상 이점을 가진다.
- JPA의 경우 1차 캐시에 스냅샷을 저장해서 변겅감지를 통해 UPDATE 되는데, readOnly = true 의 경우 스냅샷, 변경감지, 저장 이런 것들을 하지 않아 성능이 향상된다.
- JPA의 경우 1차 캐시에 스냅샷을 저장해서 변겅감지를 통해 UPDATE 되는데, readOnly = true 의 경우 스냅샷, 변경감지, 저장 이런 것들을 하지 않아 성능이 향상된다.
ControllerTest
@WebMvcTest(controllers = ProductController.class)
class OrderControllerTest...
→ Web 즉, Controller 관련 빈들만 주입할 수 있는 가벼운 어노테이션.
@Autowiredprivate MockMvc mockMvc;
@MockBeanprivate ProductService productService;
@Autowiredprivate ObjectMapper objectMapper
- mockito 라이브러리의 인터페이스 Mock
- mokito의 경우 스프릉 테스트에 포함되어 있다.
- Mocking 하고자 하는 객체를 @MockBeanprivate 로 만듬
- @MockBean : 컨테이너에 먹으로 만든 객체를 넣어주는 역할.
- ObjectMapper : 직렬화, 역직렬화를 지원
WebMvcTest
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty
- WebMvcTest 진행중 발생한 오류
→ 이유는 JPA Auditing 기능으로 인해 @SpringBootApplication에 @EnableJPaAuditing을 추가하여 사용하고 있기 때문에 발생하는 에러다. webMvcTest는 web관련 빈들만 주입되기 때문에 EnableJPaAuditing는 주입되지 않아 발생한 오류이다.
해결 방법
** config를 분리
@EnableJpaAuditing
@Configurationpublic
class JpaAuditingConfig {}
이런식으로 분리를 해주면 스프링 부트로 테스트할때는 config가 올라와서 괜찮고, webMvcTest시에는 config를 거지지 않아서 오류가 나지 않은다.
출처 : https://www.inflearn.com/course/practical-testing-실용적인-테스트-가이드
'TDD' 카테고리의 다른 글
Mockito로 Stubbing 하기 (1) | 2024.12.01 |
---|---|
응답 예외처리와 책임 분리 (0) | 2024.11.25 |
레이어드 아키텍처(Layered Architecture) 와 테스트 (0) | 2024.11.18 |
테스트는 [문서]다 (1) | 2024.11.15 |
TDD가 정확히 무엇일까? (0) | 2024.11.11 |