[Spring Boot] 10. REST API와 JSON
- -
10장. REST API와 JSON

10.1. REST API와 JSON 등장 배경
웹 서비스를 사용하는 클라이언트는 웹 브라우저 뿐만 아니라 스마트폰, 스마트워치, 태블릿, CCTV, 각종 센서 등으로 다양하다. 따라서 서버는 이러한 모든 클라리언트의 요청에 응답해야 하고 웹 브라우저 뿐만 아니라 어떤 기기가 와도 기기에 맞는 뷰 페이지를 응답해야 하는데, 이것이 REST API가 필요한 이유이다.
· REST API (Representational State Transfer API)
- 서버의 자원을 클라이언트에 구애받지 않고 사용할 수 있게 하는 설계 방식
- REST API 방식에서는 HTTP 요청에 대한 응답으로 서버의 자원을 반환한다.
- 이 때 서버에서 보내는 응답이 특정 기기에 종속되지 않도록 모든 기기에서 통용될 수 있는 데이터를 반환한다.
· REST API의 동작
- 서버는 클라이언트의 요청에 대한 응답으로 화면(View)이 아닌 데이터를 전송한다.
- 이때 사용하는 응답 데이터는 JSON(JavaScript Object Notatoin)이다.
- 과거에는 응답 데이터로 XML을 많이 사용했지만, 최근에는 JSON으로 통일하는 추세.

· XML과 JSON
// XML : Extensible Markup Language
<article-form>
<id>1</id>
<title>제목제목</title>
<content>내용내용</content>
</article-form>
// JSON : JavaScript Object Notation
{
"id" : 1,
"title" : "제목제목",
"content" : "내용내용"
}
10.2. REST API 동작 살펴보기
10.2.1. {JSON} Placeholder 사이트 둘러보기
· HTTP 메서드와 URL 경로

· 단일 데이터 조회
URL 경로를 확인해보면 .../post/1 이기에 1번 게시글을 조회하는 요청이다. 결과를 보면 1번 게시글의 id, title, body, userId가 JSON 데이터로 반환되었다. 그런데 데이터 조회를 요청할 때는 method 속성 값으로 GET을 써야 하지만 아래 코드에서는 GET을 볼 수가 없는데, 이는 GET은 method 속성의 기본값이기 때문에 이 경우에는 생략이 가능하기 때문이다.

·전체 데이터 조회
URL 경로를 확인해보면 .../posts 이기에 전체 게시글 데이터를 조회하는 요청이다. 결과를 보면 1번부터 100번까지 모든 게시글이 JSON 데이터로 반환되었다. 마찬가지로 이 역시 GET 요청이어서 method 속성을 따로 표시하지 않고 생략한다.

·데이터 생성 요청과 응답
method의 속성 값이 POST이므로 데이터 생성 요청이다. 요청의 body 부분을 보면 JSON 데이터로 새 게시글의 title(제목), body(내용), userId(사용자 아이디) 값도 같이 보낸 것을 확인할 수 있다. 결과를 보면 요청 부분의 body 내용을 JSON 데이터로 그대로 반환한 것을 볼 수 있다.

·데이터 수정 요청 : PUT과 PATCH의 차이점


·데이터 삭제 요청

10.2.2. Talend API Tester 설치

10.2.3. GET 요청하고 응답받기
·전체 데이터 조회 요청
전체 데이터 조회를 위해 .../posts URL 경로를 작성하면 응답으로 200이 온다. 200은 요청이 잘 처리됐다는 것을 의미하는 상태 코드이고, BODY 부분을 보면 응답으로 온 1번부터 100번까지 게시글의 JSON 데이터를 확인할 수 있다.


·단일 데이터 조회 요청
단일 데이터 조회를 위해 .../posts/1 URL 경로를 작성하면 응답으로 200이 온다. BODY 부분을 보면 응답으로 1번 게시글의 JSON 데이터를 확인할 수 있다.


·데이터 조회 실패
게시글은 100번까지 있기에 101번 게시글을 요청하는 .../posts/101 URL을 입력하면 응답으로 에러가 발생한다. 상태코드 404는 요청한 페이지를 찾을 수 없다(not found)는 의미이다.

·HTTP 상태코드
| 상태 코드 | 설명 |
| 1XX(정보) | 요청이 수신되어 처리 중입니다. |
| 2XX(성공) | 요청이 정상적으로 처리됐습니다. |
| 3XX(리다이렉트 메시지) | 요청을 완료하려면 추가 행동이 필요합니다. |
| 4XX(클라이언트 요청 오류) | 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없습니다. |
| 5XX(서버 응답 오류) | 서버 내부에 에러가 발생해 클라리언트 요청에 대해 적절히 수행 불가. |
·HTTP 요청 메시지와 응답 메시지
| 종류 | 설명 |
| 시작 라인 | HTTP 요청 또는 응답 내용, 항상 한 줄로 끝난다. |
| 헤더 | HTTP 전송에 필요한 부가 정보(metadata) |
| 빈 라인 | 헤더의 끝을 알리는 빈 줄, 헤더가 모두 전송되었음을 알린다. |
| 본문 | 실제 전송하는 데이터가 있다. |
요청 메시지를 살펴보면 시작라인에는 요청의 종류(GET), URL 경로(/posts/101), 사용하는 HTTP 버전(HTTP/1.1)이 있고, 헤더에는 호스트 주소(jsonplaceholder.typicode.com, 어디로 보낼지에 대한 정보)가 있다. 즉, 헤더정보는 편지봉투와 같다고 볼 수 있다.

