들어가며
📜 정적 컨텐츠: 파일을 그대로 클라이언트단에 보여주는 방식
🛠️ MVC와 템플릿 엔진: 서버에서 변형을 하여 html을 바꿔서 내려주는 방식
🔄 API 방식: json 포맷으로 클라이언트에게 데이터를 전달하는 방식이라고 할 수 있습니다.
1. 정적 컨텐츠 (파일을 그대로)
- main > resources > 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을 치면 내장 톰캣 서버가 이 요청을 받습니다.
- 스프링은 우선 컨트롤러를 먼저 찾아보지만, hello-static 관련 컨트롤러는 없습니다.
- 컨트롤러가 없기에 이후 resouces: static/hello-static.html를 찾아 이를 웹 브라우저에 반환해 줍니다.
2. MVC와 템플릿 엔진 (View를 템플릿 엔진으로 렌더링된 html을 클라이언트에게 전달)
1) MVC
- Model: 데이터와 비즈니스 로직을 관리합니다.
- View: 레이아웃과 화면을 처리합니다.
- Controller: 모델과 뷰로 명령(사용자의 입력에 대한 응답으로 모델 또는 뷰를 업데이트하는 로직 포함)을 전달합니다.
- main > resources > 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>
2) 템플릿 엔진
- main > java > hello > hello.hello_spring > controller > HelloController
- @GetMapping: hello-mvc가 들어오면 GET 메서드로 받을 수 있도록 매핑합니다.
- @RequestParam(value = "name", required = true)
- name 파라미터를 반드시(required = true) 받습니다.
package hello.hello_spring.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;
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name", required = true) String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
- main > resources > templates > hello-template.html
- html로 직접 접근하면 <p> 태그 내 hello! empty가 출력됩니다.
- controller를 거치면 name이 반영되어 html로 렌더링 후 출력됩니다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
- MVC와 템플릿 엔진 동작원리
- 웹 브라우저에서 localhost:8080/hello-mvc?name=spring!!!!! → 내장 톰캣 서버에서 이 내용이 스프링 부트로 전달됩니다.
- hello-mvc는 helloController에 매핑이 되어 있기에, hello-templete + model(name: spring!!!!!)와 함께 리턴됩니다.
- 이 내용을 받아서 viewResolver가 동작하고, templates/hello-template.html 타임리프 템플릿 엔진에게 처리 요청합니다.
- 타임리프 템플릿 엔진이 렌더링하여 html으로 변환 후 웹 브라우저에게 넘겨줍니다.
3. API (HttpMessageConverter를 통해서 객체 반환)
- main > java > hello > hello_spring > controller > HelloController
- @ResponseBody: http 응답 body에 return에 작성한 "hello" + name 데이터를 직접 넣어주겠다는 의미입니다.
- hello-string은 String을 반환, hello-api는 객체를 반환합니다.
- setter 메서드로 hello 객체에 name을 넣고, return hello 이 hello 객체를 반환합니다.
package hello.hello_spring.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-string")
@ResponseBody // 중요! http 응답 body에 return에 쓴 "hello" + name이라는 데이터를 직접 넣어주겠다는 의미
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;
}
}
}
- API 동작원리
- 웹 브라우저에서 localhost:8080/hello-api를 받으면, 톰캣이 스프링에 전달합니다.
- 스프링 helloController에 ResponseBody 어노테이션을 인식합니다. (만약 ResponseBody가 없었다면, 이후 VeiwResolver가 리턴값을 받아 동작합니다.)
- HttpMessageConverter로 리턴값을 받는데
- string이라면 StringConverter로
- 객체라면 JsonConverter가 기본으로 동작하여 객체를 json 스타일로 변경합니다.
- 이를 통해 변경된 json을 웹 브라우저에게 다시 보내줍니다.
- @ResponseBody
- HTTP의 BODY에 문자 내용을 직접 반환합니다.
- viewResolver 대신에 HttpMessageConverter 가 동작합니다.
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- MappingJackson2: 객체를 json으로 바꿔주는 라이브러리입니다. (스프링이 기본으로 사용하는 라이브러리)
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있습니다.
- 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프
김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확
www.inflearn.com
반응형