Follow API

팔로우 등록

HTTP Request

POST /api/v1/follow/2 HTTP/1.1
X-CSRF-TOKEN: YAr9Y8sl2azAifB7nX4ZkpFAsRveHGTOAdXk_eHOcw-LBikQUm_KAKhGvJnt65JOrFMtq_NwnCK8egDjMbOHxdmoQz28Yhly
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Table 1. /api/v1/follow/{followeeId}
Parameter Description

followeeId

팔로우할 유저 ID

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

내가 팔로우 하는 유저 목록 조회

HTTP Request

GET /api/v1/follow/1/following?page=0&size=20 HTTP/1.1
X-CSRF-TOKEN: GhKH8pQ2oG_n62PsjDUNJ8hn3W-QuWDhyxVB7zf8-tUZM7h5LnbmkPAGxlfK0lHdtBg5Rf8C8FeogAbM_Sxz3Qeew-YvA9pJ
Host: localhost:8080
Table 2. /api/v1/follow/{userId}/following
Parameter Description

userId

유저 ID

Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 281

{
  "users" : [ {
    "id" : 1,
    "nickname" : "zl존",
    "tag" : "@Hotoran",
    "profileImagePath" : "sample-profile-image-url"
  }, {
    "id" : 2,
    "nickname" : "DrangeWoo",
    "tag" : "@timel2ss",
    "profileImagePath" : "sample-profile-image-url"
  } ]
}
Path Type Description

users

Array

팔로우 유저 목록

users[].id

Number

유저 ID

users[].nickname

String

유저 닉네임

users[].tag

String

유저 태그

users[].profileImagePath

String

유저 프로필 이미지 경로

나를 팔로우 하는 유저 목록 조회

HTTP Request

GET /api/v1/follow/1/followed?page=0&size=20 HTTP/1.1
X-CSRF-TOKEN: 40H0vh9QeH6vizhK6-kvRBBf7rUtoilOoPxh7_Xcod_TiVb_hiCQ2HszSU2CuAx_3cQbdnJtw9dLl09jlp5U15O_kufjvTfO
Host: localhost:8080
Table 3. /api/v1/follow/{userId}/followed
Parameter Description

userId

유저 ID

Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 281

{
  "users" : [ {
    "id" : 1,
    "nickname" : "zl존",
    "tag" : "@Hotoran",
    "profileImagePath" : "sample-profile-image-url"
  }, {
    "id" : 2,
    "nickname" : "DrangeWoo",
    "tag" : "@timel2ss",
    "profileImagePath" : "sample-profile-image-url"
  } ]
}
Path Type Description

users

Array

팔로우 유저 목록

users[].id

Number

유저 ID

users[].nickname

String

유저 닉네임

users[].tag

String

유저 태그

users[].profileImagePath

String

유저 프로필 이미지 경로

팔로우 삭제

HTTP Request

DELETE /api/v1/follow/2 HTTP/1.1
X-CSRF-TOKEN: rcXZ7ftldrclJd9jXkssJwyEPfvVuTd9Lc8KZOCUVorxXRdnz_fv2J5TENIIEe0CaGYYRWi9EJmzi1JQG_g9UoasNb7BOS9T
Host: localhost:8080
Table 4. /api/v1/follow/{followeeId}
Parameter Description

followeeId

팔로우를 취소할 유저 ID

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

Toon API

웹툰 등록

HTTP Request

$ curl 'http://localhost:8080/api/v1/toon' -i -X POST \
    -H 'Content-Type: text/plain' \
    -H 'X-CSRF-TOKEN: qqfvs_nny0o9YGs4zvzBoX59YdjixNTn8KAKX6i3-zE97TvQyJ7bhp-FrXkQAVMJ_dH1xxhNTOHQobDKwMRsOc3WnQcPj1rg' \
    -F 'title=sample-title' \
    -F 'description=sample-description' \
    -F 'toonImages=@sample1.png;type=multipart/form-data' \
    -F 'toonImages=@sample2.png;type=multipart/form-data'
Part Description

title

웹툰 제목

description

웹툰 설명

toonImages

웹툰 이미지 리스트

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 20

{
  "toonId" : 1
}
Path Type Description

toonId

Number

생성된 웹툰 ID

웹툰 삭제

HTTP Request

DELETE /api/v1/toon/1 HTTP/1.1
X-CSRF-TOKEN: 8B7JvalUlKMboVd8tiohSluTAglR02cmDSwVmuP1fT1SQykRknv5jchmo8c2k2NPjgcVeT-nLzBitl4LbE0k_NHHGFxidB5w
Host: localhost:8080
Table 5. /api/v1/toon/{toonId}
Parameter Description

toonId

웹툰 ID

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

웹툰 정보 조회

HTTP Request

GET /api/v1/toon/1 HTTP/1.1
X-CSRF-TOKEN: wJ8x0sywkGzd568CZRH3XWXjwwhtZkIuDcqgHjeC8rRNlszj9a5U462Fplrwgsw3UjzDP13X7jFZAHQDPfnDf1LmkId-8P2C
Host: localhost:8080
Table 6. /api/v1/toon/{toonId}
Parameter Description

toonId

웹툰 ID

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 362

