새로운 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
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9