[9팀 권지호]. Chapte,r 3.-.2.. 프론트엔드 테스트. 코드 🦍🧦#3
Open
tomatopickles404 wants to merge 34 commits intohanghae-plus:mainfrom
Open
[9팀 권지호]. Chapte,r 3.-.2.. 프론트엔드 테스트. 코드 🦍🧦#3tomatopickles404 wants to merge 34 commits intohanghae-plus:mainfrom
tomatopickles404 wants to merge 34 commits intohanghae-plus:mainfrom
Conversation
… 추가 - 31일 매월 반복 시 2월은 28일, 4월은 30일에 생성 - 2월 29일 매년 반복 시 윤년이 아닌 해에는 28일에 생성
…ngleEditEvent 함수로 단일 수정 이벤트 생성 - 고유 ID 생성 및 반복 설정 제거 로직 구현 - 매일/매주/매월/매년 반복 일정 단일 수정 지원
…에 매년 반복 시 윤년이 아닌 해는 건너뛰기 - 요구사항: '31일에만 생성', '29일에만 생성' 준수
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
8주차 과제 체크포인트
기본 과제
필수
선택
심화 과제
각 팀원들의 테스트 전략은?
저희팀은 팀원별로 테스트 전략에 대한 의견을 주고 받기 보다는 피그잼을 통해 함께 브레인스토밍하며 전략을 좁혀 나갔습니다.
따라서, 하나의 PR에 테스트 전략을 수립하여 모두 페어코딩을 진행했습니다.
결론적으로 9팀은 심화과제 PR부분과 코드 전략을 함께 작성하여 그 내용이 같습니다.
합의된 테스트 전략과 그 이유는 무엇인가요?
저희 9팀은 TDD 기반으로 반복 일정 기능을 구현하면서 윤년, 월말 날짜 등 다양한 엣지 케이스를 마주할 수 있다고 판단했습니다.
따라서 테스트 전략의 목표를 엣지 케이스를 최소화하는 것으로 잡고, 이를 검증하기 위한 방향을 고민했습니다.
이 과정에서 단순히 “어떻게 테스트할까” 라는 관점에 머무르지 않고,
“어떻게 하면 코드를 테스트하기 좋은 구조로 만들까” 라는 질문에 집중했습니다.
코치님께서도 이 점을 강조해주셨고, 그 조언을 바탕으로 레이어를 먼저 추상화한 뒤,
테스트할 부분과 그렇지 않은 부분을 의도적으로 구분하여 선택적으로 검증하는 전략을 수립했습니다.
아키텍처 정의하기
[기존 구조]
뿐만 아니라 utils 디렉토리는 아래와 같은 서로 다른 역할과 관심사가 혼재하고 있었습니다.
이처럼 역할이 다른 코드들이 한 폴더에 섞여있어 반복 일정 계산 로직을 구별하기 어려웠습니다.
[레이어 도출]

