2026 W04 주간회고
지난주 주간 보고
[2026-01-19 주간 보고]
- 지난주 업무 (업무명/결과)
- conflict-detector (UC 4개 중 4개) ✅
- master-plan UNTIL TUE 1/20 🏃
- 라켓타임웹 한글주소 ✅
- 프리랜서 코치 레슨 문제정의서 작성완료
- 닉네임으로 유저 검색기능 문제정의서 작성완료
- 레슨 대리예약 간소화를 위한 코치 운영시간, 코트 등을 명시한 플랜 문제정의서 작성완료
- v.1.11.15 배포 및 릴리즈 노트 작성완료
- 현재 업무 (업무명/목표/마감일)
- master-plan UNTIL TUE 1/20 🏃
- 2일 정도 딜레이 예정
- A안, B안 사전 공유
- 닉네임으로 유저 검색기능
- master-plan UNTIL TUE 1/20 🏃
- 연장/취소된 사유
- master-plan: 하위호환성을 위한 리팩터링 필요
master-plan
| 항목명 | 설명 | 검증 방법 | 🔲✅❌ |
|---|---|---|---|
| PlanReadBase 단독 조회 가능 | 읽기 모델 조회 시 Plan Aggregate 인스턴스를 생성하지 않아도 동작해야 한다 | Read API에서 Aggregate 생성 코드가 없는지 코드 리뷰 | ✅ |
| Read Model ↔ Aggregate 의존성 단절 | Projector / Read DTO 어디에서도 Plan(aggregate)을 참조하지 않는다 | grep / IDE 검색으로 import 의존성 확인 |
✅ |
| CourtSelectionPolicy Value Object 공유 | CourtSelectionPolicy 로직이 Aggregate / Projector 양쪽에서 동일하게 사용된다 | 동일 클래스/모듈을 양쪽에서 import 하는지 확인 | ✅ |
| Court 필터링이 Projector에서 수행됨 | courtModels 필터링 로직이 DB 쿼리나 Aggregate가 아닌 Projector에 존재 | Projector 코드 위치 확인 | ✅ |
| Read 쿼리에 정책 로직 없음 | DB query 단계에는 court 정책 / 도메인 조건문이 없다 | Prisma query / aggregation 코드 리뷰 | ✅ |
| Detail 조회에서만 courtModels include | Plan 목록 조회 시 courtModels를 포함하지 않는다 | List API 응답 payload / query include 확인 | ❌ 프로젝션 옵션 인자 추가함 |
| PlanCommonRead / PlanDetailRead DTO 분리 | 공통/상세 DTO가 명확히 분리되어 있다 | DTO 정의 파일 확인 | ✅ |
| Projector는 순수 함수 | Projector가 외부 상태(DB, 서비스)를 참조하지 않는다 | 생성자/의존성 주입 여부 확인 | ✅ |
| CourtSelectionPolicy 불변식 강제 | ALL / INCLUDE / EXCLUDE 정책 제약이 코드로 강제된다 | 생성자 또는 팩토리에서 validation 확인 | ✅ |
| INCLUDE 정책에서 ids 필수 | INCLUDE + 빈 배열이 허용되지 않는다 | unit test 또는 runtime validation | ✅ |
| ALL 정책에서 ids 항상 빈 배열 | ALL 정책에서 ids가 존재하면 에러 또는 무시된다 | unit test | ✅ |
| EXCLUDE + 빈 배열 = ALL 동치 | EXCLUDE 정책에서 ids가 비어있을 때 ALL과 동일하게 동작 | unit test | ✅ |
| numberOfWeeks 최대 6 제한 | LessonPlan / LongTermPlan에서 6 초과 불가 | Aggregate 생성 시 validation 테스트 | ❌사용하지않음 |
| LessonSetting 마이그레이션 | lesson_settings 컬렉션이 생성되고 academyId 기준으로 조회된다 | DB 컬렉션 / index 확인 | ✅ |
| LessonSetting fallback 동작 | 신규 컬렉션이 없을 경우 legacy academy embedded 사용 | feature flag / 분기 코드 테스트 | 🔲 |
| LessonSetting unique 보장 | academyId 기준 중복이 불가능하다 | MongoDB unique index 확인 | ✅ |
| LessonSetting 백필 완료 | 기존 academy embedded 데이터가 신규 컬렉션으로 이전됨 | migration 로그 / count 비교 | ✅ |
| CourtSelectionPolicy 마이그레이션 완료 | legacy plan.courts → policy INCLUDE 변환됨 | migration 스크립트 실행 결과 확인 | ✅ |
| Legacy 필드 유지 | 기존 TicketPlan 옵셔널 필드가 제거되지 않음 | schema diff 확인 | ✅ |
| Backward compatibility 보장 | 기존 API consumer가 깨지지 않는다 | 스테이징 회귀 테스트 | 🏃 |
| Read API 응답 타입 안정성 | Read DTO에서 optional/nullable 의도가 명확하다 | Swagger / 타입 정의 확인 | 🏃 |
| PlanLegacyDtoFabricator 구현 | 기존의 TicketPlanResponseDto와의 호환성 레이어 | ReadModel이 주어졌을때 예상 변환 결과를 테스트 | 🔲 |
| 정책 로직 단일 책임 유지 | court 정책 로직이 한 곳에만 존재 | 중복 구현 여부 검색 | ✅ |
| Aggregate 테스트가 Read 없이 통과 | Aggregate 단위 테스트가 Read Model 없이 가능 | 테스트 실행 | 🔲 |
| Read 테스트가 Aggregate 없이 통과 | Read Projector 테스트가 Aggregate 없이 가능 | 테스트 실행 | 🔲 |
기존의 ticketplanmodels 마이그레이션 |
모든 옵셔널 필드가 뒤섞인 거대한 도큐먼트를 각각의 타입별로 임베드 하거나 별도의 릴레이션으로 분리 | 마이그레이션 스크립트 실행 후 정합성 평가 | ❌ 사유: 기존의 TicketPlan의 필수 필드를 제외한 나머지를 옵셔널로 변경하는 것으로 달성 |
| PlanQueryPort 구현 | 다양한 필터, 정렬, 페이지네이션 조건을 입력으로 DB에 쿼리를 조회하고 PlanRead 읽기모델로 변환하는 레포지토리를 구현 | 레거시 TicketPlanRepository를 대체 | ✅ |
prisma:push 기능 확장
관련 PR: https://github.com/curinginnos/racketime-api/pull/343
AS-IS
prisma:push 커맨드를 실행하면 자꾸 아카데미 테이블에 있는 2dSphere 인덱스가 사라지는 등의 문제가 있어 수작업으로 인덱스/유니크제약조건을 추가해야 하는 불편함이 따랐음.
TO-BE
prisma:index 커맨드를 신설하여 MongoDB 커넥션을 직접 연결 후 Prisma가 지원하지 않는 타입의 인덱스 (2dSphere, partialIndex)를 추가할 수 있게 되었음.
해당 커맨드는 prisma:push 커맨드 안에 병행하도록 하여 일관적으로 데이터베이스 인덱스를 관리할 수 있게 되었음.
닉네임 검색 기능 제안
현재 라켓타임은 휴대폰 번호 기반으로만 유저를 조회할 수 있어 일반 유저가 매칭 상대나 카메라 촬영 동의자를 추가할 때 UX 장벽이 크다.
이에 유저가 닉네임 기반으로 다른 유저를 조회/선택할 수 있게 하여 입력 부담을 줄이고 실사용 흐름을 매끄럽게 만드는 것을 목표로 한다.
닉네임은 흔한 값이 빠르게 선점되는 문제가 있으므로, 디스코드 방식처럼 닉네임#123 같이 핸들을 사용하여 정확히 유저 1명을 식별 가능하게 함을 염두에 두고 작업했다.
이번 주 잘한 일
- freelance-coach-class.spec 문제정의서를 적은 에너지로 빠르게 만들어내 업무공백을 줄이면서 동시에 예상 소요시간 측정을 위한 지표를 마련함
- 본 업무 외적으로도 눈에 띄는 자잘한 업무들을 지원하여 "그래도 최승현 놀지는 않았네" 인식을 심어줌. 심지어 에너지를 많이 쓰지도 않음.
- 라켓타임웹 한글주소화 한 결과를 가지고 모든 매장에 딥링크를 포함한 한글주소를 배포해야 했는데, 노가다성이 짙었기 때문에 간단한 JS 코드를 작성하여 딸깍으로 끝내버림. 에너지 최소화 갑.
이번 주 아쉬운 일
- plan-modernization.spec 예상시간을 아득히 초월해버려 원래 화요일까지 끝내려던 걸 금요일까지도 다 끝내지 못해 일요일 회사에 출근하였다. 기존 구조의 근간을 흔드는 업무는 얼마나 오래 걸릴지 예측할 수 없다.
- 야근을 너무 자주 해 일주일에 요가를 4번밖에 하지 못했다. 그마저도 짧은 10분~20분짜리 요가로 채워넣어 체력/근손실을 느끼고 있다.
W05 목표
- freelance-coach-class.spec 문제정의서를 다시 읽고 두뇌 회로를 재정렬한다.
- 문제가 무엇인지부터 다시 정의하고, 그 문제를 어떻게 해결할건지를 고민하는데 처음 16시간을 할애한다.
- freelance-coach-class.wireframe 와이어프레임을 가지고 디자이너와 협업한다. 나는 "이 데이터가 필요해요"를 전달할 책임을 가지고 있으며, 디자이너는 UX를 구성할 책임을 가지고 있다.
다음 1,2개월동안 회사가 나에게 기대야 할 "주축"은?
- 팀이 헷갈려하는 경계 (대관, 레슨, 클래스)를 명확히 잘라 결정 속도를 높이는 데 기여
- UML 랭귀지를 사내 구성원이 모두 이해할 수 있게 만들자
W05 Estimated Output
산출물
- 팀 내 wireframe 리뷰 1회
- UML 다이어그램 리뷰 1회
- class FSM (pre, during, post)
- Sequence
- AI 에이전트를 위한 fine-grained spec file 유스케이스당 하나씩, 1차 필수기능 중 P0 spec 6EA
- UC022
- UC021
- UC020
- UC001
- UC023
- UC002
Best
- 회의/리뷰의 기준이 되는 spec, "다음 스펙에 따르면.." 이 팀 내에서 발화할 것
- "저번에 XX라고 말하지 않았어? 아닌데?" 같은 대화가 퇴행하는 건수 2회 미만
- 퇴행대화란? 이전에 결정된 항목을 다시 논의하는 케이스를 의미. 주로 기록하지 않거나 찾기 어려워 기억에 의존할 경우 발생.
- plan-modernization PR dev로 머지 후 회귀테스트 All Pass
- QA 시나리오 최소 10개
Worst
- spec, UC 언급횟수 5회 미만
- 팀 내 "일단 디자인이 나와봐야" 발화 횟수 3회 이상
- 데이터계약(API/모델/상태)는 디자인보다 먼저 확정되어야 한다.
- 디자인이 의사결정을 대신하는 것을 막자.
- 주간 이슈처리 할애시간 8hr 이상
규칙 1) 월~화는 “스펙 P0 생산”만
-
월: P0 2개 완성
-
화: P0 2개 완성
-
수: 리뷰
규칙 2) 주간 이슈는 “슬롯제”로
-
하루 1시간 슬롯만
-
1시간 넘으면 → 내일로 이월 or 위임
규칙 3) 집에서 작업 금지(너가 이미 선언함)
대신 진짜 허용:
-
회사에서 야근 1~2회는 OK
-
집에서 1시간이라도 일하면 = 실패