## 작업 개요 사용자가 월 전체 예산을 설정하고, 해당 금액을 필수·자유·비상금·미래자산 포켓에 배분하는 기능을 구현합니다. 확정된 예산을 변경할 때는 기존 금액과 변경된 금액을 이력으로 기록하고, 이미 소비한 금액보다 포켓 예산을 낮출 수 없도록 검증합니다. ## 브랜치 `feat/monthly-budget-management` ## 작업 내용 - 월 예산 신규 설정 기능을 구현합니다. - 월 예산 확정 기능을 구현합니다. - 포켓별 목표 금액 저장 기능을 구현합니다. - 확정된 월 예산의 총액 및 포켓별 금액 변경 기능을 구현합니다. - 전체 예산과 포켓별 배분 합계의 일치 여부를 검증합니다. - 포켓별 사용액을 기준으로 최소 조정 가능 금액을 검증합니다. - 월 예산 변경 이력과 포켓별 변경 상세를 저장합니다. - 월 예산 조회 결과에 상태와 배분 방식을 포함합니다. ## 예산 생성 기준 - 한 사용자는 같은 월에 하나의 월 예산만 가질 수 있습니다. - 기준 월은 해당 월의 1일로 저장합니다. - 전체 예산은 0원보다 커야 합니다. - 포켓별 목표 금액은 0원 이상이어야 합니다. - 네 포켓의 배분 금액 합계는 전체 예산과 일치해야 합니다. - 포켓은 다음 네 유형을 모두 포함해야 합니다. - `ESSENTIAL` - `FREE` - `EMERGENCY` - `FUTURE_ASSET` - 같은 포켓 유형을 중복해서 전달할 수 없습니다. - 다른 사용자의 포켓을 예산에 포함할 수 없습니다. ## 예산 상태 ### `DRAFT` - 사용자가 아직 확정하지 않은 예산입니다. - 초안 상태에서는 총액과 포켓별 배분 금액을 수정할 수 있습니다. ### `CONFIRMED` - 사용자가 최종 확정한 예산입니다. - 시스템이 임의로 다시 계산하거나 덮어쓰지 않습니다. - 이후 변경은 반드시 변경 이력과 함께 저장합니다. ## 포켓 배분 방식 - `USER_INPUT` - 사용자가 직접 입력한 금액 - `AUTO_REMAINDER` - 나머지 포켓을 입력한 뒤 남은 금액을 자동으로 배정 - `SYSTEM_DRAFT` - 시스템이 최초 초안으로 제안한 금액 ## API ### 월 예산 설정 ```http PUT /api/budgets/monthly/{month} Authorization: Bearer {accessToken} Content-Type: application/json
Activity