[Spring Intro] Section 02. 스프링 웹 개발 기초
강의: 김영한의 스프링 입문
# 스프링 웹 개발 기초
- 정적 컨텐츠: 파일을 그대로 웹브라우저에서 내려주는 것이다
- MVC와 템플릿 엔진: 서버에서 HTML을 프로그래밍해 동적으로 내려주는 것이다
- API: JSON이라는 데이터 구조 포맷으로 클라이언틍게 데이터를 전달하는 방식이며, 서버끼리의 데이터 통신에도 사용한다
# 정적 컨텐츠
1. 정적 컨텐츠
스프링 부트 정적 컨텐츠 기능: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content
- 스프링 부트는 기본적으로 resources/static 경로 내의 파일을 정적 콘텐츠로 사용한다
- 실습
- resources/static/hello-static.html을 작성하고 확인한다
- 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
2. 정적 컨텐츠 이미지
- 웹 브라우저에서 localhost:8080/hello-static.html에 접속
- 내장 tomcat 서버가 요청을 받아 spring에게 hello-staitc.html에 대해서 전달
- Spring이 컨트롤러 쪽에 hello-static과 관련한 컨트롤러가 있는지 먼저 확인 (컨트롤러가 정적 콘텐츠보다 우선 순위를 가짐)
- 매핑된 hello-static 컨트롤러가 없으므로 resources의 static 내에 해당 파일이 있는지 확인하고 있으면 브라우저로 반환
# MVC와 템플릿 엔진
1. MVC와 템플릿 엔진
- MVC: Model, View, Controller
- model1 방식: View에 모든 것을 구현하는 방식으로 대표적인 예시로 jsp가 있다
View: 화면을 그리는데 집중한다
Model, Controller: 비지니스 로직이나 내부적 처리에 집중한다
2. Controller
- @RequestParam: url 파라미터를 받을 때 사용한다
- HelloController에 다음 코드를 추가한다
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
3. View
- resources/templates/hello-template.html를 새로 만들어준다
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
4. 접속 및 확인
- localhost:8080/hello-mvc에 접속해보면 다음과 같이 에러 페이지가 발생하는 것을 확인할 수 있다
- 로그를 확인해보면 필수 파라미터 name이 없는 것을 확인할 수 있다
- 파라미터 정보 확인: Command + P (Mac 기준)
- 파라미터 정보를 확인해보면 value() 또는 name()이 있다
- required()의 default가 true임을 알 수 있으며 true인 경우에는 parameter 값을 반드시 입력해줘야 에러가 나지 않는다
- GET 방식에서의 url 파라미터 전달 방식
- http://localhost:8080/hello-mvc?name=spring!!
template에서 thymeleaf엔진의 <p> 태그는 태그로 감싸져 있는 내용이 th:text= 뒤에 오는 내용으로 치환되어 보여진다. 이때, 서버 없이 해당 파일을 열게되면 태그로 감싸고 있는 본래 내용이 보여진다
5. MVC, 템플릿 엔진 이미지
- 웹 브라우저가 접속하면, 내장 tomcat 서버가 spring에 요청을 전달한다
- spring은 helloController의 hello-mvc가 매핑이 되어있음을 확인하고 해당되는 메소드를 호출한다
- hello-template를 returngkau model에는 인자로 받은 값(key가 name인 value 값)을 함께 spring에 전달한다
- spring이 viewResolver가 return 받은 값과 똑같은 템플릿을 찾아 thymeleaf 템플릿 엔진으로 랜더링을해서 변환한 HTML을 웹 브라우저에 표시한다
ViewResolver: View를 찾아주고 템플릿 엔진을 연결한다
# API
1. MVC와 API
- MVC: HTML을 바로 내리는 것이다 → 현재 강의는 웹과 스프링부트의 관계를 주로 설명하고 있어 이와 같이 정의하신 것이다
- API: 데이터를 바로 내리는 것이다
2. @ResponseBody
ResponseBody에서의 Body는 HTML에서의 body 태그를 의미하는 것이 아니라 HTTP 프로토콜에서의 body 부분을 의미하는 것이다
3. @ResponseBody 문자 반환
- hello-string
- hello + [인자로 받은 name의 값]을 view 없이 return하여 바로 내려주는 것이다
- 즉, @ResponseBody를 사용하면 viewResolver를 사용하지 않는다
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
- 접속: http://localhost:8080/hello-string?name=spring
4. @ResponseBody 객체 반환
- hello-api
- @ResponseBody는 객체를 JSON 형태로 변환한다
- Java에서는 private로 선언된 변수에 바로 해당 클래스 외에 다른 곳에서 직접 접근이 불가능하므로 getter/setter 함수를 통해 값에 접근한다
- 위와 같은 방식을 프로퍼티 접근 방식이라고도 부른다
@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;
}
}
- 접속: http://localhost:8080/hello-api?name=spring
5. 템플릿 엔진 vs @ResponseBody
- 소스보기로 페이지를 비교했을 때 @ResponseBody를 사용한 경우 HTML 코드 없이 string만 있음을 확인할 수 있다
- View 없이 return 부분이 그대로 웹 브라우저에 표시된다는 것이 템플릿 엔진과의 차이점이다
6. @ResponseBody 사용 원리
- 웹 브라우저에서 접근하면 tomcat 내장 서버에서 hello-api가 왔음을 spring에게 알린다
- springdms hello-api와 관련된 컨트롤러가 있음을 확인한다
- 이때, ResponseBody 주석을 확인하면, HTTP 응답 Body에 문자 내용 혹은 객체를 반환한다
- HttpMessageConverter의 처리
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다
클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 두가지를 조합해서 HttpMessageconverter가 선택된다
'Study > Backend Note' 카테고리의 다른 글
[Spring Intro] Section 06. 스프링 DB 접근 기술 (0) | 2023.03.06 |
---|---|
[Spring Intro] Section 05. 회원 관리 예제 - 웹 MVC 개발 (0) | 2023.03.04 |
[Spring Intro] Section 04. 스프링 빈과 의존관계 (0) | 2023.02.28 |
[Spring Intro] Section 03. 회원 관리 예제 - 백엔드 개발 (0) | 2023.02.28 |
[Spring Intro] Section 01. 프로젝트 환경설정 (0) | 2023.02.24 |