Skip to content

test: [ALT-305] 삭제 일정 상태와 본인 조회 날짜 계약 보완 - #119

Merged
hodoon merged 4 commits into
devfrom
test/alt-305
Oct 28, 2026
Merged

hodoon merged 4 commits into
devfrom
test/alt-305

Conversation

@ysw789

@ysw789 ysw789 commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

삭제된 근무가 본인 일 조회에 남거나 수락된 대타 승인으로 다시 확정되는 문제를 고쳤습니다. 본인 일 조회의 잘못된 날짜도 기존 500 대신 400/B001로 거부합니다.

변경

  • WorkspaceShift.assignWorker에서 DELETED를 기존409/B020으로 거부합니다. 승인 실패 시 일정·대타 요청/대상 상태를 유지하고 알림을 추가하지 않습니다. 삭제된 본인 일 조회를 DB 조건에서 제외합니다.
  • 공유 조회 DTO의 private 교차 날짜 검증을 self 엔드포인트에만 활성화했습니다. 완전한 year/month/day만 검사하며 기존 불완전 조합 메시지, day 없는 month13의200 빈목록, workspace/candidate의 day 계약을 유지합니다.
  • 기존 signature/응답/예상수입 정책은 그대로이며 승인409와 self400을 Swagger에 반영했습니다. 새 API·외부 필드·migration·handler/config 변경 없음.

검증

  • 최초 삭제 수정: Red2 → 관련33 Green / 전체527 성공. 당시 tracked diff de749ca19422397e54ff800afaca920d9a56e2bd의 독립 HTTP는 조회·시간수정·근무자 교체·해제·재배정·삭제·정상 대타승인 및 삭제 대타승인409/실패 원자성·권한·급여 계약을 확인했습니다. 이 과정에서 기존 날짜500 두 건을 발견했습니다.
  • 추가 날짜 수정: 잘못된 일자6개 Red → 날짜15 및 관련26 Green. 최종 JAVA_TOOL_OPTIONS=-Dapi.version=1.44 ./gradlew clean build 전체542 성공(42s, 실패·오류·skip0). 잘못된 month/day·평년2월29 거부, 정상윤년/월말·month13 월조회·불완전400·workspace/candidate 계약·JSON/Swagger 모델 year/month/day3필드만을 회귀했습니다. Testcontainers 잔존0.
  • 날짜 수정 후 독립 HTTP r2 당시 운영 diff db82442ce365315facb3e84effbf111a70618f6e, 삭제 test 8c27f917199bda98301e6e5e43ac94fc7e9e2e6b, 날짜 test 19a48acd81c1f8c1e4721ce733155032ade0c1fd로 검증했습니다. 아래 두 test-only 후속 뒤에도 운영 diff는 동일하며 현재 삭제 test는 247cf6cca579b74832cfa4459b16fd0abd5ecdc4, 날짜 test는 a27e260595a4e2649393436f5d98527a4f772f92입니다.
  • 최종 revision 독립 HTTP 재검증: 무효 day32/month13+day1/평년2월29는400/B001, 윤년·정상 날짜는200입니다. month13(day없음)은200/빈목록/급여0, yearonly는 기존400 메시지를 유지합니다. workspace/candidate day32와 day없음은 빈·비어 있지 않은 목록 모두 동일하고 누락 year/month의 기존400을 보존했습니다. 실제 OpenAPI 세 조회는 각각 year/month/day3필드만이며 self400/approve409 설명이 존재합니다.
  • 같은 최종 revision에서 직접 삭제 전1행/3h→삭제 후0행/0h, 삭제 원근무 ACCEPTED 대타승인409/B020 삭제된 근무 일정에는 근무자를 배정할 수 없습니다.와 업무 전체 digest 불변, 별도 정상승인200/APPROVED를 재확인했습니다. 조회 묶음 digest도 불변입니다. 이전 de749 실행의 모든 수정·권한 시나리오를 최종 revision에서 전부 재실행한 것으로 표현하지 않습니다.
  • 가상 사용자만 사용하고 실제 업무 행 복사0, 메일/FCM/S3 효과0. 두 독립 실행 모두 자기 서버/격리PG·Redis/private 파일을 정리했고 최신18082/25442/26382 사용권 반납을 확인했습니다.

