이 글은 김영한님 스프링-입문 강의를 듣고 작성합니다.
[2. 스프링 웹 개발 기초] 강의에 해당된 내용을 정리합니다.
Spring으로 응답을 하는데 3가지 방법이 있다.
- 정적 컨텐츠
- MVC와 템플릿 엔진
- API
1. 정적 컨텐츠
파일을 그대로 날려준다.
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>
http://localhost:8080/hello-static.html 실행하면 다음과 같이 나온다.
동작
(헥.. 하나씩 다 만드느라 힘들었다..)
- localhost:8080/hello-static.html 웹브라우저에서 요청을 하면 스프링부트에 내장되어 있는 톰켓 서버가 그걸 받는다.
- 톰켓 서버는 먼저, 스프링 컨테이너에 hello-static 관련 있는 컨트롤러를 찾는다.
- 없으면, resource 파일에 hello-static.html 정적 파일이 있는지 확인한다.
- 있으면, 그 html 페이지를 웹브라우저에 그대로 날려준다.
2. MVC 템플릿 엔진
💡 Controller → viewResolver → Thymeleaf 템플릿 엔진 처리
- “name”이라는 파라미터를 @RequestParam 어노테이션을 사용하여 받고, Model에 데이터를 추가한 뒤 “hello-mvc” 리턴
- viewResolver는 Controller가 리턴한 논리적인 파일 이름을 “hello-mvc.html” 로 변환한 뒤 파일을 찾는다.
- Thymeleaf는 Model 객체에 담긴 “name” 속성 값을 처리하여 동적인 HTML을 생성하고 웹브라우저에 전달
MVC 패턴을 준수하면서, template engine을 활용하여 웹브라우저에게 띄운다.
Controller
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
- @Controller: 스프링의 컨트롤러 어노테이션. 스프링은 이 어노테이션이 붙은 클래스를 검색하여 웹 요청을 처리한다.
- @GetMapping("hello-mvc"): “/hello-mvc” 경로로 들어오는 GET 요청에 대해 helloMvc 메소드를 실행한다.
- (@RequestParam("name") String name, Model model): “name”이라는 파라미터를 @RequestParam 어노테이션을 사용하여 받는다. 또한, Model 객체를 매개변수로 받아서 이 객체에 데이터를 추가한다!
- model.addAttribute("name", name): Model 객체에 "name"이라는 속성에 클라이언트로부터 받은 name 값을 추가한다.
- return "hello-template": 뷰의 이름을 나타낸다. "hello-template"은 스프링이 View Resolver를 통해 실제 뷰 템플릿을 찾아가게 될 뷰의 이름이다.
View
templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
- thymeleaf 사용 선언
- ${name} : 서버에서 보낸 Model 객체의 “name”이라는 속성의 값을 넣는다.
http://localhost:8080/hello-mvc?name=spring실행하면 다음과 같이 ${name} 자리에 “spring!!”이 나타난다.
동작
(헥.. 하나씩 다 만드느라 힘들었다..)
- localhost:8080/hello-mvc 웹브라우저에서 요청을 하면 스프링부트에 내장되어 있는 톰켓 서버가 받아서 스프링 컨테이너에게 전달한다.
- 스프링 컨테이너에 hello-mvc 관련 있는 컨트롤러를 찾는다.
- helloController
- “name” 파라미터 값을 Model 객체에 “name” 속성으로 추가한다.
- “hello-template”을 viewResolver에게 전달한다.
- viewResolver
- “hello-template”이라는 논리적인 이름을 실제 물리적인 view 파일 “hello-template.html” 로 변환한다.
- templates 폴더 안에 “hello-template.html” 파일을 찾는다.
- Thymeleaf
- Model 객체에 담긴 “name” 속성 값을 처리하여 동적인 HTML을 생성
- 웹브라우저에게 전달
Thymeleaf는 템플릿 언어를 처리하기만 하고 viewResolver가 웹브라우저에 전달하는 줄 알았는데,
viewResolver는 Controller가 리턴한 논리적인 파일 이름을 실제 파일로 변환하고 찾는 역할만 하다니..
그리고 Thymeleaf가 웹브라우저에게 전달하는 거였구나..
💡 Thymeleaf : 웹브라우저에게 전달 , viewResolver : Controller가 리턴한 논리적인 파일 이름을 실제 파일로 변환하고 찾는 역할
3. API
💡 Controller → HttpMessageConverter
1. @ResponseBody
: 해당 메소드가 HTTP 응답 body에 데이터를 저장하고 객체를 반환
2. Spring은 반환되는 객체를 이러한 HttpMessageConverter를 사용하여 적절한 형식으로 변환하고,
그 결과를 HTTP 응답 본문에 담아 클라이언트에게 전달
html 태그가 없고 바로 hello+name 출력
@ResponseBody 문자 반환
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello " + name;
}
- @ResponseBody 를 사용하면 viewResolver를 사용하지 않음
- 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)
실행화면
@ResponseBody 객체 JSON 반환
@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 : 해당 메소드가 HTTP 응답 body에 직접 데이터를 작성하도록 지정한다. 객체를 JSON 형태로 변환하고 응답 본문에 포함
- “/hello-api”로 GET 요청이 들어올 때, “name” 파라미터를 가지고 새로운 Hello 객체를 생성하여 JSON 형태로 응답한다.
실행화면
다음과 같이 JSON 형태로 나온다.
동작
(헥.. 하나씩 다 만드느라 힘들었다..)
- @ResponseBody를 사용하면 HTTP의 BODY에 문자 내용을 직접 반환한다.
- 그럼 HttpMessageConverter 이 동작하고
- Spring에서 HTTP 메시지를 Java 객체로 변환하거나 그 반대로 변환하는 역할을 수행한다.
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter (JSON 형식)
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
- 결론, @ResponseBody를 사용하면, Spring은 반환되는 객체를 이러한 HttpMessageConverter를 사용하여 적절한 형식으로 변환하고, 그 결과를 HTTP 응답 본문에 담아 클라이언트에게 전달
🌟 정리
1. 정적 컨텐츠 ➩ static 폴더에서 파일 생성 후, 파일 그대로 보낸다.
2. MVC 템플릿 엔진 ➩ Controller → viewResolver → Thymeleaf 템플릿 엔진 처리
Thymeleaf : 웹브라우저에게 전달 , viewResolver : Controller가 리턴한 논리적인 파일 이름을 실제 파일로 변환하고 찾는 역할
3. API ➩ Controller → HttpMessageConverter
@ResponseBody 를 사용하면 viewResolver를 사용하지 않고, HTTP의 BODY에 문자 내용을 직접 반환
HttpMessageConver는 HTTP 메시지 <-> java 객체 변환 역할
'Spring' 카테고리의 다른 글
@ModelAttribute 언제 사용할까? (0) | 2025.03.24 |
---|---|
HTTP 상태코드에 대해 설명해주세요. (0) | 2024.08.29 |
[Spring] 테스트 케이스 작성 / Intellj 편한 단축키 (0) | 2024.08.10 |