[6팀 노유리] Chapter 1-2. AI와 테스트를 활용한 안정적인 기능 개발#103
Open
nohyr wants to merge 12 commits intohanghae-plus:mainfrom
Open
[6팀 노유리] Chapter 1-2. AI와 테스트를 활용한 안정적인 기능 개발#103nohyr wants to merge 12 commits intohanghae-plus:mainfrom
nohyr wants to merge 12 commits intohanghae-plus:mainfrom
Conversation
- CLAUDE.md 프로젝트 가이드 추가 - design.md 설계 문서 추가 - TDD 에이전트 설정 추가 (.claude/agents/) - 코드 리뷰, Git 브랜치 전략, 성능 최적화 가이드 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
- TDD 워크플로우 명세 추가 - API 엔드포인트 명세 추가 - 반복 생성 알고리즘 명세 추가 - 특수 케이스 처리 명세 추가 (31일, 윤년) - 단일/전체 수정 및 삭제 명세 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
- generateRecurringEvents 함수 테스트 추가 - 기본 동작 테스트 (none, repeat.id, 고유 id, 기본 종료일) - 매일 반복 테스트 (2개) - 매주 반복 테스트 (2개) - 매월 반복 테스트 (5개 - 31일, 30일 특수 케이스 포함) - 매년 반복 테스트 (3개 - 윤년 2월 29일 포함) - 에러 처리 테스트 (1개) - isLeapYear 유틸리티 테스트 (4개) 총 21개 테스트 케이스 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
- generateRecurringEvents 메인 함수 구현 - generateDailyDates 매일 반복 날짜 생성 - generateWeeklyDates 매주 반복 날짜 생성 - generateMonthlyDates 매월 반복 날짜 생성 - 31일 특수 케이스: 31일이 있는 달에만 생성 - 30일 특수 케이스: 2월 제외한 모든 달에 생성 - generateYearlyDates 매년 반복 날짜 생성 - 윤년 2월 29일 특수 케이스 처리 - isLeapYear 윤년 판별 함수 구현 - 보조 함수: formatDate, getDaysInMonth 테스트: 21/21 통과 ✅ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
- 반복 UI 활성화 (주석 해제) - Repeat 아이콘 추가 (주간/월간/목록 뷰) - useEventOperations에 generateRecurringEvents 통합 - /api/events-list 엔드포인트 사용 - 서버 코드 수정: 프론트엔드에서 생성한 repeat.id 유지 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
반복 일정에 대한 단일/전체 수정 및 삭제 다이얼로그를 구현하고, 백엔드 API와 통합하여 완전한 반복 일정 관리 기능을 제공합니다. ## 주요 변경사항 ### 1. Import 오류 수정 - useEventForm에서 주석 처리된 setRepeatType, setRepeatInterval, setRepeatEndDate를 활성화 - fetchEvents를 useEventOperations에서 추출하여 사용 ### 2. 반복 일정 수정 다이얼로그 - 사용자가 "이 일정만" 또는 "모든 반복 일정"을 선택할 수 있는 다이얼로그 추가 - "이 일정만" 선택 시: repeat.type을 'none'으로 변경하여 단일 일정으로 전환 - "모든 반복 일정" 선택 시: isEditingAllRepeats 플래그 설정 후 수정 모드로 전환 ### 3. 반복 일정 삭제 다이얼로그 - 사용자가 "이 일정만" 또는 "모든 반복 일정"을 선택할 수 있는 다이얼로그 추가 - "이 일정만" 선택 시: 해당 일정만 삭제 - "모든 반복 일정" 선택 시: /api/recurring-events/:repeatId DELETE 엔드포인트 호출 ### 4. 전체 반복 일정 수정 로직 - addOrUpdateEvent에서 isEditingAllRepeats 플래그 확인 - 플래그가 true이고 repeat.id가 있는 경우, /api/recurring-events/:repeatId PUT 엔드포인트 호출 - 같은 repeat.id를 가진 모든 일정의 공통 속성 업데이트 (title, description, location, category, notificationTime, repeat) - 업데이트 후 fetchEvents()로 일정 목록 새로고침 ### 5. 전체 반복 일정 삭제 로직 - handleDeleteAll에서 /api/recurring-events/:repeatId DELETE 엔드포인트 호출 - 같은 repeat.id를 가진 모든 일정을 서버에서 일괄 삭제 - 삭제 후 fetchEvents()로 일정 목록 새로고침 ### 6. 일정 겹침 다이얼로그 업데이트 - 겹침 경고 다이얼로그의 "계속 진행" 버튼도 isEditingAllRepeats 플래그를 확인하도록 수정 - 전체 수정 시에도 동일한 API 호출 로직 적용 ## 기술적 세부사항 - 서버 API 엔드포인트: - PUT /api/recurring-events/:repeatId - 반복 일정 전체 수정 - DELETE /api/recurring-events/:repeatId - 반복 일정 전체 삭제 - 상태 관리: - isEditingAllRepeats: 전체 반복 일정 수정 여부 추적 - selectedEvent: 다이얼로그에서 선택된 이벤트 저장 - isRepeatEditDialogOpen: 수정 다이얼로그 표시 여부 - isRepeatDeleteDialogOpen: 삭제 다이얼로그 표시 여부 - 에러 처리: - API 호출 실패 시 적절한 에러 메시지 표시 - 성공 시 사용자에게 피드백 제공 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
TypeScript 타입 에러를 수정합니다. ## 문제점 1. RepeatInfo 인터페이스에 id 속성이 누락되어 있음 2. App.tsx에서 RepeatType이 import되지 않음 ## 해결방법 1. RepeatInfo에 `id?: string` 속성 추가 - 반복 일정을 그룹화하기 위해 필요한 속성 - 같은 repeat.id를 가진 일정들이 하나의 반복 시리즈를 구성 2. App.tsx에서 RepeatType import 활성화 - setRepeatType 함수의 타입 지정을 위해 필요 ## 영향 범위 - src/types.ts: RepeatInfo 인터페이스에 id 속성 추가 - src/App.tsx: RepeatType import 주석 해제 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
specs/04-single-all-operations.md의 요구사항을 검증하는 테스트를 작성합니다. ## 테스트 범위 (8개 테스트) ### 단일 수정 (Single Edit) - 2개 - [SE-001] 단일 수정 시 repeat.type을 none으로 변경 - 단일 수정 후 다른 일정은 영향 없음 ### 전체 수정 (All Edit) - 3개 - [AE-001] 같은 repeat.id의 모든 일정 수정 - 전체 수정 후에도 반복 타입 유지 - 다른 repeat.id의 일정은 영향 없음 ### 단일 삭제 (Single Delete) - 1개 - [SD-001] 선택한 일정만 삭제 ### 전체 삭제 (All Delete) - 2개 - [AD-001] 같은 repeat.id의 모든 일정 삭제 - 다른 repeat.id의 일정은 영향 없음 ## 테스트 전략 MSW를 사용하여 API 엔드포인트를 모킹하고 다음을 검증: - PUT /api/events/:id (단일 수정) - PUT /api/recurring-events/:repeatId (전체 수정) - DELETE /api/events/:id (단일 삭제) - DELETE /api/recurring-events/:repeatId (전체 삭제) ## 주요 검증 사항 1. **단일 수정**: repeat.type이 'none'으로 변경되어 반복에서 분리 2. **전체 수정**: 같은 repeat.id의 모든 일정이 동일하게 수정 3. **격리성**: 다른 repeat.id 그룹은 영향 받지 않음 4. **반복 정보 유지**: 전체 수정 시 repeat.type과 repeat.id 유지 ## 테스트 결과 ✅ 8/8 테스트 통과 ✅ 전체 반복 테스트 29/29 통과 (repeatUtils 21 + repeatOperations 8) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
- .claude/agents/에서 문서 파일들을 .claude/docs/로 이동 - agents 폴더는 에이전트 역할 정의만 포함 (1-6번 파일) - docs 폴더에 프로젝트 가이드 문서 분리 - CODE_REVIEW_RULES.md - GIT_BRANCH_STRATEGY.md - PERFORMANCE_OPTIMIZATION.md - README.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
- import 순서 수정 (setupTests를 types보다 먼저) - 미사용 변수 제거 (params) - 미사용 타입 import 제거 (Event) - useNotifications에 useCallback 적용하여 무한 루프 방지 - React Hook exhaustive-deps 경고 해결 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
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.
과제 체크포인트
필수 스펙
기본 과제
공통 제출
기본 과제(Easy)
기본 과제(Hard)
심화 과제
🤖 AI 도구 활용을 개선하기 위해 노력한 점
1. 프로젝트별 맞춤 지침 작성 (
CLAUDE.md)2. TDD 워크플로우 자동화를 위한 Agent 시스템 구축
6개의 전문화된 AI Agent를 설계하여 TDD 사이클을 체계적으로 관리:
각 Agent는 명확한 입력/출력과 책임을 가지며,
.claude/agents/폴더에 markdown 형태로 정의3. 상세한 명세 문서 작성 (
specs/)AI가 정확하게 구현할 수 있도록 명세를 5개 파일로 분리:
00-tdd-workflow.md: TDD 사이클 및 커밋 규칙01-repeat-api-spec.md: API 엔드포인트 명세02-repeat-generation-algorithm.md: 반복 일정 생성 알고리즘03-special-cases.md: 31일 매월 반복, 윤년 2/29 처리 등 엣지 케이스04-single-all-operations.md: 단일/전체 수정 및 삭제 로직각 명세는 Given-When-Then 형식의 예제 포함
4. 컨텍스트 계층화
역할(agents)과 문서(docs)를 분리하여 AI가 필요한 정보를 빠르게 찾을 수 있도록 구조화
5. 구체적이고 단계적인 프롬프트 설계
각 단계마다 역할을 명시하고, 참조할 문서를 지정하여 AI의 혼란 최소화
6. 테스트 파일 난이도별 명명 규칙
파일명에 난이도를 표시하여 AI가 테스트 복잡도를 인지하고 적절한 수준의 테스트 작성
7. 커밋 메시지에 TDD 단계 표시
커밋 히스토리만 봐도 TDD 사이클을 명확하게 추적 가능
과제 셀프회고
회사에서 AI를 적극적으로 활용하라고 했을 때, 필요성을 잘 느끼지 못했을 뿐만 아니라 AI를 어떻게 활용해야 할지 감이 잡히지 않았습니다. AI를 활용하는 방법에 대해서도 따로 공부하지 않았기 때문에 처음에는 어떻게 접근해야 할지 난감했습니다. 과제 내용을 파악하는 데 어려움이 있었고, 에이전트나 오케스트레이터 같은 낯선 용어를 접했을 때는 '과제를 1주일 안에 다 할 수 있을까?' 하는 걱정도 많았습니다. 다행히 참고 자료가 풍부해서 하루 종일 그것만 보며 학습할 수 있었습니다. 또한 회사에서 Claude AI를 사용해 보라고 결제해 주셔서, 그동안 사용해보지 못했던 AI를 이번 기회에 직접 경험할 수 있었습니다.
기술적 성장
1. TDD 실전 적용 경험
학습 내용:
구체적 사례:
isLeapYear유틸리티 필요성을 발견하고 추가2. 복잡한 날짜 로직 구현
학습 내용:
new Date()의 월 인덱스가 0부터 시작하는 것을 고려한 안전한 날짜 계산구현 예시:
3. API 설계 패턴 학습
학습 내용:
/api/events/:id(단일),/api/recurring-events/:repeatId(전체)4. React Hook 최적화
학습 내용:
useCallback으로 함수 메모이제이션하여 불필요한 리렌더링 방지useMemo로 비싼 계산 결과 캐싱개선 사례:
코드 품질
특히 만족스러운 구현
명세 기반 테스트 구조
[SE-001],[AE-001])으로 추적성 확보반복 일정 생성 알고리즘의 확장성
MSW를 활용한 API 모킹
setupMockHandlerCreation,setupMockHandlerUpdating등 헬퍼 함수로 중복 제거리팩토링이 필요한 부분
App.tsx의 컴포넌트 분리
에러 처리 일관성
Result<T, E>타입으로 통일하거나, 전역 에러 핸들러 도입반복 일정 UI 활성화 후 통합 테스트
코드 설계 관련 고민과 결정
고민 1: 단일/전체 수정 시 API 설계
/api/events/:id?mode=single)/api/events/:id,/api/recurring-events/:repeatId)고민 2: repeat.id 생성 시점
고민 3: 반복 일정 데이터 저장 방식
학습 효과 분석
가장 큰 배움이 있었던 부분
AI와의 협업 방법론
TDD의 실용성
명세의 중요성
추가 학습이 필요한 영역
성능 최적화
타입 안전성 강화
as타입 단언 사용접근성 (a11y)
실무 적용 가능성
Agent 기반 TDD 워크플로우
명세 문서 작성 습관
테스트 우선 개발
과제 피드백
과제에서 좋았던 부분
단계별 난이도 설계
실용적인 요구사항
TDD + AI Agent 조합
과제에서 모호하거나 애매했던 부분
"31일 매월 반복"의 정확한 의미
반복 일정 UI 주석 처리
테스트 데이터 파일 분리
realEvents.json과e2e.json의 역할 구분이 처음에 헷갈림리뷰 받고 싶은 내용
1. 반복 일정 생성 알고리즘의 효율성
현재 구현:
질문:
2. 단일/전체 수정 시 데이터 일관성 보장
현재 구현:
우려사항:
질문:
3. MSW 핸들러의 상태 관리
현재 구현:
우려사항:
eventsData를 사용하여 상태 관리질문:
4. Agent 시스템의 실무 적용 가능성
현재 설계:
질문:
5. 타입 안전성 개선 방향
현재 문제:
repeat.type이 'none'일 때id가 있으면 안 되는데, 현재 타입으로는 방지 불가repeat.type이 'none'이 아닐 때id가 필수인데, optional로 정의됨개선 방향 고민:
질문:
커밋 히스토리:
테스트 커버리지: