개요

HTTP 동사

본 REST API에서 사용하는 HTTP 동사(verbs)는 가능한한 표준 HTTP와 REST 규약을 따릅니다.

동사 용례

GET

리소스를 가져올 때 사용

POST

새 리소스를 만들 때 사용

PUT

기존 리소스를 수정할 때 사용

PATCH

기존 리소스의 일부를 수정할 때 사용

DELETE

기존 리소스를 삭제할 떄 사용

HTTP 상태 코드

본 REST API에서 사용하는 HTTP 상태 코드는 가능한한 표준 HTTP와 REST 규약을 따릅니다.

상태 코드 용례

200 OK

요청을 성공적으로 처리함

201 Created

새 리소스를 성공적으로 생성함. 응답의 Location 헤더에 해당 리소스의 URI가 담겨있다.

204 No Content

기존 리소스를 성공적으로 수정함.

400 Bad Request

잘못된 요청을 보낸 경우. 응답 본문에 더 오류에 대한 정보가 담겨있다.

404 Not Found

요청한 리소스가 없음.

오류

에러 응답이 발생했을 때 (상태 코드 >= 400), 본문에 해당 문제를 기술한 JSON 객체가 담겨있다.

Auth Error

Error0001

Response body
{
  "timestamp" : "2020-10-02T22:50:18.7902702",
  "status" : 202,
  "error" : "0001",
  "message" : "ID: TestUser1 이미 사용중인 아이디입니다."
}

Error0002

Response body
{
  "timestamp" : "2020-10-02T22:50:16.6159715",
  "status" : 403,
  "error" : "0002",
  "message" : "ID: TestUser1 회원가입이 되어있지 않거나 잠긴 계정입니다."
}

Error0003

Response body
{
  "timestamp" : "2020-10-02T22:50:14.8562847",
  "status" : 403,
  "error" : "0003",
  "message" : "유효하지 않은 토큰입니다."
}

Error0004

Response body
{
  "timestamp" : "2020-10-02T22:50:14.9646203",
  "status" : 403,
  "error" : "0004",
  "message" : "손상된 토큰입니다."
}

Error0005

Response body
{
  "timestamp" : "2020-10-02T22:50:12.8269885",
  "status" : 403,
  "error" : "0005",
  "message" : "잘못된 인증입니다."
}

Error0006

Response body
{
  "timestamp" : "2020-10-02T22:50:12.6952261",
  "status" : 403,
  "error" : "0006",
  "message" : "만료된 토큰입니다."
}

Community Error

Error1001

Response body
{
  "timestamp" : "2020-10-02T22:49:54.2290311",
  "status" : 400,
  "error" : "1001",
  "message" : "존재하지 않거나 수정 권한이 없습니다."
}

Post Error

Error1101
Response body
{
  "timestamp" : "2020-10-02T22:49:54.8660554",
  "status" : 404,
  "error" : "1101",
  "message" : "존재하지 않는 게시글입니다."
}

System Error

Error2001

Response body
{
  "timestamp" : "2020-10-02T22:49:50.6524271",
  "status" : 400,
  "error" : "2001",
  "message" : "Unrecognized field \"message\" "
}

하이퍼미디어

본 REST API는 하이퍼미디어와 사용하며 응답에 담겨있는 리소스는 다른 리소스에 대한 링크를 가지고 있다. 응답은 Hypertext Application from resource to resource. Language (HAL) 형식을 따른다. 링크는 `_links`라는 키로 제공한다. 본 API의 사용자(클라이언트)는 URI를 직접 생성하지 않아야 하며, 리소스에서 제공하는 링크를 사용해야 한다.

인증하기

Post 요청을 사용해서 인증할수있다.

HTTP request

POST /auth/signin HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 54
Host: templet.restapi.com

{
  "id" : "TestUser1",
  "password" : "password"
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 380

{
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE2LCJleHAiOjE2MDE2NDcyMTZ9.futR0hYXRxFZlFNx3oygo75JUzBK07JxK5FN5-Xl7zU",
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE2LCJleHAiOjE2MDIyNTE0MTZ9.bhb8fwGoCH1fqpnYzHnTry8R9ctTsNF1PXqay2Fw5ds"
}

회원가입하기

Post 요청을 사용해서 회원가입을 할 수있다.

HTTP request

POST /auth/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 88
Host: templet.restapi.com

{
  "id" : "TestUser1",
  "password" : "Password",
  "name" : "테스트 유저 1"
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 380

{
  "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE4LCJleHAiOjE2MDE2NDcyMTh9.QUPPZeRPDwtZXc-5i22areROEz64kyfQVbLpXeLSnm4",
  "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjE4LCJleHAiOjE2MDIyNTE0MTh9.GLwgWBQgf64aDD03tmNcXtHBgcu7VJ0gbgncKp55r_A"
}

회원가입하기

Get 요청을 사용해서 아이디 중복확인을 할 수있다.

HTTP request

GET /auth/checkid/TestUser1 HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
Content-Length: 35
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY

사용가능한 아이디입니다.

게시글 목록 조회

Get 요청을 사용해서 게시글 목록을 조회 할 수 있다.

HTTP request

GET /board/posts?page=1&size=2&sort=title%2CDESC HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 1469

{
  "_embedded" : {
    "postList" : [ {
      "postId" : 5,
      "title" : "게시글4",
      "writerId" : "TestUser4",
      "views" : 0,
      "commentNum" : 0,
      "modifiedDate" : "2020-10-02T22:50:05.658172",
      "_links" : {
        "self" : {
          "href" : "https://templet.restapi.com/board/posts/5"
        }
      }
    }, {
      "postId" : 4,
      "title" : "게시글3",
      "writerId" : "TestUser3",
      "views" : 0,
      "commentNum" : 0,
      "modifiedDate" : "2020-10-02T22:50:05.574237",
      "_links" : {
        "self" : {
          "href" : "https://templet.restapi.com/board/posts/4"
        }
      }
    } ]
  },
  "_links" : {
    "first" : {
      "href" : "https://templet.restapi.com/board/posts?page=0&size=2&sort=title,desc"
    },
    "prev" : {
      "href" : "https://templet.restapi.com/board/posts?page=0&size=2&sort=title,desc"
    },
    "self" : {
      "href" : "https://templet.restapi.com/board/posts?page=1&size=2&sort=title,desc"
    },
    "next" : {
      "href" : "https://templet.restapi.com/board/posts?page=2&size=2&sort=title,desc"
    },
    "last" : {
      "href" : "https://templet.restapi.com/board/posts?page=2&size=2&sort=title,desc"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#getPosts"
    }
  },
  "page" : {
    "size" : 2,
    "totalElements" : 6,
    "totalPages" : 3,
    "number" : 1
  }
}

게시글 작성

Post 요청을 사용해서 게시글을 작성 할 수 있다.

HTTP request

POST /board/posts HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJUZXN0VXNlcjEiLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWF0IjoxNjAxNjQ2NjA4LCJleHAiOjE2MDE2NDcyMDh9.LhJ93EfR0V6eK5ETzcpkwfvpg3eDX01WznQHBcfo4y8
Content-Length: 88
Host: templet.restapi.com

{
  "title" : "포스트 제목",
  "body" : "포스트 입력 테스트입니다."
}

Example response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Location: https://templet.restapi.com/board/posts/1
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 206

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#sendPost"
    }
  }
}