{
  "id" : 1,
  "title" : "sample-title",
  "description" : "sample-description",
  "thumbnailUrl" : "toons/1/1-thumb.png",
  "authorId" : 3,
  "authorNickname" : "sample-author",
  "profileImageUrl" : "profileImages/1.png",
  "imagePaths" : [ "toons/1/1-0.png", "toons/1/1-1.png" ],
  "viewCount" : 100,
  "likeCount" : 42,
  "likeStatus" : "LIKE"
}
Path Type Description

id

Number

만화 ID

title

String

만화 제목

description

String

만화 설명

authorId

Number

작가 유저 ID

authorNickname

String

작가 이름

profileImageUrl

String

작가 프로필 이미지 경로

thumbnailUrl

String

만화 썸네일 url

imagePaths

Array

만화 이미지 경로

viewCount

Number

만화 조회수

likeCount

Number

만화 좋아요수

likeStatus

String

만화 좋아요 상태 (LIKE/DISLIKE/NONE)

유저가 등록한 웹툰 리스트 조회

HTTP Request

GET /api/v1/toon/user/1 HTTP/1.1
X-CSRF-TOKEN: MlkIbc_bVg-iy6WO47D7BbWDhF6pqfkHBWSAEa_AGctjanC7Vjw7Dq66ZjeP_cPr2p3PY4KyqWaanc0qZgC5KJv3LfsGX0fa
Host: localhost:8080
Table 7. /api/v1/toon/user/{userId}
Parameter Description

userId

유저 ID

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 416

{
  "cartoons" : [ {
    "id" : 1,
    "title" : "김영현의 모험1",
    "author" : "king",
    "thumbnailUrl" : "toons/1/1-thumb.png"
  }, {
    "id" : 6,
    "title" : "김영현의 모험2",
    "author" : "king",
    "thumbnailUrl" : "toons/6/6-thumb.png"
  }, {
    "id" : 12,
    "title" : "김영현의 모험3",
    "author" : "king",
    "thumbnailUrl" : "toons/12/12-thumb.png"
  } ]
}
Path Type Description

cartoons

Array

만화 목록

cartoons[].id

Number

만화 ID

cartoons[].title

String

만화 제목

cartoons[].author

String

작가 닉네임

cartoons[].thumbnailUrl

String

만화 썸네일 경로

웹툰 조회수 상승

HTTP Request

POST /api/v1/toon/1/view HTTP/1.1
X-CSRF-TOKEN: BzOBK_emnRjhQWLJk8ZOZX2RO7Pl7_Hyc5uE7RmuohFhJr2oMVCxSMGWrSzMJQT7pet6B0umFtLUisHfQ_iz2iGel3MAQ4md
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Table 8. /api/v1/toon/{toonId}/view
Parameter Description

toonId

웹툰 ID

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

웹툰 정보 변경

HTTP Request

PATCH /api/v1/toon/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 73
X-CSRF-TOKEN: S8QvIQWB8PnrxjSlfJHmE3a30XwlAo4stjFUzmwKHrExWgRzL6ZLRTW1lc_G9wDEHrzSdRKO_B4TYb0B0wRs-Vw9etNUbWJG
Host: localhost:8080

{
  "title" : "update-title",
  "description" : "update-description"
}
Table 9. /api/v1/toon/{toonId}
Parameter Description

toonId

웹툰 ID

Path Type Description

title

String

변경할 제목

description

String

변경할 설명

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

이미지 삽입

HTTP Request

$ curl 'http://localhost:8080/api/v1/toon/1/image/3' -i -X POST \
    -H 'Content-Type: multipart/form-data' \
    -H 'X-CSRF-TOKEN: cMKV_AjMasS8znZ_VyOJEoVdYO7Rel00bbLxOKmWbBPPuvBDE_qty2yuWPSRr0FGMw69cbxtTdfmSmwZD9fGXZCmD3L8icJ0' \
    -F 'image=@sample1.png;type=multipart/form-data'

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 35

{
  "path" : "toons/1/1-12.png"
}
Path Type Description

path

String

새로 삽입된 이미지 경로

이미지 삭제

HTTP Request

DELETE /api/v1/toon/1/image/3 HTTP/1.1
X-CSRF-TOKEN: GRa4-eZ_zZe61hytwzesAJ1STFaao_IpMWIY024KXbzrlS_6eCDdmN9P-66X5y-d9xqYNPhnYW6ikcoECFMr5Qoya4SO9E7N
Host: localhost:8080
Table 10. /api/v1/toon/{toonId}/image/{index}
Parameter Description

toonId

웹툰 ID

index

삭제 위치
(0부터 시작)

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

Search API

유저 검색

HTTP Request

keyword: "김영현"

GET /api/v1/search/user?keyword=%EA%B9%80%EC%98%81%ED%98%84&page=0&size=5 HTTP/1.1
X-CSRF-TOKEN: hjh6nuho59tw8fj0U4z4upkt6T0I5kdYLMsqJsOjV_SZhYG54gsY_Ixa3r1dxM-RZ6HM36tPxFw93n51HfwaFfrCZpes57DY
Host: localhost:8080
Parameter Description

keyword

검색 키워드

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 428

{
  "users" : [ {
    "id" : 1,
    "nickname" : "김영현 광팬",
    "tag" : "@chocoSongEE",
    "profileImagePath" : "profileImages/1.png"
  }, {
    "id" : 2,
    "nickname" : "김영현",
    "tag" : "@Kinggggg",
    "profileImagePath" : "profileImages/1.png"
  }, {
    "id" : 7,
    "nickname" : "패션개발자김영현",
    "tag" : "@Fashion",
    "profileImagePath" : "profileImages/1.png"
  } ]
}
Path Type Description

