MVC와 템플릿 엔진

웹을 개발하는 종류에는 크게 3가지 종류가 있다.

  • 정적 컨텐츠 → 하드코딩
  • MVC와 템플릿 엔진 → JSP, PHP, HTML을 동적으로
  • API

정적 컨텐츠

공식 문서에 Static Content 검색

정적 컨텐츠는 모두 resources/static 에 작성된다.

작동 순서

  1. 웹 브라우저에서 서버에 요청을 보낸다.
  2. 내장 톰켓 서버에서 관련 컨트롤러를 찾는다.
  3. 관련 컨트롤러가 없으니 static 폴더에서 관련 정적 컨텐츠를 찾는다.
  4. 컨텐츠를 브라우저로 반환한다.

MVC와 템플릿 엔진

MVC

  • Model → 데이터와 비즈니스 로직 관리
  • View → 화면을 그리는 요소
  • Controller → 사용자의 요청을 처리하고 적절한 모델과 뷰 호출

Controller

 @Controller
 public class HelloController {
     @GetMapping("hello-mvc")
     public String helloMvc(@RequestParam("name") String name, Model model) {
         model.addAttribute("name", name);
         return "hello-template";
     }
}
  • @RequestParam("name") → name이라는 이름을 가진 매개변수를 하나 받아야한다.

    • 그냥 접속하게 된다면

    • http://localhost:8080/hello-mvc 해당 url로 접속하니 해당 에러가 뜸

      2024-08-06T00:03:32.527+09:00  WARN 65156 --- [hello-spring] 
      [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]

View

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

서버없이 그냥 열면 hello! empty가 뜬다

동작 과정

  1. http://localhost:8080/hello-mvc?name=choiho 로 브라우저가 요청을 보낸다
  2. 내장 톰켓 서버에서 관련 컨트롤러를 찾는다.
  3. 컨트롤러에서 값을 받아 hello-template에 반환한다.
  4. viewResolver에서 templates/hello-template.html을 처리해 반환한다.

API

@ResponseBody 문자 반환

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}
  • @ResponseBody를 사용하면 뷰 리졸버를 사용하지 않는다.
  • HTTP의 바디에 문자 내용을 직접 반환한다.

@ResponseBody 객체 반환

@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으로 반환

동작과정

  1. 웹 브라우저에서 요청을 보낸다.
  2. 내장 톰켓 서버에서 해당 컨트롤러를 찾는다.
  3. 컨트롤러를 찾았는데 @ResponseBody가 붙어있다.
  4. 뷰 리졸버를 사용하지 않고 HttpConverter가 동작한다.
  5. 변환된 내용을 웹브라우저에 반환한다.

@ResponseBody

  • HTTP의 Body에 내용 반환
  • viewResolver 대신에 HttpMessageConverter가 동작
  • 기본 문자처리 → StringHttpMessageConverter
  • 기본 객체처리 → MappingJackson2HttpMessageConverter

'공부 > Spring' 카테고리의 다른 글

스프링 의존관계  (0) 2024.08.12
스프링 - 회원 관리 예제  (0) 2024.08.12
View 환경설정  (0) 2024.08.09
1.1 프로젝트 생성  (0) 2024.08.09