통합 테스트 호환 후속

  • ALT302의 받은 대타 상세 유스케이스를 조합한 통합 사본에서 테스트가 직접 호출하던 컨트롤러 생성자의 인자 수가 달라 compileTestJava가 실패했습니다. 운영 compileJava는 통과했으며 해당 실패 로그를 보존했습니다.
  • ScheduleInquiryValidationTests 한 파일만 Mockito 자동 주입으로 바꿨습니다. 실제 대타 후보 유스케이스는 spy로 유지해 day 무시·누락400, self 날짜 및 외부3필드 검증을 약화하지 않았습니다. ALT302 운영 코드나 port를 이 브랜치에 가져오지 않았습니다.
  • 후속 diff c1235b1ddbf4c90a626713e32df3ce1a37224d04, 원 브랜치 관련15개 및 전체542개 clean build 성공(43s, 실패·오류·skip0). 운영 diff db82442ce365315facb3e84effbf111a70618f6e와 기존 r2 HTTP 증거는 불변입니다. 이 테스트 refactor 후 새 HTTP를 재실행한 결과는 아닙니다.
  • 후속 head를 포함한 독립 최종 통합 컴파일·전체 빌드·대표 위험 조합 API 검증이 완료됐습니다. 원 브랜치 542건과 아래 최종 통합 981건은 별도 실행 결과입니다.

통합 잠금 경로 테스트 slice 후속

  • 생성자 호환 후 통합에서 삭제 테스트 slice에 ALT301 승인 경로의 UserQueryRepository bean이 없어 context가 실패했습니다. 기존 구현체 import를 추가한 뒤에는 H2가 실제 native SET LOCAL lock_timeout = '5s'를 처리하지 못하는 두 실패가 확인됐습니다.
  • ScheduleDeletionFlowTests 한 클래스만 기존 PostgreSQL17.2 Testcontainers/DataJpaTest 선례로 전환했습니다. 기존 fixture helper를 재사용하며 삭제·배정·승인·rollback·정상 조회의 7사례와 실제 repository 잠금 및 모든 기대값을 유지했습니다. 잠금을 mock으로 무력화하거나 운영 H2 분기·새 공통 베이스·설정을 추가하지 않았습니다.
  • 후속 diff 40aac7c27f0d19794580bf3381e82e6358abbafd, 원 브랜치 PostgreSQL 7건 및 전체542건 clean build 성공(43s, 실패·오류·skip0). 허용된 임시 통합의 해당 클래스 PostgreSQL 7건도 통과했지만 이는 원인 확인을 위한 진단이며 시험 파일은 원본으로 복원했습니다.
  • 운영 diff db82442ce365315facb3e84effbf111a70618f6e와 기존 r2 HTTP 증거는 불변입니다. 테스트-only 수정 자체를 새 HTTP 재실행으로 표현하지 않으며, 별도 최종 통합에서 수행한 새 대표 API 검증은 아래 결과로 구분합니다.

독립 최종 통합 결과

  • 최신 PR119 b9f1d1c588fc167f41d3f6d1d268e76231d8c255를 포함한 선행·작업 14개 head를 조합해 파일 충돌0을 확인했습니다. 통합 HEAD b6a9442ea028ea63600310a26fd6191130df852c / tree 5f72cbd9dfeea691f6a9772eac03ad67fdc90adc에서 독립 clean build 981건이 성공했습니다(1m40s, 실패·오류·skip0). 이는 단독 r2 HTTP, 원 브랜치 542건, 임시 PostgreSQL 진단7건과 구분되는 최종 전체 조합 실행입니다.
  • 최종 tree의 새 실제 HTTP에서 ALT298+301+305 본인 일정 격리·day32 400/B001·삭제일0시간, 수락된 대타 원근무 삭제 후 승인409/B020 및 요청/대상 ACCEPTED·일정 DELETED·알림 digest 불변을 확인했습니다. 실제 동시 배정은 두 lock waiter 아래200/400·확정 저장1건, 잠금 timeout은429/E001·원상태 유지였습니다. 모든 단독 권한·수정 시나리오를 최종 통합에서 다시 실행한 결과는 아닙니다.
  • 승인된 V15 schema-only/matching Flyway history에서 부모 V16의 실제 적용·validate를 확인했습니다. 초기 V1 DDL 부재에 따른 대안이며 fresh V1 성공이 아닙니다. 자체 서버·PG/Redis·비밀 파일과 임시 통합 worktree 정리/포트 반납까지 완료했습니다. 근거는 integration-final.md와 독립 통합 로그·HTTP 단언입니다.

