Loading...

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

스프링 11강. Restful API 주소 설계 규칙(1)

반응형

 

 

새로운 Post 컨트롤러를 만들어보자.

 

데이터를 리턴하는 컨트롤러를 API 컨트롤러라고 한다.

 

postman을 사용해 CRUD 테스트를 할 건데

이 CRUD의 get, post, put, delete를 http 메서드라고 한다.

 

(1) Read - SELECT - Get

// 주세요 Read - SELECT
// SELECT * FROM post WHERE id = ?
// 구체적으로 뭘 달라고 요청은 쿼리 스트링에 -> body 없음
@GetMapping("/post/{id}") // post 뒤에 있는 숫자는 무조건 PK, 이건 DS가 다 만들어줌
public String test1(@PathVariable int id) { // 고정된 값이 아닌 동적으로 받고싶을 때 PathVariable
    // 1번 게시글 주세요
    return "주세요 id : " + id;
}

 

1번 게시글을 요청했을 때 실제 쿼리는 아래와 같다.

SELECT * FROM post WHERE id = ?

구체적으로 어떤 파일을 달라고(get) 요청할 때는

클라이언트의 http body가 없다.

 

Get요청은 @GetMapping 어노테이션을 사용한다.

 

1번 게시글을 요청할 때 요청 주소는

http://localhost:8000/post?id=2 와 같을 텐데

http://localhost:8000 뒤의 주소로 매핑된다.

 

이때 규칙 한 가지를 알아두자.

post/ 뒤에 아무것도 없이 적은 숫자는

무조건 Primary Key의 값이다.

 

post 테이블의 id 값이 되는 것이다.

 

고정된 값이 아닌 동적인 값을 받고 싶을 때는

@PathVariable 어노테이션을 사용한다.

매개변수로 받은 @PathVariable int id 값을

@GetMapping("/post/{id}") 로 받아

주소를 매핑하게 되는 것이다.

 

만약 이 자리에 String 타입으로

주소 요청을 한다면

MethodArgumentTypeMismatchException이 뜬다. 

 

 

 

// SELECT * FROM post WHERE title = ?
// PK가 아닌 것은 쿼리 스트링으로 받음
// http://localhost:8000/post?title=?
@GetMapping("/post") // PK가 아니라 WHERE절에 title이 들어오는 것
public String search(String title) { // DS : 매개변수에 뭐가 있네? 
				// 아 쿼리 스트링이 있다는거네? 파싱해줄게!
    // title이 ~인 것 찾아 주세요
    return "주세요 title : " + title;
}

만약 Primary Key가 아닌

다른 값으로 구체적인 요청을 할 때는 어떻게 사용할까?

PK가 아닌 것은 주소를 통해

쿼리 스트링으로 받는다.

 

http://localhost:8000/post?title=? 의 요청은

아래 쿼리와 같다.

 SELECT * FROM post WHERE title = ?

 

이 title의 값은 메서드의 매개변수로 받아오면

DS가 스캔할 때 "매개변수에 값이 필요하네?

아, 그럼 쿼리 스트링이라는 말이구나?

내가 파싱 해줄게!" 하고 알아서 title을 파싱 해준다.

 


 

 

(2) Create - INSERT - Post

 

// 줄게요 Create - INSERT
// 추가할 데이터 필요 -> body 있음

// http:localhost:8000/post 요청하면 전송되는 내용(아래)

// body : title=제목1&content=내용1
// header : Content-Type:application/x-www-form-urlencoded -> 쿼리스트링, form태그로

// 들어오는 데이터
// request.getParameter() 메서드가 스프링 기본 파싱 전략
// -> x-www-form-urlencoded 타입만 파싱 가능
@PostMapping("/post")
public String test2(String title, String content) {
    // 제목, 내용 줄게요
    return "줄게요 : title : " + title + ", content : " + content;
}

 

 

Post 요청은 데이터를 추가해달라는 말이다.

그러면 이 데이터를

요청시 body에 담아서 보내줘야 한다.

 

 

클라이언트가 요청을 해 오면

서버가 파싱 하기 위해서 어떻게 생긴

데이터 모양인지 알아야 한다.

 

하지만 서버 입장에서는

클라이언트가 어떤 타입으로

post 요청할지 알 수가 없다.

 

서버가 이해하기 위해서

클라이언트가 body 데이터를 보낼 때는

header에 내가 어떤 데이터를 보내는지

설명을 적어줘야 한다.

 

그래야 파싱이 가능하다!

 

이때 내가 어떤 데이터를 보내는지 설명하기 위해

MIME 타입을 사용한다.

 

내 문서가 어떻게 생겼는지 알려주기 위한 것이다.

 

문서가 어떻게 생겼는지 알려준다는 것은

실어갈 데이터가 있다는 것인데,

요청 시에 body가 있다는 말이다.

 

즉, post 아니면 put 요청을 해왔다는 것이다.

 

이 요청들은 주소에 담아서 보내지 않는다.

쿼리 스트링으로 보내지 않기 때문에

주소에 남지 않고, body에 담아 보낸다.

 

 

 

이 header는 request 요청의 헤더인데

Content-Type이 내가 지금 보내는 body 데이터가

이렇게 생긴 모양이야 라고 알려주는 key값이다.

 

값을 보니 application/x-www-form-urlencoded라고 적혀있다.

이것을 request header에 담아서 전송하니까

서버는 헤더를 까보고 이 body 데이터가

키=밸류 타입으로 보냈구나를 알 수 있다.

 

http://localhost:8000/post라고 post 요청을 하면

실제로 body에는 title=제목1&content=내용1이 담기고

header에 많은 데이터 중 Content-Type에는

Content-Type:application/x-www-form-urlencoded 가 담기는 것이다.

 

자세히 보니 이 타입은 쿼리 스트링과 닮아있다.

쿼리 스트링이 x-www-form-urlencoded 타입이기 때문이다.

 

우리는 쿼리 스트링을 request.getParameter( ) 메서드로

파싱 했었다.

 

이 메서드가 스프링 기본 파싱 전략이기 때문이다.

 

즉,  x-www-form-urlencoded만 파싱 한다.

 

 

 

 

[출처]

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

 

반응형