🎁 모든 강의 30% + 무료 강의 선물🎁

인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 3주차 발자국

인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 3주차 발자국

image

image

Readable Code: 읽기 좋은 코드를 작성하는 사고법

Practical Testing: 실용적인 테스트 가이드

강의와 함께한 인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 (Java, Spring Boot)

3주차 발자국 입니다.


학습 내용 요약

이번 주에는 Spring & JPA 환경에 계층형 아키텍처(Layered Architecture)테스트 기법(통합 테스트, MockMvc, JPA 테스트 등)을 학습했습니다.

1⃣ Spring & JPA

  • Spring이 제공하는 IoC/DI 개념과 ORM(JPA, Hibernate) 기반 데이터 접근 방식을 이해했습니다.

  • 엔티티(Entity) 설계를 통해 도메인 모델링을 하고, 리포지토리(Repository) 계층으로 데이터 CRUD를 담당하도록 분리했습니다.

     

2⃣ Layered Architecture

  • Presentation Layer(Controller)

  • Business Layer(Service)

  • Persistence Layer(Repository)

  • 컨트롤러는 요청/응답을 처리하고, 비즈니스 로직은 서비스가 담당하며, 데이터 접근은 리포지토리를 통해 수행합니다.

3⃣ 테스트 코드 작성

  • 단위 테스트: 특정 클래스나 메서드 단위 검증. 예: JUnit + AssertJ 사용

  • 통합 테스트: 스프링 컨텍스트를 로드해 여러 레이어(Controller, Service, Repository)의 협력을 검증.

  • MockMvc를 사용해 테스트하는 방식을 배웠습니다.

4⃣ 유효성 검증(Bean Validation)

  • DTO에서 @NotEmpty, @NotNull, @Positive 등 애노테이션을 사용하여 입력값을 검증하고,

  • RestControllerAdviceBindException 등을 처리하여 예외 상황 시 API 응답을 표준화했습니다.

학습 회고

  • Spring & JPA 학습을 통해, 계층형 아키텍처 전체 흐름을 이해해야 함을 느꼈습니다.

  • 테스트 코드에서, 단위 테스트와 통합 테스트의 경계와 필요성을 체감했습니다.

  • JUnit5 + AssertJ로 간단한 메서드 단위 검증을 할 때는 편리했지만, MockMvc로 검증하거나, @DataJpaTest로 테스트할 때는 더 많은 설정이 필요했습니다. 그만큼 테스트 커버리지가 넓어지며 신뢰도가 높아진다는 장점을 느꼈습니다.

  • ValidationExceptionHandler를 통해 잘못된 입력을 막고, 표준화된 에러 응답을 제공하는 프로세스가 얼마나 중요한지 깨달았습니다.


미션 해결 과정

🎯 스터디카페 이용권 선택 시스템 테스트 미션

미션

스터디카페 이용권 선택 시스템의 테스트 코드를 작성하는 미션.

미션 목표

  • 메시지 출력 테스트

  • 할인 로직 테스트

  • 사물함 선택 테스트

     

해결 과정

  1. OutputHandlerTest

    • 환영 메시지 + 공지사항 “프리미엄 스터디카페” 등의 문구가 제대로 찍히는지 확인.

    • 주문 내역 요약에 “이용 내역”, “이용권”, “사물함”, “총 결제 금액” 같은 키워드가 포함되는지 검증.

  2. StudyCafePassOrderTest

    • 할인율 및 가격 계산이 의도대로 동작하는지 (예: (250,000 + 10,000) - 할인액 25,000 = 235,000) 확인.

    • 사물함이 있는지 없는지에 따라 Optional<LockerPass>가 올바르게 반환되는지 테스트.

  3. StudyCafeSeatPassTest

    • 할인율이 0일 때 할인 금액이 0원인지, 0.1이면 정상 할인액이 계산되는지.

    • 시간권(HOURLY)cannotUseLocker() == true, 고정석(FIXED)false인지 등을 테스트로 보장.

       

image

회고

도메인 로직이 잘 분리되어 있어 테스트 작성이 수월했습니다. 만약 복잡한 코드가 여기저기 있었다면, 테스트도 훨씬 어렵고 중복될 뻔했습니다. 또한 예외 처리 부분에 대한 테스트 코드의 필요성도 느껴졌습니다. 예외 상황에 대한 흐름을 명확하게 검증하고, 안정적인 동작을 보장하기 위해서는 예외 처리에 대한 테스트도 함께 구성되어야 한다고 생각했습니다.

🔗 테스트 미션 깃허브 링크


회고

스스로 칭찬하고 싶은 점

  • 도메인 흐름 파악: Controller → Service → Repository 순으로 데이터가 흐르는 구조를 더욱 제대로 이해하게 되었습니다.

     

  • 다양한 스프링 테스트 어노테이션(WebMvcTest, SpringBootTest, DataJpaTest 등)을 직접 적용하며, 각 용도에 맞게 테스트를 구분해본 경험이 유익했습니다.

아쉬웠던 점 & 보완할 점

  • 테스트 격리: 통합 테스트 시 상태를 초기화하는 과정이 번거로웠고, 테스트 순서에 따라 의존성이 생기지 않도록 더 철저히 관리해야 함을 느꼈습니다.

  • 테스트 시나리오 다양성 부족: 대부분 해피 케이스 위주로 검증한 감이 있어, 더욱 폭넓은 예외 상황에 대한 시나리오를 추가 작성하면 안정성이 높아질 것 같습니다.

다음 주 학습 목표

  1. Mock과 Test Double: Mock과

    Test Double 개념을 학습하고, 적절히 사용해 볼 예정입니다.

  2. 테스트 환경 독립성:

    테스트 시 독립적인 환경을 유지하는 방법을 살펴볼 예정입니다.

  3. 테스트 개선 기법:

    조금 더 간결하고 가독성 높은 테스트 작성을 시도해 볼 계획입니다.

이번 주에는 Spring & JPA 환경에서의 테스트 코드 작성을 중점적으로 경험 했습니다. 이를 통해 서비스가 단계적으로 확장되더라도, 테스트 코드가 안정적인 작동을 보장할 수 있다는 점을 다시금 깨달았습니다. 앞으로도 테스트 우선 방식으로 새로운 기능이나 리팩토링을 진행해, 안전하고 효율적인 협업 환경을 유지해 나가겠습니다.
감사합니다!

댓글을 작성해보세요.


채널톡 아이콘