users[]

Array

유저 정보 목록 데이터

users[].id

Number

유저 ID

users[].nickname

String

유저 닉네임

users[].tag

String

유저 태그

users[].profileImagePath

String

유저 프로필 이미지 경로

웹툰 검색

HTTP Request

keyword: "김영현"

GET /api/v1/search/toon?keyword=%EA%B9%80%EC%98%81%ED%98%84&page=0&size=5 HTTP/1.1
X-CSRF-TOKEN: ybYH6w7gmVnu3nQrjb0aZS17va7fawhejYN3D-w49MJe_Py-8dVl3DfVrDrD6kQd6ZAuAxxOkJe5DT5z6-cWadkLkadunpmJ
Host: localhost:8080
Parameter Description

keyword

검색 키워드

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 288

{
  "cartoons" : [ {
    "id" : 1,
    "title" : "김영현의 모험",
    "author" : "김승환",
    "thumbnailUrl" : "toons/1/1-thumb.png"
  }, {
    "id" : 3,
    "title" : "용사 김영현",
    "author" : "김승환",
    "thumbnailUrl" : "toons/3/3-thumb.png"
  } ]
}
Path Type Description

cartoons[]

Array

만화 정보 목록 데이터

cartoons[].id

Number

만화 ID

cartoons[].title

String

만화 제목

cartoons[].author

String

작가 이름

cartoons[].thumbnailUrl

String

만화 썸네일 url

Collection API

컬렉션 생성

HTTP Request

POST /api/v1/collection/create HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 52
X-CSRF-TOKEN: J7CtjxyM46aVudEhOo2WIg3Is54WHTD9WKiqUTwekQZZImw6Q9GVvCu80se43ORCCqCiETyqnv8uJFbQasyTZAkoqTNqFlwK
Host: localhost:8080

{
  "title" : "sample-title",
  "closed" : true
}
Path Type Description

title

String

Collection 제목

closed

Boolean

비공개 여부 (true: 비공개, false: 공개)

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 26

{
  "collectionId" : 1
}
Path Type Description

collectionId

Number

생성된 Collection ID

컬렉션 삭제

HTTP Request

DELETE /api/v1/collection/1 HTTP/1.1
X-CSRF-TOKEN: T1ucYjMGmYWnrfj1GUwnwaWIJPRmspSGLvG9_QnDcCrf5fd9fD-oAAZnq7WKmcvMKWET-JO_CZVRh62rS5KKz2unRUzn3cIf
Host: localhost:8080
Table 11. /api/v1/collection/{collectionId}
Parameter Description

collectionId

Collection ID

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

컬렉션 리스트 조회

HTTP Request

GET /api/v1/collection/author/1?page=0&size=30 HTTP/1.1
X-CSRF-TOKEN: uf1E8_89WUTaNOOP9sjz3SowAUyq_We_xESeGRVfkMtkn4nTi8p1kcgNayf3A9XsxeXHuxgDLHTPxQGS_CauLyc6oPJRrbzn
Host: localhost:8080
Table 12. /api/v1/collection/author/{authorId}
Parameter Description

authorId

조회할 유저 ID

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 492

{
  "collectionInfos" : [ {
    "id" : 1,
    "title" : "title1",
    "closed" : false,
    "thumbnailPaths" : [ ]
  }, {
    "id" : 2,
    "title" : "title2",
    "closed" : false,
    "thumbnailPaths" : [ "cartoon/thumbnail-path/1", "cartoon/thumbnail-path/2" ]
  }, {
    "id" : 3,
    "title" : "title3",
    "closed" : true,
    "thumbnailPaths" : [ "cartoon/thumbnail-path/1", "cartoon/thumbnail-path/2", "cartoon/thumbnail-path/3", "cartoon/thumbnail-path/4" ]
  } ]
}
Path Type Description

collectionInfos

Array

Collection 목록 데이터

collectionInfos[].id

Number

Collection ID

collectionInfos[].title

String

Collection 제목

collectionInfos[].closed

Boolean

Collection 비공개 여부 (true: 비공개 | false: 공개)

collectionInfos[].thumbnailPaths

Array

Collection의 대표 북마크 썸네일 4개

Bookmark API

북마크 생성

HTTP Request

POST /api/v1/collection/1/1 HTTP/1.1
X-CSRF-TOKEN: yc1z8eNEUl2WF07QvILouFsIiSB-8HpDuN0N_UFqxwj-p5ue_v9EwNcmZWW7cijp3a_c3Wk8pEJMwU9uge88z3RfoWmfwaOm
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Table 13. /api/v1/collection/{collectionId}/{cartoonId}
Parameter Description

collectionId

Collection ID

cartoonId

웹툰 ID

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 24

{
  "bookmarkId" : 1
}
Path Type Description

bookmarkId

Number

생성된 Bookmark ID

북마크 삭제

HTTP Request

DELETE /api/v1/bookmark/1 HTTP/1.1
X-CSRF-TOKEN: 4Iik6lPHlNjVOq922QFRybsKaP7d5XaRVvjOMIlO8jDZMBf60r6QiTbwrO34DpZFuixl-ItvRcbq0kG8YJyvVLArkFK8VXLN
Host: localhost:8080
Table 14. /api/v1/bookmark/{bookmarkId}
Parameter Description

