[워밍업 클럽 4기 - 백엔드] 4주차 발자국
[인프런 워밍업 클럽 스터디 4기 - 백엔드]강의 출처 :Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드4주차 발자국 강의 수강학습 내용 요약Spring & JPA 기반 테스트 : Presentation Layer 테스트(@WebMvcTest, Mock와 Mockito, @MockBean, @RestControllerAdvice, @ExceptionHandler, Spring Bean Validation)Mock을 마주하는 자세 : Mockito로 Stubbing하기, Test Double(Dummy, Fake, Stub-상태검증, Spy, Mock-행위 검증), 순수 Mockito로 검증하기(@Mock, @Spy, InjectMocks), BDDMockito, Classicist VS Mockist더 나은 테스트를 작성하기 위한 구체적 조언 : 한 문단에 한 주제, 완벽하게 제어하기, 테스트 환경의 독립성 보장, 한 눈에 들어오는 Test Fixture 구성(@BeforeAll, @BeforeEach, setUp), Text Fixture 클렌징(deleteAllInBatch, deleteAll), @DynamicTest, 환경 통합하기, private 메서드 테스트 x, 테스트에만 필요한 메서드도 가능함Appendix : 학습 테스트, Spring REST Docs(REST Docs, Swagger, AsciiDoc)Outro : 테스트를 작성하는 마음가짐(시간, 충분한 연습, 테스트 케이스에 대해 생각해보기) 4주차 회고 이번 주는 드디어 테스트 작성 강의를 완강한 주였습니다. Presentation Layer 테스트부터 Mockito를 활용한 테스트 더블까지 다양한 내용을 배우면서, 평소 개념만 어렴풋이 알고 있던 Mock 객체들을 제대로 배울 수 있어서 정말 좋았습니다. 특히 Spring Bean Validation이나 MockMVC 등을 실제로 사용하며 학습하니, 이론만 공부할 때는 애매했던 부분들도 확실히 이해가 되어서 뿌듯했습니다. 또한, 테스트 코드를 작성하면서 자연스럽게 코드 자체의 가독성이나 명확성을 고민하게 되어, 코드 작성뿐 아니라 글쓰기에 대해서도 많이 배울 수 있었습니다.지난 금요일에는 2차 중간 점검 라이브도 진행되었는데, 다른 분들의 Q&A를 들으면서 같이 공부도 되고 다양한 정보도 얻을 수 있어 좋았고, 코드 리뷰를 통해서 다른 분들의 코드를 내 코드와 비교해보고 고칠 점이나 배울 점을 정말 많이 느낄 수 있었습니다. 직접 코드 리뷰를 신청하지는 못했지만, 그럼에도 함께 리뷰하는 것만으로도 여러가지 좋은 아이디어를 얻을 수 있는 시간이었습니다!스스로 칭찬할 점은 이번 주 강의 수강과 미션을 미루지 않고 당일에 잘 해냈다는 점과, 4주간 꾸준히 노력하며 스터디를 무사히 완주했다는 점입니다. 처음에는 제가 잘 따라갈 수 있을 지 조금 걱정되긴 했지만, 포기하지 않고 뭔가를 꾸준히 해내고 성취했다는 사실이 정말 기쁘고 뿌듯했습니다. 아쉬운 점은 스터디를 하면서 좀 더 적극적으로 참여했더라면 좋았을 것 같다는 생각이 듭니다. 특히 코드 리뷰 신청 같은 기회들을 더 적극적으로 활용하지 못한 것이 아쉽습니다. 스터디를 마치면서 돌이켜보면, 그동안 뭔가를 해야 한다고 생각하면서도 자꾸 미루고 시작조차 하지 못하던 나 자신에게 변화를 줄 수 있는 좋은 계기가 된 것 같습니다. 스터디를 통해 클린 코드와 테스트 코드에 대해서도 많이 배웠고, 무엇보다 꾸준히 무언가를 해나가는 습관 또한 형성하게 되어 좋았습니다. 또한, 다른 분들의 발자국을 보며 여러 가지 다양한 생각을 접할 수 있어서 즐겁고 유익했습니다. 이번 스터디를 통해 얻은 것을 앞으로 실제 프로젝트에서도 적극적으로 적용하며 더 성장하고 싶습니다. 미션미션 해결 과정 미션 5 (Day16) : 이번 미션에서는 Layered Architecture의 각 레이어가 어떤 책임을 가지는지 스스로 정리해보았습니다. Controller, Service, Repository 각각의 역할과 테스트 방법을 실제 사용 흐름을 떠올리며 정리했고, MockMvc, 단위 테스트, 통합 테스트가 어느 레이어와 어울리는지도 고민하며 정리했습니다. 단순히 암기하는 게 아니라, 내가 다른 사람에게 직접 설명하듯이 이해 중심으로 써보려고 노력했습니다.미션 6 (Day18) : 이번 미션에서는 Mockito의 주요 어노테이션인 @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 각각의 특징과 차이를 정리해보았습니다. 스프링 환경 여부나 진짜 객체인지 여부, 주입 방식 등 조건에 따라 어떤 상황에서 어떤 어노테이션을 써야 할지 더 정확하게 구분할 수 있게 되었고, 지금까지 흐릿했던 개념들이 많이 정리되었습니다.또 테스트 흐름을 명확히 하려고 각 테스트 항목을 @BeforeEach, given절, when절 구조에 맞게 나누어 배치해봤습니다. 예를 들어 댓글 테스트에서는 공통적으로 필요한 사용자와 게시물 생성을 @BeforeEach에 미리 두고, 테스트마다 필요한 사전 작업은 given에, 핵심 동작은 when에 넣어서 흐름을 더 읽기 쉽게 구성했습니다. 회고이번 주 미션을 하면서 테스트 코드가 단순히 결과를 확인하는 도구가 아니라, 기능을 이해하고 구조를 설계하는 데 꼭 필요한 도구라는 것을 다시 한 번 느꼈습니다. 특히 레이어별 역할을 직접 정리하면서, 내가 작성하는 코드가 어떤 위치에서 어떤 책임을 가져야 하는지 더 명확하게 구분할 수 있었고, 앞으로 코드 작성 시에도 이런 기준을 계속 의식하게 될 것 같습니다.Mockito 어노테이션도 이번 기회에 비교해 정리하면서 그동안 헷갈렸던 부분들이 한 번에 정리되었고, 테스트 흐름을 given-when-then 구조로 나누어 작성해보면서 테스트 코드 자체가 문서처럼 읽히게 만드는 것도 중요하다는 점을 알게 되었습니다. 처음에는 주석으로만 흐름을 표시했던 코드들을 어떻게 정리할지 막막했지만, 테스트의 목적에 집중하며 구조를 잡아가는 과정이 점점 익숙해졌고, 그 안에서 테스트가 곧 설계와 연결된다는 감각도 생겼습니다.그동안 미션을 진행하며 매번 배운 내용을 복습하고, 개념을 내 언어로 정리해보는 과정 자체가 학습에 큰 도움이 되었고, 직접 코드를 작성하고 흐름을 따라가며 '이제는 진짜 이해했다'는 자신감도 생겼습니다. 앞으로도 기능 구현과 테스트를 함께 이어가며, 테스트를 설계의 나침반처럼 활용할 수 있도록 꾸준히 연습하고 습관을 쌓아가고 싶습니다!!