기준·통합·남은 QA

  • 기준 dev ed0dbea5ae250b9b234d54dee9a432d5ba58098f, head test/alt-305, draft base dev.
  • ALT298과 같은 query adapter가 겹칩니다. 본 branch의 workspace 전체조회는 ALT298 이전 정책이므로 본인 격리 해결로 주장하지 않습니다. ALT298의 월query 변경과 이번 일query 삭제제외를 모두 유지해야 합니다.
  • ALT301과 실제 수정 파일은 query adapter가 겹칩니다. 잠금 패치를 이 브랜치에 가져오지 않았고 순차305 흐름을 동시성 해결로 표현하지 않습니다. ALT301의 잠금 조회·승인 경로와 본 PR의 삭제상태 정책은 위 독립 최종 조합에서 검증했습니다. PR111의 기존 버그 기대 테스트는 test-only 후속에서 deleted-row ForUpdate query 계약으로 분리됐습니다. 실제 병합 시 ALT298→ALT301→ALT305 순서와 양쪽 변경 보존을 고려해야 합니다.
  • PR105 예상수입 변경은 제외했습니다. 같은 query/entity 파일의 merge-tree 충돌 및 기존 소득/응답 정책 보존을 확인해야 합니다. ALT311 일반·동시성 회귀와 연계하되 각 standalone 검증을 합친 성공으로 표현하지 않습니다.
  • 새 migration0. E2E는 V15 schema-only/Flyway history baseline이며 저장소 초기V1 DDL 부재로 fresh V1 검증이 아닙니다. 사용자 승인 최종 통합은 V15 snapshot→선행PR107 V16 기준입니다.
  • FE 날짜모달/수정·해제·삭제/근무자선택/상세 딥링크·캐시·배포 SHA는 미검증입니다. 삭제 알림은 추가하지 않았고 필요 여부 정책은 미확정입니다. 기존 workspace day 무시 및 상세 route 부재를 유지합니다.
  • Notion: https://app.notion.com/p/3ef86553162881099d0ce9df4e0c0435 (진행 중, 최종문서화/QA 후속)

@coderabbitai

coderabbitai Bot commented Oct 4, 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

Comment @coderabbitai help to get the list of available commands.

@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.

리뷰했습니다. 인라인 코멘트 확인 부탁드립니다.

@Operation(summary = "대타 요청 승인", description = "대타 요청을 승인하고 실제 스케줄을 교환합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "승인 성공"),
@ApiResponse(responseCode = "409", description = "삭제된 근무 일정 또는 수락자의 시간 충돌 (CONFLICT / B020)"),

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.

새로 추가된 409 응답에는 content가 없어서, Swagger에서 이 응답의 본문 형식이 보이지 않을 것 같습니다.
같은 메서드의 400/403/404 응답은 모두 content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))로 되어 있으니, 409도 같은 형식으로 맞춰 두면 어떨까요?

@hodoon hodoon self-assigned this Oct 21, 2026
hodoon added a commit that referenced this pull request Oct 22, 2026
#105(ALT-287) 위로 옮기면서 본인 일 조회 필터와 없는 날짜 400 처리는 #105 구현을 따른다.
#105가 UseCase에서 DateTimeException을 B001로 바꾸므로 같은 목적의 @AssertTrue 검증 테스트는 지우고,
DELETED만 제외하던 일 조회 기대값 테스트도 CONFIRMED만 보는 #105 동작과 맞지 않아 뺀다.
대타 승인 409 응답에는 다른 실패 응답과 같은 ErrorResponse 스키마를 붙인다.
@hodoon
hodoon changed the base branch from dev to fix/ALT-287 October 22, 2026 10:20
ysw789 and others added 4 commits October 22, 2026 19:22
#105(ALT-287) 위로 옮기면서 본인 일 조회 필터와 없는 날짜 400 처리는 #105 구현을 따른다.
#105가 UseCase에서 DateTimeException을 B001로 바꾸므로 같은 목적의 @AssertTrue 검증 테스트는 지우고,
DELETED만 제외하던 일 조회 기대값 테스트도 CONFIRMED만 보는 #105 동작과 맞지 않아 뺀다.
대타 승인 409 응답에는 다른 실패 응답과 같은 ErrorResponse 스키마를 붙인다.
@hodoon
hodoon changed the base branch from fix/ALT-287 to dev October 22, 2026 10:28
@hodoon
hodoon marked this pull request as ready for review October 28, 2026 13:34
@hodoon
hodoon merged commit d34f24c into dev Oct 28, 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