bookmarkId

북마크 ID

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

북마크 리스트 조회

HTTP Request

GET /api/v1/collection/1?page=0&size=5 HTTP/1.1
X-CSRF-TOKEN: iSnA8TC0knZazzBgqPYuyM-hE1dX2CjDRog3gb8r0HOwsG6Xux-mxFOAoEV3qVVWmdsarfrEPjU1vRruJ7kAuY0e50SHiV6i
Host: localhost:8080
Table 15. /api/v1/collection/{collectionId}
Parameter Description

collectionId

조회할 Collection ID

Query Parameters
Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 460

{
  "bookmarkInfos" : [ {
    "bookmarkId" : 1,
    "cartoonId" : 2,
    "cartoonTitle" : "cartoon-title-1",
    "thumbnailPath" : "cartoon/thumbnail-path/1"
  }, {
    "bookmarkId" : 2,
    "cartoonId" : 4,
    "cartoonTitle" : "cartoon-title-2",
    "thumbnailPath" : "cartoon/thumbnail-path/2"
  }, {
    "bookmarkId" : 3,
    "cartoonId" : 7,
    "cartoonTitle" : "cartoon-title-3",
    "thumbnailPath" : "cartoon/thumbnail-path/3"
  } ]
}
Path Type Description

bookmarkInfos

Array

북마크 목록 데이터

bookmarkInfos[].bookmarkId

Number

북마크 ID

bookmarkInfos[].cartoonId

Number

북마크한 웹툰 ID

bookmarkInfos[].cartoonTitle

String

북마크한 웹툰 제목

bookmarkInfos[].thumbnailPath

String

북마크한 웹툰 썸네일 이미지 경로

Like API

좋아요

HTTP Request

POST /api/v1/like/1 HTTP/1.1
X-CSRF-TOKEN: Vvyc8SqVWlKLuYGgj59M1TRIz93Go1BKWgLycDYhHQY3NfITNMT6lR_3azamgeCX7LJ45lYs4uT1mmdnODKQE1QYJTUPBJQh
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Table 16. /api/v1/like/{toonId}
Parameter Description

toonId

웹툰 ID

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

싫어요

HTTP Request

POST /api/v1/dislike/1 HTTP/1.1
X-CSRF-TOKEN: MSIkP2yCIwGaDmAkCQwneYDkSVkd5xLGFgKTkbKQMGws1Kw-BEAWCQ7hQjC3OVJAbSETG7jVZGB50ifrL2D29YKoBVpJ4p1c
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Table 17. /api/v1/dislike/{toonId}
Parameter Description

toonId

웹툰 ID

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

Comment API

댓글 등록

HTTP Request

Table 18. /api/v1/comment/{toonId}
Parameter Description

toonId

웹툰 ID

POST /api/v1/comment/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 36
X-CSRF-TOKEN: cPIfPc_TmbmQx9gtKXZ3qKDI0i0o47gNf_kBlEgdTJhOi9BRQMIqXK7kqty98btLEVtDn8aq_08fhYogS84y8nl4eP18s-U0
Host: localhost:8080

{
  "content" : "sample-content"
}
Path Type Description

content

String

댓글 내용 (200자 이내)

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 23

{
  "commentId" : 1
}
Path Type Description

commentId

Number

생성된 댓글 ID

댓글 삭제

HTTP Request

DELETE /api/v1/comment/1 HTTP/1.1
X-CSRF-TOKEN: aEqHBQx2oJRFuyMc3BD9AyfPB7wXOKpiMwDuEsGEoRnWy3deWXy-PG0SxaNojUJ96j3JYkH5KoQmWZxPVTKPJfa0x3-3qEM4
Host: localhost:8080
Table 19. /api/v1/comment/{commentId}
Parameter Description

commentId

댓글 ID

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

웹툰 댓글 조회

HTTP Request

GET /api/v1/comment/1?page=0&size=10 HTTP/1.1
X-CSRF-TOKEN: bMWBZz9bqdsrzy_t335hiRqGlC1c5lN5bsQkOKyljW-HwwrxWaO2UQppkesG9h2PvFNV7CmyuRRtg2ZUDaAdXMjDtVax8zqS
Host: localhost:8080
Table 20. /api/v1/comment/{toonId}
Parameter Description

toonId

웹툰 ID

Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 1348

{
  "comments" : [ {
    "commentId" : 1,
    "userInfo" : {
      "id" : 1,
      "nickname" : "Hotoran",
      "tag" : "hoto_ran",
      "profileImagePath" : "thumnnail/path/1"
    },
    "content" : "sample 1",
    "myComment" : true,
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  }, {
    "commentId" : 5,
    "userInfo" : {
      "id" : 2,
      "nickname" : "Lepetit",
      "tag" : "iced3974",
      "profileImagePath" : "thumnnail/path/2"
    },
    "content" : "sample 2",
    "myComment" : false,
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  }, {
    "commentId" : 12,
    "userInfo" : {
      "id" : 3,
      "nickname" : "Kimasds",
      "tag" : "kimyy333",
      "profileImagePath" : "thumnnail/path/3"
    },
    "content" : "sample 3",
    "myComment" : false,
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  }, {
    "commentId" : 13,
    "userInfo" : {
      "id" : 4,
      "nickname" : "LEEEEEE",
      "tag" : "timel2ss",
      "profileImagePath" : "thumnnail/path/4"
    },
    "content" : "sample 4",
    "myComment" : false,
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  } ]
}
Path Type Description

