카테고리 없음

11. HTTP와 REST 컨트롤러

smallsilver_west 2025. 1. 4. 19:24

11.1 REST API의 동작 이해하기

 

JSON

키와 값의 쌍으로 된 속성으로 데이터를 표현

JSON의 값으로 또 다른 JSON 데이터나 배열을 삽입할 수 있음

 

REST

HTTP URL로 서버의 자원을 명시하고 HTTP 메서드로 해당 자원에 대해 CRUD

 

API

클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스

 

11.2 REST API의 구현 과정

 

REST API를 구현하기 위해서는 REST API의 주소인 URL을 설계 필요

 

| 조회 요청: /api/articles/{id}

: GET 메서드로 Article 목록 전체 또는 단일 Article 조회

 

| 생성 요청: /api/articles

: POST 메서드로 새로운 Article을 생성해 목록에 저장

 

| 수정 요청: /api/article/{id}

: PATCH 메서드로 특정 Article의 내용 수정

 

| 삭제 요청: /api/article/{id}

: DELETE 메서드로 특정 Article 삭제

 

11.3 REAT API 구현하기

 

REST 컨트롤러

JSON이나 텍스트와 같은 데이터를 반환하는 컨트롤러

일반 컨트롤러는 주로 뷰 페이지를 반환

@RestController
public class FirstApiController { }

* REST API를 구현하는 경우 @RestController를 사용

@GetMapping("/api/hello")
public String hello() {
    return "hello world!";
}

* locahhost:808/api/hello로 URL 요청이 들어왔을 떄 "hello world!"를 출력하는 메서드

 

GET 구현

@GetMapping 메서드로 "/api/articles" 주소로 오는 URL 요청 받기

@RestController
public class ArticleApiController {
    @Autowired
    private ArticleRepository articleRepository;

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

 

단일 게시글 조회

@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 dto) {
    Article article = dto.toEntity();
    return articleRepository.save(article);
}

 

PATCH 구현

@PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id, @RequestBody ArticleForm dto) {
    Article article = dto.toEntity();
    log.info("id: {}, article: {}", id, article.toString());

Article target = articleRepository.findById(id).orElse(null);

if (target == null || id != article.getId()) {

        log.info("잘못된 요청! id: {}, article: {}", id, article.toString());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
    }
    Article updated = articleRepository.save(article);
    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 || id != target.getId()) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
    }
    articleRepository.delete(target);
    return ResponseEntity.status(HttpStatus.OK).body(null);
}