해당 게시물은 인프런에 있는 김영한님의 강의 "스프링 입문 - 코드로 배우는 스프링부트, 웹, MVC, DB 접근 기술" 강의를 참고하여 작성하였습니다.
링크 :
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
정적 컨텐츠
스프링 부트는 정적 컨텐츠 기능을 자동으로 제공한다.
7.1.5 Static Content
"기본적으로 Spring Boot는 클래스 경로의 /static(또는 /public, /resources 또는 /META-INF/resources)이라는 디렉터리나 ServletContext의 루트에서 정적 콘텐츠를 제공합니다. 이는 Spring MVC의 ResourceHttpRequestHandler를 사용하므로 사용자는 자체 WebMvcConfigurer를 추가하고 addResourceHandlers 메서드를 재정의하여 해당 동작을 수정할 수 있습니다."
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>
static 폴더에 원하는 파일을 넣으면 그대로 반환이 되는 대신 어떠한 프로그래밍은 할 수가 없다. 이러한 것을 정적 콘텐츠를 제공하는 기능이라고 한다.
웹브라우저에서 localhost:8080/hello-static.html을 입력했다면
1. 내장 톰캣서버 스프링에게 hello-static.html 요청을 넘긴다.
2. 스프링은 컨트롤러 쪽에 hello-static 이라는게 있는지 확인해본다.
3. 맵핑된 컨트롤러가 없는 것을 확인하고 내부에있는 정적 파일 hello-static.html을 찾아서 반환한다.
MVC와 템플릿 엔진
Controller
@Controller
public class HelloController {
/*
* 웹에서 파라미터 받기
* @RequestParam
*/
@GetMapping("hello-mvc") // localhost:8080/hello-mvc
public String helloMvc(@RequestParam("name") String name, Model model){
/*
* model에 담으면 view에서 렌더링할 때 사용한다.
* 파라미터로 넘어온 name을 넘긴다.
*/
model.addAttribute("name",name);
return "hello-template";
}
}
@RequestParam 어노테이션을 이용해 웹에서 파라미터를 받을 것이다. 컨트롤러에서 hello-mvc의 요청이 오면 name값을 받아서 model에 데이터를 담아서 hello-template로 치환해 줄 것이다.
resources/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}"></p>
</body>
</html>
서버에서 Bad Request, status를 400으로 반환하였다. 왜냐하면 name 파라미터를 받지 못했기 때문이다.
위 그림과 같이 name 값을 함께 요청하면 thymeleaf엔진을 통해 반환 name값이 적용된 hello-template.html 파일를 그대로 치환해준다. 현재 글쓰기를 진행하는 도중에도 ?type=post&retrunURL와 같이 path가 있는데, 아직 ?name=tisory!!!에 대한 원리는 잘 모른다. 차근차근 알아갈 예정
API 방식
Controller
@GetMapping("hello-string")
@ResponseBody
/*
* body의 내용을 return 값으로 직접 넣어준다.
* */
public String helloString(@RequestParam("name") String name){
return "hello " + name;
@ResoponseBody를 이용하여 retrun 값을 바로 웹상으로 뿌려준다.
html 소스를 보면
정말 hello tistory를 그대로 뿌려준다. 말그대로 return 값을 그대로 뿌려준다. 물론 <html><body>hello</body></html> 이런식으로 코딩해도 문제는 없다고 한다. (ㅋㅋ)
API방식의 진가는 이제부터이다.
Controller
@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;
}
}
항상 문자를 retrun 해왔는데, 이제 객체자체를 넘길것이다. 객체에 파라미터를 받아서 넣어준다음 객체를 리턴했다.
(static class는 class안에 class를 사용가능하다. hello-controller.hello, java에서 정식으로 지원하는 문법이다.)
객체가 key와 value로 이루어진 Json방식으로 반환되었다.
과거에는 xml방식으로 많이 사용하였는데 xml을 방식은 html태그와 같이 닫는태그가 필요했었고 많이 무거워서 최근에는 JSON방식으로 코딩을 많이한다고 한다. xml을 방식을 사용하고 싶으면 따로 찾아서 하면 될 듯!
그리고 자바는 getter and setter라고 JavaBean규약이 있는데 외부에서 객체를 마음대로 조작하지 못하게 private으로 되어있는데 메소드를 통해 getter and setter 방식으로 접근한다. 용어로는 프로퍼티 접근 방식이라고도 한다.
1. 웹브라우저에서 localhost8080/hello-api를 요청한다.
2. 그러면 웹 서버 톰캣에서 hello-api 요청을 받았다고 스프링에 던진다.
3. ResponseBody 어노테이션이 붙어있는것을 확인하고 그대로 데이터를 넘긴다.
4. 문자가 아니고 객체를 받았다?
5. 객체가 왔기 때문에 json방식으로 http 응답에 반환한다.(기본 정책이다.)
6. ResponseBody 사용으로 인해 HttpMessageConverter가 동작을 한다.(기존에는 뷰리졸버가 반응)
기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
7. hello 객체반환이 요청 되었기 떄문에 객체처리가 된 후 Json으로 반환이 되었다.
'Framework > Spring' 카테고리의 다른 글
Spring Security 살펴보기 (0) | 2024.02.22 |
---|---|
스프링 핵심 원리 - 스프링 컨테이너 생성, 빈 조회 (0) | 2024.01.22 |
스프링 핵심 원리 - 예제 만들기 (0) | 2024.01.14 |
객체지향 설계와, 스프링 (1) | 2024.01.12 |
스프링 입문 - 프로젝트 환경설정 (0) | 2023.12.12 |