comments

Array

댓글 데이터

comments[].commentId

Number

댓글 ID

comments[].userInfo

Object

댓글 유저 정보

comments[].userInfo.id

Number

댓글 유저 ID

comments[].userInfo.nickname

String

댓글 유저 닉네임

comments[].userInfo.tag

String

댓글 유저 태그

comments[].userInfo.profileImagePath

String

댓글 유저 프로필이미지 경로

comments[].content

String

댓글 내용

comments[].myComment

Boolean

자신의 댓글 여부 (true: 조회한 유저의 댓글 | false: 다른 사람)

comments[].createdDateTime

String

댓글 생성 시각

comments[].modifiedDateTime

String

댓글 수정 시각

자신이 작성한 댓글 조회

HTTP Request

GET /api/v1/comment/myComment?page=0&size=10 HTTP/1.1
X-CSRF-TOKEN: lAONmgYlDZlz_jR4ne8-U-OB0yHzpQLHtxlemyeLZb5aKJjuoTa1_mBEOfhexgUbqcIKN9ay_kOXlGfqh3tvoxO7UIw5Sv6K
Host: localhost:8080
Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 1123

{
  "comments" : [ {
    "commentId" : 1,
    "cartoonId" : 12,
    "cartoonTitle" : "김영현의 모험1",
    "cartoonThumbnailUrl" : "김영현",
    "content" : "thumbnail/path/1",
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  }, {
    "commentId" : 2,
    "cartoonId" : 14,
    "cartoonTitle" : "이세계 용사 김영현",
    "cartoonThumbnailUrl" : "SPR",
    "content" : "thumbnail/path/2",
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  }, {
    "commentId" : 3,
    "cartoonId" : 25,
    "cartoonTitle" : "태어나보니 김영현",
    "cartoonThumbnailUrl" : "Inkojava",
    "content" : "thumbnail/path/3",
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  }, {
    "commentId" : 4,
    "cartoonId" : 43,
    "cartoonTitle" : "김영현의 모험2",
    "cartoonThumbnailUrl" : "김영현",
    "content" : "thumbnail/path/4",
    "createdDateTime" : "2023-11-01T09:17:11",
    "modifiedDateTime" : "2023-11-01T09:17:11"
  } ]
}
Path Type Description

comments

Array

댓글 데이터

comments[].commentId

Number

댓글 ID

comments[].cartoonId

Number

댓글 단 웹툰 ID

comments[].cartoonTitle

String

댓글 단 웹툰 제목

comments[].cartoonThumbnailUrl

String

댓글 단 웹툰 썸네일 URL

comments[].content

String

댓글 내용

comments[].createdDateTime

String

댓글 생성 시각

comments[].modifiedDateTime

String

댓글 수정 시각

Authentication API

로그인

HTTP Request

POST /api/v1/login HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 67
X-CSRF-TOKEN: leNCfyi3-8dxYl34x6N55ThAU2NM0_txxBUJ7JPRUOqebarHpNQjTEmHmf9cVTnNpo5N3AFzfgIp48lc8XQ91fbkYd-oWp2j
Host: localhost:8080

{
  "email" : "sample@email.com",
  "password" : "q1w2e3r4!@#"
}
Path Type Description

email

String

이메일 주소 (이메일 형식)

password

String

비밀번호 (20자 이내)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 429

{
  "userId" : 1,
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzYW1wbGVAZW1haWwuY29tIiwiZW1haWwiOiJzYW1wbGVAZW1haWwuY29tIiwiaWF0IjoxNjkxODQ5NDU1LCJleHAiOjE2OTE4NTEyNTV9.P_clLb6hZOQ9gHtzhW5-7bFgSbWBaqVnS7AVF-yJ9Qs",
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzYW1wbGVAZW1haWwuY29tIiwiZW1haWwiOiJzYW1wbGVAZW1haWwuY29tIiwiaWF0IjoxNjkxODQ5NDU1LCJleHAiOjE2OTMwNTkwNTV9.mTA7MeINcCshC7Oz5rY6R8RVX8TxrSFgakKBqIhK9pY"
}
Path Type Description

userId

Number

유저 ID

accessToken

String

access 토큰 (ttl 30분)

refreshToken

String

refresh 토큰 (ttl 7일)

토큰 재발행

HTTP Request

POST /api/v1/token/reissue HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 208
X-CSRF-TOKEN: rZ04AM7pdpxKZvLsyesGrk8944yoQZ5pbbja1KejMcOTaoBdzKUBN_7fE6RnVJHV-8Yym3wLzu6bIqhECdnj4JKWVaaiXrA7
Host: localhost:8080

{
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzYW1wbGVAZW1haWwuY29tIiwiZW1haWwiOiJzYW1wbGVAZW1haWwuY29tIiwiaWF0IjoxNjkxODQ5NDU1LCJleHAiOjE2OTMwNTkwNTV9.mTA7MeINcCshC7Oz5rY6R8RVX8TxrSFgakKBqIhK9pY"
}
Path Type Description

refreshToken

String

refresh 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 412

