REST API란?
REST란, HTTP URL로 서버의 자원(resources)를 명시하고, HTTP 메서드(POST,GET,PATCH/PUT,DELETE)로 해당 자원에 대해 CRUD(생성,조회,수정,삭제)하는 것을 말합니다.
API란, 클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스입니다.
결국, REST API란 REST 기반 API를 구현한 것으로, 클라이언트가 기기에 구애받지 않고 서버의 자원을 이용할 수 있을 뿐만 아니라, 서버가 클라이언트 요청에 체계적으로 대응할 수 있어서 서버 프로그램의 재사용성과 확장성이 좋아집니다.
![](https://velog.velcdn.com/images/yeonjookang/post/85e50d3e-809d-480e-a83c-7139341be4d7/image.png)
REST API URL 설계 과정
REST API를 구현하려면 REST API의 주소, 즉 URL을 설계해야 합니다.
URL 설계 규칙은 다음과 같다.
- 마지막에 '/'를 포함하지 않는다.
- _(underline) 대신 -(dash)를 사용한다.
- 소문자를 사용한다.
- 행위(method)를 URL에 포함하지 않는다.
- POST, GET, PUT, DELETE 4가지 methods는 반드시 제공한다.
- 의미에 맞는 HTTP status를 리턴한다.
참고) https://sanghaklee.tistory.com/57
앞에서 만든 Article에 대한 CRUD URL을 다음과 같이 설계할 수 있다.
- 조회: GET /api/articles 또는 GET /api/articles/{articledId}
- 생성: POST /api/arcitles
- 수정: PUT /api/articles/{articleId}
- 삭제: DELETE /api/articles/{articleId}
이제 해당 URL 요청을 받아 그 결과를 JSON으로 반환해 줄 컨트롤러를 생성하자.
REST API 구현하기
REST 컨트롤러와 일반 컨트롤러의 차이
REST 컨트롤러는 HttpMessageConverter가 JSON이나 텍스트 같은 데이터를 반환하는 반면 일반 컨트롤러는 viewResolver가 뷰 페이지를 반환합니다.
![](https://velog.velcdn.com/images/yeonjookang/post/463e71d2-0501-4fba-8440-d75567eadba6/image.png)
HttpMessageConverter 동작 방식
@RestController 선언 시 반환값이 문자면 StringConverter가 동작하여 문자 전달을 하고, 반환값이 객체면 JsonConverter가 동작하여 JSON 방식(default)으로 데이터를 만들어서 HTTP 응답에 반환한다!
CRUD 구현하기
- GET 방식
![](https://velog.velcdn.com/images/yeonjookang/post/412f403d-558f-49c2-bb57-c9fa96970d03/image.png)
전체 조회 결과
![](https://velog.velcdn.com/images/yeonjookang/post/0cf6b3b1-ae00-497b-8900-2f3b7fdff47b/image.png)
단건 조회 결과
![](https://velog.velcdn.com/images/yeonjookang/post/a7437b7f-1bfb-4a47-a590-7f4ae95468da/image.png)
- POST 방식
![](https://velog.velcdn.com/images/yeonjookang/post/e1d7f577-5994-4dae-b02d-572576821501/image.png)
위와 같이 요청하면 오류가 난다. 컨트롤러는 form 태그가 실어 보낸 데이터를 객체(DTO)에 담아 받는다. 하지만 REST API에서 데이터를 생성할 때는 JSON 데이터를 받아와야 하므로 단순히 매개변수로 DTO를 쓴다고 해서 받아올 수 있는 것이 아니다. 즉, DTO 매개변수 앞에 @RequestBody라는 어노테이션을 추가해줘야 한다! 이렇게 요청하면 본문에 실어보내는 데이터를 createArticle() 메서드의 매개변수로 받아올 수 있다.
![](https://velog.velcdn.com/images/yeonjookang/post/849b3687-8426-440f-9c9b-e711ac0e9abb/image.png)
요청과 응답
![](https://velog.velcdn.com/images/yeonjookang/post/856b08ec-ac96-450c-8e73-a675b3b11846/image.png)
@RequestBody와 @ResponseBody
@ResquestBody 요청: JSON 요청 -> HTTP 메시지 컨버터 -> 객체
@ResponseBody 응답: 객체 -> HTTP 메시지 컨버터 -> JSON 응답
(@RestController에 @ResponseBody가 포함되어 있다.)
- PATCH 방식
수정은 고려해야할 사항이 두 가지가 있다.
- 데이터 전체 수정인지, 일부 수정인지
- 잘못된 id 요청인지
데이터 일부 수정이지만, patch 요청을 그냥 보내게 되면 나머지 부분은 null로 수정이 된다. 이를 위하여 Article 클래스에 patch 메서드를 만들어준다!
![](https://velog.velcdn.com/images/yeonjookang/post/72fff339-e509-4e48-8035-50d60a77b97e/image.png)
잘못된 id 요청이 들어왔을 시, 400 에러를 위하여 ResponseEntitiy를 사용하자. ResponseEntity는 REST 컨트롤러의 API 응답을 위해 사용하는 클래스이다. 응답 시, HTTP 상태코드, 헤더, 본문을 실어보낼 수 있다.
HttpStatus는 HTTP 상태 코드를 관리하는 클래스로, 상태코드 200은 HttpStatus.OK, 201은 HttpStatus.CREATED, 400은 HttpStatus.BAD_REQUEST를 의미한다.
![](https://velog.velcdn.com/images/yeonjookang/post/4e4c2508-a5ff-4ddb-917e-b15c58c3a776/image.png)
위 코드는 두 가지 고려사항을 모두 적용한 updateArticle 메소드이다.
오류(id 존재 X) 요청과 응답
![](https://velog.velcdn.com/images/yeonjookang/post/9d26187f-acc7-4536-906e-4de9321f73d8/image.png)
전체 수정 요청과 응답
![](https://velog.velcdn.com/images/yeonjookang/post/5ac99ba5-9e6d-4ca3-b679-d81dd4fb77d1/image.png)
일부 수정 요청과 응답
![](https://velog.velcdn.com/images/yeonjookang/post/83780a15-e723-4319-b9fd-6cfb0d58c68b/image.png)
- DELETE 방식
![](https://velog.velcdn.com/images/yeonjookang/post/1a3fc7bb-62ab-46fd-a3e7-d0ec24cd489c/image.png)
삭제 요청과 응답
![](https://velog.velcdn.com/images/yeonjookang/post/bd069b2f-5821-425f-ab08-7db460c8c841/image.png)