게시글 조회

Get 요청을 사용해서 게시글을 조회 할 수 있다.

Path parameters

Table 1. /board/posts/{postId}
Parameter Description

postId

게시글 아이디

HTTP request

GET /board/posts/1 HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 1561

{
  "title" : "게시글1",
  "writerId" : "TestUser1",
  "body" : "게시글 본문입니다.",
  "views" : 1,
  "createdDate" : "2020-10-02T22:50:05.0309156",
  "modifiedDate" : "2020-10-02T22:50:05.0309156",
  "comments" : [ {
    "commentId" : 1,
    "message" : "2번째 댓글",
    "commenterId" : "TestUser2",
    "createdDate" : "2020-10-02T22:50:05.123636",
    "modifiedDate" : "2020-10-02T22:50:05.123636",
    "_links" : {
      "self" : {
        "href" : "https://templet.restapi.com/board/posts/1"
      },
      "updateComment" : {
        "href" : "https://templet.restapi.com/board/posts/1"
      },
      "deleteComment" : {
        "href" : "https://templet.restapi.com/board/posts/1"
      }
    }
  }, {
    "commentId" : 2,
    "message" : "3번째 댓글",
    "commenterId" : "TestUser3",
    "createdDate" : "2020-10-02T22:50:05.2163657",
    "modifiedDate" : "2020-10-02T22:50:05.2163657",
    "_links" : {
      "self" : {
        "href" : "https://templet.restapi.com/board/posts/2"
      },
      "updateComment" : {
        "href" : "https://templet.restapi.com/board/posts/2"
      },
      "deleteComment" : {
        "href" : "https://templet.restapi.com/board/posts/2"
      }
    }
  } ],
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/1"
    },
    "sendComment" : {
      "href" : "https://templet.restapi.com/board/posts/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#getPost"
    }
  }
}

게시글 수정

Put 요청을 사용해서 게시글을 수정 할 수 있다.

Path parameters

Table 1. /board/posts/{postId}
Parameter Description

postId

게시글 아이디

HTTP request

PUT /board/posts/2 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 91
Host: templet.restapi.com

{
  "title" : "수정된 포스트",
  "body" : "포스트 수정 테스트입니다."
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 208

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/2"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#updatePost"
    }
  }
}

게시글 삭제

Delete 요청을 사용해서 게시글을 삭제 할 수 있다.

Path parameters

Table 1. /board/posts/{postId}
Parameter Description

postId

게시글 아이디

HTTP request

DELETE /board/posts/1 HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 208

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#deletePost"
    }
  }
}

댓글 작성

Post 요청을 사용해서 댓글을 작성 할 수 있다.

Path parameters

Table 1. /board/posts/{postId}
Parameter Description

postId

게시글 번호

HTTP request

POST /board/posts/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 38
Host: templet.restapi.com

{
  "message" : "댓글 테스트"
}

Example response

HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 209

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/1"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#sendComment"
    }
  }
}

댓글 수정

Put 요청을 사용해서 댓글을 수정 할 수 있다.

Path parameters

Table 1. /board/posts/{postId}/{commentId}
Parameter Description

postId

게시글 번호

commentId

댓글 번호

HTTP request

PUT /board/posts/2/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 45
Host: templet.restapi.com

{
  "message" : "댓글 수정 테스트"
}

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 211

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/2"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#updateComment"
    }
  }
}

댓글 삭제

Delete 요청을 사용해서 댓글을 삭제 할 수 있다.

Path parameters

Table 1. /board/posts/{postId}/{commentId}
Parameter Description

postId

게시글 번호

commentId

댓글 번호

HTTP request

DELETE /board/posts/3/2 HTTP/1.1
Host: templet.restapi.com

Example response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/hal+json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 211

{
  "_links" : {
    "self" : {
      "href" : "https://templet.restapi.com/board/posts/3"
    },
    "profile" : {
      "href" : "https://templet.restapi.com/docs/index.html#deleteComment"
    }
  }
}