{
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzYW1wbGVAZW1haWwuY29tIiwiZW1haWwiOiJzYW1wbGVAZW1haWwuY29tIiwiaWF0IjoxNjkxODQ5NDU1LCJleHAiOjE2OTE4NTEyNTV9.P_clLb6hZOQ9gHtzhW5-7bFgSbWBaqVnS7AVF-yJ9Qs",
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzYW1wbGVAZW1haWwuY29tIiwiZW1haWwiOiJzYW1wbGVAZW1haWwuY29tIiwiaWF0IjoxNjkxODQ5NDU1LCJleHAiOjE2OTMwNTkwNTV9.mTA7MeINcCshC7Oz5rY6R8RVX8TxrSFgakKBqIhK9pY"
}
Path Type Description

accessToken

String

access 토큰 (ttl 30분)

refreshToken

String

refresh 토큰 (ttl 7일)

User API

회원가입

HTTP Request

POST /api/v1/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 156
X-CSRF-TOKEN: bHDkpEYHhCe6_tubOerIbs2scL9Fzrr-uB5MJL_QHiNu83ejXRaCkHY3s0aXmrn4WMf8XP3JXd10-djT3n18QtrkJhIKxkLB
Host: localhost:8080

{
  "name" : "sample_name",
  "nickname" : "sample_nickname",
  "tag" : "sample_tag",
  "email" : "sample@email.com",
  "password" : "!@#sAmple1234"
}
Path Type Description

name

String

이름 (20자 이내)

nickname

String

닉네임 (20자 이내)

tag

String

