# 요일 회전 기반 체크리스트 생성 로직 문제 해결 보고서
## 1. 문제 파악
- AI 기반 루틴 생성 플랫폼(MyCoach)에서, 사용자가 플랜을 실행할 요일을 자유롭게 선택(예: 수, 목 등)해도, 체크리스트 배열은 항상 월~일 순서로만 생성되어 원하는 순서대로 표시되지 않음.
- 예를 들어, 시작일이 목요일이고, 실행 요일이 수·목이면 체크리스트상에서 실행 요일의 위치가 어색하게 배치되는 현상 발생.
## 2. 원인 분석
- 기존 generate_checklist 함수는 요일 리스트(days=[0,0,1,1,0,0,0])를 월~일 순서로 고정해서 반복문을 돌려 체크리스트를 만들고 있었음.
- 사용자 루틴의 "시작 요일(start_day)"이 언제이든 상관없이, 체크리스트 배열은 항상 월요일부터 시작됨.
- 실제로 "체크리스트의 첫 번째 요일"이 항상 월요일이 아닌, 루틴의 시작일에 맞춰 첫 칸이 되기를 기대함.
## 3. 해결 과정
1. **문제 재현 및 원인 로그 분석**
- print로 days, start_day, rotated_days, day_order 등을 찍어 실제 회전 동작 여부 확인.
- 시작일이 목요일, 실행요일이 수·목이면 rotated_days가 [1,0,0,0,0,0,1]로 회전되어야 정상임을 검증.
2. **회전 로직(rotate_days) 구현**
- utils.py에 rotate_days(days, start_idx) 함수를 구현하여, 요일 배열을 시작 요일 기준으로 회전할 수 있도록 함.
- generate_checklist 함수에 start_day 인자 추가 및 days 배열을 rotate_days로 회전하여 생성 로직에 적용.
3. **시작 요일 계산 로직 추가**
- 시작 날짜(예: "2025-08-07")를 받아서 get_korean_weekday 함수로 요일 문자열(예: "목")로 변환.
- worker.py 등 체크리스트 생성 호출부에서 plan_dict["PLAN"]["DATE_START"]를 활용해 start_day를 계산, generate_checklist에 넘김.
4. **테스트 및 검증**
- 다양한 예시로 직접 print 및 테스트 코드를 통해 요일 배열이 기대한 대로 회전·적용되는지 반복 확인.
- 수, 목 실행/목요일 시작 → [1,0,0,0,0,0,1], 수요일 시작 → [1,1,0,0,0,0,0] 등 정상 동작 확인.
## 4. 최종 결과 및 개선점
- 이제 체크리스트 배열은 **루틴 시작일에 맞춰 회전된 요일 순서**로 생성됨.
- 월~일 고정 배열이 아닌, 사용자의 루틴 시작일(start_day)을 기준으로 배열이 동적으로 회전됨.
- 실제 체크리스트상에서 첫 번째 칸이 시작일의 요일, 마지막 칸이 시작일의 전날이 되어, 실행 요일에 체크가 정확하게 생성됨.
- 해당 로직은 앞으로 다양한 요일 조합과 시작 요일에 모두 유연하게 대응 가능.
---
## (부록) 주요 적용 코드
```python
def rotate_days(days: list, start_index: int) -> list:
return days[start_index:] + days[:start_index]
def generate_checklist(week_plans: list, days: list, start_day: str = "월") -> list:
day_order = ["월", "화", "수", "목", "금", "토", "일"]
start_idx = day_order.index(start_day)
rotated_days = rotate_days(days, start_idx)
# 이하 생략...
def get_korean_weekday(date_str):
days_kor = ["월", "화", "수", "목", "금", "토", "일"]
d = datetime.datetime.strptime(date_str, "%Y-%m-%d")
return days_kor[d.weekday()]