Back end/SpringBoot

HTTP와 RestController

jinpark1992 2023. 12. 8. 12:36

- Controller < - > RestController

Controller는 일반 페이지를 retrun 하는 반면  < - > RestController는 json과 return하는 text 즉  data를 반환한다.

 

예시 코드!!

package com.example.firstproject.api;

import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
@Slf4j
@RestController// RestAPI용 컨트롤러! 데이터(JSON)를 반환
public class ArticleApiController {
    @Autowired// DI
    private ArticleRepository articleRepository;

    // GET
    @GetMapping("/api/articles")
    public List<Article> index() {
        return articleRepository.findAll();
    }

    @GetMapping("/api/articles/{id}")
    public Article index(@PathVariable Long id) {
        return articleRepository.findById(id).orElse(null);
    }

    // POST
    @PostMapping("/api/articles")
    public Article index(@RequestBody ArticleForm dto) { // RestController에서 dto를 받으려면 RequestBody를 작성해야함
        Article article = dto.toEntity();
        return articleRepository.save(article);
    }

    // PATCH
    @PatchMapping("/api/articles/{id}")
    public ResponseEntity<Article> update(@PathVariable Long id, // ResponseEntity<> 는 상태코드(200번,400번 등) 을 보낼수 있다.
                                          @RequestBody ArticleForm dto) { // RestController에서 dto를 받으려면 RequestBody를 작성해야함
        // 1. 수정용 엔티티 생성
        Article article = dto.toEntity();
        log.info("id: {}, article: {}", id, article.toString());

        // 2. 대상 엔티티를 조회
        Article target = articleRepository.findById(id).orElse(null);

        // 3. 잘못된 요청 처리(대상이 없거나, id가 다른 경우)
        if (target == null || id != article.getId()) {
            // 400, 잘못된 요청 응답!
            log.info("잘못된요청! id: {}, article: {}", id, article.toString());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); // 400번 오류
        }

        // 4. 업데이트 및 정상 응답(200)
        target.patch(article);  // id,title,content중 하나가 빠져도 기존 데이터는 유지할수 있게 만듬.
        Article updated = articleRepository.save(target);
        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){
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
            }
            //대상 삭제
            articleRepository.delete(target);

            // 데이터 반환
            return ResponseEntity.status(HttpStatus.OK).build();
        }
    }

 

댓글수1