Loading...

Spring / / 2022. 2. 28. 16:48

스프링 12강. Restful API 주소 설계 규칙(2)

반응형

 

 

(3) Update - UPDATE - Put

// 수정해주세요 Update - UPDATE
// 수정할 데이터 필요 -> body 있음
// UPDATE post SET title = ?, content = ? WHERE id = ?
// 협업을 하기 위해 API 문서 필요
@PutMapping("/post/{id}") // WHERE절의 조건은 주소에, 변경할 데이터는 body에 (규칙)
public String test3(String title, String content, @PathVariable int id) {
    // title, content (primary key : id) 수정
    return "수정해주세요 : title : " + title + ", content : " + content + ", id : " + id;
}

 

title과 content 2개를 수정할 때는

수정하고 싶은 데이터 말고 PK(id)도 같이 보내야 한다.

 

body에 수정하고 싶은 데이터를 보내는데,

id를 수정할 건 아니고, 수정하고 싶은 사람을 찾을 때

id가 필요한 것이기 때문에

PK의 값은 주소에 요청한다.

 

위 요청의 쿼리문은 아래와 같다.

UPDATE post SET title = ?, content = ? WHERE id = ?

 

WHERE절의 조건은 주소로 전송해주어야 한다.

변경하고 싶은 데이터는 body에 담아 보낸다.

 

그렇기 때문에 get 요청은 모두 주소에 적어준 것이다.

WHERE절의 조건이니까!

 

 

 

 

 

Restful API

: 자원을 가지기 위한 API

-> 컨트롤러의 메서드

 

그 메서드에 접근하기 위한 주소 설계 규칙이 있다.

 

  • 주소에 동사를 쓰지 않는다.
  • 이유 : 동사는 Get, Post, Put, Delete 가능하기 때문
  • 첫 주소에는 테이블명 : /post
  • 구체적인 것이 필요할 때
    그게 primary key면 : /post/1
  • primary key가 아니라면 쿼리 스트링 : /post?count=2
  • 1번 유저(userTbl)의 모든 게시글(postTbl)을 달라
    http://localhost:8000/user/1/post
  • 1번 유저(userTbl)의 2번째 게시글(postTbl)을 달라
    http://localhost:8000/user/1/post/2

 


 

(4) Delete - DELETE - Delete

// 삭제해주세요 Delete - DELETE
// 구체적으로 삭제해주세요 -> body 없음
// 구체적인 id는 주소로 요청
// DELETE from post WHERE id = ?

// 만약 http://localhost:8000/post?title=제목1
// DELETE from post WHERE title = ?
// title은 PK가 아니니까 WHERE에 있어도 쿼리 스트링
// 키값이 필요없기때문에 주소에 쓸 수 있는것
@DeleteMapping("/post/{id}")
public String test4(@PathVariable int id) {
    return "삭제해주세요 id : " + id;
}

 

Delete도 마찬가지로

WHERE절의 조건이기 때문에

주소에 요청한다.

 

http://localhost:8000/post/1

DELETE from post WHERE id = ?

 

만약 id가 아닌 title을 조건으로

삭제할 때도 주소에 요청할까?

DELETE from post WHERE title = ?

이때 title은 주소로 받지만

쿼리 스트링으로 요청해야 한다.

 

http://localhost:8000/post?title=제목1

 

title은 PK가 아니기 때문에

쿼리 스트링으로 요청한다.

 

 


 

package site.metacoding.second.web;

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PostApiController {

    // 주세요 Read - SELECT
    @GetMapping("/post/{id}")
    public String test1(@PathVariable int id) {
        // 1번 게시글 주세요
        return "주세요 id : " + id;
    }

    // SELECT * FROM post WHERE title = ?
    @GetMapping("/post")
    public String search(String title) {
        // title이 ~인 것 찾아 주세요
        return "주세요 title : " + title;
    }

    // 줄게요 Create - INSERT
    @PostMapping("/post")
    public String test2(String title, String content) {
        // 제목, 내용 줄게요
        return "줄게요 : title : " + title + ", content : " + content;
    }

    // 수정해주세요 Update - UPDATE
    @PutMapping("/post/{id}")
    public String test3(String title, String content, @PathVariable int id) {
        // title, content (primary key : id) 수정
        return "수정해주세요 : title : " + title + ", content : " + content + ", id : " + id;
    }

    // 삭제해주세요 Delete - DELETE
    @DeleteMapping("/post/{id}")
    public String test4(@PathVariable int id) {
        return "삭제해주세요 id : " + id;
    }
}

 

 

 

 

 

 

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형