프로그래밍/Backend

나만의블로그만들기(3)

supernovaMK 2024. 8. 1. 17:56

앞서 만든 컨트롤러에서 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 객체의 매핑이 이루어지게 된다.