-
Notifications
You must be signed in to change notification settings - Fork 53
[2팀 고다솜] Chapter 1-2. AI와 테스트를 활용한 안정적인 기능 개발 #100
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ds92ko
wants to merge
84
commits into
hanghae-plus:main
Choose a base branch
from
ds92ko:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
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
- warning React Hook useEffect has a missing dependency: 'checkUpcomingEvents'.
- 작업 단계에 컨텍스트로 제공될 파일 경로를 명시 - 템플릿 파일이 없을 경우 템플릿 파일 생성 제안으로 변경 - 참고 문서 명칭 변경
- 테스트 설계 체크리스트 문서 추가 - 테스트 가이드 문서 추가 - 테스트 작성 베스트 프랙티스 문서 추가
- 에이전트 카드 - 에이전트 작업 가이드 - 에이전트 작업 후 체크리스트 - 에이전트 산출물 템플릿
- 에이전트 카드 - 에이전트 작업 가이드 - 에이전트 작업 후 체크리스트 - 에이전트 산출물 템플릿
- 에이전트 카드 - 에이전트 작업 가이드 - 에이전트 작업 후 체크리스트 - 에이전트 산출물 템플릿
- 기능 설계 에이전트 - 테스트 설계 에이전트
- 에이전트 카드 - 에이전트 체크리스트 - 에이전트 작업 가이드 - 에이전트 산출물 템플릿
- 테스트 설계 에이전트 산출물 - 테스트 코드 작성 에이전트 산출물
- 에이전트 카드 - 에이전트 체크리스트 - 에이전트 작업 가이드 - 에이전트 산출물 템플릿
- 반복 종료일 max='2025-12-31' 속성 추가 - 1줄 추가로 기능 완성 - 147/147 tests passed - 리팩토링 불필요 (코드 이미 최적)
- 반복 일정 수정 시 다이얼로그 추가 - 단일 수정 vs 전체 수정 선택 기능 - PUT /api/events/:id 및 PUT /api/recurring-events/:repeatId 활용 - 날짜/시간 동기화 로직 명세
- 반복 일정 수정 다이얼로그 테스트 설계 - TC-001~007: 주요 기능 테스트 - 단일/전체 수정 API 호출 검증 - 반복 아이콘 표시/제거 검증
- 반복 일정 수정 다이얼로그 테스트 작성 - TC-001~007: 7개 테스트 케이스 구현 - MSW 핸들러 추가: PUT /api/recurring-events/:repeatId - Red Phase 확인: 6 failed, 1 passed (예상대로)
- 반복 일정 수정 시 다이얼로그 추가 - '예' 선택: 단일 일정으로 변환 (repeat.type='none') - '아니오' 선택: 전체 시리즈 수정 (PUT /api/recurring-events/:repeatId) - 이벤트 리스트에 반복 아이콘 추가 - Green Phase 달성: 모든 테스트 통과 (154/154)
- 리팩토링 불필요 판정 - 코드 품질 분석: 모든 메트릭 우수 - 가독성, 유지보수성, 확장성 모두 적정 수준 - 추가 추상화가 오히려 복잡도 증가시킬 수 있음 - 현재 코드 상태 유지 권장
✅ 전체 TDD 사이클 완료 (Red → Green → Refactor) ✅ 반복 일정 수정 기능 완벽 구현 ✅ 다이얼로그를 통한 단일/전체 수정 선택 ✅ 이벤트 리스트에 반복 아이콘 추가 ✅ 모든 테스트 통과 (154/154) ✅ 회귀 없음, 코드 품질 우수 ✅ 리팩토링 불필요 판정 (이미 최적)
문제: - server.js는 수정 불가 (백엔드 파일) - 날짜/시간 변경 시 프론트엔드에서 처리 필요 해결: 1. useEventOperations.ts - 날짜/시간 변경 감지 - 변경 있음: 각 일정 개별 UPDATE (PUT /api/events/:id) - 변경 없음: 기존 API 사용 (PUT /api/recurring-events/:repeatId) - 종료일 넘는 일정: DELETE API 호출 2. 테스트 수정 - TC-003: 시간 변경 테스트 → 개별 API 호출 검증 동작: - 날짜/시간 변경 시 모든 일정 이동 - 종료일을 넘는 일정 자동 삭제 - 제목/설명/위치만 변경 시 기존 API 사용 (효율적) 테스트: 154/154 통과 ✅ server.js: 수정 없음 ✅
문제: - 시리즈의 '첫 번째 일정'과 비교하고 있었음 - 사용자가 '클릭한 특정 일정'과 비교해야 함 예시: - 시리즈: 11-01, 11-08, 11-15 - 사용자가 11-01 클릭 → 11-05로 변경 - 기존: firstEvent(11-01) vs 수정(11-05) = +4일 ✓ - 하지만 11-08 클릭 시 문제 발생! 수정: - useEventOperations에 editingEvent 파라미터 추가 - originalEvent = editingEvent (클릭한 일정) - 이제 정확한 날짜 차이 계산! 결과: - 어떤 일정을 클릭하든 정확히 작동 ✅
- 기존 단일 일정 수정 시 반복 설정이 적용되지 않는 문제 수정 - 단일 일정을 반복 일정으로 변경 시 기존 일정 삭제 후 반복 일정 생성 - 단일 일정 유지 시에는 기존 로직 그대로 사용
- TDD 세션 문서 업데이트 - 리포트 업데이트
- 단일 일정으로 변경 시 repeat.id를 undefined로 설정하여 반복 시리즈에서 분리 - 반복 일정 전체 수정 시 repeat.type='none'인 일정 제외하도록 필터링 개선 - Mock 서버에서 각 반복 일정 시리즈마다 고유한 repeat.id 생성 이제 단일 일정을 반복 일정으로 변경한 후, '해당 일정만 수정' → '전체 수정' 시나리오가 정상 동작합니다.
- handleEditSingleEvent에서 repeat.id와 endDate를 undefined로 명시적 설정 - 이전에는 repeat.id가 남아있어 '전체 수정' 시 잘못된 일정까지 포함되는 문제 발생 - 이제 단일 일정으로 변경 시 반복 정보가 완전히 제거됨
- Event에서 id를 제거하고 EventForm으로 변환 - 반복 일정 새로 생성할 때와 동일한 로직 적용 - 이제 단일→반복→해당일정만수정→전체수정 시나리오가 정상 동작함
- 반복 설정(종료일, 간격, 유형) 변경 시 기존 일정 삭제 후 재생성 - 이제 반복 종료일을 연장하면 새 일정들이 추가됨 - EventForm 타입으로 명시적 변환하여 워닝 완전 제거 - eslint-disable 주석 제거하고 근본적으로 해결
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)
심화 과제
report.md
과제 셀프회고
이번 과제를 통해 AI에 대한 제 인식이 크게 달라졌습니다.
사실 저는 원래 AI에 대한 불신이 강한 편이었습니다.
주변에서 Claude나 Cursor를 결제해서 쓴다고 해도 “그걸 왜 돈 주고 써?”라는 회의적인 입장이었고, 회사에서 제공하는 GitHub Copilot도 단순히 인라인 코드 자동완성 도구로만 사용했습니다.
AI를 깊이 이해하지 못한 부분도 있었지만, 지금 돌아보니 편견이 훨씬 더 컸던 것 같습니다.
이번 과제를 진행하면서 AI를 단순한 코드 생성기가 아니라 함께 일할 수 있는 협업 파트너로 바라보게 되었습니다.
특히 테스트 주도 개발(TDD) 구조 안에서 AI가 테스트를 기준으로 코드를 생성하고, 실패를 감지하며, 회귀를 자동으로 추적하는 과정을 보면서 “올바른 컨텍스트를 제공한다면 AI도 신뢰할 수 있는 동료가 될 수 있구나”라고 느꼈습니다.
AI는 반복적이고 패턴화된 작업에서는 사람보다 훨씬 빠르고 일관되게 일했습니다.
하지만 문제의 ‘의도’를 해석하거나, 품질·보안·성능과 같은 판단이 필요한 순간에는 여전히 인간의 개입이 필수적이라고 느꼈습니다.
이 과정을 통해 AI를 맹신할 필요도, 완전히 배척할 이유도 없다는 생각을 하게 되었습니다.
AI가 인간보다 강점을 가진 부분은 과감히 위임하고, 인간은 그 빈틈을 메우는 방향으로 역할을 나누는 것이 바람직하다고 느꼈습니다.
AI는 속도와 확장성에 강하고, 사람은 방향 설정과 판단, 검증에 더 강하다고 생각합니다.
이 둘이 서로를 신뢰하며 협력할 때, 개발의 속도와 품질 모두에서 시너지를 낼 수 있다는 깨달음을 얻었습니다.
또한, 중요한 건 AI의 능력이 아니라 사람이 얼마나 명확하게 맥락을 설계하고 지시하느냐였습니다.
AI는 그 궤도 안에서 가속하는 엔진일 뿐, 궤도를 설계하는 것은 여전히 사람의 몫이라고 느꼈습니다.
기술적 성장
이번 과제에서는 AI를 활용한 테스트 주도 개발(TDD)을 실제로 적용하며, 기존과 완전히 다른 개발 사고방식을 경험했습니다.
그동안 테스트 코드를 “마지막 검증 절차”로만 생각했는데, 이번에는 기능 설계의 출발점으로 테스트를 먼저 작성하고 AI가 이를 통과하도록 유도하는 과정에서, 테스트가 단순 검증을 넘어 개발 방향을 제어하는 핵심 도구임을 체감했습니다.
TDD를 처음 접하는 입장에서, RED 단계에서 처음 스켈레톤 코드를 생성하지 않고 바로 테스트를 작성했더니, 실제 테스트 실패가 아닌 린트 에러가 발생해 혼란을 겪었습니다.
이 경험을 통해 TDD에서는 테스트 환경과 코드 구조를 먼저 준비하는 것이 얼마나 중요한지도 직접 체감할 수 있었습니다.
또한 멀티 에이전트 구조와 컨텍스트 엔지니어링을 적용하면서, AI의 응답 품질이 명세의 구체성과 맥락 유지력에 크게 의존한다는 사실도 확인했습니다.
이를 통해 AI 기반 개발 워크플로우를 설계할 때는 단순한 도구 사용이 아니라, 시스템 아키텍처 설계 수준의 사고가 필요함을 배웠습니다.
특히, 컨텍스트를 통해 에이전트 간 상태와 역할을 명확히 정의하면, AI가 보다 일관된 결과를 내도록 유도할 수 있음을 실감했습니다.
코드 품질
이번 과제는 TDD 중심의 AI 에이전트 설계에 초점을 맞췄습니다.
각 에이전트의 역할
디렉토리 구조
초기에는 바로 에이전트 카드를 작성했는데, 에이전트마다 형식과 포함 정보가 달라져 카드 간 일관성이 깨졌습니다.
이 과정에서 단순히 각 에이전트가 자신의 역할만 수행하는 것이 아니라 TDD 사이클을 함께 완성하는 협업 체계가 필요하다는 점을 인식했습니다.
그래서 다음과 같은 정비를 진행했습니다.
공통 협업 스펙 수립
모든 에이전트가 공유하는 통합 스펙 문서(협업 가이드)를 작성하여 역할 경계, 상호 의존 정보, 산출물 흐름을 명확히 했습니다.
각 에이전트는 자신이 담당하는 TDD 단계뿐 아니라 앞뒤 단계 에이전트의 기본 책임과 기대 산출물을 확인하도록 했습니다.
템플릿 체계 정립
에이전트 카드, 작업 사전 가이드라인, 작업 후 셀프 체크용 체크리스트, 세션 산출물(기능 명세, 테스트 명세, 테스트 코드, 구현 코드, 리팩토링 보고서) 등에 대해 표준 템플릿을 제작했습니다.
공통적으로 지켜야 하는 품질/협업 규칙 + 에이전트별 특화 규칙을 분리해 템플릿에 반영했습니다.
문서 전개 및 규격화
템플릿을 활용해 모든 에이전트 카드 / 가이드라인 / 체크리스트 문서를 재생성하여 형식과 포함 정보(목표, 입력/출력, 검증 기준 등)를 통일했습니다.
이후 TDD 세션마다 산출물 문서가 동일 구조로 누적되도록 세션 디렉토리(sessions/…)에 규격화된 파일을 생성·관리했습니다.
실행 절차 준수
각 에이전트는 작업 시작 전에 협업 스펙 문서와 자신의 가이드라인을 확인하고, 작업 종료 후 체크리스트로 셀프 검증을 수행했습니다.
산출물은 지정된 템플릿을 반드시 사용하여 정보 누락 및 형식 편차를 제거했습니다.
오케스트레이션 품질 관리
오케스트레이션 에이전트는 세션별 상태 추적 문서를 유지하며 워크플로우 단계 종료 시마다 문서 업데이트를 수행했습니다.
각 단계 종료 시 Git 커밋을 진행했으며, TDD(RED, GREEN, REFFACTOR) 단계일 경우 Git 커밋 전에 테스트를 실행해 해당 단계의 기대 결과(RED 때 실패, GREEN/REFACTOR 때 성공)를 검증한 후에만 Git 커밋을 진행했습니다.
효과
학습 효과 분석
가장 큰 배움은 AI를 단순 코드 생성기가 아니라, 테스트 기반 협업 파트너로 활용할 수 있다는 점이었습니다.
AI와 사람의 역할을 명확히 구분하고 보완하면 개발 효율과 안정성이 모두 향상됩니다.
이번 과제를 통해 TDD가 AI 협업에서 갖는 본질적인 역할과, 테스트가 곧 안전망이라는 점을 체감했습니다.
과제 피드백
좋았던 점은 AI를 단순 도구가 아닌 협업 체계로 활용하도록 설계된 과제 구조였습니다.
테스트 기반의 기능 개발이라는 주제가 AI의 한계와 강점을 동시에 드러내서 학습 효과가 컸습니다.
특히 이 과제를 통해 AI를 어떻게 ‘활용’해야 하는가에 대한 이해가 크게 달라졌습니다.
처음에는 AI가 신뢰하기 어려운 존재라고 생각했지만, 직접 테스트 주도 흐름 속에서 함께 일해보니 “AI에게 무엇을, 어떻게 명확히 지시해야 하는가”가 핵심이라는 걸 깨달았습니다.
결국 중요한 건 AI의 능력이 아니라 사람이 컨텍스트를 얼마나 잘 설계하느냐였다는 점이 가장 인상 깊었습니다.
리뷰 받고 싶은 내용
이 접근의 의도는 각 에이전트가 자신의 역할과 목표를 명확히 이해해야 협업 과정에서 일관성과 품질을 유지할 수 있다고 판단했기 때문입니다.
이러한 ‘역할 기반 워크플로우 설계’가 실제로 효율적인 구조인지, 더 나은 방법이 있을지 조언을 받고 싶습니다.