10장 REST API와 JSON
REST API (Representational State Transfer API)란?
서버의 자원을 클라이언트에 구애받지 않고 사용할 수 있게 하는 설계 방식이다.
HTTP 요청에 대한 응답으로 서버의 자원을 반환하는 것.
(특정 기기에 종속되지 않는 모든 기기에서 통용될 수 있는 데이터 반환)
이때, 응답하는 데이터는 JSON 형식으로 반환된다. (XML은 예전 방식)
PUT method 와 PATCH method 의 차이점
PUT | PATCH |
기존 데이터를 전부 새 내용으로 변경, 만약 기존 데이터가 없다면 새로 생성한다. |
기존 데이터 중에서 일부만 새 내용으로 변경한다. |
실습은 Postman 으로 진행할 것이다.( 책에서는 Talend API Tester 를 썼지만, 나는 Postman으로 진행해보려한다.)
+ https://jsonplaceholder.typicode.com 활용
https://www.postman.com/downloads/
1. GET 요청하고 응답받기
이렇게 요청을 보낸다.
200번 상태코드가 나오면서 JSON 데이터들이 나오는 것을 확인할 수 있다.
위에 404가 뜨는 이유는 게시글이 100번까지 있는데, 101번을 요청해서 404 에러가 발생한 것이다. (not found)
HTTP 상태 코드
상태코드 | 설명 |
1XX(정보) | 요청이 수신되어 처리 중이다. |
2XX(성공) | 요청이 정상적으로 처리 |
3XX(리다이렉션 메시지) | 요청을 완료하려면 추가 행동 필요함 |
4XX(클라이언트 요청 오류) | 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없음 |
5XX(서버 응답 오류) | 서버 내부에 에러가 발생해 클라이언트 요청에 대해 적절히 수행하지 못함 |
HTTP 메시지
시작라인(start line) | HTTP 요청 또는 응답 내용이 있다. 시작 라인은 항상 한 줄로 끝난다. |
헤더(header) | HTTP 전송에 필요한 부가 정보(metadata)가 있다. |
빈 라인(blank line) | 헤더의 끝을 알리는 빈 줄로 , 헤더가 모두 전송되었음을 알린다. |
본문(body) | 실제 전송하는 데이터가 있다. |
위의 사진은 헤더이다.
2. POST 요청하고 응답받기
url을 수정하고, 데이터를 입력한 후 send 버튼을 클릭한다.
응답으로 201이 뜨면서 body에 데이터가 잘 반환되는 것을 확인할 수 있다.
참고로 key 부분에 " " 큰따옴표를 지우고 send를 보냈더니 500번 내부 서버 에러가 발생한 것을 확인할 수 있다.
3. PATCH 요청하고 응답받기
데이터 수정 요청을 해보겠다. 여기서는 PUT과 PATCH 중에서 PATCH를 사용하기로 했다.
1번 게시글을 수정할 것이므로 URL은 다음과 같이 작성한다.
https://jsonplaceholder.typicode.com/posts/1
4. DELETE 요청하고 응답받기
10번 게시글을 삭제하겠다.
상태코드 200이 떴으므로 성공했다.
body 부분의 중괄호도 비어있는 걸 확인할 수 있다.
1분 퀴즈)
1. 다음 ㉠~㉤에 들어갈 HTTP 응답 코드 번호대를 골라 쓰세요.
• ( ㉠ ): 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없다.
• ( ㉡ ): 요청이 정상적으로 처리됐다.
• ( ㉢ ): 서버 내부에 에러가 발생해 클라이언트의 요청에 대한 적절한 수행을 하는 데 실패했다.
• ( ㉣ ): 요청을 완료하려면 추가 행동이 필요하다.
• ( ㉤ ): 요청이 수신돼 처리 중이다.
ㄱ: 4xx
ㄴ: 2xx
ㄷ: 5xx
ㄹ: 3xx
ㅁ: 1xx
셀프 체크
id가 10번인 사용자의 오늘 할일을 생성, 조회, 수정, 삭제하는 HTTP 요청 메시지 작성하기.
1. 오늘 할 일 생성: 10번 사용자의 오늘 할 일을 생성하되, title은 “맛집 탐방하기”로 설정하세요.
2. 오늘 할 일 조회: 10번 사용자의 오늘 할 일 전체를 조회하세요.
GET으로 조회했는데, 위에 새로 입력한 게시글 id는 201번으로 들어갔는데, 200까지만 조회가 된다... 왜지...?????
3. 오늘 할 일 수정: 10번 사용자의 오늘 할 일 중 id 200번의 title을 “멋지게 숨쉬기”로 수정하세요.
4. 오늘 할 일 삭제: 10번 사용자의 오늘 할 일 중 id 200번 데이터를 삭제하세요.
11장 HTTP와 REST 컨트롤러
REST API의 의미
REST : HTTP URL로 서버의 자원을 명시하고, HTTP 메서드로 해당 자원에 대해 CRUD하는 것을 말한다.
API : 클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스이다.
REST API를 구현하려면 URL을 설계해야 한다.
2부에서 만든 게시판의 Article 데이터를 CRUD하기 위해 REST API 주소를 다음과 같이 설계함.
조회 | /api/articles/ 또는 /api/articles/{id} |
생성 | /api/articles |
수정 | /api/articles/{id} -> PATCH 메서드로 특정 Article의 내용을 수정. |
삭제 | /api/articles/{id} |
REST API 구현하기
com.example.firstproject.api 패키지를 생성해준다.
REST 컨트롤러를 생성해줬다.
결과
postman에서도 GET으로 확인해보면 잘 나오는 것을 확인할 수 있다.
1. REST API : GET 구현하기
1-1 ) 모든 게시글 조회하기
[ ArticleApiController.java]
클래스 내부에 ArticleRepository를 선언 후 index() 메서드를 List 타입으로 정의하고,
return 문에서는 findAll()메서드를 이용하여 DB에 저장된 Article을 반환한다.
GET 요청을 보내면 데이터 3개가 반환되는 것을 확인할 수 있다.
1-2 ) 단일 게시글 조회하기
index()메서드 밑에 show()메서드를 작성해줬다.
url은 /api/articles/id번호
2. POST 구현하기
[ ArticleApiController.java ]
@PostMapping("/api/articles")
public Article create(ArticleForm dto) { //create() 메서드 정의 수정할 데이터 dto 매개변수로 받아옴
Article article = dto.toEntity(); // dto를 Entity로 변환해서 article에 담음
return articleRepository.save(article);
}
처음에는 JSON형식으로 입력하기 귀찮아서, Query Params로 입력했더니 잘 들어갔다.
그리고, JSON형식으로 입력했는데, null이 들어가는 걸 확인하였다.........
이렇게 되는 원인은 컨트롤러의 메서드에서 매개변수로 dto를 받아 오기만 해서 그런것이었다.
dto 매개변수 앞에 @RequestBody라는 어노테이션을 추가해야 JSON 데이터를 받아올 수 있었던 거임....
@PostMapping("/api/articles")
public Article create(@RequestBody ArticleForm dto) { //create() 메서드 정의 수정할 데이터 dto 매개변수로 받아옴
Article article = dto.toEntity(); // dto를 Entity로 변환해서 article에 담음
return articleRepository.save(article);
}
->이렇게 수정...
3. PATCH 구현하기
3-1 ) 전체 데이터를 수정할 경우
id가 1번인 게시글을 수정할려면
/api/articles/1 주소로 요청...
[ ArticleApiController.java ]
@PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id, @RequestBody ArticleForm dto) {
// 1. DTO -> 엔티티 변환하기
Article article = dto.toEntity(); //dto를 엔터티로 변환
log.info("id: {}, article: {}", id, article.toString()); // 로그
// 2. 타깃 조회하기
Article target = articleRepository.findById(id).orElse(null);
// 3. 잘못된 요청 처리하기
if (target == null || id != article.getId()) {
// 400번 에러 발생
log.info("잘못된 요청! id: {}, article: {}", id, article, toString());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); // ResponseEntity 반환
}
// 4. 업데이트 및 정상 응답하기(200)
Article updated = articleRepository.save(article); // article 엔터티 DB 저장
return ResponseEntity.status(HttpStatus.OK).body(updated);
}
url 을 보면 id 가 1 이어야 하는데, id : 3을 입력해서 400번 에러가 발생했다.
로그 찍힌 걸 확인하면 확인할 수 있다.
제대로 입력하면 잘 업데이트 된 것을 확인할 수 있다.
3-2 ) 일부 데이터만 수정할 경우
이번에는 데이터의 일부인 content부분만 수정해보겠다.
에러 없이 수정은 잘 되었지만, title 부분에 null이 들어갔다...
아래는 이것을 보완하는 코드이다.
[ Article.java ] 에 patch() 메서드 추가
public void patch(Article article) {
if (article.title != null) {
this.title = article.title;
}
if (article.content != null) {
this.content = article.content;
}
}
[ ArticleApiController.java ] 수정
// 4. 업데이트 및 정상 응답하기(200)
target.patch(article);
Article updated = articleRepository.save(target); // article 엔터티 DB 저장
return ResponseEntity.status(HttpStatus.OK).body(updated);
이제는 null 이 안들어간다..
4. DELETE 구현하기
delete url은 /api/articles/{id} 이렇게 지정될 예정..
삭제된 걸 확인할 수 있다.
1분 퀴즈 )
1. ㉠~㉤에 각각 들어갈 용어를 찾아 쓰세요.
• ( ㉠ ): REST API 구현을 위한 컨트롤러에 사용하는 어노테이션
• ( ㉡ ): HTTP 요청 중 PATCH 메서드를 처리하는 어노테이션
• ( ㉢ ): HTTP 요청 중 DELETE 메서드를 처리하는 어노테이션
• ( ㉣ ): REST API 요청을 받아 응답할 때 HTTP 상태 코드, 헤더, 본문을 실어 보내는 클래스
• ( ㉤ ): HTTP 상태 코드를 관리하는 클래스
정답 )
ㄱ: @RestController
ㄴ: @PatchMapping
ㄷ: @DeleteMapping
ㄹ: ResponseEntity
ㅁ: HttpStatus
'스터디 > back' 카테고리의 다른 글
15장 ~ 16장 (0) | 2024.01.04 |
---|---|
12장 ~ 14장 (0) | 2023.12.21 |
Part 2) 게시판 만들기 (3) - 리다이렉트 / update / delete / SQL 쿼리 (1) | 2023.12.07 |
Part 2) 게시판 만들기(2) (1) | 2023.11.23 |
Part 2) 게시판 만들기(1) (0) | 2023.11.21 |