피우다프로젝트
.env.example파일을 참고해 루트 경로에.env를 생성합니다.- 애플리케이션은
application.yml을 통해 MySQL, Redis, JWT, OAuth2 Provider 정보를 환경 변수에서 주입받습니다. - Kakao idToken 흐름을 사용하는 경우
OAUTH_KAKAO_APP_CLIENT_ID(모바일 앱 키)를 별도로 설정해야 합니다.
- MySQL 8.x 인스턴스를 준비하고 UTF-8 환경으로
wearagain데이터베이스를 생성합니다. - Redis 서버를 실행하고 필요 시 비밀번호를
.env에 설정합니다. - Google, Kakao, Apple OAuth2 자격 증명을 발급 받아
.env에 입력합니다.
- GET
/api/v1/auth/google/authorize-url- 응답
{ "authorizationUrl": "https://accounts.google.com/o/oauth2/..." }
- 응답
- POST
/api/v1/auth/google/callback - 요청
{ "authorizationCode": "AUTHORIZATION_CODE" } - 성공 응답
{ "userId": "00000000-0000-0000-0000-000000000000", "email": "user@example.com", "displayName": "사용자", "profileImageUrl": "https://lh3.googleusercontent.com/...", "accessToken": "JWT_ACCESS_TOKEN", "refreshToken": "JWT_REFRESH_TOKEN", "accessTokenExpiresIn": 900, "refreshTokenExpiresIn": 1209600 } - 실패 시
A1001또는A1004에러 코드 사용
- GET
/api/v1/auth/kakao/authorize-url- 응답
{ "authorizationUrl": "https://kauth.kakao.com/oauth/authorize?..." } - Scope:
openid profile_nickname account_email
- 응답
- POST
/api/v1/auth/kakao/callback - 요청
{ "authorizationCode": "AUTHORIZATION_CODE" } - 성공 응답: Google과 동일 구조 (
userId는 UUID 문자열) - 실패 시
A1002(토큰/사용자 정보 조회 또는 이메일 미제공) 또는A1004(인가 코드 누락) 에러 코드 사용 - POST
/api/v1/auth/kakao/id-token - 요청
{ "idToken": "KAKAO_ID_TOKEN" } - 처리
- 전달된
idToken으로 카카오 사용자 정보를 검증 및 조회한다. - 사용자 정보가 존재하지 않으면 자동 회원가입을 수행하고 JWT를 발급한다.
- RTR 정책에 따라 Refresh Token을 회전시킨다.
- 전달된
- 성공 응답: Google과 동일 구조 (
userId는 UUID 문자열) - 실패 시
A1002(카카오 idToken 검증 실패/사용자 정보 조회 실패) 또는A1004(입력 파라미터 누락) 에러 코드 사용
- POST
/api/v1/auth/apple/callback - 요청
{ "code": "AUTHORIZATION_CODE", "id_token": "APPLE_ID_TOKEN" } - 성공 응답: Google과 동일 구조 (
userId는 UUID 문자열) - 실패 시
A1003또는A1004에러 코드 사용
- POST
/api/v1/auth/refresh - 요청
{ "refreshToken": "JWT_REFRESH_TOKEN" } - 성공 응답
{ "accessToken": "NEW_JWT_ACCESS_TOKEN", "refreshToken": "NEW_JWT_REFRESH_TOKEN" } - 실패 시
A1005(만료/불일치) 또는A1007(재사용) 에러 코드 사용
모든 인증 관련 API는 다음 표준 구조를 따른다.
{
"timestamp": "2025-10-04T12:34:56",
"statusCode": 401,
"errorCode": "A1001",
"message": "에러 설명 메시지",
"path": "/api/v1/auth/..."
}| 코드 | HTTP Status | 메시지 |
|---|---|---|
| C1000 | 500 Internal Server Error | 서버 내부 오류가 발생했습니다. |
| C1001 | 400 Bad Request | 잘못된 요청입니다. |
| C1002 | 401 Unauthorized | 인증이 필요합니다. |
| C1003 | 403 Forbidden | 접근이 거부되었습니다. |
| 코드 | HTTP Status | 메시지 |
|---|---|---|
| A1001 | 401 Unauthorized | Google 토큰 발급 실패 또는 사용자 정보 조회 실패 |
| A1002 | 401 Unauthorized | Kakao 토큰 발급/사용자 정보 조회 실패 또는 이메일 미제공 |
| A1003 | 401 Unauthorized | Apple 토큰 발급 또는 사용자 정보 조회 실패 |
| A1004 | 400 Bad Request | 인가 코드가 필요합니다. |
| A1005 | 401 Unauthorized | Refresh Token 만료 또는 불일치 |
| A1006 | 401 Unauthorized | Access Token이 만료되었습니다. |
| A1007 | 401 Unauthorized | 재사용된 Refresh Token 입니다. |
| 코드 | HTTP Status | 메시지 |
|---|---|---|
| AD1001 | 400 Bad Request | 입력 값이 유효하지 않습니다. |
| AD1002 | 401 Unauthorized | 이메일 또는 비밀번호가 올바르지 않습니다. |
| AD1003 | 403 Forbidden | 승인되지 않은 계정입니다. |
| AD1004 | 403 Forbidden | SUPER_ADMIN 권한이 필요합니다. |
| AD1005 | 409 Conflict | 이미 처리된 신청입니다. |
| AD1006 | 409 Conflict | 이미 등록된 이메일입니다. |
| AD1007 | 410 Gone | 가입 신청이 만료되었습니다. |
| AD1008 | 500 Internal Server Error | 관리자 인증 처리 중 오류가 발생했습니다. |
| AD1009 | 401 Unauthorized | 관리자 인증 토큰이 유효하지 않습니다. |
| 코드 | HTTP Status | 메시지 |
|---|---|---|
| E1001 | 400 Bad Request | 필수 입력 값이 누락되었습니다. |
| E1002 | 400 Bad Request | 행사 기간이 유효하지 않습니다. |
| E1003 | 400 Bad Request | 옵션 트리 깊이가 허용 범위를 초과했습니다. |
| E1004 | 400 Bad Request | 옵션 정보가 올바르지 않습니다. |
| E1005 | 400 Bad Request | 이미지 정보가 올바르지 않습니다. |
| E1006 | 409 Conflict | 중복된 옵션이 존재합니다. |
| E1007 | 403 Forbidden | 행사 등록 권한이 없습니다. |
| E1008 | 500 Internal Server Error | 행사 등록 처리 중 오류가 발생했습니다. |
| E1009 | 500 Internal Server Error | 이미지 업로드 처리 중 오류가 발생했습니다. |
| E1010 | 404 Not Found | 행사를 찾을 수 없습니다. |
| E1011 | 400 Bad Request | 행사를 신청할 수 없는 상태입니다. |
| E1012 | 404 Not Found | 행사 옵션을 찾을 수 없습니다. |
| E1013 | 409 Conflict | 이미 신청한 행사입니다. |
| E1014 | 409 Conflict | 신청 가능 인원이 초과되었습니다. |
| E1015 | 404 Not Found | 신청 정보를 찾을 수 없습니다. |
| E1016 | 409 Conflict | 취소할 수 없는 신청 상태입니다. |
| E1017 | 400 Bad Request | 행사 조회 요청이 올바르지 않습니다. |
| E1018 | 409 Conflict | 이미 보관 처리된 행사입니다. |
| E1019 | 409 Conflict | 이미 처리된 신청입니다. |
| E1020 | 404 Not Found | 행사 담당 관리자를 찾을 수 없습니다. |
| E1021 | 403 Forbidden | 행사 수정 권한이 없습니다. |
| E1022 | 403 Forbidden | 행사 상태 변경 권한이 없습니다. |
| E1023 | 409 Conflict | 허용되지 않은 상태 전환입니다. |
| E1024 | 403 Forbidden | 스태프 코드를 발급할 권한이 없습니다. |
| E1025 | 404 Not Found | 스태프 코드가 발급되지 않았습니다. |
- 행사 엔티티에 이용 방법(
usageGuide), 주의 사항(precautions) 텍스트 필드를 추가해 관리자 생성·수정·상세 응답에서 노출합니다. - 사용자 신청 내역 리스트 응답은 행사 상태(
eventStatus) 중심으로 단순화해 커서 기반 페이징과 함께 제공합니다. - 체크인 QR 발급 응답은
qrToken,expiresIn(초 단위)만 반환하며, 발급 시CheckinTokenUtil이 사용자별 기존 토큰을 즉시 제거합니다.
행사 담당 관리자(organizerAdmin) 또는 ADMIN/SUPER_ADMIN 역할의 관리자는 다음 API로 현장 스태프용 6자리 숫자 코드를 관리합니다. 코드는 DB event.staff_code 컬럼에 저장되며 만료 시간 없이 유지됩니다.
- POST
/api/v1/admin/events/{eventId}/staff-code- 새 6자리 숫자 코드를 발급하고 기존 코드가 있다면 즉시 대체합니다.
- 응답 예시
{ "eventId": 101, "staffCode": "023941", "issuedAt": "2025-02-01T10:15:20Z" } - MANAGER 역할 사용자는 organizerAdmin 본인일 때만 호출할 수 있으며, 그렇지 않거나 미인증인 경우
E1024가 반환됩니다. ADMIN/SUPER_ADMIN은 행사 담당자가 아니어도 호출할 수 있습니다.
- GET
/api/v1/admin/events/{eventId}/staff-code- 이미 발급된 스태프 코드를 조회합니다. ADMIN/SUPER_ADMIN은 담당자가 아니어도 조회할 수 있으며, MANAGER는 organizerAdmin 본인일 때만 가능합니다.
- 코드가 없다면
E1025에러가 발생합니다.
발급·조회는 모두 관리자 인증 토큰이 필요하며, 응답의 issuedAt은 UTC 기준입니다.
- GET
/api/v1/events/applications- 사용자 자신의 신청 내역을 커서 기반으로 조회합니다.
status,from,to,cursor,limit파라미터를 지원하며 응답에items,nextCursor,hasNext가 포함됩니다.
- POST
/api/v1/events/applications/{applicationId}/qr- 신청이
APPLIED상태인 경우 32자리 QR 토큰(UUID, 하이픈 없는 문자열)을 발급하고 Redis(event:qr:{userId})에 10분 TTL로 저장합니다. - 토큰 발급 시 기존 토큰은 삭제되며, 응답에는
qrToken,expiresIn(600)이 포함됩니다.
- 신청이
- 관리자(Admin)
POST /api/v1/admin/events: 행사 등록GET /api/v1/admin/events: offset 기반 목록 조회(상태 필터, 신청 통계, 담당 관리자 정보 포함)GET /api/v1/admin/events/{eventId}: 상세 조회(이미지, 옵션, 신청 목록, 담당 관리자 정보)PUT /api/v1/admin/events/{eventId}: 부분 수정(기본 정보/이미지/옵션)PATCH /api/v1/admin/events/{eventId}/status: 상태 변경(권한/전환 검증 포함)DELETE /api/v1/admin/events/{eventId}: 보관 처리(ARCHIVED)
- 사용자(User)
GET /api/v1/events: cursor 기반 행사 목록 조회GET /api/v1/events/{eventId}: 행사 상세 조회POST /api/v1/events/{eventId}/apply: 행사 신청PATCH /api/v1/events/applications/{applicationId}/cancel: 신청 취소POST /api/v1/events/applications/{applicationId}/qr: 체크인 QR 토큰 발급
- 스태프(Staff)
POST /api/v1/staff/events/check-in: QR 토큰과 스태프 코드를 검증해 신청 상태를CHECKED_IN으로 변경하고 Redis 토큰을 삭제합니다. 코드가 없으면E1025, 코드 불일치 시E1026, 토큰 만료 시E1027, 토큰 위변조 시E1028, 이미 처리된 신청이면E1019가 반환됩니다.