나만의블로그만들기(3)
앞서 만든 컨트롤러에서 REST API를 활용하여 블로그를 재구성해보려고 한다.
Rest Api를 활용하기 위해서는 Rest 컨트롤러를 사용해야한다.(@Controller ---------- @RestController)
그렇다면 Rest 컨트롤러는 일반 컨트롤러와 차이가 무엇일까?
차이점으로는 일반 컨트롤러는 뷰 페이지를 반환하지만 rest 컨트롤러는 JSON이나 텍스트 같은 데이터를 반환하게 된다.
@RestController
public class ArticleApiController {
@Autowired
ArticleRepository articleRepository;
//Get
@GetMapping("/api/articles")
public List<Article> index(){
return articleRepository.findAll();
}
@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 form){
Article articleEntity=form.toEntity();
return articleRepository.save(articleEntity);
}
//Patch
@PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id,@RequestBody ArticleForm dto){
Article articleEntity=dto.toEntity();
Article target=articleRepository.findById(id).orElse(null);
if(target==null || id!=target.getId()){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
target.patch(articleEntity);
Article updated= articleRepository.save(target);
return ResponseEntity.status(HttpStatus.OK).body(updated);
}
@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).build();
}
}
가장 눈에 보이는 변화들은 return값들이다 Article엔티티를 그대로 데이터에 넣어주거나 ResponseEntity에 담아서 보내주게 된다.
여기서 ResponseEntity란
RestController의 반환형, 즉 REST API 응답을 위해 사용하는 클래스로 이 클래스에 HTTP 상태코드,헤더 ,본문을 실어 담아 보낼 수 있다.
ResponseEntity.status(HttpStatus.OK).body(updated);
HttpStatus.OK란 HttpStatus상태 코드를 관리 하는 클래스로 Enum 타입과 관련된 메서드를 가진다.
이때 ResponseEntity를 반환 할 때는 반환 값을 ResponseEntity<Article> 형태로 반환을 지정해주어야 한다.
또 .body(null) 부분은 .build()와 같은 의미로 쓰일 수 있다. build는 본문 값이 없는 클래스 형태를 반환한다는 의미로 쓰인다.
또 다른 눈에 보이는 점은 매개변수 DTO를 받아오는 과정이다.
JSON형태로 HTTP 요청으로 데이터가 들어올때 DTO로 매핑을 하기 위해서는 @RequestBody 어노테이션을 붙혀 주어야 JSON형태의 데이터와 나의 DTO 객체의 매핑이 이루어지게 된다.