ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTP와 RestController
    Back end/SpringBoot 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();
            }
        }
    
    

     

    'Back end > SpringBoot' 카테고리의 다른 글

    테스트 작성하기  (0) 2023.12.12
    서비스 계층과 트랜잭션  (0) 2023.12.11
    폼 데이터 주고 받기  (0) 2023.11.29
    뷰 템플릿과 MVC 패턴  (2) 2023.11.29
    Controller -> Service -> Dao || repository -> dbms  (0) 2023.11.16
Designed by Tistory.