소개
핀업 API 문서 입니다.
Member API
닉네임 생성
Curl request
Snippet curl-request not found for operation::generatedNickname
HTTP request
Snippet http-request not found for operation::generatedNickname
HTTP response
Snippet http-response not found for operation::generatedNickname
닉네임 수정
Curl request
Snippet curl-request not found for operation::members-update-nickname
Request fields
Snippet request-fields not found for operation::members-update-nickname
HTTP request
Snippet http-request not found for operation::members-update-nickname
HTTP response
Snippet http-response not found for operation::members-update-nickname
Response fields
Snippet response-fields not found for operation::members-update-nickname
회원 탈퇴
Curl request
Snippet curl-request not found for operation::members-disable
Request fields
Snippet request-fields not found for operation::members-disable
HTTP request
Snippet http-request not found for operation::members-disable
HTTP response
Snippet http-response not found for operation::members-disable
Response fields
Snippet response-fields not found for operation::members-disable
로그아웃
Curl request
Snippet curl-request not found for operation::members-logout
HTTP request
Snippet http-request not found for operation::members-logout
HTTP response
Snippet http-response not found for operation::members-logout
Response fields
Snippet response-fields not found for operation::members-logout
팝업스토어 API
전체 조회
Curl request
$ curl 'http://localhost:8080/api/stores' -i -X GET
HTTP request
GET /api/stores HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 2048
[ {
"id" : 1,
"name" : "store",
"description" : "description",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"websiteUrl" : "",
"snsUrl" : "https://instgram.com/test",
"viewCount" : 0,
"category" : {
"id" : 1,
"name" : "뷰티",
"createdAt" : "2025-08-30T08:32:51.998569492",
"updatedAt" : null
},
"location" : {
"id" : 1,
"name" : "서울 송파구 올림픽로 300",
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.513713,
"longitude" : 127.104302,
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : ""
},
"operatingHours" : [ {
"days" : "월~금",
"startTime" : "08:32:51.998582347",
"endTime" : "18:32:51.998584771"
} ],
"storeImages" : [ {
"id" : 1,
"storeId" : 1,
"imageUrl" : "http://127.0.0.1:4566/pinup/store/image1.png",
"isThumbnail" : true
} ],
"createdAt" : "2025-08-30T08:32:51.998594269",
"updatedAt" : null
}, {
"id" : 1,
"name" : "store",
"description" : "description",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"websiteUrl" : "",
"snsUrl" : "https://instgram.com/test",
"viewCount" : 0,
"category" : {
"id" : 1,
"name" : "뷰티",
"createdAt" : "2025-08-30T08:32:51.998599679",
"updatedAt" : null
},
"location" : {
"id" : 1,
"name" : "서울 송파구 올림픽로 300",
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.513713,
"longitude" : 127.104302,
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : ""
},
"operatingHours" : [ {
"days" : "월~금",
"startTime" : "08:32:51.998602895",
"endTime" : "18:32:51.998604157"
} ],
"storeImages" : [ {
"id" : 1,
"storeId" : 1,
"imageUrl" : "http://127.0.0.1:4566/pinup/store/image1.png",
"isThumbnail" : true
} ],
"createdAt" : "2025-08-30T08:32:51.998607013",
"updatedAt" : null
} ]
Response fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어 아이디 |
|
|
팝업스토어명 |
|
|
팝업스토어 설명 |
|
|
팝업스토어 상태 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 참고 홈페이지 주소 |
|
|
팝업스토어 참고 SNS 주소 |
|
|
팝업스토어 조회수 |
|
|
팝업스토어 카테고리 아이디 |
|
|
팝업스토어 카테고리명 |
|
|
팝업스토어 카테고리 등록날짜 |
|
|
팝업스토어 카테고리 수정날짜 |
|
|
위치 아이디 |
|
|
위치명 |
|
|
위치 우편번호 |
|
|
위치 시/도 |
|
|
위치 시/군/구 |
|
|
위치 위도 |
|
|
위치 경도 |
|
|
위치 주소 |
|
|
위치 상세주소 |
|
|
팝업스토어 운영 날짜 |
|
|
팝업스토어 운영 오픈시간 |
|
|
팝업스토어 운영 마감시간 |
|
|
팝업스토어 이미지 아이디 |
|
|
팝업스토어 아이디 |
|
|
팝업스토어 이미지 URL |
|
|
팝업스토어 썸네일 이미지 여부 |
|
|
팝업스토어 등록날짜 |
|
|
팝업스토어 수정날짜 |
요약 썸네일 조회
Curl request
$ curl 'http://localhost:8080/api/stores/summary?limit=2' -i -X GET
HTTP request
GET /api/stores/summary?limit=2 HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 490
[ {
"id" : 1,
"name" : "store",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"categoryName" : "뷰티",
"sigungu" : "송파구",
"thumbnailImage" : "http://127.0.0.1:4566/pinup/store/image1.png"
}, {
"id" : 1,
"name" : "store",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"categoryName" : "뷰티",
"sigungu" : "송파구",
"thumbnailImage" : "http://127.0.0.1:4566/pinup/store/image1.png"
} ]
Response fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어 아이디 |
|
|
팝업스토어명 |
|
|
팝업스토어 상태 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 카테고리명 |
|
|
팝업스토어 위치 시/군/구 |
|
|
팝업스토어 썸네일 이미지 URL |
단건 조회
Curl request
$ curl 'http://localhost:8080/api/stores/1' -i -X GET
HTTP request
GET /api/stores/1 HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1021
{
"id" : 1,
"name" : "store",
"description" : "description",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"websiteUrl" : "",
"snsUrl" : "https://instgram.com/test",
"viewCount" : 0,
"category" : {
"id" : 1,
"name" : "뷰티",
"createdAt" : "2025-08-30T08:32:52.072584557",
"updatedAt" : null
},
"location" : {
"id" : 1,
"name" : "서울 송파구 올림픽로 300",
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.513713,
"longitude" : 127.104302,
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : ""
},
"operatingHours" : [ {
"days" : "월~금",
"startTime" : "08:32:52.072595427",
"endTime" : "18:32:52.072597852"
} ],
"storeImages" : [ {
"id" : 1,
"storeId" : 1,
"imageUrl" : "http://127.0.0.1:4566/pinup/store/image1.png",
"isThumbnail" : true
} ],
"createdAt" : "2025-08-30T08:32:52.072605346",
"updatedAt" : null
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어 아이디 |
|
|
팝업스토어명 |
|
|
팝업스토어 설명 |
|
|
팝업스토어 상태 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 참고 홈페이지 주소 |
|
|
팝업스토어 참고 SNS 주소 |
|
|
팝업스토어 조회수 |
|
|
팝업스토어 카테고리 아이디 |
|
|
팝업스토어 카테고리명 |
|
|
팝업스토어 카테고리 등록날짜 |
|
|
팝업스토어 카테고리 수정날짜 |
|
|
위치 아이디 |
|
|
위치명 |
|
|
위치 우편번호 |
|
|
위치 시/도 |
|
|
위치 시/군/구 |
|
|
위치 위도 |
|
|
위치 경도 |
|
|
위치 주소 |
|
|
위치 상세주소 |
|
|
팝업스토어 운영 날짜 |
|
|
팝업스토어 운영 오픈시간 |
|
|
팝업스토어 운영 마감시간 |
|
|
팝업스토어 이미지 아이디 |
|
|
팝업스토어 아이디 |
|
|
팝업스토어 이미지 URL |
|
|
팝업스토어 썸네일 이미지 여부 |
|
|
팝업스토어 등록날짜 |
|
|
팝업스토어 수정날짜 |
저장
Curl request
$ curl 'http://localhost:8080/api/stores' -i -X POST \
-H 'Content-Type: multipart/form-data' \
-F 'images=@image.jpeg;type=image/jpeg' \
-F 'storeRequest=@storeRequest.json;type=application/json'
HTTP request
POST /api/stores HTTP/1.1
Content-Type: multipart/form-data; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=image.jpeg
Content-Type: image/jpeg
data
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=storeRequest; filename=storeRequest.json
Content-Type: application/json
{"name":"store","description":"description","startDate":"2025-08-30","endDate":"2025-09-09","websiteUrl":"","snsUrl":"","thumbnailIndex":0,"categoryId":1,"locationId":1,"operatingHours":[{"days":"월~금","startTime":"08:32:51.908803081","endTime":"18:32:51.908806237"}]}
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
Request parts
| Part | Description |
|---|---|
|
이미지들 |
|
팝업스토어 등록 정보 |
Request part-storerequest-fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어명 |
|
|
팝업스토어 상세설명 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 참고 홈페이지 주소 |
|
|
팝업스토어 참고 SNS 주소 |
|
|
썸네일 선택 인덱스 |
|
|
팝업스토어 카테고리 아이디 |
|
|
위치 아이디 |
|
|
팝업스토어 운영 요일 |
|
|
팝업스토어 운영 오픈 시간 |
|
|
팝업스토어 운영 마감 시간 |
HTTP response
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 1021
{
"id" : 1,
"name" : "store",
"description" : "description",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"websiteUrl" : "",
"snsUrl" : "https://instgram.com/test",
"viewCount" : 0,
"category" : {
"id" : 1,
"name" : "뷰티",
"createdAt" : "2025-08-30T08:32:51.908986663",
"updatedAt" : null
},
"location" : {
"id" : 1,
"name" : "서울 송파구 올림픽로 300",
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.513713,
"longitude" : 127.104302,
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : ""
},
"operatingHours" : [ {
"days" : "월~금",
"startTime" : "08:32:51.908995179",
"endTime" : "18:32:51.908996612"
} ],
"storeImages" : [ {
"id" : 1,
"storeId" : 1,
"imageUrl" : "http://127.0.0.1:4566/pinup/store/image1.png",
"isThumbnail" : true
} ],
"createdAt" : "2025-08-30T08:32:51.909003635",
"updatedAt" : null
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어 아이디 |
|
|
팝업스토어명 |
|
|
팝업스토어 설명 |
|
|
팝업스토어 상태 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 참고 홈페이지 주소 |
|
|
팝업스토어 참고 SNS 주소 |
|
|
팝업스토어 조회수 |
|
|
팝업스토어 카테고리 아이디 |
|
|
팝업스토어 카테고리명 |
|
|
팝업스토어 카테고리 등록날짜 |
|
|
팝업스토어 카테고리 수정날짜 |
|
|
위치 아이디 |
|
|
위치명 |
|
|
위치 우편번호 |
|
|
위치 시/도 |
|
|
위치 시/군/구 |
|
|
위치 위도 |
|
|
위치 경도 |
|
|
위치 주소 |
|
|
위치 상세주소 |
|
|
팝업스토어 운영 날짜 |
|
|
팝업스토어 운영 오픈시간 |
|
|
팝업스토어 운영 마감시간 |
|
|
팝업스토어 이미지 아이디 |
|
|
팝업스토어 아이디 |
|
|
팝업스토어 이미지 URL |
|
|
팝업스토어 썸네일 이미지 여부 |
|
|
팝업스토어 등록날짜 |
|
|
팝업스토어 수정날짜 |
수정
Curl request
$ curl 'http://localhost:8080/api/stores/1' -i -X PATCH \
-H 'Content-Type: multipart/form-data' \
-F 'images=@image.jpeg;type=image/jpeg' \
-F 'request=@request.json;type=application/json'
HTTP request
PATCH /api/stores/1 HTTP/1.1
Content-Type: multipart/form-data; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=image.jpeg
Content-Type: image/jpeg
data
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=request; filename=request.json
Content-Type: application/json
{"name":"store","description":"description","startDate":"2025-08-30","endDate":"2025-09-09","websiteUrl":"","snsUrl":"","thumbnailId":1,"thumbnailIndex":null,"categoryId":1,"locationId":1,"operatingHours":[{"days":"월~금","startTime":"08:32:51.861619231","endTime":"18:32:51.861621936"}],"deletedImageIds":[1]}
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
Path parameters
| Parameter | Description |
|---|---|
|
팝업스토어 ID |
Request parts
| Part | Description |
|---|---|
|
이미지들 |
|
팝업스토어 수정 정보 |
Request part-request-fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어명 |
|
|
팝업스토어 상세설명 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 참고 홈페이지 주소 |
|
|
팝업스토어 참고 SNS 주소 |
|
|
팝업스토어 기존 아이디 |
|
|
썸네일 선택 인덱스 |
|
|
팝업스토어 카테고리 아이디 |
|
|
위치 아이디 |
|
|
팝업스토어 운영 요일 |
|
|
팝업스토어 운영 오픈 시간 |
|
|
팝업스토어 운영 마감 시간 |
|
|
팝업스토어 기존 이미지 삭제 |
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1021
{
"id" : 1,
"name" : "store",
"description" : "description",
"status" : "RESOLVED",
"startDate" : "2025-08-30",
"endDate" : "2025-09-09",
"websiteUrl" : "",
"snsUrl" : "https://instgram.com/test",
"viewCount" : 0,
"category" : {
"id" : 1,
"name" : "뷰티",
"createdAt" : "2025-08-30T08:32:51.862231954",
"updatedAt" : null
},
"location" : {
"id" : 1,
"name" : "서울 송파구 올림픽로 300",
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.513713,
"longitude" : 127.104302,
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : ""
},
"operatingHours" : [ {
"days" : "월~금",
"startTime" : "08:32:51.862269985",
"endTime" : "18:32:51.862272079"
} ],
"storeImages" : [ {
"id" : 1,
"storeId" : 1,
"imageUrl" : "http://127.0.0.1:4566/pinup/store/image1.png",
"isThumbnail" : true
} ],
"createdAt" : "2025-08-30T08:32:51.862340116",
"updatedAt" : null
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
팝업스토어 아이디 |
|
|
팝업스토어명 |
|
|
팝업스토어 설명 |
|
|
팝업스토어 상태 |
|
|
팝업스토어 시작날짜 |
|
|
팝업스토어 종료날짜 |
|
|
팝업스토어 참고 홈페이지 주소 |
|
|
팝업스토어 참고 SNS 주소 |
|
|
팝업스토어 조회수 |
|
|
팝업스토어 카테고리 아이디 |
|
|
팝업스토어 카테고리명 |
|
|
팝업스토어 카테고리 등록날짜 |
|
|
팝업스토어 카테고리 수정날짜 |
|
|
위치 아이디 |
|
|
위치명 |
|
|
위치 우편번호 |
|
|
위치 시/도 |
|
|
위치 시/군/구 |
|
|
위치 위도 |
|
|
위치 경도 |
|
|
위치 주소 |
|
|
위치 상세주소 |
|
|
팝업스토어 운영 날짜 |
|
|
팝업스토어 운영 오픈시간 |
|
|
팝업스토어 운영 마감시간 |
|
|
팝업스토어 이미지 아이디 |
|
|
팝업스토어 아이디 |
|
|
팝업스토어 이미지 URL |
|
|
팝업스토어 썸네일 이미지 여부 |
|
|
팝업스토어 등록날짜 |
|
|
팝업스토어 수정날짜 |
삭제
Curl request
$ curl 'http://localhost:8080/api/stores/1' -i -X DELETE
HTTP request
DELETE /api/stores/1 HTTP/1.1
Host: localhost:8080
Path parameters
| Parameter | Description |
|---|---|
|
팝업스토어 ID |
HTTP response
HTTP/1.1 204 No Content
Location API
저장
Curl request
$ curl 'http://localhost:8080/api/locations' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"zonecode" : "05554",
"sido" : "서울",
"sigungu" : "송파구",
"address" : "서울 송파구 올림픽로 240",
"addressDetail" : "롯데백화점 잠실점 10F 웨이브 행사장 (LG전자 콜라보 행사)"
}'
HTTP request
POST /api/locations HTTP/1.1
Content-Type: application/json
Content-Length: 226
Host: localhost:8080
{
"zonecode" : "05554",
"sido" : "서울",
"sigungu" : "송파구",
"address" : "서울 송파구 올림픽로 240",
"addressDetail" : "롯데백화점 잠실점 10F 웨이브 행사장 (LG전자 콜라보 행사)"
}
Request fields
| Path | Type | Description |
|---|---|---|
|
|
우편번호 |
|
|
도/특별시/광역시 |
|
|
시/군/구 |
|
|
주소 |
|
|
상세 주소 |
HTTP response
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 339
{
"id" : 1,
"name" : "서울 송파구 올림픽로 240",
"zonecode" : "05554",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.51131,
"longitude" : 127.098142,
"address" : "서울 송파구 올림픽로 240",
"addressDetail" : "롯데백화점 잠실점 10F 웨이브 행사장 (LG전자 콜라보 행사)"
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
아이디 |
|
|
이름 |
|
|
우편번호 |
|
|
도/특별시/광역시 |
|
|
시/군/구 |
|
|
주소 |
|
|
상세 주소 |
|
|
x 좌표 |
|
|
y 좌표 |
수정
Curl request
$ curl 'http://localhost:8080/api/locations/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : "잠실 롯데월드몰 1층 아트리움"
}'
HTTP request
PUT /api/locations/1 HTTP/1.1
Content-Type: application/json
Content-Length: 189
Host: localhost:8080
{
"zonecode" : "05551",
"sido" : "서울",
"sigungu" : "송파구",
"address" : "서울 송파구 올림픽로 300",
"addressDetail" : "잠실 롯데월드몰 1층 아트리움"
}
Path parameters
| Parameter | Description |
|---|---|
|
위치 ID |
Request fields
| Path | Type | Description |
|---|---|---|
|
|
우편번호 |
|
|
도/특별시/광역시 |
|
|
시/군/구 |
|
|
주소 |
|
|
상세 주소 |
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 339
{
"id" : 1,
"name" : "서울 송파구 올림픽로 300",
"zonecode" : "05554",
"sido" : "서울",
"sigungu" : "송파구",
"latitude" : 37.51131,
"longitude" : 127.098142,
"address" : "서울 송파구 올림픽로 240",
"addressDetail" : "롯데백화점 잠실점 10F 웨이브 행사장 (LG전자 콜라보 행사)"
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
아이디 |
|
|
이름 |
|
|
우편번호 |
|
|
도/특별시/광역시 |
|
|
시/군/구 |
|
|
주소 |
|
|
상세 주소 |
|
|
x 좌표 |
|
|
y 좌표 |
게시글 API
게시글 목록 조회
HTTP request
GET /api/post/list/10 HTTP/1.1
Host: localhost:8080
Path parameters
| Parameter | Description |
|---|---|
|
스토어 ID |
Request fields
Snippet request-fields not found for operation::post-get-list
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 631
[{"id":1,"storeId":null,"member":{"id":null,"name":null,"email":null,"nickname":"writer","providerType":null,"role":null,"deleted":false},"title":"제목1","content":null,"thumbnail":"thumb1.jpg","createdAt":"2025-08-30T08:32:38.592278685","updatedAt":null,"commentCount":1,"likeCount":1,"likedByCurrentUser":false},{"id":2,"storeId":null,"member":{"id":null,"name":null,"email":null,"nickname":"writer","providerType":null,"role":null,"deleted":false},"title":"제목2","content":null,"thumbnail":"thumb2.jpg","createdAt":"2025-08-30T08:32:38.592278685","updatedAt":null,"commentCount":1,"likeCount":1,"likedByCurrentUser":false}]
Response fields
| Path | Type | Description |
|---|---|---|
|
|
게시글 ID |
|
|
작성자 닉네임 |
|
|
게시글 제목 |
|
|
썸네일 이미지 URL |
|
|
작성일시 |
|
|
댓글 수 |
|
|
좋아요 수 |
|
|
현재 로그인한 사용자가 좋아요 눌렀는지 여부 |
게시글 상세 조회
HTTP request
GET /api/post/1 HTTP/1.1
Host: localhost:8080
Path parameters
| Parameter | Description |
|---|---|
|
게시글 ID |
Request fields
Snippet request-fields not found for operation::post-get-by-id
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 780
{"post":{"id":1,"storeId":null,"member":{"id":null,"name":null,"email":null,"nickname":"writer","providerType":null,"role":null,"deleted":false},"title":"제목1","content":null,"thumbnail":"thumb1.jpg","createdAt":"2025-08-30T08:32:38.606081129","updatedAt":null,"commentCount":1,"likeCount":1,"likedByCurrentUser":false},"comments":[{"id":100,"postId":1,"member":{"id":null,"createdAt":null,"updatedAt":null,"name":null,"email":"comment@example.com","nickname":"댓글유저","password":null,"providerType":"NAVER","providerId":null,"role":"ROLE_USER","deleted":false},"content":"댓글 내용","createdAt":"2025-08-30T08:32:38.606081129"}],"postImages":[{"id":201,"postId":1,"s3Url":"https://s3.bucket/image1.jpg"},{"id":202,"postId":1,"s3Url":"https://s3.bucket/image2.jpg"}]}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
게시글 정보 |
|
|
게시글 ID |
|
|
스토어 ID |
|
|
작성자 ID |
|
|
작성자 닉네임 |
|
|
작성자 이메일 |
|
|
OAuth 제공자 |
|
|
사용자 권한 |
|
|
탈퇴 여부 |
|
|
게시글 제목 |
|
|
게시글 내용 |
|
|
썸네일 이미지 URL |
|
|
게시글 생성일 |
|
|
게시글 수정일 |
|
|
댓글 수 |
|
|
댓글 목록 |
|
|
댓글 ID |
|
|
댓글이 속한 게시글 ID |
|
|
댓글 작성자 닉네임 |
|
|
댓글 내용 |
|
|
댓글 작성일 |
|
|
게시글 이미지 목록 |
|
|
이미지 ID |
|
|
이미지가 속한 게시글 ID |
|
|
이미지 S3 URL |
게시글 생성
요청은 multipart/form-data 형식으로 전송되며, 다음과 같은 파트로 구성됩니다:
-
post: 게시글 생성 정보 (JSON) -
images: 이미지 파일 배열
HTTP request
POST /api/post/create HTTP/1.1
Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Accept: application/json
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=post; filename=post.json
Content-Type: application/json;charset=UTF-8
{"storeId":1,"title":"제목","content":"내용"}
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=img1.jpg
Content-Type: image/jpeg
data1
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=img2.jpg
Content-Type: image/jpeg
data2
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
Request parts
| Part | Description |
|---|---|
|
게시글 정보(JSON) |
|
이미지 파일들 (2장 이상) |
Request part-post-fields
| Path | Type | Description |
|---|---|---|
|
|
스토어 ID |
|
|
게시글 제목 |
|
|
게시글 내용 |
HTTP response
HTTP/1.1 201 Created
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 405
{"id":1,"storeId":null,"member":{"id":null,"name":"테스터","email":"test@naver.com","nickname":"행복한돼지","providerType":"NAVER","role":"ROLE_USER","deleted":false},"title":"제목","content":"내용","thumbnail":"https://example.com/thumbnail.jpg","createdAt":"2025-08-30T08:32:38.667708308","updatedAt":"2025-08-30T08:32:38.667710492","commentCount":0,"likeCount":0,"likedByCurrentUser":false}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
게시글 ID |
|
|
스토어 ID |
|
|
작성자 ID (nullable) |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 닉네임 |
|
|
OAuth 제공자 |
|
|
사용자 역할 |
|
|
삭제 여부 |
|
|
제목 |
|
|
내용 |
|
|
썸네일 이미지 URL |
|
|
생성 일시 |
|
|
수정 일시 |
|
|
댓글 수 |
|
|
좋아요 수 |
|
|
현재 로그인한 사용자가 좋아요 눌렀는지 여부 |
게시글 삭제
Path parameters
| Parameter | Description |
|---|---|
|
삭제할 게시글 ID |
게시글 수정
요청은 multipart/form-data 형식으로 전송되며, 다음과 같은 파트로 구성됩니다:
-
updatePostRequest: 수정할 게시글 정보 (JSON) -
images: 추가로 업로드할 이미지 파일들 (선택) -
imagesToDelete: 쿼리 파라미터로 삭제할 이미지 파일 이름 목록 (선택)
HTTP request
PUT /api/post/1 HTTP/1.1
Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=updatePostRequest; filename=updatePostRequest.json
Content-Type: application/json;charset=UTF-8
{"title":"수정 제목","content":"수정 내용"}
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=image1.jpg
Content-Type: image/jpeg
이미지데이터1
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=image2.jpg
Content-Type: image/jpeg
이미지데이터2
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
Path parameters
| Parameter | Description |
|---|---|
|
수정할 게시글 ID |
Request parts
| Part | Description |
|---|---|
|
수정할 게시글 정보 (title, content 포함) |
|
추가로 업로드할 이미지 파일들 (0개 이상 가능) |
Request part-updatepostrequest-fields
| Path | Type | Description |
|---|---|---|
|
|
수정할 제목 |
|
|
수정할 내용 |
Query parameters
| Parameter | Description |
|---|---|
|
삭제할 이미지 파일 이름 목록 (선택) |
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 427
{"id":1,"storeId":null,"member":{"id":null,"name":"테스터","email":"test@naver.com","nickname":"행복한돼지","providerType":"NAVER","role":"ROLE_USER","deleted":false},"title":"수정 제목","content":"수정 내용","thumbnail":"https://example.com/updated-thumbnail.jpg","createdAt":"2025-08-29T08:32:38.638659065","updatedAt":"2025-08-30T08:32:38.638670417","commentCount":0,"likeCount":0,"likedByCurrentUser":false}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
게시글 ID |
|
|
스토어 ID |
|
|
작성자 ID |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 닉네임 |
|
|
소셜 로그인 제공자 |
|
|
회원 권한 |
|
|
회원 삭제 여부 |
|
|
제목 |
|
|
내용 |
|
|
썸네일 이미지 URL |
|
|
생성 일시 |
|
|
수정 일시 |
|
|
댓글 수 |
|
|
좋아요 수 |
|
|
현재 로그인한 사용자가 좋아요 눌렀는지 여부 |
게시글 비활성화
HTTP request
PATCH /api/post/1/disable HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Content-Length: 102
_csrf=80Bu0rIOLUZz51p-aQSWNb6bfBX8k-3xxPNnWIQAv3kB35iGxXUP4YttHnRehGwcDCmiDImpUS2e9ozc_MMFbLI4j0tg56yw
Path parameters
| Parameter | Description |
|---|---|
|
비활성화할 게시글 ID |
Request fields
Snippet request-fields not found for operation::post-disable
HTTP response
HTTP/1.1 204 No Content
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Response fields
Snippet response-fields not found for operation::post-disable
PostLike API
게시글 목록 조회
HTTP request
POST /api/post-like/1 HTTP/1.1
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Content-Length: 102
_csrf=m3RHoAKCGjvL-gT4RWdxfVyC2Ic3lWK9S_LjPxs3Ne5MENFOohElkDW2e1nmwmbBfEpFGTq39b8CoASQLZTbDS8FAdp0KOMo
Path parameters
| Parameter | Description |
|---|---|
|
좋아요를 누를 게시글 ID |
Request fields
Snippet request-fields not found for operation::post-like-toggle
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
{"likeCount":15,"likedByCurrentUser":true}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
총 좋아요 수 |
|
|
현재 사용자가 좋아요 눌렀는지 여부 |
댓글 API
댓글 생성
HTTP request
POST /api/comment/1?_csrf=TN79QHfH0KxaLQ6WGGXEndFfnVY1S1JDN_AkrrU40nZ-N1CfKuaYd0Dxs813GTuuLUjwq7c9sG5XKmBuVMVHmYNZ4xJOVGWt HTTP/1.1
Content-Type: application/json
Accept: application/json
Content-Length: 27
Host: localhost:8080
{"content":"댓글 내용"}
Path parameters
| Parameter | Description |
|---|---|
|
댓글을 작성할 게시글 ID |
Request fields
| Path | Type | Description |
|---|---|---|
|
|
댓글 내용 |
HTTP response
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 314
{"id":1,"postId":1,"member":{"id":null,"createdAt":null,"updatedAt":null,"name":"테스터","email":"test@naver.com","nickname":"행복한돼지","password":null,"providerType":"NAVER","providerId":"naver123","role":"ROLE_USER","deleted":false},"content":"댓글 내용","createdAt":"2025-08-30T08:31:49.57694925"}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
댓글 ID |
|
|
게시글 ID |
|
|
댓글 내용 |
|
|
작성 시각 |
|
|
작성자 ID |
|
|
작성자 닉네임 |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 비밀번호 |
|
|
소셜 로그인 제공자 |
|
|
소셜 제공자 식별자 |
|
|
작성자 권한 |
|
|
삭제 여부 |
|
|
작성자 생성 시각 |
|
|
작성자 수정 시각 |
댓글 삭제
HTTP request
DELETE /api/comment/1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Content-Length: 102
_csrf=mn7fwWkWEgx6B6fXL10eq5SFyQ8Gv40_Q6yBD-O_1KHg0tcc_E3m9QomJTlXPsXmGHAqk6Th5G5i3OwSIpmxa9aN5cfR57Es
Path parameters
| Parameter | Description |
|---|---|
|
삭제할 댓글 ID |
Request fields
Snippet request-fields not found for operation::comment-delete
HTTP response
HTTP/1.1 204 No Content
Response fields
Snippet response-fields not found for operation::comment-delete
공지사항 API
전체 조회
Curl request
$ curl 'http://localhost:8080/api/notices' -i -X GET
HTTP request
GET /api/notices HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 656
[ {
"id" : 2,
"title" : "title 2",
"content" : "content 2",
"member" : {
"id" : 1,
"name" : "핀업",
"email" : "pinup0106@gmail.com",
"nickname" : "핀업",
"providerType" : "NAVER",
"role" : "ROLE_ADMIN",
"deleted" : false
},
"createdAt" : "2025-01-01T01:00:00",
"updatedAt" : null
}, {
"id" : 1,
"title" : "title 1",
"content" : "content 1",
"member" : {
"id" : 1,
"name" : "핀업",
"email" : "pinup0106@gmail.com",
"nickname" : "핀업",
"providerType" : "NAVER",
"role" : "ROLE_ADMIN",
"deleted" : false
},
"createdAt" : "2025-01-01T00:00:00",
"updatedAt" : null
} ]
Response fields
| Path | Type | Description |
|---|---|---|
|
|
공지사항 아이디 |
|
|
공지사항 제목 |
|
|
공지사항 내용 |
|
|
작성자 아이디 |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 닉네임 |
|
|
OAuth 제공자 |
|
|
작성자 권한 |
|
|
작성자 탈퇴 여부 |
|
|
공지사항 작성일 |
|
|
공지사항 수정일 |
단건 조회
Curl request
$ curl 'http://localhost:8080/api/notices/1' -i -X GET
HTTP request
GET /api/notices/1 HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 321
{
"id" : 1,
"title" : "title",
"content" : "content",
"member" : {
"id" : 1,
"name" : "핀업",
"email" : "pinup0106@gmail.com",
"nickname" : "핀업",
"providerType" : "NAVER",
"role" : "ROLE_ADMIN",
"deleted" : false
},
"createdAt" : "2025-01-01T00:00:00",
"updatedAt" : null
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
공지사항 아이디 |
|
|
공지사항 제목 |
|
|
공지사항 내용 |
|
|
작성자 아이디 |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 닉네임 |
|
|
OAuth 제공자 |
|
|
작성자 권한 |
|
|
작성자 탈퇴 여부 |
|
|
공지사항 작성일 |
|
|
공지사항 수정일 |
존재하지 않는 ID로 조회
-
요청:
GET /api/notices/{noticeId} -
설명: 존재하지 않는 공지사항 요청 시,
errorView 반환 -
Path Parameters:
noticeId(Long): 조회할 공지사항의 ID -
View name:
error -
Model attributes:
error
저장
Curl request
$ curl 'http://localhost:8080/api/notices' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"title" : "title 1",
"content" : "content 1"
}'
HTTP request
POST /api/notices HTTP/1.1
Content-Type: application/json
Content-Length: 52
Host: localhost:8080
{
"title" : "title 1",
"content" : "content 1"
}
Request fields
| Path | Type | Description |
|---|---|---|
|
|
공지사항 제목 |
|
|
공지사항 내용 |
HTTP response
HTTP/1.1 201 Created
저장 시 제목 누락 예외
Curl request
$ curl 'http://localhost:8080/api/notices' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"title" : null,
"content" : "content 1"
}'
HTTP request
POST /api/notices HTTP/1.1
Content-Type: application/json
Content-Length: 47
Host: localhost:8080
{
"title" : null,
"content" : "content 1"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 144
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"title" : "제목을 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
제목은 필수 입력 필드입니다. |
저장 시 제목 길이 제한 예외
Curl request
$ curl 'http://localhost:8080/api/notices' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"title" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"content" : "content 1"
}'
HTTP request
POST /api/notices HTTP/1.1
Content-Type: application/json
Content-Length: 146
Host: localhost:8080
{
"title" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"content" : "content 1"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 163
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"title" : "제목을 1~100자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
제목은 1~100자 이내여야 합니다. |
저장 시 내용 누락 예외
Curl request
$ curl 'http://localhost:8080/api/notices' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"title" : "title 1",
"content" : null
}'
HTTP request
POST /api/notices HTTP/1.1
Content-Type: application/json
Content-Length: 45
Host: localhost:8080
{
"title" : "title 1",
"content" : null
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 146
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"content" : "내용을 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
내용은 필수 입력 필드입니다. |
수정
Curl request
$ curl 'http://localhost:8080/api/notices/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"title" : "title 1",
"content" : "update content"
}'
HTTP request
PUT /api/notices/1 HTTP/1.1
Content-Type: application/json
Content-Length: 57
Host: localhost:8080
{
"title" : "title 1",
"content" : "update content"
}
Path parameters
| Parameter | Description |
|---|---|
|
공지사항 아이디 |
Request fields
| Path | Type | Description |
|---|---|---|
|
|
공지사항 제목 |
|
|
공지사항 내용 |
HTTP response
HTTP/1.1 204 No Content
존재하지 않는 ID로 수정
-
요청:
PUT /api/notices/{noticeId} -
설명: 존재하지 않는 공지사항 수정 요청 시,
errorView 반환 -
Path Parameters:
noticeId(Long): 수정할 공지사항의 ID -
View name:
error -
Model attributes:
error
수정 시 제목 누락 예외
Curl request
$ curl 'http://localhost:8080/api/notices/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"title" : null,
"content" : "update content"
}'
HTTP request
PUT /api/notices/1 HTTP/1.1
Content-Type: application/json
Content-Length: 52
Host: localhost:8080
{
"title" : null,
"content" : "update content"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 144
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"title" : "제목을 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
제목은 필수 입력 필드입니다. |
수정 시 제목 길이 제한 예외
Curl request
$ curl 'http://localhost:8080/api/notices/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"title" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"content" : "update content"
}'
HTTP request
PUT /api/notices/1 HTTP/1.1
Content-Type: application/json
Content-Length: 151
Host: localhost:8080
{
"title" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"content" : "update content"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 163
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"title" : "제목을 1~100자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
제목은 1~100자 이내여야 합니다. |
수정 시 내용 누락 예외
Curl request
$ curl 'http://localhost:8080/api/notices/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"title" : "title update",
"content" : null
}'
HTTP request
PUT /api/notices/1 HTTP/1.1
Content-Type: application/json
Content-Length: 50
Host: localhost:8080
{
"title" : "title update",
"content" : null
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 146
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"content" : "내용을 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
내용은 필수 입력 필드입니다. |
삭제
Curl request
$ curl 'http://localhost:8080/api/notices/1' -i -X DELETE
HTTP request
DELETE /api/notices/1 HTTP/1.1
Host: localhost:8080
Path parameters
| Parameter | Description |
|---|---|
|
공지사항 아이디 |
HTTP response
HTTP/1.1 204 No Content
존재하지 않는 ID로 삭제
-
요청:
DELETE /api/notices/{noticeId} -
설명: 존재하지 않는 공지사항 삭제 요청 시,
errorView 반환 -
Path Parameters:
noticeId(Long): 삭제할 공지사항의 ID -
View name:
error -
Model attributes:
error
FAQ API
전체 조회
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X GET
HTTP request
GET /api/faqs HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 708
[ {
"id" : 2,
"question" : "question 2",
"answer" : "answer 2",
"category" : "USE",
"member" : {
"id" : 1,
"name" : "핀업",
"email" : "pinup0106@gmail.com",
"nickname" : "핀업",
"providerType" : "NAVER",
"role" : "ROLE_ADMIN",
"deleted" : false
},
"createdAt" : "2025-01-02T00:00:00",
"updatedAt" : null
}, {
"id" : 1,
"question" : "question 1",
"answer" : "answer 1",
"category" : "USE",
"member" : {
"id" : 1,
"name" : "핀업",
"email" : "pinup0106@gmail.com",
"nickname" : "핀업",
"providerType" : "NAVER",
"role" : "ROLE_ADMIN",
"deleted" : false
},
"createdAt" : "2025-01-01T00:00:00",
"updatedAt" : null
} ]
Response fields
| Path | Type | Description |
|---|---|---|
|
|
FAQ ID |
|
|
FAQ 질문 |
|
|
FAQ 답변 |
|
|
FAQ 카테고리 |
|
|
작성자 ID |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 닉네임 |
|
|
OAuth 제공자 |
|
|
작성자 권한 |
|
|
작성자 탈퇴 여부 |
|
|
FAQ 작성일 |
|
|
FAQ 수정일 |
단건 조회
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X GET
HTTP request
GET /api/faqs/1 HTTP/1.1
Host: localhost:8080
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 347
{
"id" : 1,
"question" : "question",
"answer" : "answer",
"category" : "USE",
"member" : {
"id" : 1,
"name" : "핀업",
"email" : "pinup0106@gmail.com",
"nickname" : "핀업",
"providerType" : "NAVER",
"role" : "ROLE_ADMIN",
"deleted" : false
},
"createdAt" : "2025-01-01T00:00:00",
"updatedAt" : null
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
FAQ ID |
|
|
FAQ 질문 |
|
|
FAQ 답변 |
|
|
FAQ 카테고리 |
|
|
작성자 ID |
|
|
작성자 이름 |
|
|
작성자 이메일 |
|
|
작성자 닉네임 |
|
|
OAuth 제공자 |
|
|
작성자 권한 |
|
|
작성자 탈퇴 여부 |
|
|
FAQ 작성일 |
|
|
FAQ 수정일 |
존재하지 않는 ID로 조회
-
요청:
GET /api/faqs/{faqId} -
설명: 존재하지 않는 FAQ 요청 시,
errorView 반환 -
Path Parameters:
faqId(Long): 조회할 FAQ의 ID -
View name:
error -
Model attributes:
error
저장
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "answer",
"category" : "USE"
}'
HTTP request
POST /api/faqs HTTP/1.1
Content-Type: application/json
Content-Length: 74
Host: localhost:8080
{
"question" : "question",
"answer" : "answer",
"category" : "USE"
}
Request fields
| Path | Type | Description |
|---|---|---|
|
|
FAQ 질문 |
|
|
FAQ 답변 |
|
|
FAQ 카테고리 |
HTTP response
HTTP/1.1 201 Created
저장 시 질문 누락 예외
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"question" : "",
"answer" : "answer",
"category" : "USE"
}'
HTTP request
POST /api/faqs HTTP/1.1
Content-Type: application/json
Content-Length: 66
Host: localhost:8080
{
"question" : "",
"answer" : "answer",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 173
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"question" : "질문 내용을 1~100자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
질문은 필수 입력 필드입니다. |
저장 시 질문 길이 제한 예외
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"question" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"answer" : "answer",
"category" : "USE"
}'
HTTP request
POST /api/faqs HTTP/1.1
Content-Type: application/json
Content-Length: 167
Host: localhost:8080
{
"question" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"answer" : "answer",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 173
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"question" : "질문 내용을 1~100자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
질문은 1~100자 이내여야 합니다. |
저장 시 답변 누락 예외
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "",
"category" : "USE"
}'
HTTP request
POST /api/faqs HTTP/1.1
Content-Type: application/json
Content-Length: 68
Host: localhost:8080
{
"question" : "question",
"answer" : "",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 171
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"answer" : "답변 내용을 1~500자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
답변은 필수 입력 필드입니다. |
저장 시 답변 길이 제한 예외
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"category" : "USE"
}'
HTTP request
POST /api/faqs HTTP/1.1
Content-Type: application/json
Content-Length: 569
Host: localhost:8080
{
"question" : "question",
"answer" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 171
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"answer" : "답변 내용을 1~500자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
답변은 1~500자 이내여야 합니다. |
저장 시 카테고리 누락 예외
Curl request
$ curl 'http://localhost:8080/api/faqs' -i -X POST \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "answer",
"category" : null
}'
HTTP request
POST /api/faqs HTTP/1.1
Content-Type: application/json
Content-Length: 73
Host: localhost:8080
{
"question" : "question",
"answer" : "answer",
"category" : null
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 153
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"category" : "카테고리는 필수입니다."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
카테고리는 필수 입력 필드입니다. |
수정
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"question" : "update question",
"answer" : "update answer",
"category" : "USE"
}'
HTTP request
PUT /api/faqs/1 HTTP/1.1
Content-Type: application/json
Content-Length: 88
Host: localhost:8080
{
"question" : "update question",
"answer" : "update answer",
"category" : "USE"
}
Path parameters
| Parameter | Description |
|---|---|
|
FAQ ID |
Request fields
| Path | Type | Description |
|---|---|---|
|
|
FAQ 질문 |
|
|
FAQ 답변 |
|
|
FAQ 카테고리 |
HTTP response
HTTP/1.1 204 No Content
존재하지 않는 ID로 수정
-
요청:
PUT /api/faqs/{faqId} -
설명: 존재하지 않는 FAQ 수정 요청 시,
errorView 반환 -
Path Parameters:
faqId(Long): 수정할 FAQ의 ID -
View name:
error -
Model attributes:
error
수정 시 질문 누락 예외
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"question" : "",
"answer" : "answer",
"category" : "USE"
}'
HTTP request
PUT /api/faqs/1 HTTP/1.1
Content-Type: application/json
Content-Length: 66
Host: localhost:8080
{
"question" : "",
"answer" : "answer",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 173
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"question" : "질문 내용을 1~100자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
질문은 필수 입력 필드입니다. |
수정 시 질문 길이 제한 예외
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"question" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"answer" : "answer",
"category" : "USE"
}'
HTTP request
PUT /api/faqs/1 HTTP/1.1
Content-Type: application/json
Content-Length: 167
Host: localhost:8080
{
"question" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"answer" : "answer",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 173
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"question" : "질문 내용을 1~100자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
질문은 1~100자 이내여야 합니다. |
수정 시 답변 누락 예외
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "",
"category" : "USE"
}'
HTTP request
PUT /api/faqs/1 HTTP/1.1
Content-Type: application/json
Content-Length: 68
Host: localhost:8080
{
"question" : "question",
"answer" : "",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 171
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"answer" : "답변 내용을 1~500자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
답변은 필수 입력 필드입니다. |
수정 시 답변 길이 제한 예외
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"category" : "USE"
}'
HTTP request
PUT /api/faqs/1 HTTP/1.1
Content-Type: application/json
Content-Length: 569
Host: localhost:8080
{
"question" : "question",
"answer" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"category" : "USE"
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 171
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"answer" : "답변 내용을 1~500자 이내로 입력하세요."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
답변은 1~500자 이내여야 합니다. |
수정 시 카테고리 누락 예외
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X PUT \
-H 'Content-Type: application/json' \
-d '{
"question" : "question",
"answer" : "answer",
"category" : null
}'
HTTP request
PUT /api/faqs/1 HTTP/1.1
Content-Type: application/json
Content-Length: 73
Host: localhost:8080
{
"question" : "question",
"answer" : "answer",
"category" : null
}
HTTP response
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 153
{
"status" : 400,
"message" : "입력값이 유효하지 않습니다.",
"validation" : {
"category" : "카테고리는 필수입니다."
}
}
Response fields
| Path | Type | Description |
|---|---|---|
|
|
상태 코드 |
|
|
에러 메시지 |
|
|
카테고리는 필수 입력 필드입니다. |
삭제
Curl request
$ curl 'http://localhost:8080/api/faqs/1' -i -X DELETE
HTTP request
DELETE /api/faqs/1 HTTP/1.1
Host: localhost:8080
Path parameters
| Parameter | Description |
|---|---|
|
FAQ ID |
HTTP response
HTTP/1.1 204 No Content
존재하지 않는 ID로 삭제
-
요청:
DELETE /api/faqs/{faqId} -
설명: 존재하지 않는 FAQ 삭제 요청 시,
errorView 반환 -
Path Parameters:
faqId(Long): 삭제할 FAQ의 ID -
View name:
error -
Model attributes:
error