우선 예제를 위해 아래와같이 프로젝트를 생성해준다.
Controller
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data","hello!!"); //hello.html에 있는 ${data}가 hello!!로 치환됨
return "hello"; //hello.html을 찾으라는 뜻
}
}
다음 인텔리제이 내에있는 resources>templates 아래에 hello.html을 만들어준다. (thymeleaf 템플릿 사용)
hello.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. '+ ${data}" >안녕하세요. 손님</p>
</body>
</html>
먼저 스프링부트는 톰켓 서버를 내장하고 있고, 서버에서 스프링 컨테이너의 컨트롤러로 접근하게 된다.
다음 해당 컨트롤러에 들어있는 메서드를 실행시키게 되고 매개변수에 있는 model을 만들어 주게 된다.
모델안에 addAttribute를 통해 hello!!라는 값을 넣어주고 return 값이 hello기 때문에 viewResolver에 의해 hello.html을 찾아가게 된다
두번째 방법으로 @ReqeustParam을 써서 구현해본다.
Controller
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name", required = true) String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
달라진점은 model에 파라미터값을 받아서 넣는다는 점이다.
위와 같이 그대로 hello-mvc를 실행하게 되면 오류가 뜨지만
name뒤에 value 값을 주면 정상적으로 출력되는 것을 볼 수 있다.
다음으로 Api방식으로 자주 사용하는 @ResponseBody를 써서 구현해본다.
Controller
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello "+name; //뷰가 없음 데이터를 그대로 내려줌
}
위의 코드는 뷰를 따로 리턴하지 않고 HTTP의 BODY에 문자 내용을 직접 반환한다.
그렇다면 문자열이 아닌 객체를 반환하면 어떻게 될까?
Controller
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello; // 객체는 기본적으로 json 방식으로 반환됨
}
static class Hello{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
먼저 Hello 클래스를 자바 빈 패턴으로 구현해주고 hello라는 객체를 return 시켜줬다.
위와 같이 JSON 형식으로 출력되는 것을 볼 수 있다.
원리는 아래와 같다.
먼저 @ResponseBody는 HTTP의 BODY에 문자 내용을 직접 반환한다
또한 스프링부트에서 @ResponseBody를 사용하게 되면 위에 템플릿을 사용한 viewResolver를 사용하지 않게되고 HttpMessageConverter가 동작하게 된다.
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) 콘솔창에서 빌드후 실행 (0) | 2022.05.06 |
---|---|
Springboot) 스프링 시큐리티 소셜 로그인 처리 (0) | 2022.02.07 |
Springboot) UserDetailsService (0) | 2022.01.24 |
Springboot) Springsecurity : AuthenticationManager , AuthenticationProvider , UserDetailsService (0) | 2022.01.21 |
Springboot) RedirectAttributes, addFlashAttribute() (0) | 2022.01.17 |