구체적인 데이터 요청시 쿼리스트링
또는 주소 변수 매핑
이 필요합니다.
스트링부트에서는 '주소 변수 매핑'이 훨씬 편리해서 주로 사용합니다.
강의에서는 통닭집에 비유해 개념을 설명합니다.
요는, 서버나 데이터베이스에 요청을 할 때 무엇을 원하는지 구체적으로 전달한다는 것입니다.
예를들어 '도메인?type=양념'의 형식으로 요청하는 것이 '쿼리스트링',
'도메인/양념'의 형식으로 요청하는 것이 '주소 변수 매핑'이라고 합니다.
지난 프로젝트에 이어 web 패키지에 클래스를 하나 생성합니다.
package com.cos.controllerdemo.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class QueryPathController {
@GetMapping("/chicken") // 쿼리스트링
public String chickenQuery(String type) {
return type+" 배달갑니다.(쿼리스트링)";
}
@GetMapping("/chicken/{type}") // 주소 변수 매핑
public String chickenPath(@PathVariable String type) {
return type+" 배달갑니다.(주소 변수 매핑)";
}
}
'POST', 'PUT' 요청 방식으로 body 데이터를 전송할 때,
'http header'에 Content-Type
을 'protocol'로 명시해야 합니다.
'GET' 요청 방식에는 body가 없으니 'Content-Type' 또한 없습니다.
스프링부트는 기본적으로 x-www-form-urlencoded
타입을 파싱(분석)합니다.
이외에도 'text/plain', 'application/json', 이미지, 영상 등등이 있습니다.
Content-Type | 데이터 형식 |
---|---|
x-www-form-urlencoded | key = value |
text/plain | 메시지 |
application/json | {"username" : "cos"} |
web 패키지에 새로운 클래스를 하나 생성합니다.
요청 방식은 'POST'이며 아직 위에서 본 코드들과 큰 차이는 없어보입니다.
요청 방식이 'POST'이므로 'Postman'을 실행합니다.
package com.cos.controllerdemo.web;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HttpBodyController {
@PostMapping("/body1")
public String xwwwformurlencoded() {
return "key=value 전송 옴";
}
@PostMapping("/body2")
public String textplain() {
return "plain/text 전송 옴";
}
@PostMapping("/body3")
public String applicationjson() {
return "json 전송 옴";
}
}
지금까지는 특별히 다른 점이 안보입니다.
이번에는 포스트맨에 키와 값을 입력하고 위 코드에서 아래와 같이 코드를 조금 추가합니다.
'Logger'를 통해 'username' 키의 값을 콘솔창에 보여줍니다.
@RestController
public class HttpBodyController {
private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);
@PostMapping("/body1")
public String xwwwformurlencoded(String username) {
log.info(username);
return "key=value 전송 옴";
}
이번에는 'textplain' 메서드를 아래와 같이 수정합니다.
위에서는 'String username'을 매개변수로 받아 키로 인식해 값을 출력했다면
여기서는 '@RequestBody String data'를 매개변수로 받아서 그대로 출력합니다.
@PostMapping("/body2")
public String textplain(@RequestBody String data) {
log.info(data);
return "text/plain 전송 옴";
}
포스트맨에서 'Body-raw-Text'로 설정하고 메시지를 입력합니다.
저는 "평문을 날려봅니다."라고 입력하고 'Send' 버튼을 눌렀습니다.
하단에 "text/plain 전송 옴"이라고 return 값이 출력되었습니다. 반면 콘솔창에는
작성한 데이터가 잘 출력되었습니다.
실습에 앞 서 강의에서 'json'에 대해 유튜브 링크를 하나 추천해주었습니다.
👉 스프링부트 강좌 23강(블로그 프로젝트) - JSON 사용법
위 코드에 이어 'applicationjson' 메서드의 코드를 아래와 같이 수정하고 저장합니다.
위의 'text/plain'와 다른 게 없습니다.
@PostMapping("/body3")
public String applicationjson(@RequestBody String data) {
log.info(data);
return "json 전송 옴";
}
이제 포스트맨에 아래와 같이 입력하고 'Send'를 누릅니다.
데이터가 잘 출력되었습니다. 키로 요청해 값을 응답받고 싶으면 새로운 패키지와 클래스를 생성합니다.
package com.cos.controllerdemo.domain; // domain 패키지 - User 클래스
public class User {
// 멤버변수 'username' 선언
private String username;
// get(), set() 메서드 선언(아래의 방법으로 자동완성 가능)
// 우클릭 - Source - Generate Getters and Setters
// 또는 [option]+[command]+S > Generate Getters and Setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
이제 이 'User' 클래스의 메서드를 이용해 'username'의 값을 받아올 것입니다.
다시 'HttpBodyController' 클래스에 아래와 같이 코드를 추가합니다.
위에서는 그저 문자열 데이터로만 받아왔다면 이번에는 'x-www-form-urlencoded'처럼
'username'을 키로 활용해 값을 받아옵니다.
@PostMapping("/body4")
public String applicationjsonToObject(@RequestBody User user) {
log.info(user.getUsername());
return "json 전송 옴";
}
그리고 포스트맨에 위와 똑같이 다시 입력하고 전송 버튼을 누릅니다.
원하는 값을 잘 받아왔습니다. 그런데 하나 궁금한 게 생겼습니다.
굳이 get() 메서드를 활용해서 데이터를 받아왔어야 하나? 'username'으로 직접 받으면 안되나? 싶습니다.
아- 코드를 쓰다가 깨달았습니다. 애초에 매개변수를 String 으로 받는 순간 그것은 문자열 데이터일 뿐입니다.