Skip to content

feat: [alt-309] 고정 근무 반복·적용 기간 계약 및 생성 규칙 정립 - #121

Merged
hodoon merged 9 commits into
devfrom
feat/alt-309
Nov 4, 2026
Merged

hodoon merged 9 commits into
devfrom
feat/alt-309

Conversation

@ysw789

@ysw789 ysw789 commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

기존 고정 근무 API는 요일과 시간만 저장해 반복 방식과 적용 기간을 보존하지 못했습니다. 매주 또는 매월 n번째 요일 규칙과 적용 기간을 등록·조회·수정하고, 다음 달 실제 근무 생성에 반영합니다.

변경사항

  • V17 마이그레이션으로 반복 유형, 월별 발생 순서, 적용 시작일·종료일을 추가합니다. 기존 데이터는 기간 제한 없는 WEEKLY로 유지합니다. (#107의 V16이 먼저 병합되는 순서를 기준으로 V16에서 V17로 번호를 바꿨습니다.)
  • 등록·수정 입력을 도메인 command로, 조회 출력을 result로 전환하고 inbound 응답을 from(Result)로 매핑합니다.
  • 신규 필드가 없는 구형 POST는 무기한 매주로 처리하며, 구형 PATCH는 기존 반복·기간 값을 보존합니다.
  • 공통 계산 로직으로 월별 n번째 요일, 기간별 충돌, 한 요청 내부 중복과 주 경계 야간 근무를 검사합니다. 요청 업장과 근무자·규칙의 소속도 확인합니다.
  • 다음 달 배치에 반복·기간을 적용하고 KST를 명시합니다. 없는 다섯째 요일은 건너뛰며, 적용 기간은 근무 시작일 기준 양끝을 포함하고 종료일 생략을 허용합니다.
  • 규칙 등록 시 즉시 근무를 생성하지 않습니다. 규칙 수정·삭제 후에도 이미 생성된 실제 근무는 보존합니다.

검증

  • Red: 월별 반복·기간 저장 유실과 일요일→월요일 근무 거부를 먼저 확인했습니다.
  • 2026-10-11: ./gradlew clean build 통과, 전체 565개 테스트 실패·오류·skip 0.
  • 커밋 전 관련 단위 테스트 57개 재실행 통과.
  • 2026-10-11: alter-api-workflow를 사용한 localhost HTTP E2E 37개 시나리오 통과. 등록·조회·수정·삭제, 구형 요청 호환, 입력 오류, 시간 충돌, 인증·권한과 기존 실제 근무 보존을 확인했습니다.
  • 기존 로컬 PostgreSQL에 V16(현재 V17) 마이그레이션을 적용하고 레거시 행의 기본값을 확인했습니다. E2E 전용 데이터·토큰을 제거하고 기존 업장·근무자·근무·규칙 데이터의 해시 보존을 확인했습니다.

통합 및 남은 검증

  • ALT-301 #111은 현재 열린 Draft PR입니다. 사용자 잠금과 최신 확정 근무 재조회 변경이 같은 배치에 적용되므로 선행 반영 후 통합 검증이 필요합니다. 이 PR은 해당 동시성 보호를 중복 구현하지 않습니다.
  • 실제 자정 cron 실행, ALT-301과 결합한 동시성 검증, 프론트 연동·화면 QA와 배포 검증은 아직 수행하지 않았습니다.

관련 문서

ALT-309: 고정 근무 반복·적용 기간 계약 및 생성 규칙 정립

@coderabbitai

coderabbitai Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@hodoon hodoon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰했습니다. 머지 전에 확인이 필요한 부분이 있어 인라인으로 남겼습니다.

LocalDate upper = earlier(left.getEndDate(), right.getEndDate());
// 무기한 요일 규칙도 Gregorian 달력의 400년 주기로 반복된다.
if (lower == null) {
lower = upper == null ? LocalDate.of(2000, 1, 1) : upper.minusYears(400);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

두 규칙 중 하나라도 시작일이나 종료일이 없으면 비교 구간이 400년(약 2만 주)으로 잡힙니다. 마이그레이션된 기존 데이터는 전부 start/end가 null인 WEEKLY라서 거의 모든 비교가 이 경로로 가는 것 같습니다. 겹치지 않는 정상 케이스에서는 조기 종료가 없고, 생성 API는 규칙 쌍마다 이 전개를 반복하니 쓰기 트랜잭션 안에서 할당량이 꽤 커질 수 있을 것 같습니다.
최소한 두 규칙이 모두 WEEKLY일 때는 주기가 1주이니 lower 기준 2주 정도 창으로 줄이고, MONTHLY가 끼는 경우에만 긴 창을 쓰면 어떨까요? (요일 배치는 28년 단위로 반복되므로 그 정도로 줄여도 충분해 보입니다)

@hodoon hodoon self-assigned this Oct 21, 2026
@ysw789

ysw789 commented Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

#107(feat/alt-295)이 먼저 머지될 예정이고, 그 PR도 V16__refactor_posting_recruitment_and_working_days.sql을 추가합니다. 이 PR의 V16__add_fixed_schedule_recurrence.sql을 V17__add_fixed_schedule_recurrence.sql로 바꿔야 합니다. 설정이 validate-on-migrate: true, out-of-order: false라서, 그대로 머지하면 버전 16이 중복돼 기동할 때 실패합니다.

참고: 로컬 DB에 이 PR의 V16이 이미 적용돼 있다면, 파일 이름을 바꾼 뒤 flyway_schema_history의 버전 16 행을 정리해야 합니다.

hodoon added a commit that referenced this pull request Oct 22, 2026
기존 데이터는 대부분 기간 없는 WEEKLY라 충돌 검사마다 400년치를 전개했다.
근무 길이가 7일 미만이고 매주 규칙은 1주 주기라 두 규칙 모두 WEEKLY면 2주 창으로 충분해 줄이고,
MONTHLY가 섞인 경우는 윤년 예외 때문에 기존 창을 유지한다.
ysw789 and others added 9 commits November 4, 2026 19:58
PR 번호 순서대로 병합하면 #107(ALT-295)의 V16이 먼저 들어가므로 번호 충돌을 피한다.
기존 데이터는 대부분 기간 없는 WEEKLY라 충돌 검사마다 400년치를 전개했다.
근무 길이가 7일 미만이고 매주 규칙은 1주 주기라 두 규칙 모두 WEEKLY면 2주 창으로 충분해 줄이고,
MONTHLY가 섞인 경우는 윤년 예외 때문에 기존 창을 유지한다.
관리하지 않는 업장은 실제로 400(B008)인데 404(B019)로, 근무 시간 검증·겹침 문구도 바뀐 규칙과
다르게 적혀 있어 클라이언트가 잘못된 코드를 처리하지 않도록 UseCase·엔티티의 실제 응답에 맞춘다.
@hodoon
hodoon marked this pull request as ready for review November 4, 2026 11:03
@hodoon
hodoon merged commit 947b579 into dev Nov 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants