스프링을 이용해서 웹을 개발할 때 3가지 방법이 존재합니다.
정적 컨텐츠
MVC와 템플릿 엔진
API
이 3가지 방법이 어떤 것인지, 동작원리는 어떻게 되는지에 대해서 알아보도록 하겠습니다.
정적 컨텐츠
html 그 자체를 어떠한 조작없이 바로 보여주는 형태입니다.
static 폴더에 html 파일을 두고 해당 주소로 접속을 하게 되면 우리가 작성한 html 그대로를 보여주는 형태입니다.
구현
static/hello-static.html 파일을 생성하고 아래의 내용을 복사 붙여넣기를 해 봅시다.
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
스프링 서버를 구동 후 localhost:8080/hello-static.html 에 들어가보면 아래와 같은 화면을 볼 수 있을 것입니다.
정적 컨텐츠의 동작 순서
1. 웹 브라우저에서 localhost:8080/hello-static.html 요청을 서버에 전송합니다.
2. 내장 톰켓 서버는 요청을 받아 스프링 컨테이너에 전달을 합니다.
3. 스프링 컨테이너는 hello-static 요청을 처리할 컨트롤러가 존재하지 않는 것을 확인합니다.
4. static 패키지에서 hello-static.html 파일이 있는 것을 확인합니다.
4. 해당 화면을 반환한다.
MVC와 템플릿 엔진
MVC는 model, view, controller 를 줄인 말입니다.
각각의 역할을 나눔으로 인해서,
HelloController.java
package com.example.hellospring2.controller;
import org.springframework.stereotype.Controller;
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 hello222(Model model){
model.addAttribute("data","hello test!!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name") String name, Model model){
model.addAttribute("thymeleafName", name);
return "hello-template";
}
}
templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org"> <body>
<p th:text="'hello ' + ${thymeleafName}">hello! empty</p> </body>
</html>
http://localhost:8080/hello-mvc?name=springMan 주소로 접속해보면 아래와 같은 화면이 뜨는 것을 볼 수 있습니다.
SpringMVC 의 동작 순서
동작 원리
1. 웹 브라우저에서 localhost:8080/hello-mvc 요청을 보냅니다.
2. 내장 톰캣에서 해당 요청을 받아서 스프링 컨테이너로 요청을 전달합니다.
3. 스프링 컨테이너에서는 hello-mvc 요청을 처리할 수 있는 helloController가 존재하는 것을 확인하고 model을 viewResolver에 전달합니다.
4. viewResolver는 템플릿 화면을 처리하고 웹 브라우저에게 최종 화면을 전달해줍니다.
viewResolver
- view를 찾아주고 화면과 연결해주는 역할을 함
API
API 방법은 2가지가 존재합니다.
문자열을 반환하는 방법
객체를 반환하는 방법
2가지에 대해서 결과를 각각 알아보도록 하겠습니다.
문자열을 반환 하는 방법
package com.example.hellospring2.controller;
import org.springframework.stereotype.Controller;
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 hello222(Model model){
model.addAttribute("data","hello test!!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name") String name, Model model){
model.addAttribute("thymeleafName", name);
return "hello-template";
}
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello " + name;
}
}
@GetMapping("hello-string") 부분만 살펴보면 됩니다.
http에 body부에 return 값에 해당하는 data를 직접 넣어주고 있습니다.
문자로 하는 방식은 화면 없이 아래와 같이 그대로 데이터를 내려준다.
객체를 전달하는 방법
package com.example.hellospring2.controller;
import org.springframework.stereotype.Controller;
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 hello222(Model model){
model.addAttribute("data","hello test!!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name") String name, Model model){
model.addAttribute("thymeleafName", 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;
}
}
}
@GetMapping("hello-api") 아래에 있는 메서드만 살펴보면 됩니다.
앞에서는 문자열을 직접 return문에 전달하였지만 이번에는 hello라는 객체를 전달하고 있습니다.
결과물은 http://localhost:8080/hello-api?name=springMan2 로 가면 아래와 같이 json 형태의 결과를 확인할 수 있습니다.
API 동작 원리
1. 웹 브라우저에서 localhost:8080/hello-api 요청을 전송
2. 내장 톰캣 서버에서 요청을 받아 스프링 컨테이너에 전달
3. @GetMapping 에서 hello-api 를 받는 곳을 찾음
4. @ResponseBody annotation을 확인한 뒤, 문자면 그대로 반환, 이 후 StringConverter가 동작하여 문자 자체로 전달해줌
5. @ResponseBody annotation을 확인한 뒤, 객체면 제이슨 형태로 html에 반환하게 됨
5.1. @ResponseBody를 확인했다면, viewResolver가 아닌 JsonConverter가 동작하여 Json style로 값을 바꾸게 됨
Json converter 는 대표적으로 2가지가 있다고 합니다.
1. MappingJackson2HttpMessageConverter
2. GSON
'강의 > 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 카테고리의 다른 글
회원 Controller 세팅 (0) | 2022.04.06 |
---|---|
스프링 빈을 등록하는 2가지 방법 (0) | 2022.04.06 |
회원 Service 생성 및 Test (0) | 2022.04.06 |
회원 Repository 생성 및 Test (0) | 2022.04.06 |
프로젝트 생성 (0) | 2022.04.06 |