get Method
가 필요 // Object to Json : Serialization(직렬화)
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
// objectMapper 객체를 읽은 다음에 String 타입의 json 형태로 변환
// objectMapper도 Getter가 필요(직렬화 떄문)
String json = objectMapper.writeValueAsString(star);
System.out.println("json = " + json);
}
기본 생성자와 get 혹은 set 메서드
가 필요 // Json to Object : DeSerialization(역직렬화)
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
// 클래스 필드의 Key 값을 잘 맞춰줘야한다.
String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
// readValue(String , 어떠한 객체로 만들거냐? )
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
System.out.println("star.getAge() = " + star.getAge());
}
}
// [Request sample]
// GET http://localhost:8080/hello/request/star/Robbie/age/95 (보내고자 하는 데이터를 경로에 추가)
// 필요한 데이터 부분에 중괄호
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
// [Request sample]
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95 (Query String 방식)
// ? key=value & key=value -> ?name=Robbie & age=95
// RequestParam 생략이 가능하다.
// 데이터를 안 보낼경우 오류가 난다. -> required = false로 해결한다. : 클라이언트의 전달받는 값들 중에서 해당 값이 포함이 안되도 오류 X, 물론 pathVariable에도 있다.
// 대신 빈 값에 NULL이 들어간다.
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam(required = false) String name, int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
Post방식
도 위와 같다 하지만, Post는 HTTP Body 부분name=Robbie&age=95
형태로 서버로 전달한다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/param
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
Post방식
(Query String) // [Request sample]
// POST http://localhost:8080/hello/request/form/model
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
// ModelAttribute - > Body에 있는 QueryString 방식을 객체로 받을 수 있다.
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
Get 방식
(query String)// [Request sample]
// GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95
@GetMapping("/form/param/model")
@ResponseBody
public String helloRequestParam(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
Spring에서는 @ModelAttribute뿐만 아니라 @RequestParam도 생략이 가능한데 그럼 어떻게 구분할까?
- 파라미터(매개변수)가 SimpleValueType : @RequestParam
- 파라미터가 객체 : @ModelAttribute
// [Request sample]
// POST http://localhost:8080/hello/request/form/json
// Header
// Content type: application/json
// Body
// {"name":"Robbie","age":"95"}
// @RequestBody : 이거 데이터 받아와주세요.
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
주의할 점!!!
객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요