11.1 REST API의 동작 이해하기
JSON
키와 값의 쌍으로 된 속성으로 데이터를 표현
JSON의 값으로 또 다른 JSON 데이터나 배열을 삽입할 수 있음
REST
HTTP URL로 서버의 자원을 명시하고 HTTP 메서드로 해당 자원에 대해 CRUD
API
클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스
11.2 REST API의 구현 과정
REST API를 구현하기 위해서는 REST API의 주소인 URL을 설계 필요
| 조회 요청: /api/articles/{id}
: GET 메서드로 Article 목록 전체 또는 단일 Article 조회
| 생성 요청: /api/articles
: POST 메서드로 새로운 Article을 생성해 목록에 저장
| 수정 요청: /api/article/{id}
: PATCH 메서드로 특정 Article의 내용 수정
| 삭제 요청: /api/article/{id}
: DELETE 메서드로 특정 Article 삭제
11.3 REAT API 구현하기
REST 컨트롤러
JSON이나 텍스트와 같은 데이터를 반환하는 컨트롤러
일반 컨트롤러는 주로 뷰 페이지를 반환
@RestController
public class FirstApiController { }
* REST API를 구현하는 경우 @RestController를 사용
@GetMapping("/api/hello")
public String hello() {
return "hello world!";
}
* locahhost:808/api/hello로 URL 요청이 들어왔을 떄 "hello world!"를 출력하는 메서드
GET 구현
@GetMapping 메서드로 "/api/articles" 주소로 오는 URL 요청 받기
@RestController
public class ArticleApiController {
@Autowired
private ArticleRepository articleRepository;
@GetMapping("/api/articles")
public List<Article> index() {
return articleRepository.findAll();
}
// POST
// PATCH
// DELETE
}
단일 게시글 조회
@GetMapping("/api/articles/{id}")
public Article show(@PathVariable Long id) {
return articleRepository.findById(id).orElse(null);
}
POST 구현
@PostMapping("/api/articles")
public Article create(@RequestBody ArticleForm dto) {
Article article = dto.toEntity();
return articleRepository.save(article);
}
PATCH 구현
@PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id, @RequestBody ArticleForm dto) {
Article article = dto.toEntity();
log.info("id: {}, article: {}", id, article.toString());
Article target = articleRepository.findById(id).orElse(null);
if (target == null || id != article.getId()) {
log.info("잘못된 요청! id: {}, article: {}", id, article.toString());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
Article updated = articleRepository.save(article);
return ResponseEntity.status(HttpStatus.OK).body(updated);
}
DELETE 구현
@DeleteMapping("/api/articles/{id}")
public ResponseEntity<Article> delete(@PathVariable Long id) {
Article target = articleRepository.findById(id).orElse(null);
if (target == null || id != target.getId()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
articleRepository.delete(target);
return ResponseEntity.status(HttpStatus.OK).body(null);
}