정적 컨텐츠
hello-static.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>정적 컨텐츠</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>정적 컨텐츠입니다.</body>
</html>
- http://localhost:8080/hello-static.html 를 검색하면 그대로 나온다.
- 웹 브라우저에서 http://localhost:8080/hello-static.html를 검색하면 내장 톰켓 서버에서 요청을 받고 스프링으로 넘긴다. 스프링의 컨트롤러에서 hello-static을 찾아보고 (컨트롤러 우선순위) 없으면 resources 폴더 내부에 있는 static/hello-static.html을 찾아 웹 브라우저에 반환한다.
아파치 톰켓(Apache Tomcat)
- 웹 애플리케이션 서버이다. 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하며 JSP, 자바서블릿(자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램)이 실행할 수 있는 환경을 제공한다.
MVC와 템플릿 엔진
MVC: model, view, controller를 이용한 설계 방식
model) 소프트웨어 내에서 테이터
view) 사용자에게 보이는 화면
controller) model과 view의 상호작용을 관리
- mvc의 경우 뷰와 모델이 정확히 분리되지만, 컨트롤러가 뷰의 구성에 관여하여 독립성이 다소 떨어진다.
- 이를 해결하기 위해 컨트롤러의 뷰 기능은 모두 뷰가 맡고 presenter가 모델과 뷰 사이의 인터페이스 역할을 하도록 한다(MVP)
package hello.hellospring.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 hello(Model model){
model.addAttribute("data","hello!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") 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;
}
}
}
템플릿 엔진을 사용하면 뷰를 편하게 구성할 수 있다. 컨트롤러에서 반환값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아서 처리한다. 이 때, 템플릿 엔진이 동작하여 동적으로 HTML을 생성하게 된다.
- ‘model’ 객체 사용
model.addAttribute("data", "hello!!");
model.addAttribute("name", name);
model 객체는 컨트롤러에서 뷰로 데이터를 전달하는 역할
- ‘@ResponseBody’없이 문자열 반환
public String hello(Model model)
public String helloMvc(@RequestParam("name") String name, Model model)
메서드가 ‘@ResponseBody’없이 문자열 반환 경우, 해당 문자열은 뷰의 이름으로 간주된다. 이는 반환된 문자열이 템플릿 엔진을 통해 렌더링될 뷰의 이름임을 의미한다.
hello-template.html
<body><p th:text="'hello ' + ${name}">abcdefg!</p></body>
</html>
서버를 타면 abcdefg! 부분이 <hello + ${name}>으로 바뀐다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
name 값을 정해야 함
- http://localhost:8080/hello-static.html?name=spring!
- name의 value(spring!)가 template으로 넘어가 반영됨
MVC 과정
- 웹 브라우저에서 localhost8080/hello-mvc를 넘기면 톰켓 서버를 거친다.
- 톰켓 서버에서 hello-mvc를 확인 후 스프링에 보내고 helloController에 hello-mvc 메서드가 매핑됨을 보고 hello-mvc 메서드를 호출한다.
- return 할 때 model의 key는 name, value는 spring!이라 지정한다.
- hello-template에 반영이 되고 viewResolver가 view를 찾고 템플릿 엔진을 연결시킨다.
- viewResolver가 templates 폴더에서 hello-template return의 이름과 똑같은 html을 찾아 thymeleaf 템플릿 엔진이 처리한다.
API
@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;
}
}
- @ResoponseBody를 사용하면 viewResolver를 사용하지 않는다. (json 방식)
- get set을 사용할 때는 public 을 사용한다. (JAVA Bean 표준방식)
API 과정
- localhost8080/hello-api 를 넘기면 톰켓 서버를 거친다.
- 톰켓 서버가 스프링으로 보낸다.
- @ResponseBody가 있을 경우 데이터를 그대로 넘기려고 한다.
- 하지만 위 코드와 같은 hello는 객체 데이터이므로 JSON방식으로 http 응답에 반환하려고 한다.
- HttpMessageConverter가 동작하고 반환값이 객체이므로 JsonConverter가 동작하여 Json으로 바꾼다.
'spring boot' 카테고리의 다른 글
| springboot_JPA_프로젝트 환경설정 (0) | 2024.09.17 |
|---|---|
| 객체 지향 원리 (0) | 2024.07.28 |
| 프로젝트 생성 (0) | 2024.07.23 |
| 스프링 개념 (1) | 2024.07.20 |
| 회원관리 (0) | 2024.07.04 |