인프런 워밍업 클럽 3기 BE 클린코드 & 테스트

[인프런 워밍업 클럽 BE 3기 클린코드 & 테스트] Day16 미션

taey 2025. 3. 28. 18:50

Day16 미션

Layered Architecture 구조의 레이어별 테스트 작성법을 알아보았습니다.
레이어별로
1) 어떤 특징이 있고,
2) 어떻게 테스트를 하면 좋을지, 자기만의 언어로 다시 한번 정리해 볼까요?

 


1) 레이어별 특징 정리

 

  1. Persistence Layer
    • 데이터베이스 및 외부 저장소와 상호작용하며, 데이터를 저장, 로드하는 계층 
    • 비즈니스 가공 로직은 Business Layer에서
    • 데이터 CRUD에 집중 
  2. Business Layer
    • 비즈니스 로직을 처리하는 계층
    • 도메인 모델을 조작하고, 검증하는 핵심 로직을 처리
    • 트랜잭션을  보장하고, 관리한다.
    • Persistence Layer와 상호작용하여 비즈니스 로직을 실행
  3. Presentation Layer
    • 사용자와 소프트웨어의 첫 접점, UI와 요청 처리를 담당하는 계층
    • 사용자와 상호작용하고, 요청을 Business Layer로 전달하며, 결과를 사용자에게 보여준다.
    • 엔드포인트를  정의
    • 요청 데이터 검증을 하며, Controller와 DTO를 포함

2) 레이어별 테스트 작성법

  1. Persistence Layer 테스트 작성
    • 테스트 작성법
      • 데이터 접근에 대한 테스트를 진행 (데이터 무결성, 데이터  영속성을 테스트,  CRUD)
      •  통합 테스트이지만 단위 테스트의 성격을 지님
      • @DataJpaTest를 통해서 Repository와 같은 데이터 관련 빈들만 주입할 수 있다. 그로 인해서, 경량화를 할수 있지만, 전체 시스템의 통합 테스트가 아닌, 단위 테스트 경향을 띄기에 서비스가 온전하다고 말할 수 없다.
      • @SpringBootTest + @Transactional을 조합해서 @DataJpaTest 대신쓸 수 있다.
  2. Business Layer 테스트 작성
    • 테스트 작성법
      • 비즈니스 로직이 정상적으로 작동하는지 테스트
      • 해피 케이스보다, 예외 케이스에 집중해야 한다.
      • 도메인 가공이 들어가는 로직으로, 도메인 객체를 만드는 데 다양한 방법이 있다.
        • new 생성자
        • Builder 패턴
        • 정적 of 메서드(record에서도 사용)  
        • Factory 클래스
        • ModelMapper 라이브러리
      • Repository 등 외부 의존성은 Mock 처리해서 로직 검증에만 집중할 수 있다.
      1.  
        • @Transactional vs deletaAll vs deleteAllInBatch데이터 초기화
      • tearDown(after)절에서 삭제 순서는 외래 키 제약에 의해 영향을 받을 수 있다.
        • @Transactional : Service 단에서 Transactional을 안 걸어놨어도 적용이 돼 사이드 이펙트가 발생할수 있다.
        • deleteAll : 조회해서 1개씩 삭제하므로 외래키 제약조건을 어기지 않는다. 다만 단일 쿼리가 여러개 나가기에 시간이 걸린다.
        • deleteAllInBatch : 배치 처리를 통해 1번에 삭제하므로, 빨리 끝난다. 단, 순서에 따라 외래키 제약 조건에 걸릴 수도 있다. 관계 repository부터 먼저 삭제 필요
  3. Presentation Layer 테스트 작성
    • 테스트 작성법
      • Controller에서는 요청 파라미터에 대한 검증을 수행 
      • @WebMvcTest를 통해서 MockMvc를 사용한다.  
      • MockMvc의 perform 메서드를 사용해서, 사용자 요청을 실행 및 테스트
      • 결과값 검증보다는 요청 시 수행 자체에 대한 검증 (요청 흐름)
        • HTTP 상태 코드
        • Response Type
        • response의 필드 값이 존재하는지 정도..?
        • 가상의 요청 파라미터에 따른 응답 데이터 예측 정도...? 

 

 

[출처]