스프링 웹 개발 기초
- 정적 컨텐츠
- MVC와 템플릿 엔진
- API
정적 컨텐츠
- spring boot에서 /static 폴더에서 지원하고있다
<!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 로 이동
동작 원리
1. localhost:8080/hello-static.html 을 요청을 보냄
2. Spring에 내장된 Tomcat에서 Mapping되어있는 것을 확인 (hello-static이 controller에 있는지 확인)
3. 없는 것을 확인 한 후, static 폴더에서 hello-static.html파일을 확인
4. 존재한다면 html 을 return
5. 만약 존재하지 않는 다면 error페이지
MVC와 템플릿 엔진
- MVC : Model, View, Controller
- View : 화면을 그리는데 집중
- Controller: 비즈니스 로직이나 내부적인걸 처리하는데 집중
이러한 이유로 View와 Controller를 쪼갠다.
기존에 만들어왔던 HelloController에 아래 코드를 추가해준다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
그 다음
templates 디렉토리에 들어가서 hello-template.html 파일을 생성해주고 작성해준다.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content = "text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
완료 되면 실행
2023-08-21 14:25:38.792 WARN 47515 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]
이 에러가 떳다. [name이 없는데 어떻게 만들어요? 라는 내용]
동작원리
1. localhost:8080/hello-mvc을 요청
2. helloController가 내장Tomcat을 통해 받음
3. helloController에 우리가 추가한 GetMapping "hello-mvc"로 코드 실행
4. return "hello-template"; 을 통해 hello-template.html을 viewResolver가 templates디렉토리에서 찾음
5. 찾았으면 우리가 추가한 thymeleaf 템플릿 엔진이 html을 변환시켜서 요청한 곳에 다시 반환
P.S 강의에서 helloController에서 선언한 함수에서
@RequestParam("name")에서 cmd + p 를 누르면 required true가 되어있다 어떻다 말씀하셨는데 이해가 잘 되지 않아서 참고한 링크들을 남긴다.
감사합니다
1. [https://hongku.tistory.com/119] -> RequestParam 사용법, 어떤식으로 사용되는지
2. [https://heavenly-appear.tistory.com/302] -> default value, required 등의 지정하는 방법
API
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 void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
위 코드 추가 입력
[꿀팁]
- cmd + n 을 눌러 getter와 setter을 만들어 줄 수 있음 (일일이 타이핑 하지 않아도 됨)
실행시키면 이런 모습이 보여짐
동작원리
1. localhost:8080/hello-api 요청
2. helloController가 내장 Tomcat을 통해 받음
3. @ResponseBody 라는 태그가 붙어있는걸 확인하고 HttpMessageConverter로 요청을 보냄 (ViewResolver로 안보냄!)
4. 이때 요청한것이 객체면 JsonConverter로, 단순 문자열이면 StrongConverter로 변환!
5. 위 예시의 경우 Hello라는 객체이기 때문에 Json으로 변환
MORE
- @ResponseBody를 사용하면 HTTP의 BODY 부분에 내용을 직접 반환하겠다는 의미
- 기본 문자 처리 : StringHttpMessageConverter
- 기본 객체 처리 : MappingJackson2HttpMessageConverter
- 여러가지 처리들이 HttpMessageConverter가 기본 등록 되어있으나 주로 Json으로 사용한다.
- 클라이언트의 HTTP Accept헤더와 서버의 컨트롤러 반환 타입 정보 이 두개를 조합해서 HttpMessageConverter가 선택됨!
'Spring' 카테고리의 다른 글
4장 스프링 빈과 의존관계 (0) | 2023.08.25 |
---|---|
3장 회원관리 예제 (0) | 2023.08.23 |
1장 -3 View 환경설정 + Build 하기 (0) | 2023.08.18 |
1장-2. Spring 라이브러리, Dependencies (0) | 2023.08.18 |
Mac M1 Spring 시작하기 + 스프링 입문 [프로젝트 생성] (0) | 2023.08.17 |