응답 메시지는 요청 메시지 아래 한 줄 띄고 그 다음부터 응답 메시지이다. 응답 메시지를 살펴보면 시작라인에는 HTTP 버전(HTTP/1.1)과 상태코드(404)가 있다. 헤더에는 응답을 보낸 날짜(date), 응답 데이터 형식 (content-type) 등이 있다. 응답 메시지의 헤더 아래에 한 줄을 띄고 그 다음 줄부터 본문이다.
본문에는 메시지를 실어 보내는 실제 데이터가 있다. 앞서 /posts/101을 요청해서 404 에러가 발생했으므로 본문은 비어있다. ({}) 즉, 헤더가 편지 봉투였다면 본문은 편지 내용과 같다.

10.2.4. POST 요청하고 응답받기
데이터 생성을 요청하고 응답을 받아보자. 메서드를 POST로 선택하고 URL은 .../posts로 수정하고 BODY 부분에 아래와 같이 내용을 입력하고 [SEND] 버튼을 클릭하자.

응답으로 201이 나온다. 상태 코드 201은 데이터가 잘 생성되었음을 의미하고, BODY 부분을 보면 새롭게 생성된 데이터가 JSON 형식으로 잘 반환된 것을 볼 수 있다.

실제 HTTP 메시지를 살펴보기 위해 [HTTP] 탭을 확인해보면 여청 메시지의 시작 라인에는 요청 정보(POST), URL 경로(/posts), HTTP 버전(HTTP/1.1)이 들어있다. 헤더에는 호스트 주소(jsonplaceholder.typicode.com), 데이터 형식(Content-Type) 등이 있고, 본문에는 새로 생성할 데이터 정보가 들어 있다.

응답 메시지도 시작라인에는 HTTP 버전(HTTP/1.1)과 상태코드(201)가 있다. 헤더에는 응답을 보낸 날짜(date), 응답 데이터 형식 (content-type) 등이 있고 본문에는 생성 데이터가 실려 반환되었다. 이때 id는 자동으로 101번이 매겨진다.

· 데이터 생성 요청 실패하는 경우
데이터 생성 요청이 실패했을 때 어떤 응답이 오는지 확인해 보자. 데이터 요청 실패를 위해 JSON 데이터를 아래와 같이 title과 body에 큰 따옴표(")를 지우고 [Send] 버튼을 클릭한다.

응답으로 500이 온다. 상태 코드 500은 서버 내부에 에러가 발생했다는 것을 의미한다. 응답의 BODY를 보면 'SyntaxError: ....'라고 나온다. 요청을 보낼 때 데이터를 잘못 보내면 다음과 같은 문제가 발생한다.

[HTTP] 탭에서도 확인해보면, 요청 메시지에서 JSON 데이터의 title과 body 속성에도 큰 따옴표(")가 빠져있다.

HTTP 응답 메시지도 살펴보면, 시작 라인에는 서버에 문제가 생겼음을 알리는 상태코드 500이 보이고, 본문에는 에러가 났음을 알리는 'SyntaxError: ....' 등의 내용을 확인할 수 있다.

10.2.5. PATCH 요청하고 응답받기
데이터 수정을 요청하고 응답을 받아보자. 메서드를 PATCH로 선택하고 URL은 .../posts/1로 수정하고 BODY 부분에 아래와 같이 내용을 수정하고 [SEND] 버튼을 클릭하자.

응답으로 200이 나온다. BODY를 보면 수정한 내용이 반환된 것을 확인할 수 있다.

10.2.5. DELETE 요청하고 응답받기
데이터 수정을 요청하고 응답을 받아보자. 메서드를 DELETE로 선택하고 URL은 .../posts/10로 수정하고 10번 게시글 삭제를 위해 BODY 부분에 아래와 같이 내용을 수정하고 [SEND] 버튼을 클릭하자.

응답으로 200이 오면 장 삭제되었다는 의미이다.

HTTP 요청 메시지를 보면 DELETE로 10번 게시글 삭제를 요청했다. 응답 메시지의 시작라인에는 게시글이 잘 삭제되었다는 상태 코드 200이 있고, 본문에는 JSON 데이터의 중괄호({})가 텅텅 비어 있다.

'BackEnd > 스프링부트3 백엔드 개발 입문' 카테고리의 다른 글
| [Spring Boot] 12. 서비스 계층과 트랜잭션 (0) | 2024.01.23 |
|---|---|
| [Spring Boot] 11. HTTP와 REST 컨트롤러 (0) | 2024.01.22 |
| [Spring Boot] 09. CRUD와 SQL 쿼리 (0) | 2024.01.18 |
| [Spring Boot] 08. 게시글 삭제하기 (0) | 2024.01.18 |
| [Spring Boot] 07. 게시글 수정하기 (0) | 2024.01.17 |
소중한 공감 감사합니다