[새로운 레이어 구조]
관심사의 분리와 테스트 용이성이라는 두 가지 키워드로 다음과 같이 레이어를 세분화하고자 했습니다.
1. utils
repeat이라는 기능(feature)단위로 디렉토리를 묶고, 그 안에서 역할을 세분화 했습니다.
2. test
레이어 별 테스트 전략 수립
아키텍처가 명확하게 정의되니 코치님 말씀대로 각 디렉토리의 역할에 맞는 테스트 전략을 구체화 할 수 있었습니다.
반복 일정 생성에서는 기준에 맞는 일정 생성 및 엣지 케이스 판단이 중요합니다. 반면 UI 구현의 비중은 적습니다.
이를 테스트 전략에도 반영했습니다. 일정 생성과 기준에 맞는 일정일지 판단하는 함수의 유닛 테스트의 비중을 높였습니다.
UI 구현을 검증하는 통합 테스트와 e2e테스트는 최소한의 사용성을 보장하는 정도로 최소화했습니다.
저희는 '전략적 선택과 집중' 원칙에 따라 테스트의 종류와 범위를 다음과 같이 결정했습니다.
[Unit Test] - 도메인 로직 (Domain Logic)
[Integration Test] - 계층 간 통합 (Layer Integration)
실제 서버나 fetch 라이브러리를 테스트 하는 것이 아니라, 각 레이어들이 올바르게 통합되어 데이터의 흐름을 잘 처리하는지 확인하는 목적입니다.
[E2E Test] - 사용자 시나리오 (User Scenario)
추가로 작성된 테스트 코드는 어떤 것들이 있나요?
유닛 테스트
1.
actions.spec.tsexpandEventsToNextOccurrencesex)
expandEventsToNextOccurrences윤년 체크getNextDailyOccurrence,getNextWeeklyOccurrence,getNextYearlyOccurrencegenerateInstances2.
helpers.spec.tsgetNextYearlyOccurrence: 2/29 시작, from=평년 → 다음 윤년ex)
getNextYearlyOccurrence가 다음 윤년을 정확히 반환하는지 확인getNextMonthlyOccurrence: 1/31 시작, from=2월 → 3/31getNextWeeklyOccurrence: 수요일 시작, from=다음주 월요일 → 다음 수요일getNextDailyOccurrence: from이 더 뒤면 interval에 맞게 다음 날짜clampEndDate는 더 이른 날짜를 반환해야 한다daysInMonthUTC는 2월 윤년/평년과 30/31일을 정확히 반환해야 한다addMonthsUntilHasDay는 1/31에서 2월을 건너뛰고 3/31을 반환해야 한다통합 테스트
1. 반복 UI 및 표시
ex) 반복 일정 생성 후 캘린더에서 반복일정 아이콘 확인
e2e 테스트
1. 기본 + 반복 아이콘
2. 단일 일정 삭제
ex) 일정 추가 버튼 -> 입력 -> 일정 겹침 경고 -> 반복 일정 등록 완료 -> 일정 삭제 -> 단일 일정 삭제 확인
과제 셀프회고
TDD를 처음으로 접하게 되는 경험이었습니다.
생각보다 기능의 범위를 미리 예측하고 코드를 작성하는 것이 추상적이게 느껴져서 지금까지의 과제 중에 가장 체감 난이도가 높게 느껴졌습니다.
작성하면서도 내가 작성한 테스트가 과연 테스트 커버리지가 유효한가? 촘촘하게 유닛테스트를 만들고 통합에서 작성한 테스트가 과연 시나리오의 신뢰도를 높여주고 있을까? 직접 테스팅 하기 전까지는 스스로 신뢰하지 못하는 과정이었습니다.
기술적 성장
AI 활용
이번 과제는 TDD의 Red-Green-Refactor 과정을 AI와 협업하여 진행했습니다.
주로 사용한 기술은 Cursor와 클로드입니다.
[진행 과정]
적용한 Cursor Rules
📋 테스트 코드 작성 철학 및 가이드라인 (클릭하여 펼치기)
⚡ 테스트 품질 관리 및 중복 방지 규칙 (클릭하여 펼치기)
Testing Code of Conduct
Core Principles
1. No Test Duplication Rule
2. Equivalence Partitioning Rule
3. Boundary Value Analysis Priority
4. Logical Test Grouping
5. Given-When-Then Structure
Implementation Guidelines
Test Organization
Test Naming
Test Structure
Quality Standards
Coverage Requirements
Maintainability
Performance
Code Review Checklist
Before merging any test code, verify:
Examples
✅ Good Test Structure
❌ Bad Test Structure
Enforcement
코드 품질
리팩토링이 필요한 부분
1. 상태 관리 복잡성
[문제점]
추상화를 진행하지 않아 App 컴포넌트가 거대하고, 상태가 너무 많이 존재하고 있습니다.
[개선 방안]
각 상태를 하나의 훅 별로 모듈화하여 단일 책임과 추상화 레이어를 유지합니다.
2. 복잡한 이벤트 생성/수정 로직
[문제점]
[개선]
학습 효과 분석
findBy vs queryBy + waitFor
it('반복일정을 단일 삭제하면 해당 날짜 셀에서만 사라진다') 에서 findBy 메서드와 waitFor + queryBy 사용에 대해 고민했습니다.
[기존 작성]
[개선 방향]
waitFor + queryBy 보다는 findByText를 통해 비동기로 요소를 찾는게 더 가독성에 좋지 않을까? 라는 생각에 리팩토링을 하려고 했습니다.
그러나 지금과 같은 테스트 조건에서는 waitFor + queryByText 을 더 권장한다는 것을 알게 되었습니다.
주요 차이점들
2. 존재하지 않는 요소 처리
따라서 의미상으로도 queryByText가 조금 더 자연스럽습니다.
지금과 같은 예시처럼 두 가지 상태를 동시에 검증할 때
이런 경우 findBy로는 "사라짐"을 자연스럽게 표현하기 어렵습니다.
[결론]
과제 피드백
TDD를 처음 접하더라도 TDD와 Red-Green-Refactor 를 어렵지 않게 적용하며 이해해 볼 수 있는 과제였습니다.
리뷰 받고 싶은 내용
Q1. 팀 과제에 지난 멘토링 시간에 조언해주셨던 부분을 적극적으로 적용해보고자 했습니다.
저희가 적절하게 잘 적용한게 맞을까요? 아쉬운 부분이 있다면 어떤 부분일까요?
Q2. TDD에서 기능의 범위를 미리 예측하고 코드를 작성하는 것이 아직은 추상적이게 느껴집니다.
코치님이 일하고 계신 실무에서는 테스트 코드나 TDD를 어떤 방식으로 활용하고 계신지, 라이브러리나 컨벤션, 프로세스와 같이 실무에서의 실용적인 적용사례에 대해 궁금합니다!