본 게시글은 김영한님의 [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술]을 수강하며 작성한 글입니다.
1. 정적 컨텐츠
1) 정적 컨텐츠 방식
서버에서 HTML 파일을 정적으로 웹 브라우저에 올리는 방식이다.
Static Content
By default, Spring Boot serves static content from a directory called /static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext. It uses the ResourceHttpRequestHandler from Spring MVC so that you can modify that behavior by adding your own WebMvcConfigurer and overriding the addResourceHandlers method.
2) 동작 원리
- 컨트롤러측에서 먼저 hello-static이 존재하는지 확인한다.
- 없을 경우 resources/static/ 경로 하위에 hello-static.html이 존재하는지 확인한다.
3) 실습
1. src/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. 테스트 - localhost:8080/hello-static.html 접속
해당 파일을 서버가 잘 전달해주는 것을 확인할 수 있다.
2. MVC와 템플릿 엔진
1) MVC 방식
서버에서 HTML 파일을 동적으로 웹 브라우저에 올리는 방식이다.
- Model: 클라이언트의 요청을 처리한 결과 데이터
- View: 화면에 보이는 리소스(Resource)를 제공하는 역할
- Controller: 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트(Endpoint)로써 Model과 View의 중간에서 상호작용을 해주는 역할
2) 동작 원리
3) 실습
1. /controller/HelloController.java 파일 작성
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;
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
2. /resources/hello-template.html 파일 작성
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
<p th:text="'hello ' + ${name}">hello! empty</p>
템플릿 엔진에 의해 html 파일이 변환되지 않을 경우, 즉 절대 경로를 통해 html 파일에 접속할 경우엔 태그 안의 내용(hello! empty)이 출력된다.
3. 테스트 - localhost:8080/hello-mvc?name=spring!!! 접속
요청 파라미터로 전달한 값(spring!!!)이 반영되어 변환된 html 파일을 보여준다.
3. API
1) API 방식
API 방식에서는 대부분 객체를 전달한다.
2) 동작 원리
@ResponseBody 사용
- HTTP의 Body에 문자 내용을 직접 반환한다.
- ViewResolver 대신에 HttpMessageConverter가 동작한다.
- 반환되는 값에 따라 다른 Converter가 동작한다.
- 문자: StringHttpMessageConverter
- 객체: MappingJackson2HttpMessageConverter
3-1) 실습 - 문자 반환
1. /controller/HelloController.java 파일 작성
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-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
2. 테스트 - localhost:8080/hello-string?name=spring!!! 접속
문자열이 그대로 반환되는 것을 확인할 수 있다.
3-2) 실습 - 객체 반환
1. /controller/HelloController.java 파일 작성
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-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;
}
}
}
💡 @ResponseBody @ResponseBody를 사용하고 객체를 반환하면 객체가 JSON으로 변환된다.
2. 테스트 - localhost:8080/hello-api?name=spring!!! 접속
JSON 포맷으로 값이 변환되어 나타나는 것을 확인할 수 있다.
'Courses > Spring' 카테고리의 다른 글
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 6. 스프링 DB 접근 기술 (0) | 2023.09.24 |
---|---|
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 5. 회원 관리 예제 MVC 개발 (0) | 2023.09.24 |
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 4. 스프링 빈과 의존관계 (0) | 2023.09.21 |
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 3. 회원 관리 예제 - 백엔드 개발 (0) | 2023.09.21 |
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 1. 프로젝트 환경설정 (0) | 2023.09.19 |