JSON (JavaScript Object Notation)
XML 처럼 데이터를 전송하는 방식
JSON은 JavaScript의 Object 표현 방식만 가져온 것이고 JavaScript가 절대 아니고 그저 데이터를 표현 방식
데이터 포맷이며 어떤 통신 방법도, 프로그래밍 문법도 아닌 데이터를 표시하는 표시 방법 중 하나이며 그냥 텍스트 형식일 뿐임
{Key : Value} 형식
서버와 클라이언트 간 교류에서 많이 사용
원하는 만큼 중첩시켜서 사용할 수 있음
REST 전송 방식
Client가 모두 웹에서만 요청을 보내는 것이 아니라 모바일 등 다양한 환경에서 서버에 요청을 보냄
서로 다른 언어로 구성된 것들의 요청을 하나의 서버에서 처리하기 위해 사용
JSON은 JavaScript의 객체 형태로 표현하여 통신 진행
데이터를 직접 클라이언트에 전송하는 방식
@RestController
기존 @Controller는 Model에 데이터를 담아서 return하는 경로로 데이터를 보내 JSP에서 값을 뿌려주는 방식을 사용
RestController는 비동기 요청 전용 컨트롤러이며 return에 처리하는 데이터를 조금 다른 타입으로 처리하는 형식
RequestMapping으로 들어오는 요청을 받아들이는 것을 동일하지만 return의 결과는 ViewResolver가 아니라 요청한 화면으로 리턴
즉, 객체나 문자열을 반환할 수도 있고 객체를 받을 수 있음
@ResponseBody
@Controller
@RequestMapping("/rest")
public class RestControllerTest {
@GetMapping("/hobby")
@ResponseBody
public List<String> hobby() {
List<String> hobby = Arrays.asList("축구", "운동", "잠");
return hobby;
}
}
pom에 등록한 jackson-databind가 데이터를 비동기 통신으로 보낼 때 JSON형식으로 보내줌
@RequestBody
// client에서 json형태로 값을 보냄
@PostMapping("/getObject")
public Person getObject(@RequestBody Person person) {
// 보내는 파라미터 key가 Person객체 변수의 이름과 같으므로 커맨드 객체 사용
// @RequestBody라는 annotation을 사용하면 JSON형식의 데이터를 java의 객체형식으로 변환해줌
// 해당 annotation을 사용하지 않으면 JSON을 변환하지 못하고 null이 들어옴
System.out.println("/getObject 요청이 들어옴");
System.out.println("이름 : " + person.getName());
System.out.println("나이 : " + person.getAge());
System.out.println("취미 : " + person.getHobby());
// 값을 제대로 받아오는지 확인
person.setAge(431);
// 파라미터로 저장된 person객체의 값을 바꿔줌
return person;
}
@PathVariable
@GetMapping("/getPath/{id}/{cpp}/{page}")
// 영역에 이름을 지정
public Map<String, Object> getPath(@PathVariable String id,
@PathVariable int cpp,
@PathVariable int page) {
Map<String, Object> map = new HashMap<>();
map.put("아이디", id);
map.put("게시물 개수 " , cpp);
map.put("페이지 번호", page);
// 경로에서 값을 가져와서 해당 메서드에서 포장해서 값을 보냄
return map;
}
비동기 방식의 요청만 처리하는 Cotnroller라는 것을 뜻하는 Annotation
해당 annotation을 사용하게 되면 @ResponseBody 사용하지 않아도 됨
package com.spring.mvc.test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/rest")
public class RestControllerTest {
/*
@ResponseBody
- 메서드가 리턴하는 데이터를 viewResolver에게 전달하지 않고 클라이언트에게 해당
데이터를 바로 응답하게 함
주로 비동기 통신에서 많이 사용
@RestController를 사용하면 모든 메서드에 @ResponseBody를 붙인 결과와 같음
참고
- 동기 : 순서대로 일을 처리 (순서대로 요청과 응답을 처리)
- 비동기 : 번호표를 뽑는다고 생각 (순서대로 일을 처리하지 않고 특정 요청이 오게 된다면 바로 처리)
*/
@GetMapping("/hello")
// @ResponseBody
// 비동기 방식으로 데이터를 처리하고 싶으면 사용하는 annotation
public String hello() {
return "Hello World!";
// rest방식은 viewresolver로 보내서 url을 만들어주는 것과 다르게
// 페이지 이동 없이 데이터를 요청을 보낸 화면에 던짐
}
@GetMapping("/hobby")
// @ResponseBody
public List<String> hobby() {
List<String> hobby = Arrays.asList("축구", "운동", "잠");
return hobby;
}
@GetMapping("/study")
public Map<String, Object> study() {
Map<String, Object> subject = new HashMap<>();
subject.put("자바", "java");
subject.put("jsp", "java server pages");
subject.put("스프링", "Spring Framework5");
return subject;
}
@GetMapping("/person")
public Person person() {
Person p = new Person();
p.setName("문경록");
p.setAge(28);
p.setHobby(Arrays.asList("공부", "잠", "맛집탐방"));
return p;
// 자바 객체를 전달했을 때 JSON으로 어떻게 변화되는지 확인
}
// client에서 json형태로 값을 보냄
@PostMapping("/getObject")
public Person getObject(@RequestBody Person person) {
// 보내는 파라미터 key가 Person객체 변수의 이름과 같으므로 커맨드 객체 사용
// @RequestBody라는 annotation을 사용하면 JSON형식의 데이터를 java의 객체형식으로 변환해줌
// 해당 annotation을 사용하지 않으면 JSON을 변환하지 못하고 null이 들어옴
System.out.println("/getObject 요청이 들어옴");
System.out.println("이름 : " + person.getName());
System.out.println("나이 : " + person.getAge());
System.out.println("취미 : " + person.getHobby());
// 값을 제대로 받아오는지 확인
person.setAge(431);
// 파라미터로 저장된 person객체의 값을 바꿔줌
return person;
}
@GetMapping("/getPath/{id}/{cpp}/{page}")
// 영역에 이름을 지정
public Map<String, Object> getPath(@PathVariable String id,
@PathVariable int cpp,
@PathVariable int page) {
Map<String, Object> map = new HashMap<>();
map.put("아이디", id);
map.put("게시물 개수 " , cpp);
map.put("페이지 번호", page);
// 경로에서 값을 가져와서 해당 메서드에서 포장해서 값을 보냄
return map;
}
}