Skip to content

deploy: develop 배포 (연사자·대기 수락·마감일·사용자 검색) - #51

Merged
jyuuuuu0 merged 46 commits into
mainfrom
develop
Sep 3, 2026
Merged

deploy: develop 배포 (연사자·대기 수락·마감일·사용자 검색)#51
jyuuuuu0 merged 46 commits into
mainfrom
develop

Conversation

@jyuuuuu0

@jyuuuuu0 jyuuuuu0 commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

📋 개요

develop에 쌓인 12개 PR을 프로덕션에 내보내기 위한 배포 PR입니다. 백엔드 마지막 배포는 2026-08-27(PR #39)이고, 그 뒤 머지된 기능이 전부 배포되지 않은 상태입니다. CD는 main push에서만 돌기 때문에 이 PR이 머지돼야 실제로 나갑니다.

프론트에서는 Rels-front #49가 이미 머지됐고, 그 화면들이 여기 담긴 API에 의존합니다. 이 PR이 프론트 배포보다 먼저 나가야 합니다. 순서가 바뀌면 연사자 검색이 404, 신청자 명단이 403입니다.

✅ 작업 내용

🔗 관련 이슈

없음

🧪 테스트

  • ./gradlew test 통과 (30 tests, 0 failures)
  • 마감 후 취소 동작에 대한 테스트 2개 추가
  • CI 초록, 충돌 해소 완료

💬 리뷰어에게

main에만 있던 핫픽스 두 건이 develop에 없어 충돌 상태였습니다. a502366에서 백머지하며 재적용했습니다. 그냥 develop 쪽으로 풀었으면 프로덕션 수정 두 건이 되돌아갔을 자리라, 이 커밋을 중점적으로 봐주세요.

핫픽스 #38 — 신청 시각 UTC 비교 (de764e2)

develop이 시간 판단을 LectureTimeValidator로 옮기면서 빠졌습니다. SCHOOL_ZONE, schoolTimeNow(), toSchoolTime()을 되살리고, validateApplicationTime에 넘기는 approvedAt·createdAt을 한국 시간으로 옮겨서 넘깁니다.

서버는 UTC로 도는데 applicationDeadline은 사용자가 한국 시간으로 넣은 값이 그대로 저장되므로, 변환 없이 비교하면 9시간이 밀립니다. 변환 없이 두면 approvalTime.toLocalDate().atTime(16, 20)이 한국 시간 다음 날 01:20이 됩니다.

라이프사이클 갱신과 스케줄러(syncLectureStatuses)도 전부 schoolTimeNow() 기준으로 통일했습니다.

핫픽스 #39 — 마감 후 신청 취소 차단 (d8ff54f) — 그대로 복원하지 않았습니다

핫픽스는 마감 뒤 취소를 전부 403으로 막았는데, develop에서 마감 뒤 신청은 거절 대신 대기로 들어가고 수락해야 확정되는 것으로 바뀌었습니다. 프론트도 이 전제로 마감 뒤 대기 취소를 열어 둔 상태라, 그대로 복원하면 그 화면이 403을 받습니다.

확정된 신청(ENROLLED)만 마감 후 잠그고, 대기(WAITING)는 아직 자리를 차지한 게 아니라서 마감 뒤에도 스스로 뺄 수 있게 했습니다. 프론트 현재 동작과 일치합니다.

if (canceledStatus == EnrollmentStatus.ENROLLED && isAfterApplicationDeadline(lecture, now)) {
    throw new ResponseStatusException(HttpStatus.FORBIDDEN, "신청 마감 후에는 확정된 신청을 취소할 수 없습니다.");
}

cancelRejectsConfirmedEnrollmentAfterDeadline, cancelAllowsWaitingEnrollmentAfterDeadline 두 테스트로 덮었습니다.

복원하지 않은 것: 자동 대기 승급(promoteFirstWaitingUser, promoteWaitingAfterDeadline)은 develop이 개설자·학생회의 수동 수락으로 대체한 것이라 되살리지 않았습니다. enrollmentOpenAt()extractGradeFromStudentNumber()LectureService 사본도 각각 LectureTimeValidatorLectureLifecycleHandler로 옮겨간 뒤라 정리했습니다.

⚠️ 주의사항

  • 머지 즉시 CD가 돌아 프로덕션에 배포됩니다.
  • 프론트보다 먼저 배포돼야 합니다.
  • 디스코드 봇(Rels-Bot)은 영향 없음을 확인했습니다. GET /api/lectures/discord만 호출하는 읽기 전용이고(코드에 쓰기 호출 자체가 없습니다), 필드 조회도 camelCase·snake_case를 모두 시도하는 방식이라 응답 변화에 관대합니다.
  • maindevelop 백머지는 이번 a502366으로 이미 끝냈습니다. 이 PR 머지 후에는 추가 백머지가 필요 없습니다.

🤖 Generated with Claude Code

https://claude.ai/code/session_0148L349fQXWstcyAaHxxL6h

sooooooobinn and others added 30 commits August 28, 2026 13:55
refactor: 강연 신청 마감일 설정 리팩토링
- LectureEntity에 approvedAt 필드 추가 (승인 시간 자동 저장)
- LectureSummaryResponse, LectureDetailResponse에 approvedAt 필드 추가
- LectureService의 toLectureSummary, toLectureDetail 메서드에 approvedAt 포함
- 강연 승인 시 현재 시간이 자동으로 approvedAt에 저장됨
- 강연 조회 API 응답에 승인 시간 정보 포함

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
feat: 연사자 추가 기능 구현
feat: 리프레시 토큰 API 추가
sooooooobinn and others added 16 commits September 2, 2026 00:39
feat: 신청 대기 학생 수락/거절 기능 추가
refactor: 최대 정원 30명 제한 제거
연사자를 고르려면 userId를 찾을 수단이 필요해 이름·학번으로 찾는
GET /api/users를 추가했습니다. 신청자·대기자 명단은 누가 신청했는지 보고
판단하는 정보라 학생 누구나 볼 수 있게 열고, 누가 거절됐는지는 명단에 뿌릴
정보가 아니라서 개설자와 학생회에게만 내려줍니다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UgrkxvMHthfMoDbaZHHDwZ
강연 생성·수정 요청에 applicationDeadline을 되살립니다. 값을 보내면 그대로
쓰고, 비워서 보내면 예전처럼 강연 전 주 목요일 23:59:59로 계산합니다.
강연 시작 이후로 마감을 잡으면 400으로 막습니다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UgrkxvMHthfMoDbaZHHDwZ
feat: 승인 시각 기준 신청 오픈 시간 적용
refactor: 신청 마감일 설정 변경
develop이 applicationDeadline을 필수(@NotNull @future)로 받고
validateApplicationDeadline으로 검증하도록 먼저 병합돼, 같은 기능을
선택 입력으로 구현했던 브랜치 쪽 resolveApplicationDeadline은 걷어냈습니다.
사용자 검색 API와 신청자 명단 공개 범위 변경은 그대로 유지합니다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0148L349fQXWstcyAaHxxL6h
…visibility

feat: 사용자 검색 API 추가 및 신청자 명단 공개 범위 조정
배포된 main에만 있던 핫픽스 두 건이 develop에 없어 develop -> main 배포가
충돌 상태였습니다. 그냥 develop 쪽으로 풀면 프로덕션 수정이 되돌아갑니다.

핫픽스 #38(신청 시각 UTC 비교)은 develop이 시간 판단을 LectureTimeValidator로
옮기면서 빠졌습니다. SCHOOL_ZONE/schoolTimeNow/toSchoolTime을 되살리고,
validateApplicationTime에 넘기는 approvedAt·createdAt을 한국 시간으로 옮겨
넘깁니다. 서버는 UTC로 도는데 마감 시각은 사용자가 한국 시간으로 넣은 값이
그대로 저장되어, 변환 없이 비교하면 9시간이 밀립니다.

핫픽스 #39(마감 후 취소 차단)는 그대로 되살리지 않았습니다. develop에서
마감 뒤 신청은 거절 대신 대기로 들어가고 수락해야 확정되는 것으로 바뀌었고,
프론트도 마감 뒤 대기 취소를 열어 둔 상태입니다. 확정된 신청(ENROLLED)만
마감 후 잠그고, 대기는 아직 자리가 아니라서 스스로 뺄 수 있게 했습니다.

자동 대기 승급(promoteFirstWaitingUser, promoteWaitingAfterDeadline)은
develop이 수동 수락으로 대체했으므로 복원하지 않았습니다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0148L349fQXWstcyAaHxxL6h
@jyuuuuu0 jyuuuuu0 self-assigned this Sep 3, 2026
@jyuuuuu0
jyuuuuu0 merged commit e367de9 into main Sep 3, 2026
2 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