Day16 미션
Layered Architecture 구조의 레이어별 테스트 작성법을 알아보았습니다.
레이어별로
1) 어떤 특징이 있고,
2) 어떻게 테스트를 하면 좋을지, 자기만의 언어로 다시 한번 정리해 볼까요?
1) 레이어별 특징 정리
- Persistence Layer
- 데이터베이스 및 외부 저장소와 상호작용하며, 데이터를 저장, 로드하는 계층
- 비즈니스 가공 로직은 Business Layer에서
- 데이터 CRUD에 집중
- Business Layer
- 비즈니스 로직을 처리하는 계층
- 도메인 모델을 조작하고, 검증하는 핵심 로직을 처리
- 트랜잭션을 보장하고, 관리한다.
- Persistence Layer와 상호작용하여 비즈니스 로직을 실행
- Presentation Layer
- 사용자와 소프트웨어의 첫 접점, UI와 요청 처리를 담당하는 계층
- 사용자와 상호작용하고, 요청을 Business Layer로 전달하며, 결과를 사용자에게 보여준다.
- 엔드포인트를 정의
- 요청 데이터 검증을 하며, Controller와 DTO를 포함
2) 레이어별 테스트 작성법
- Persistence Layer 테스트 작성
- 테스트 작성법
- 데이터 접근에 대한 테스트를 진행 (데이터 무결성, 데이터 영속성을 테스트, CRUD)
- 통합 테스트이지만 단위 테스트의 성격을 지님
- @DataJpaTest를 통해서 Repository와 같은 데이터 관련 빈들만 주입할 수 있다. 그로 인해서, 경량화를 할수 있지만, 전체 시스템의 통합 테스트가 아닌, 단위 테스트 경향을 띄기에 서비스가 온전하다고 말할 수 없다.
- @SpringBootTest + @Transactional을 조합해서 @DataJpaTest 대신쓸 수 있다.
- 테스트 작성법
- Business Layer 테스트 작성
- 테스트 작성법
- 비즈니스 로직이 정상적으로 작동하는지 테스트
- 해피 케이스보다, 예외 케이스에 집중해야 한다.
- 도메인 가공이 들어가는 로직으로, 도메인 객체를 만드는 데 다양한 방법이 있다.
- new 생성자
- Builder 패턴
- 정적 of 메서드(record에서도 사용)
- Factory 클래스
- ModelMapper 라이브러리
- Repository 등 외부 의존성은 Mock 처리해서 로직 검증에만 집중할 수 있다.
- @Transactional vs deletaAll vs deleteAllInBatch데이터 초기화
- tearDown(after)절에서 삭제 순서는 외래 키 제약에 의해 영향을 받을 수 있다.
- @Transactional : Service 단에서 Transactional을 안 걸어놨어도 적용이 돼 사이드 이펙트가 발생할수 있다.
- deleteAll : 조회해서 1개씩 삭제하므로 외래키 제약조건을 어기지 않는다. 다만 단일 쿼리가 여러개 나가기에 시간이 걸린다.
- deleteAllInBatch : 배치 처리를 통해 1번에 삭제하므로, 빨리 끝난다. 단, 순서에 따라 외래키 제약 조건에 걸릴 수도 있다. 관계 repository부터 먼저 삭제 필요
- 테스트 작성법
- Presentation Layer 테스트 작성
- 테스트 작성법
- Controller에서는 요청 파라미터에 대한 검증을 수행
- @WebMvcTest를 통해서 MockMvc를 사용한다.
- MockMvc의 perform 메서드를 사용해서, 사용자 요청을 실행 및 테스트
- 결과값 검증보다는 요청 시 수행 자체에 대한 검증 (요청 흐름)
- HTTP 상태 코드
- Response Type
- response의 필드 값이 존재하는지 정도..?
- 가상의 요청 파라미터에 따른 응답 데이터 예측 정도...?
- 테스트 작성법
[출처]
'인프런 워밍업 클럽 3기 BE 클린코드 & 테스트' 카테고리의 다른 글
[인프런 워밍업 클럽 BE 3기 클린코드 & 테스트] Day18 미션 (0) | 2025.03.28 |
---|---|
[인프런 워밍업 클럽 BE 3기 클린코드 & 테스트] Day4 미션 (3) | 2025.03.07 |
[인프런 워밍업 클럽 BE 3기 클린코드 & 테스트] Day 2 미션 (2) | 2025.03.04 |