📌 정적 컨텐츠 (static content)
파일을 그대로 web browser에 내려주는 방식
스프링 부트는 정적 컨텐츠 기능을 자동으로 제공해준다
resources/static/** 아래의 파일과 매핑된다
🔶 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
검색하면 내장 톰캣 서버가 요청을 받고 스프링 컨테이너에 전달 - 스프링은 controller에 hello-static이 있는지 탐색
- controller에 없는 경우,
resources/static/hello-static.html
탐색 - resources에 존재할 경우 client에 반환
📌 MVC와 템플릿 엔진
가장 많이 사용하는 방식
server에서 HTML을 변형해서 view로 내려주는 방식
✔ MVC(Model-View-Controller) : model, 템플릿 엔진 화면(view), controller
- view : 화면을 그리는데 집중
- model, controller : 비지니스 로직과 관련있으며 내부적인 일을 처리하는 데 집중
✔ 템플릿 엔진 : HTML을 server에서 프로그래밍해서 동적으로 바꿔서 내려주는 방식
➡ 과거 JSP, PHP
템플릿엔진을 model, view, controller 방식으로 쪼갠 후 view를 템플릿 엔진으로 HTML을 프로그래밍하여 렌더링하고
렌더링 된 html을 client에게 전달
🔶 java/hello/hellospring/controller/HelloController
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
🔶 hello-templates.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
- RequestParam의 required 기본값이 true이므로 웹브라우저에서 열 때 name이 존재해야한다.
➡ localhost:8080/hello-mvc?name=spring!
- ?는 HTTP get 방식
required=false로 설정하면 name 없어도 가능
✔ thymeleaf template의 장점 ❗
HTML 파일을 server없이 바로 열 수 있다
<p th:text="'hello ' + ${name}">hello! empty</p>
템플릿 엔진으로 동작할 경우(server 사용): th:text에 해당하는 문자로 치환
템플릿 엔진으로 동작하지 않는 경우(server 사용x) : 사이의 문자(hello! empty)가 출력됨
📎 단축키
command + p : parameter 정보
✔ 원리
1) 웹 브라우저에서 localhost:8080/hello-mvc?name=spring!
검색
2) 내장 톰캣 서버가 스프링 컨테이너에 전달함
3) helloController
에 mapping 되어 있다고 해당 메소드 호출
4) 반환해줄 때 이름을 hello-template으로 반환하며, 모델에 key = "name", value = "spring!"을 넘겨준다
5) viewResolver
(화면과 관련된 해결자) : view를 찾아주고 템플릿 엔진을 연결시켜준다
➡ viewResolver
가 templates/hello-template.html
을 찾아서 Thymeleaf 템플릿 엔진에게 처리를 요청한다
6) 템플릿 엔진이 렌더링해서 변환된 HTML을 웹 브라우저에 넘겨준다
📌 API
- MVC가 HTML을 내리는 방식이라면 API는 data를 내리는 방식
- JSON이라는 데이터 포맷으로 client에게 데이터를 전달해줌
- API로 데이터만 내려주면 화면을 client가 알아서 그려야하며, server 끼리의 통신에도 사용
🔶 java/hello/hellospring/controller/HelloController
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
ResponseBody
: HTTP의 body 부에 리턴 값을 직접 넣어주겠다는 뜻 (HTML에 나오는 body랑 다른 것임)- MVC와 다른 점 : hello + (name) 문자가 client로 view 없이 그대로 내려감
✔ MVC 소스코드
<html>
<body>
<p>hello spring!</p>
</body>
✔ API
hello spring!
🔶 java/hello/hellospring/controller/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
}
}
JSON 방식(key : value 구조)
✔ 과거에는 XML 방식도 주로 쓰였다
- HTML 태그가 XML 방식
- XML 방식은 태그를 두 번 써야하고 무겁다
- JSON은 단순하다 (요즘 이 방식으로 통일)
✔ @ResponseBody 사용 원리
- 웹브라우저에서
localhost:8080/hello-api?name=spring!
를 검색 - 내장 톰캣 서버에서 이걸 받아 스프링 컨테이너로 전달
helloController
에서hello-api
를 찾음@ResponseBody
가 붙어있는 것을 보고 HTTP 응답에 그대로 data를 넘겨야겠다고 생각
-> return 값이 객체(문자x)면 기본값은 data를 기본 JSON 방식으로 만들어서 HTTP 응답에 반환하겠다.HttpMessageConverter
가 동작
➡ 기존에는viewResolver
가 동작하였지만@ResponseBody
가 있을 경우HttpMessageConverter
가 동작
➡ return 값이 문자일 경우 :StringConverter
동작
➡ return 값이 객체일 경우JsonConverter
동작
➡ 객체가 return 되었으므로JsonConverter
가 동작하면서 객체를JSON
스타일로 바꿈- 바꾼 결과를 HTTP body에 실어보내어 웹브라우저에 {name:spring!}넘김
✔ @ResponseBody 사용
- HTTP의 Body에 문자 내용을 직접 반환
viewReslover
대신HttpMessageConverter
가 동작- 기본 문자 처리 :
StringHttpMessageConverter
- 기본 객체 처리 :
MappingJackson2HttpMessageConverter
- byte 처리 등 여러
HttpMessageConverter
가 기본으로 등록되어 있음
cf)
Client의 Http Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택됨
-> 하지만 요즘은 거의 JSON 사용
이 글은 <김영한_스프링 입문>을 수강하고 참고하여 작성한 글입니다

PREV
[스프링 입문] 1. 프로젝트 환경설정
📌 프로젝트 생성 방법 스프링 부트 스타터 사이트를 통해서 프로젝트 설정 Project : Gradle - Groovy Language : Java Spring Boot : 3.x.x -> 버전 옆에 SNAPSHOT OR M2 등이 써있는 것은 정식 버전이 아니다 -> 버전
nyeroni.tistory.com
NEXT
[스프링 입문] 3. 회원 관리 예제 - 백엔드 개발
📌 비지니스 요구사항 정리 데이터 : 회원ID, 이름 기능 : 회원 등록, 조회 아직 데이터 저장소가 선정되지 않았다는 가상의 시나리오 1. 일반적인 웹 애플리케이션 계층 구조 🔷 컨트롤러 : 웹 MV
nyeroni.tistory.com
'인프런 Spring 강의 정리 > 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 카테고리의 다른 글
[스프링 입문] 6. 스프링 DB 접근 기술 (0) | 2024.01.20 |
---|---|
[스프링 입문] 5. 회원 관리 예제 - 웹MVC 개발 (0) | 2024.01.20 |
[스프링 입문] 4. 스프링 빈과 의존관계 (0) | 2024.01.20 |
[스프링 입문] 3. 회원 관리 예제 - 백엔드 개발 (0) | 2024.01.20 |
[스프링 입문] 1. 프로젝트 환경설정 (0) | 2024.01.20 |