[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 7강
https://inf.run/hisy 강의를 수강하고 작성하는 게시물입니다.
1. API
1.1 API 예제
package Hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(name = "name", required = false) String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
중간에 @ResponseBody의 의미는
http의 body부를 직접 넣어주겠다는 의미이다.
name 에 문자를 넣어주면
뷰가 없고 문자가 그대로 내려간다.
http://localhost:8080/hello-string?name=spring
위의 주소로 들어가면 똑같은 결과가 보여지는것을 알 수 있지만
소스보기를 하면 html과 다르게 문자만 그대로 나와있는것을 알 수 있다.
1.2. API를 이용하여 데이터를 넘기는 방식 예제(json)
package Hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(name = "name", required = false) String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
위의 내용을 추가하고 실행해보자.
http://localhost:8080/hello-api?name=spring
json방식의 데이터 구조가 나온다(키,값으로 이루어진 구조이다. - 키는 name 값은 spring이다.)
과거에는 xml방식으로 많이 쓰였다.(html이 xml구조로 되어있다.)
그러나 무겁고 괄호 열고 닫고 해야하므로 거의 json방식으로 통일되었다.
*. 참고 : getter and setter
java bin 표준 방식이다.
라이브러리에서 쓰거나 객체 초기화하는 역할이고
마음대로 호출 불가능하게 하기 위한 역할이다.
property접근방식이라고도 한다.
1.3. @ResponseBody 대략적 사용원리
- 웹 브라우저에서 주소를 던진다
- 스프링 부트의 내장 톰캣서버에서 주소를 받고 스프링 으로 넘긴다.
- 스프링은 컨테이너에 있는것을 확인한다.
- @ResponseBody가 있는 것을 발견하면 HTTP BODY에 내용을 직접 반환한다.
- @ResponseBody가 없을경우 viewRespose에 그냥 던진다.(이전의 강의 및 게시물 참고)
- 문자일 경우 HttpMessegeConverter에 문자를 그대로 넘긴다 - StringConverter가 동작한다.
- 문자가 아닌 객체일 경우 json방식으로 데이터를 만들어서 httpMessageConverter에 던진다 - JsonConverter가 동작한다.(매우 간략하게 말한것임. 보통 MappingJackson2HttpMessageConverter라는 라이브러리를 사용한다.)
- 웹 브라우저 및 서버에 데이터를 던진다
참고로 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보들을 조합하여 HttpMessageConverter가 선택된다.(요즘은 거의 json을 쓰지만 컨버터만 쓰면 된다는 생각을 하면된다.)
댓글 남기기