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();
}
}