티스토리 뷰
REST API란 무엇인가. 면접갔을때 자주 듣는 질문중 하나다. 뭐 이런저런 대답들을 하겠지만 대부분 이 그 답변안에 이런 내용이 있을것이다.
"조회는 GET, 등록은 POST, 수정은 PUT, 삭제는 DELETE를 이용한다."
이중 GET이랑 DELETE는 비교적 명확한데 반해(이름에서부터...) POST랑 PUT은 약간 헷갈리는 부분이 있었다. 그래서 두 메서드가 의미하는 바가 어떤 차이가 있는지 알아봤다.
이것저것 찾아봤는데.. 일단 역시 공식문서가 제일 잘돼있었다.
POST
post 메서드는 기존에 알고있던대로 등록에 관한 내용이다. http 메세지로 넘어온 엔티티를 새로운 자원으로 등록한다.
새로운 자원으로 등록하지않을 수도있는데 이런 경우엔 200(ok)이나 204(no content) response code로 응답한다. 새로운 자원으로 만들어진 경우에는 201(created) response code로 응답하며 신규 생성된 자원의 위치를 헤더에 포함해야한다. 무슨 말이냐하면 예를들어 게시판에 새로 게시물을 등록하면 이를 따라갈수있는 위치를 응답 헤더에 넣어야한다는 의미다.
201 created
Location: /board/2
PUT
post와 가장 큰차이는 put 메서드는 자원의 식별자를 이미 알고있는 상태여야한다는 점이다. put 메서드는 식별자의 자원을 http 메세지로 함께 넘어온 엔티티로 교체한다. response code는 200(ok), 204(no content)를 사용한다. 다만 put 메서드로 넘어온 식별자가 꼭 존재하고있는 식별자일 필요는 없다. 존재하지않는 식별자를 넘길수도있는데 이런 경우엔 넘어온 식별자를 id로 하는 새 자원을 생성하고 201(created) 응답을 한다. 식별자를 id로 사용할수없는 경우엔 에러코드로 응답한다.
차이
새 자원을 생성한다는 점에서 POST랑 같네?! 라고 생각할수도있지만 POST와 PUT의 가장 큰 차이는 POST는 request message로 포함된 엔티티를 이용해 새로운 자원을 생성해 내는것이고, PUT은 request message와 함께 넘어온 식별자의 자원을 만드는것이다. 음 말이 좀 이해하기 어려운데 똑같은 요청이 POST로 2번 날아오면 POST는 2개의 자원을 생성한다. 게시판에 글쓰기 요청을 2번 날리면 2개의 게시물이 등록되는것이다. PUT으로 동일한 요청을 2번 날린다고 생각해보자. 이때 PUT은 식별자를 포함해야한다. 다만 꼭 존재하는 식별자를 포함할 필요는 없으므로 존재하지않는 식별자로 요청을 하게되면 이때는 POST와 동일하게 자원을 생성한다. 하지만 두번째 요청에선 이미 첫번째 요청에서 생성된 자원이 있으므로 자원을 생성하지않고 교체하게된다. 이 부분이 POST와 PUT이 달라지게된다.
post request 예제(요청할때 식별자를 보내지않음)
POST /board
{
//...
}
put request 예제(요청할때 식별자를 보내야함, 그게 실제로 존재하는것인지는 중요치 않음)
PUT /board/2
{
//...
}
정리
참고 자료들을 보면 idempotent 라는 단어가 등장한다. 우리말로하면 멱등성이라는건데 1번을 실행하든 100번을 실행하든 결과가 같은 성질을 의미한다. POST나 PUT이나 존재하지않는 자원으로 요청을하면 신규 등록을 하는건 동일하나 동일한 요청을 2번 이상했을때는 확연히 결과가 달라지게된다. POST메서드는 멱등성을 만족하지못하고, PUT은 만족하게된다. 평소에 궁금했던 내용인데 이번기회에 블로그에 정리해놓는다. 나중에 면접때 질문한번 들어왔음좋겠다.
참고내용
'Network' 카테고리의 다른 글
robots.txt (2) | 2018.01.01 |
---|---|
프록시 관련 HTTP header (0) | 2017.12.20 |
HTTP 메세저 형식 (0) | 2017.12.04 |
Response Code (0) | 2016.11.14 |
HTTP Method (0) | 2016.11.08 |
- Total
- Today
- Yesterday
- DesignPattern
- Jackson
- toby
- servlet
- MySQL
- JPA
- JavaScript Core
- code
- Git
- http
- TEST
- Design Pattern
- java8
- Spring
- mariadb
- programming
- OOP
- go-core
- frontend개발환경
- EffectiveJava
- javascript
- db
- generics
- clean code
- Kotlin
- 정규표현식
- spring cloud
- backend개발환경
- java
- frontcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |