| 항목 | 내용 |
|---|---|
| Domain | User |
| 기능 | 새로운 사용자 회원가입 |
| HTTP Method | POST |
| API Path | /user/sign-up |
| 토큰 필요 | X |
Request Body
{
"name": "string",
"gender": "MALE|FEMALE",
"phone": "string",
"maleCount": 0,
"femaleCount": 0,
"birthYMD": "string",
"residence": "string",
"privacyAgreed": true,
"purpose": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| name | string | O | 이름 |
| gender | string | O | 성별 (MALE, FEMALE) |
| phone | string | O | 전화번호 |
| maleCount | int | O | 남자 동행인 수 |
| femaleCount | int | O | 여자 동행인 수 |
| birthYMD | string | O | 생년월일 |
| residence | string | O | 거주지 |
| privacyAgreed | boolean | O | 개인정보 동의 |
| purpose | string | O | 방문목적 |
Response (201 Created)
{
"userId": "string"
}| 필드 | 타입 | 설명 |
|---|---|---|
| userId | string | 생성된 사용자 ID |
Error List
401 USER_EXIST - 유저가 이미 존재합니다
400 BAD_REQUEST - 요청 데이터 검증 실패
| 항목 | 내용 |
|---|---|
| Domain | User |
| 기능 | 기존 사용자 로그인 (방문 체크인) |
| HTTP Method | POST |
| API Path | /user/login |
| 토큰 필요 | X |
Request Body
{
"userId": "string",
"purpose": "string",
"maleCount": 0,
"femaleCount": 0
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| userId | string | O | 사용자 ID |
| purpose | string | O | 방문목적 |
| maleCount | int | O | 남자 동행인 수 |
| femaleCount | int | O | 여자 동행인 수 |
Response (200 OK)
없음 (void)
Error List
404 USER_NOT_FOUND - 해당 유저가 존재하지 않습니다
400 BAD_REQUEST - 요청 데이터 검증 실패
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 관리자 계정 로그인 |
| HTTP Method | POST |
| API Path | /admin/login |
| 토큰 필요 | X |
Request Body
{
"password": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| password | string | O | 비밀번호 |
Response (200 OK)
{
"accessToken": "string",
"refreshToken": "string"
}| 필드 | 타입 | 설명 |
|---|---|---|
| accessToken | string | JWT Access Token |
| refreshToken | string | JWT Refresh Token |
Error List
404 ADMIN_NOT_FOUND - 해당 관리자 계정이 존재하지 않습니다
401 PASSWORD_MISMATCH - 비밀번호가 일치하지 않습니다
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 새로운 관리자 계정 생성 |
| HTTP Method | POST |
| API Path | /admin/create |
| 토큰 필요 | X |
Request Body
{
"password": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| password | string | O | 비밀번호 |
Response (200 OK)
{
"accessToken": "string",
"refreshToken": "string"
}Error List
400 BAD_REQUEST - 요청 데이터 검증 실패
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 관리자 비밀번호 변경 |
| HTTP Method | PATCH |
| API Path | /admin/change |
| 토큰 필요 | O (Access Token) |
Request Body
{
"oldPassword": "string",
"newPassword": "string",
"confirmNewPassword": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| oldPassword | string | O | 기존 비밀번호 |
| newPassword | string | O | 새 비밀번호 |
| confirmNewPassword | string | O | 새 비밀번호 확인 |
Response (200 OK)
없음 (void)
Error List
404 ADMIN_NOT_FOUND - 해당 관리자 계정이 존재하지 않습니다
401 PASSWORD_MISMATCH - 비밀번호가 일치하지 않습니다
401 INVALID_PASSWORD_CONFIRM - 비밀번호 확인이 일치하지 않습니다
400 SAME_OLD_PASSWORD - 기존 비밀번호와 동일한 비밀번호로 변경할 수 없습니다
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | Access Token 재발급 |
| HTTP Method | PATCH |
| API Path | /admin/re-issue |
| 토큰 필요 | O (Refresh Token in Header) |
Request Header
Authentication: {refreshToken}
Response (200 OK)
{
"accessToken": "string",
"refreshToken": "string"
}Error List
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
401 EXPIRED_TOKEN - 만료된 토큰입니다
404 REFRESH_TOKEN_NOT_FOUND - RefreshToken이 존재하지 않습니다
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 전체 사용자 목록 조회 (페이지네이션) |
| HTTP Method | GET |
| API Path | /admin/user/all |
| 토큰 필요 | O (Access Token) |
Query Parameters
| 파라미터 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| page | int | 0 | 페이지 번호 |
| size | int | 30 | 페이지 크기 |
| sort | string | id,DESC | 정렬 기준 |
Response (200 OK)
{
"totalCount": 100,
"slice": {
"content": [
{
"id": 1,
"name": "string",
"age": "20대",
"gender": "MALE",
"phone": "string",
"birthYMD": "string",
"residence": "string",
"privacyAgreed": true,
"count": 5
}
],
"hasNext": true,
"number": 0,
"size": 30,
"numberOfElements": 30
}
}Error List
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 거주지 기준 사용자 목록 조회 |
| HTTP Method | GET |
| API Path | /admin/user |
| 토큰 필요 | O (Access Token) |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| residence | string | O | 거주지 |
| page | int | X | 페이지 번호 |
| size | int | X | 페이지 크기 |
Response (200 OK)
{
"totalCount": 50,
"slice": {
"content": [
{
"id": 1,
"name": "string",
"age": "20대",
"gender": "MALE",
"phone": "string",
"birthYMD": "string",
"residence": "string",
"privacyAgreed": true,
"count": 5
}
],
"hasNext": true,
"number": 0,
"size": 30,
"numberOfElements": 30
}
}Error List
400 INVALID_RESIDENCE - 존재하지 않는 거주지 이름입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 특정 사용자 상세 정보 조회 |
| HTTP Method | GET |
| API Path | /admin/user/{id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| id | long | 사용자 ID |
Response (200 OK)
{
"name": "string",
"userId": "string",
"phone": "string",
"birthYMD": "string",
"residence": "string"
}Error List
404 USER_NOT_FOUND - 해당 유저가 존재하지 않습니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 특정 사용자 정보 수정 |
| HTTP Method | PATCH |
| API Path | /admin/user/{id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| id | long | 사용자 ID |
Request Body
{
"name": "string",
"userId": "string",
"phone": "string",
"birthYMD": "string",
"residence": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| name | string | O | 이름 (최대 30자) |
| userId | string | O | 사용자 ID (최대 30자) |
| phone | string | O | 전화번호 (최대 11자) |
| birthYMD | string | O | 생년월일 |
| residence | string | O | 거주지 |
Response (200 OK)
없음 (void)
Error List
404 USER_NOT_FOUND - 해당 유저가 존재하지 않습니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
400 BAD_REQUEST - 요청 데이터 검증 실패
| 항목 | 내용 |
|---|---|
| Domain | Admin |
| 기능 | 월별 방문 로그 엑셀 파일 다운로드 |
| HTTP Method | GET |
| API Path | /admin/excel/{yearMonth} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| yearMonth | string | 년월 (예: "202501") |
Response (200 OK)
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Body: Excel 파일 (byte[])
Error List
507 EXCEL_GENERATION_FAILED - 엑셀 파일 생성 중 오류가 발생했습니다
400 INVALID_DATE - 유효하지 않은 날짜 형식입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Log |
| 기능 | 새로운 방문 로그 생성 |
| HTTP Method | POST |
| API Path | /log |
| 토큰 필요 | O (Access Token) |
Request Body
{
"name": "string",
"age": "TEENS|TWENTIES|THIRTIES|FORTIES|FIFTIES|SIXTIES|SEVENTIES_PLUS",
"phone": "string",
"maleCount": 0,
"femaleCount": 0,
"purpose": "string",
"visitDate": "string",
"privacyAgreed": true,
"visitTime": "string",
"residence": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| name | string | O | 이름 (최대 30자) |
| age | string | O | 나이대 (Enum 참조) |
| phone | string | O | 전화번호 (최대 30자) |
| maleCount | int | O | 남자 동행인 수 |
| femaleCount | int | O | 여자 동행인 수 |
| purpose | string | O | 방문목적 |
| visitDate | string | O | 방문 날짜 |
| privacyAgreed | boolean | O | 개인정보 동의 (true여야 함) |
| visitTime | string | O | 방문 시간 |
| residence | string | O | 거주지 |
Response (201 Created)
없음 (void)
Error List
409 DUPLICATE_LOG - 이미 해당 시간의 로그가 존재합니다
400 BAD_REQUEST - 요청 데이터 검증 실패
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Log |
| 기능 | 기존 방문 로그 수정 |
| HTTP Method | PATCH |
| API Path | /log/{log-id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| log-id | long | 로그 ID |
Request Body
{
"name": "string",
"age": "TEENS|TWENTIES|THIRTIES|FORTIES|FIFTIES|SIXTIES|SEVENTIES_PLUS",
"phone": "string",
"maleCount": 0,
"femaleCount": 0,
"purpose": "string",
"visitDate": "string",
"privacyAgreed": true,
"visitTime": "string",
"residence": "string"
}Response (204 No Content)
없음 (void)
Error List
404 LOG_NOT_FOUND - 존재하지 않는 이용목록입니다
409 DUPLICATE_LOG - 이미 해당 시간의 로그가 존재합니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Log |
| 기능 | 방문 로그 삭제 |
| HTTP Method | DELETE |
| API Path | /log/{log-id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| log-id | long | 로그 ID |
Response (204 No Content)
없음 (void)
Error List
404 LOG_NOT_FOUND - 존재하지 않는 이용목록입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Log |
| 기능 | 전체 방문 로그 목록 조회 (페이지네이션) |
| HTTP Method | GET |
| API Path | /log |
| 토큰 필요 | O (Access Token) |
Query Parameters
| 파라미터 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| page | int | 0 | 페이지 번호 |
| size | int | 30 | 페이지 크기 |
| sort | string | visitDate,id,DESC | 정렬 기준 |
Response (200 OK)
{
"content": [
{
"id": 1,
"name": "string",
"maleCount": 0,
"femaleCount": 0,
"visitDate": "string"
}
],
"hasNext": true,
"number": 0,
"size": 30,
"numberOfElements": 30
}Error List
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Log |
| 기능 | 특정 방문 로그 상세 조회 |
| HTTP Method | GET |
| API Path | /log/{log-id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| log-id | long | 로그 ID |
Response (200 OK)
{
"id": 1,
"name": "string",
"age": "TWENTIES",
"phone": "string",
"maleCount": 0,
"femaleCount": 0,
"purpose": "string",
"visitDate": "string",
"privacyAgreed": true
}Error List
404 LOG_NOT_FOUND - 존재하지 않는 이용목록입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Purpose |
| 기능 | 새로운 방문목적 생성 |
| HTTP Method | POST |
| API Path | /purpose |
| 토큰 필요 | O (Access Token) |
Request Body
{
"purpose": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| purpose | string | O | 방문목적 (1~30자) |
Response (201 Created)
없음 (void)
Error List
409 PURPOSE_ALREADY_EXIST - 이미 존재하는 방문 목적입니다
400 BAD_REQUEST - 요청 데이터 검증 실패
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Purpose |
| 기능 | 기존 방문목적 수정 |
| HTTP Method | PATCH |
| API Path | /purpose/{id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| id | long | 방문목적 ID |
Request Body
{
"purpose": "string"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| purpose | string | O | 방문목적 (1~30자) |
Response (200 OK)
없음 (void)
Error List
404 PURPOSE_NOT_FOUND - 존재하지 않는 방문목적입니다
409 PURPOSE_ALREADY_EXIST - 이미 존재하는 방문 목적입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Purpose |
| 기능 | 방문목적 삭제 |
| HTTP Method | DELETE |
| API Path | /purpose/{id} |
| 토큰 필요 | O (Access Token) |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| id | long | 방문목적 ID |
Response (204 No Content)
없음 (void)
Error List
404 PURPOSE_NOT_FOUND - 존재하지 않는 방문목적입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 항목 | 내용 |
|---|---|
| Domain | Purpose |
| 기능 | 특정 방문목적 조회 |
| HTTP Method | GET |
| API Path | /purpose/{id} |
| 토큰 필요 | X |
Path Parameters
| 파라미터 | 타입 | 설명 |
|---|---|---|
| id | long | 방문목적 ID |
Response (200 OK)
{
"id": 1,
"purpose": "string"
}Error List
404 PURPOSE_NOT_FOUND - 존재하지 않는 방문목적입니다
| 항목 | 내용 |
|---|---|
| Domain | Purpose |
| 기능 | 모든 방문목적 목록 조회 |
| HTTP Method | GET |
| API Path | /purpose/all |
| 토큰 필요 | X |
Response (200 OK)
[
{
"id": 1,
"purpose": "string"
},
{
"id": 2,
"purpose": "string"
}
]Error List
에러 없음
| 항목 | 내용 |
|---|---|
| Domain | Purpose |
| 기능 | 방문목적 표시 순서 변경 |
| HTTP Method | PATCH |
| API Path | /purpose/move |
| 토큰 필요 | O (Access Token) |
Request Body
{
"purposeId": [1, 3, 2, 4]
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| purposeId | long[] | O | 새로운 순서의 ID 배열 |
Response (200 OK)
없음 (void)
Error List
404 PURPOSE_NOT_FOUND - 존재하지 않는 방문목적입니다
401 INVALID_TOKEN - 유효하지 않은 토큰입니다
| 에러 코드 | HTTP 상태 | 설명 |
|---|---|---|
| INVALID_TOKEN | 401 | 유효하지 않은 토큰입니다 |
| EXPIRED_TOKEN | 401 | 만료된 토큰입니다 |
| REFRESH_TOKEN_NOT_FOUND | 404 | RefreshToken이 존재하지 않습니다 |
| INVALID_ROLE | 401 | 유효하지 않은 역할입니다 |
| 에러 코드 | HTTP 상태 | 설명 |
|---|---|---|
| USER_NOT_FOUND | 404 | 해당 유저가 존재하지 않습니다 |
| USER_MISMATCH | 401 | 유저가 일치하지 않습니다 |
| INVALID_USER | 401 | 유효하지 않은 사용자입니다 |
| USER_EXIST | 401 | 유저가 이미 존재합니다 |
| COMPANION_NOT_FOUND | 404 | 존재하지 않는 동행인 ID입니다 |
| 에러 코드 | HTTP 상태 | 설명 |
|---|---|---|
| ADMIN_NOT_FOUND | 404 | 해당 관리자 계정이 존재하지 않습니다 |
| PASSWORD_MISMATCH | 401 | 비밀번호가 일치하지 않습니다 |
| INVALID_PASSWORD_CONFIRM | 401 | 비밀번호 확인이 일치하지 않습니다 |
| SAME_OLD_PASSWORD | 400 | 기존 비밀번호와 동일한 비밀번호로 변경할 수 없습니다 |
| 에러 코드 | HTTP 상태 | 설명 |
|---|---|---|
| LOG_NOT_FOUND | 404 | 존재하지 않는 이용목록입니다 |
| DUPLICATE_LOG | 409 | 이미 해당 시간의 로그가 존재합니다 |
| 에러 코드 | HTTP 상태 | 설명 |
|---|---|---|
| PURPOSE_NOT_FOUND | 404 | 존재하지 않는 방문목적입니다 |
| PURPOSE_ALREADY_EXIST | 409 | 이미 존재하는 방문 목적입니다 |
| 에러 코드 | HTTP 상태 | 설명 |
|---|---|---|
| INVALID_RESIDENCE | 400 | 존재하지 않는 거주지 이름입니다 |
| EXCEL_GENERATION_FAILED | 507 | 엑셀 파일 생성 중 오류가 발생했습니다 |
| INVALID_DATE | 400 | 유효하지 않은 날짜 형식입니다 |
| BAD_REQUEST | 400 | 잘못된 요청입니다 |
| INTERNAL_SERVER_ERROR | 500 | 서버 내부 오류입니다 |
| 값 | 설명 |
|---|---|
| MALE | 남성 |
| FEMALE | 여성 |
| 값 | 라벨 |
|---|---|
| TEENS | 10대 |
| TWENTIES | 20대 |
| THIRTIES | 30대 |
| FORTIES | 40대 |
| FIFTIES | 50대 |
| SIXTIES | 60대 |
| SEVENTIES_PLUS | 70대 이상 |
모든 에러 응답은 다음 형식으로 반환됩니다:
{
"message": "에러 메시지",
"status": 400,
"timestamp": "2026-01-26T15:30:45.123456",
"description": "상세 설명"
}- Access Token: API 요청 시 사용
- Refresh Token: Access Token 갱신 시 사용
Header:
Authorization: Bearer {accessToken}
토큰 갱신 시:
Authentication: {refreshToken}
- O: 토큰 필요 (Authorization 헤더에 Bearer 토큰 포함)
- X: 토큰 불필요 (공개 API)