JSON 형태는 서버에서 읽을 수 없다.
JSON
형태로 내보내고 싶으면 String
으로 JSON 형태로 만들어서 내보내야한다.
return {"\"name\":\"Kim\",\"age\":10}";
이렇게 내보내게 되면 생긴 형태는
JSON
이지만 HTTP에서는text
형태라고 인식한다.
@ResponseBody
annotation 을 달아준다.
자바 객체로 반환하게 되면 JSON
으로 반환한다. (Spring 내부에서 자동적으로)
하지만 자동적으로 Controller
는 html 을 찾기 때문에 "html 이 아닌 데이터를 반환할 것 이다!" 라는 의미로 @ResponseBody
annotation 을 달아주어야 데이터를 내보낼 수 있다.
@RestController
annotation 을 달아준다.
@Controller
가 아닌 @RestController
를 달아주면 @ResponseBody
annotation 을 달지 않아도 자동으로 데이터를 반환해준다.
자바의 객체를 JSON 타입의 Stirng 으로 변환해줄 수 있고 JSON 타입의 String 값을 자바의 객체로 변환해줄 수 있다.
객체 ⇄ JSON 타입의 String
** build.gradle
에서 추가하지 않아도 자동으로 추가가 된다.
ObjectMapper
(Jackson라이브러리)를 사용한다.
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper(객체이름)
🚨 변환할 때 ObjectMapper가 Getter를 사용한다₩.
그러므로 객체에 get method가 필수로 있어야한다.
ObjectMapper
(Jackson라이브러리)를 사용한다.
먼저 String 으로 JSON 형태 문자열을 만들어준다.
String json = “{\“name\“:\“Kim\“,\“age\“:10}”;
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
🚨 객체에 기본생성자가 필수로 있어야한다.
🚨 Getter 나 Setter 둘 중 하나가 필수로 있어야한다.
🚨 객체의 필드이름과 JSON 형태의 key 값과 동일해야한다. 일치하지 않으면 찾을 수 없기 때문에 오류가 발생한다.
보내려고 하는 데이터를 브라우저 경로 넣어 놓는 방법
http://localhost:8080/hello/person/Kim/age/10
메서드 파라미터에 @PathVariable
annotation 을 달아준다.
@GetMapping(“/hello/person/{name}/age{age}”)
@ResponseBody
public String helloRequestPath (@PathVariable String name, @PathVariable int age) {
return String.format("name = %s, age = %d", name, age);
}
물음표로 데이터를 보내고 & 로 데이터를 구분한다.
http://localhost:8080/hello/form/param?name=Kim&age=10
메서드 파라미터에 @RequestParam
이라는 annotation 을 달아준다.
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age){
return String.format("name = %s, age = %d", name, age);
}
@RequestParam
은 생략이 가능하다.
🚨 GET 방식에서 들어오는 데이터가 있을 수도 있고 없을 수도 있다.
그 때마다 새로운 메서드를 만들 순 없기 때문에 @RequestParam 에 required = false 라는 옵션을 추가해준다.
그러면 그 데이터가 포함되지 않아도 오류가 발생하지 않으면서 null 로 초기화가 된다.
POST는 GET 과 달리 Body(Payload) 부분을 가지고 있다.
GET 방식은 경로에서 데이터를 확인할 수 있지만 POST는 Payload 안에서 확인할 수 있다.
[POST : Query String]
Body 에 데이터가 들어왔을 때
@ModelAttribute
annotation 을 사용하면 Body 에 들어온 Query String 방식의 데이터를 객체에 mapping 해서 가져올 수 있다.
[GET]
@ModelAttribute
annotation 사용해서 Query String 방식으로 받아올 수 있다.
🚨
Setter
또는오버 로딩된 생성자
가 꼭 필요하다.
그래야 데이터를 받아올 수 있기 때문에 만약에 없다면null
값으로 초기화가 된다.
👍🏻 데이터 종류가 적으면 괜찮지만 데이터가 name, age, birth, height, … 이렇게 많이 들어오면 하나하나
@RequestParam
&
로 작성해야하기 때문에 객체로 한번에 받을 수 있도록한다.
[POST : JSON]
HTTP Body에 JSON형태로 데이터가 넘어왔을 때 @RequsetBody
annotation 을 이용해서 💬 "JSON형태로 받아와주세요!" 라고 알려야한다. 역시 객체의 필드명과 클라이언트에서 보내는 데이터와 동일해야한다. 동일하지 않으면 null
이 나온다.