태그 (15자 이내, 영문, 특수문자(_.) 허용

email

String

이메일 주소 (이메일 형식)

password

String

비밀번호 (8자 이상, 20자 이내, 영어 소문자/숫자/특수문자(!@#$%^&*~?) 1개 이상 포함)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 20

{
  "userId" : 1
}
Path Type Description

userId

Number

유저 ID

유저 정보 조회

HTTP Request

GET /api/v1/user/1 HTTP/1.1
X-CSRF-TOKEN: g15MR1eoT5t92QW3vTt0AI5s1p2Ecpr5h46t3p6TZV5vW9yw5zgpcjSYK6NQuzCCjBZAZOxa-_-3RvzU5r2Yv6unBmgMa7_V
Host: localhost:8080
Table 21. /api/v1/user/{inquiryUserId}
Parameter Description

inquiryUserId

조회할 유저 ID

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 222

{
  "id" : 1,
  "nickname" : "sample-nickname",
  "tag" : "sample-tag",
  "profileImagePath" : "sample-path",
  "statusMessage" : "sample-message",
  "followerCount" : 20,
  "followCount" : 42,
  "follow" : true
}
Path Type Description

id

Number

조회된 유저 ID

nickname

String

조회된 유저 닉네임

tag

String

조회된 유저 태그

profileImagePath

String

조회된 유저 프로필 이미지 경로

statusMessage

String

조회된 유저 상태메시지

follow

Boolean

팔로우 여부

followerCount

Number

나를 팔로우 하는 유저 수

followCount

Number

내가 팔로우 하는 유저 수

유저 태그 중복 검사

HTTP Request

POST /api/v1/user/sample-tag HTTP/1.1
X-CSRF-TOKEN: FEyhD7lPhgSjqy23Zv8CDM5MSr1psXvjYJyd-RFMpPvdCBqbJHzHadx6tTCOnh2GBNI2NKovZ98Pgx_OBP6lzikokMnrbnz9
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Table 22. /api/v1/user/{tag}
Parameter Description

tag

유저 태그

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 26

{
  "tagExist" : false
}
Path Type Description

tagExist

Boolean

태그 존재 여부

Profile API

프로필 이미지 업로드

HTTP Request

$ curl 'http://localhost:8080/api/v1/user/image/upload' -i -X POST \
    -H 'Content-Type: multipart/form-data' \
    -H 'X-CSRF-TOKEN: 8CrNV9WXkHvAbqUBGeAM-4rFVLtGkGc9BU9QMEd3HCofq2chkR_7ZuKmoh3tX5NnKs04y7jxeYNwoQEQMntpUXUSKEsqmAUR' \
    -F 'profileImage=@sample1.png;type=multipart/form-data'

HTTP Response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 28

{
  "profileImageId" : 1
}
Path Type Description

profileImageId

Number

업로드된 프로필 이미지 ID

기본 이미지로 프로필 변경

HTTP Request

PATCH /api/v1/user/image/default HTTP/1.1
X-CSRF-TOKEN: _CYdjrczAAqhGFlRab0YZw3_sfIH16vtBZ03pgAv-FhFpOAOnhR47Y8EOTKMe29oWpAsBTnJnMox4ZvANv8PlmMWwWl9l4I4
Host: localhost:8080

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

유저 프로필 정보 변경

HTTP Request

PATCH /api/v1/user HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 108
X-CSRF-TOKEN: 80GePdjPg4YAKXiyO6AQ4N73i72Y-I-JD4zdm8WiEm-qtvBYkXWuXOusteItEE-EX40kg7jFpoT6zumkbbrtqKaUcQ6ThJFo
Host: localhost:8080

{
  "nickname" : "김영현",
  "tag" : "Kingggg",
  "password" : "q1w2e3r4!",
  "statusMessage" : ""
}
Path Type Description

nickname

String

변경할 닉네임 (20자 이내)

tag

String

변경할 태그 (15자 이내, 영문, 특수문자(_.) 허용)

password

String

변경할 비밀번호 (8자 이상, 20자 이내, 영어 소문자/숫자/특수문자(!@#$%^&*~?) 1개 이상 포함)

statusMessage

String

변경할 상태 메시지 (500자 이내)

HTTP Response

HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN

Rank API

유저 랭킹

HTTP Request

GET /api/v1/rank/user?page=0&size=50 HTTP/1.1
X-CSRF-TOKEN: CbK8awx7ahHdk3wE0MtQLO0QPEU1FKpzg-TRePKCkX97CXhrOYSPXDpCWiLwoU4zteZkStRxEX0CJJhesNK0HZPnpEweMUsK
Host: localhost:8080
Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 524

{
  "users" : [ {
    "id" : 1,
    "nickname" : "hotoran",
    "tag" : "@hotoran",
    "profileImagePath" : "profileImages/1.png"
  }, {
    "id" : 5,
    "nickname" : "Iced",
    "tag" : "@Iced",
    "profileImagePath" : "profileImages/1.png"
  }, {
    "id" : 2,
    "nickname" : "chocosongEE",
    "tag" : "@chocosongee",
    "profileImagePath" : "profileImages/1.png"
  }, {
    "id" : 6,
    "nickname" : "timel2ss",
    "tag" : "@timel2ss",
    "profileImagePath" : "profileImages/1.png"
  } ]
}
Path Type Description

users

Array

유저 랭킹 목록

users[].id

Number

유저 id

users[].nickname

String

유저 닉네임

users[].tag

String

유저 태그

users[].profileImagePath

String

유저 프로필 이미지 경로

웹툰 랭킹

HTTP Request

GET /api/v1/rank/toon?page=0&size=50 HTTP/1.1
X-CSRF-TOKEN: hH3HxCiC2DNz2iaqns3fmBjt6BHJvtq3EulrxNZC2y3oPgz1tRv08Ri26gde7USTr-Dr_n7axSmvj-yaI99f9uBy6BraXGiW
Host: localhost:8080
Parameter Description

page

페이지 번호

size

데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 550

{
  "cartoons" : [ {
    "id" : 1,
    "title" : "김영현의 모험",
    "author" : "Kinggg",
    "thumbnailUrl" : "toons/1/1-thumb.png"
  }, {
    "id" : 3,
    "title" : "김영현의 모험2",
    "author" : "Kinggg",
    "thumbnailUrl" : "toons/3/3-thumb.png"
  }, {
    "id" : 7,
    "title" : "김영현의 모험3",
    "author" : "Kinggg",
    "thumbnailUrl" : "toons/7/7-thumb.png"
  }, {
    "id" : 2,
    "title" : "김영현의 모험4",
    "author" : "Kinggg",
    "thumbnailUrl" : "toons/2/2-thumb.png"
  } ]
}
Path Type Description

cartoons

Array

만화 랭킹 목록

cartoons[].id

Number

만화 id

cartoons[].title

String

만화 제목

cartoons[].author

String

작가 이름

cartoons[].thumbnailUrl

String

만화 썸네일 url

Feed API

Feed

HTTP Request

GET /api/v1/feed?page=0&size=10 HTTP/1.1
X-CSRF-TOKEN: hKQWoye2DlolKCAuwVaC2uC3o89QQgppVq6dIv4C_BPI2sFEtpdwlBPVPzsIEBIe8Hu24tiCjq4yJGhEM8r-EJ03mCStvPUm
Host: localhost:8080
Parameter Description

page

페이지 번호

size

데이터 수
(default size: 10)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 31

{
  "feed" : [ 1, 2, 3, 4 ]
}
Path Type Description

feed

Array

웹툰 ID 목록
(최대 개수 [요청 데이터 수 * 3])

Exception API

[400] Bad Request 예외

HTTP Request

POST /api/v1/collection/1/1 HTTP/1.1
X-CSRF-TOKEN: ZsT7o2DFCxfq7z5iUPzbUzvSfs0DIMJKukfeEJm3MZffkuAwUvCewgajOSLH310BZtHvYQKwU_Q6RfJnjiO4cq2BCKG5otJS
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 74

{
  "code" : "400",
  "message" : "사용자 권한이 없습니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

POST /api/v1/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 178
X-CSRF-TOKEN: 3koYkWvMK7WgMiwBANx6hH6qJ5Y0CpeAgNuDRNvjYiL38Ufy6X9-8l30ToGNBk9lZfFO4B-eCq8EMqCts7-wJ--BUUfAknXC
Host: localhost:8080

{
  "name" : "이미 등록된 이메일 주소",
  "nickname" : "sample_nickname",
  "tag" : "sample_tag",
  "email" : "sample@email.com",
  "password" : "!@#sAmple1234"
}

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 88

{
  "code" : "400",
  "message" : "이미 사용 중인 이메일 주소입니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

POST /api/v1/token/reissue HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 77
X-CSRF-TOKEN: F3OXe0BTvBfchiZBsWXnfuR6DR3QKoBv834cNSbRK_SmkeECIkb1GiE3iifx4EV1gEjTHdYYICXlErFCl0srVxK3SsWS99A6
Host: localhost:8080

{
  "refreshToken" : "로그인 했을 때의 IP 주소와 다른 경우"
}

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 94

{
  "code" : "400",
  "message" : "잘못된 접근입니다. 다시 로그인하세요."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

POST /api/v1/token/reissue HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 67
X-CSRF-TOKEN: Tr-A0ClDxi3QbRGs-BkM-mR38kDwRzcMGt31KPKDxKrnwaUZdtm14xpx8BT9DCGayDQ4w1FO3yHAfwYhe-nAEZG1oc-DpZZ4
Host: localhost:8080

{
  "refreshToken" : "잘못된 토큰 값을 입력한 경우"
}

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 90

{
  "code" : "400",
  "message" : "유효하지 않거나 만료된 토큰입니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

POST /api/v1/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 195
X-CSRF-TOKEN: W71r8OmCDyTFfnO1XmU6SGv1UxkuIKMWPTCBlSPlr6ffY5eEOIRZwIu7NkXoTxLWb0gOf1PDfiEeGcY7DlLj80eHnpTsUaC8
Host: localhost:8080

{
  "name" : "sample_name",
  "nickname" : "sample_nickname",
  "tag" : "sample_tag",
  "email" : "이메일 형식이 아님",
  "password" : "비밀번호 조건을 달성하지 못함"
}

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 250

{
  "code" : "400",
  "message" : "잘못된 요청입니다.",
  "validation" : {
    "password" : "must match \"^(?=.*[a-z])(?=.*\\d)(?=.*[!@#$%^&*~?])[A-Za-z\\d!@#$%^&*~?]{8,20}$\"",
    "email" : "must be a well-formed email address"
  }
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

validation

Object

검증 에러 메시지

validation.password

String

검증이 실패한 항목/이유

validation.email

String

검증이 실패한 항목/이유

HTTP Request

POST /api/v1/follow/2 HTTP/1.1
X-CSRF-TOKEN: iDYSsUFMWxckvYvz1JXUBtG-MlYUYHvsHyPzF9rB8eRMNpOZsVAjhXcvPyIJie2V57jgMeCKH28sWUnBLRTEdu_zkNd8VaGo
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 88

{
  "code" : "400",
  "message" : "요청 데이터를 처리할 수 없습니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

$ curl 'http://localhost:8080/api/v1/toon/1/image/3' -i -X POST \
    -H 'Content-Type: multipart/form-data' \
    -H 'X-CSRF-TOKEN: qjqczrWTcfcmEG9eS5PrUFy77bkMctT14xEnR1yP0dmBExTgz1mu_NTwRcQLIFw_Lb7fZWqJwIFoE7bY1ylBdz-_4ui3cnfS' \
    -F 'image=@sample1.png;type=multipart/form-data'

HTTP Response

HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 100

{
  "code" : "400",
  "message" : "이미지의 개수는 10개를 초과할 수 없습니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

[404] Not Found 예외

HTTP Request

GET /api/v1/toon/99999 HTTP/1.1
X-CSRF-TOKEN: 4-UtpYVTBmuMBZGA4s6u8tmGThgzXQtalbRgR_KLVxrLizvb2twew7xnPw-hNKm21eOawOG2Y3kBOGp3odADf5fobijzvQvj
Host: localhost:8080

HTTP Response

HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 77

{
  "code" : "404",
  "message" : "존재하지 않는 웹툰입니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

POST /api/v1/collection/99999/1 HTTP/1.1
X-CSRF-TOKEN: wVyHRJsAWRbo0jdxdePlyRbP_1ZxhqA4aGzoIugMXK1I_f8q9G-1J_o5aCfFt1UVQ87R-i_40jRJs8MVW1veF9E7P559xZwS
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

HTTP Response

HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 80

{
  "code" : "404",
  "message" : "존재하지 않는 콜렉션입니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

POST /api/v1/token/reissue HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 72
X-CSRF-TOKEN: lEk2OA74Z4sl5DyADK1tTYNd8JLt7V9mGLYazO3nE4HejBVXp3lVDDebVOkI0gy1NIBZL7Bt3fDa3GtLK4Eq_N_eceDtuSNh
Host: localhost:8080

{
  "refreshToken" : "Refresh 토큰 유효 기간이 지난 경우"
}

HTTP Response

HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 100

{
  "code" : "404",
  "message" : "세션이 만료되었습니다. 다시 로그인하세요."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

HTTP Request

GET /api/v1/user/99999 HTTP/1.1
X-CSRF-TOKEN: zMPAkObdIsmpVco249caSB1l9NG41LOFIX7Qav3W7YRcG-NB9fv18tXlR_uEZ_oH0foueSpd2endtYaoFkzkC8rh3eA_LYV2
Host: localhost:8080

HTTP Response

HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: SAMEORIGIN
Content-Length: 80

{
  "code" : "404",
  "message" : "존재하지 않는 사용자입니다."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지

[500] Internal Server Error 예외

HTTP Request

POST /api/v1/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 156
X-CSRF-TOKEN: 9tHJaZUIqwQu4UVXjuf7W5uHiEFhL1g8Pyover1UWFHv90aqkuStXqxukzcDg3Nku8rPb6q0pXhSGWkRBxsYToRgbWTZlSLJ
Host: localhost:8080

{
  "name" : "sample_name",
  "nickname" : "sample_nickname",
  "tag" : "sample_tag",
  "email" : "sample@email.com",
  "password" : "!@#sAmple1234"
}

HTTP Response

HTTP/1.1 500 Internal Server Error
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
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: 121

{
  "code" : "500",
  "message" : "서버 내부 오류가 발생했습니다. 나중에 다시 시도해주세요."
}
Path Type Description

code

String

HTTP 상태 코드

message

String

예외 메시지