[Spring Boot] 3. 정적 컨텐츠, MVC와 템플릿 엔진, API

Noh_level0·2024년 1월 22일
0

Spring Boot

목록 보기
3/5

1. 정적 컨텐츠

파일을 그대로 웹 브라우저(클라이언트)에 전달하는 방식.
기본적으로 Spring Boot에서는 정적 컨텐츠를 /static or /public or /resources or /META-INF/resources 폴더에서 찾아 제공한다.


예제

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>static content</title>
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>

static 폴더에 이와 같이 hello-static.html을 만든다.

  • 결과

    http://localhost:8080/hello-static.html에 접속하게 되면 이와 같은 정적 컨텐츠가 반환되는 것을 볼 수 있다. 또한 이러한 정적 컨텐츠에서는 어떠한 프로그래밍은 할 수 없다.
  • 정적 컨텐츠가 돌아가는 방식
  1. 웹 브라우저에서 http://localhost:8080/hello-static.html을 치면 내장 톰캣 서버가 이 요청을 받는다.
  2. 내장 톰캣 서버는 이 요청을 스프링에 넘긴다.
  3. 스프링은 hello-static과 관련된 컨트롤러가 있는지 찾아본다.
  4. 만약 맵핑된 컨트롤러가 없다면 resources: static 내부에 있는 hello-static.html을 찾는다.
  5. 해당 hello-static.html이 있으므로 그것을 웹 브라우저에 반환해준다.

2. MVC와 템플릿 엔진

서버에서 html을 변형하여 웹 브라우저(클라이언트)에 전달하는 방식.

MVC: Model, View, Controller

Model: Model에 화면에 필요한 것들을 담아서 화면쪽에 넘겨준다.
View: 화면을 그리는 데 모든 영향을 집중한다.
Controller: 비즈니스 로직과 서버 뒷단에 관련된 일을 처리한다.

과거에는 View, Controller가 따로 분리되어 있지 않았다고 한다.(View에서 다 처리. 이를 소위 Model1 방식이라고 하며, jsp로 많이 했음.)
현재에는 MVC 방식으로 많이 진행된다.


예제

@Controller
public class HelloController {
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model){
        model.addAttribute("name", name);
        return "hello-template";
    }

HelloController.java에 다음과 같이 helloMvc() 메서드를 만든다.
@RequestParam: 외부에서 파라미터를 받을 때 사용.
@RequestParam의 required는 true가 디폴트이다. 따라서 무조건 파라미터를 넣어주어야 한다.(현 예제에서는 url을 통해 파라미터를 전달한다.)

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

templates 폴더에는 위와 같이 hello-template.html을 작성한다.

  • thymeleaf의 장점
    thymeleaf의 장점은 html을 그대로 서버없이 열어봐도 껍데기를 볼 수 있다는 것이다.
    즉, 절대경로를 그대로 웹 브라우저에 입력하면 hello! empty가 뜨는 것을 볼 수 있다. 그런데 이 html이 템플릿 엔진으로 동작(서버를 통해 동작)하면 hello! empty가 'hello ' + ${name}로 치환된다.
  • 결과1: 절대경로로 접속

  • 결과2: url로 접속(파라미터로 Level0 전송)

  • MVC와 템플릿 엔진의 작동 방식
  1. 웹 브라우저에서 http://localhost:8080/hello-mvc을 치면 내장 톰캣 서버가 이 요청을 받는다.
  2. 내장 톰캣 서버는 이 요청을 스프링에 넘긴다.
  3. 스프링은 HelloController에 hello-mvc라는 메서드가 있는 것을 보고 해당 메서드를 호출해준다.
  4. 이 메서드에서 return은 hello-template, model에는 (name:Level0)를 넣어 스프링에 넘겨준다.
  5. 스프링에서 viewResolver(화면 관련 해결자)는 view를 찾아 템플릿 엔진을 연결시켜준다. 따라서 viewResolver가 templates/hello-template.html을 찾아 Thymeleaf 템플릿 엔진에게 처리를 해달라고 넘겨준다.
  6. Thymeleaf 템플릿 엔진이 렌더링을 하여 변환한 html을 웹 브라우저에 반환한다.(정적과 반대)

3. API

JSON 포맷으로 웹 브라우저(클라이언트)에 데이터를 전달하는 방식.(통상적으로 요즘의 API 방식이라 함은 이를 의미한다.)


예제

@Controller
public class HelloController {
	@GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
          return "hello "+ name;
      }
}

@ResponseBody: http의 응답 body에 "hello "+ name 데이터를 직접 넣어주겠다는 의미이다.
ex) return "hello "+ name에서 name이 Level0라면 "hello Level0"라는 문자가 요청한 클라이언트에 그대로 내려간다.
템플릿 엔진과의 차이는 view가 없이 문자가 그대로 내려간다는 것이다.

  • 결과, 페이지 소스보기

    문자열이 그대로 전송된 것을 볼 수 있다.
@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;
        }
    }
}
  • 결과, 페이지 소스 보기

    JSON 방식으로 전송된 것을 볼 수 있다.
  • API 작동방식
  1. 웹 브라우저에서 localhost:8080/hello-api?name=Level0를 입력하여 내장 톰캣 서버에 요청을 넘긴다.
  2. 톰캣 내장 서버에서는 이 요청을 스프링에 넘긴다.
  3. 스프링은 @ResponseBody 애노테이션이 붙어있으므로 HttpMessageConverter가 동작하며, 단순 문자라면 StringConverter가 객체라면 JsonConverter가 기본으로 동작한다.
  4. 데이터의 스타일이 바뀌어 http 응답으로 반환된다.(단순 문자라면 http 응답에 그대로 이 데이터를 넘기는 것으로 동작, 객체라면 JSON 방식으로 데이터 스타일을 바꾸어 동작)

@ResponseBody란?
http의 body에 문자 내용을 직접 반환하겠다는 의미이다.
viewResolver 대신에 HttpMessageConverter가 동작한다.
기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다.
@ResponseBody를 하고 객체를 반환하는 것은 JSON으로 반환하는 것이 기본으로 세팅되어 있다.




본 포스팅은 inflearn 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의에 기반하여 작성되었습니다.
강의 링크

2개의 댓글

comment-user-thumbnail
2024년 1월 22일

좋은 정보 감사합니다 ^^

1개의 답글