You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
목록은 커서 페이지네이션으로 행사 시작이 가까운 순서대로 내려주고, 상세는 행사 내용·장소·일정·이미지를 함께 내려줍니다.
두 API 모두 모집 상태와 마감까지 남은 일수(D-Day)를 저장값이 아니라 조회 시점의 신청 기간·정원·강제 마감 여부로 계산하며, 계산 규칙은 Event.calculateRecruitStatus(#23)를 그대로 재사용합니다.
운영진이 아직 공개하지 않은 행사가 노출되면 안 되므로 events 테이블에 is_published 컬럼을 추가합니다.
Method
Endpoint
설명
GET
/v1/app/events
행사 목록 조회 (커서 페이지네이션, 모집 상태 필터)
GET
/v1/app/events/{eventId}
행사 상세 조회
명세서 초안은 엔드포인트를 /v1/users/...로 적고 있으나, config-and-auth.md 4절·architecture.md가 학생 앱을 /v1/app/**로 규정하고 SecurityConfig도 이 패턴으로 인가를 겁니다. #23의 폼 조회·신청도 /v1/app/events/**라 경로를 통일했습니다. 명세서 수정이 필요합니다.
📝 작업 상세 내용
공통 / 스키마
events 테이블에 is_published 컬럼 추가 (Flyway V5) 및 목록 조회용 복합 인덱스 생성
Event 도메인·EventJpaEntity에 published 필드 반영
커서 페이지네이션 공통 처리 — CursorSliceResult/CursorSliceResponse의 nextCursor를 불투명 문자열로 전환하고 CursorCodec(Base64 URL-safe) 추가
목록 조회 — GET /v1/app/events
EventCursor(eventStartAt, eventId keyset) 추가
EventSummary 추가 — 대표 이미지 추출, D-Day 계산, 모집 상태는 Event.calculateRecruitStatus에 위임
EventRepository.findPublishedSlice 및 JPQL 구현 — keyset 조회 + 모집 상태 필터 + 신청자 수 배치 집계
EventService.getPublishedEvents 추가
엔드포인트 추가 (cursor, size, recruitStatus 쿼리 파라미터)
상세 조회 — GET /v1/app/events/{eventId}
D-Day 계산을 Event.daysUntilDeadline(...) 도메인 메서드로 승격하고 EventSummary가 이를 호출하도록 정리
EventDetail 추가 — 상세 필드 + 계산된 모집 상태·D-Day + 이미지 id 목록
EventRepository.findPublishedById 추가 — 게시되고 삭제되지 않은 행사만 조회
EventService.getPublishedEvent 추가 — 없거나 미게시면 EVENT_NOT_FOUND
EventDetailResponse(중첩 Image record) 및 엔드포인트 추가
테스트
도메인 단위 테스트 — 모집 상태 판정, D-Day 경계, 커서 왕복·형식 오류, 모집 상태 파싱
📁 참고 자료 (선택)
행사 신청서 폼 조회/신청 API 추가 #23 (행사 신청서 폼 조회/신청 API) 위에 쌓는 작업입니다. Event·EventRepository·EventService·AppEventController 등을 공유하므로 해당 PR 머지 후 main으로 리베이스합니다.
이미지 URL은 파일 업로드 도메인(파일 업로드 도메인 개발 #17)이 머지되어야 조립할 수 있어, 이번 작업에서는 응답 필드만 두고 null로 내려갑니다. (목록의 thumbnailUrl, 상세의 images[].fileUrl)
D-Day는 서버의 한국 시간대 날짜 기준으로 계산합니다. 코드는 LocalDateTime.now()를 쓰므로 운영 서버의 JVM 기본 타임존이 Asia/Seoul이어야 합니다.
어떤 기능인가요?
학생 앱에서 게시된 행사의 목록과 상세를 조회하는 API를 추가합니다.
목록은 커서 페이지네이션으로 행사 시작이 가까운 순서대로 내려주고, 상세는 행사 내용·장소·일정·이미지를 함께 내려줍니다.
두 API 모두 모집 상태와 마감까지 남은 일수(D-Day)를 저장값이 아니라 조회 시점의 신청 기간·정원·강제 마감 여부로 계산하며, 계산 규칙은
Event.calculateRecruitStatus(#23)를 그대로 재사용합니다.운영진이 아직 공개하지 않은 행사가 노출되면 안 되므로
events테이블에is_published컬럼을 추가합니다.GET/v1/app/eventsGET/v1/app/events/{eventId}📝 작업 상세 내용
공통 / 스키마
events테이블에is_published컬럼 추가 (Flyway V5) 및 목록 조회용 복합 인덱스 생성Event도메인·EventJpaEntity에published필드 반영CursorSliceResult/CursorSliceResponse의nextCursor를 불투명 문자열로 전환하고CursorCodec(Base64 URL-safe) 추가목록 조회 —
GET /v1/app/eventsEventCursor(eventStartAt,eventIdkeyset) 추가EventSummary추가 — 대표 이미지 추출, D-Day 계산, 모집 상태는Event.calculateRecruitStatus에 위임EventRepository.findPublishedSlice및 JPQL 구현 — keyset 조회 + 모집 상태 필터 + 신청자 수 배치 집계EventService.getPublishedEvents추가cursor,size,recruitStatus쿼리 파라미터)상세 조회 —
GET /v1/app/events/{eventId}Event.daysUntilDeadline(...)도메인 메서드로 승격하고EventSummary가 이를 호출하도록 정리EventDetail추가 — 상세 필드 + 계산된 모집 상태·D-Day + 이미지 id 목록EventRepository.findPublishedById추가 — 게시되고 삭제되지 않은 행사만 조회EventService.getPublishedEvent추가 — 없거나 미게시면EVENT_NOT_FOUNDEventDetailResponse(중첩Imagerecord) 및 엔드포인트 추가테스트
📁 참고 자료 (선택)
Event·EventRepository·EventService·AppEventController등을 공유하므로 해당 PR 머지 후main으로 리베이스합니다.null로 내려갑니다. (목록의thumbnailUrl, 상세의images[].fileUrl)LocalDateTime.now()를 쓰므로 운영 서버의 JVM 기본 타임존이Asia/Seoul이어야 합니다.