ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] MVC 패턴 기초(추후 심화로 수정)
    Spring/Spring Boot 2024. 4. 4. 02:38

    MVC 패턴이란?

    MVC (Model - View - Controller) 패턴은 소프트웨어 설계와 아키텍처를 위한 디자인 패턴중 하나이다.

    주로 사용자 인터페이스(UI) 를 가진 응용프로그램에 사용되며   Model, View, Controller로 구성요소를 작업을 처리하는 개발 방법론이다.

     

     

     

    MVC 패턴 동작 원리

    1. User: 사용자가 웹 사이트에 접속한다.
    2. Manipulates: Controller는 사용자가 요청한 웹 페이지를 보여주기 위해 Model을 호출한다.
    3. Updates: Model은 비즈니스 로직을 통해 DB 및 파일과 같은 데이터를 제어한 후 결과를 반환한다. 이후 Controller는 Model에게 반환받은 결과를 View에 반영한다.
    4. Sees: 데이터를 받아온 View가 사용자에게 웹 페이지를 출력하여 보여준다.

     

    Model

    model은 Controller에게 받은 데이터를 조작(가공) 하는 역할 을 수행한다. 즉, 비지니스로직을 구현하여 데이터를 처리한한다.

    model은  View와 Controller와 직접적으로 통신하지 않고 독립적으로 수행되어야 한다.

     

     

    View

    view는 사용자에게 보여지는 UI 요소를 나타낸다.

     

     

    Controller

    model과 view 사이에서 데이터 흐름을 제어한다. View로 부터 데이터 요청을 받고 요청을 받은 controller가 model을 호출하여 데이터를 처리 및 가공하여 model로 부터 받은 데이터를 다시 view로 넘겨준다.

     

     

     

     

    정적 컨텐츠 불러오기

     

    View단 에서 localhost:8080/hello-static.html 요청을 보냈을 때 spring boot에 있는 내장 톰캣은 controller에서 hello-mvc 요청을 받는 cotroller를 찾는다. 없을 경우 resources/static 에서 hello-static.html 파일을 찾고 없으면 404 에러를 보낸다.

     

     

     

    템플릿 엔진 불러오기

     

    작동원리

    view에서 localhost:8080/hello-mvc 요청을 하면 내장 톰캣은 해당 요청이 controller에 있는지 확인 후 있다면 controller 가 viewResolever를 호출하고 viewResolver는 전달 받은 model을 이용하여 template 부분의 코드를 HTML로 변환 후 브라우저에 뿌린다.

     

     

    예제 코드

     

    view

    <html xmlns:th="http://www.thymeleaf.org">
    <body>
    <!--  ${name} : Contoller에서 셋팅한 model로 부터 전달받을 데이터-->
      <p th:text="'hello ' + ${name}">hello! empty</p>
    </body>
    </html>

     

    Controller & Model

    @Controller
    public class HelloController {
    
        @GetMapping("hello-mvc")
        // @RequestParam 은 default가  required = true 이기 때문에 query string을 붙여서 요청
        // model에서 name을 처리 후 view단으로 보냄
        public String helloMvc(@RequestParam(value = "name") String name, Model model) {
            model.addAttribute("name", name);
            return "hello-template";
        }
    }

     

    결과

    th:text 속성의 ${name}이 model에 넣은 name key의 value와 치환된걸 볼 수 있다.

     

     

    @ResponseBody Annotation 사용

    작동원리

    view에서 localhost:8080/helloApi에 요청을 보내면 내장 톰캣은 해당 요청이 controller에 있는지 확인 한다.

    이 때 Controller에 @ResponseBody가 있다면 HttpMesageConverter를 호출한다.

    return type이 primitive type(or String)이라면 String Converter가 String으로 , Object라면 JsonConverter가 Json으로 convert한후 view단에  뿌린다.

     

    @ResponseBody의 역할

    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신 HttpMessageConverter가 동작
    • 기본 문자 처리 : StringHttpMessageConverter
    • 기본 객체 처리 : MappingJackson2HttpMessageConverter

     

    예제 코드

     

    Controller & Model

     @GetMapping("hello-string")
        @ResponseBody
        public String helloString(@RequestParam("name") String name) {
            // @ResponseBody가 있고 return type이 String 이므로
            // HttpMessageConverter에 의해 page가 아닌 String이 return 된다.
            return "hello " + name;
        }
    
        @GetMapping("hello-api")
        @ResponseBody
        public Hello helloApi(@RequestParam("name") String name) {
            Hello hello = new Hello();
            hello.setName(name);
            // @ResponseBody가 있고 return type이 Object 이므로
            // HttpMessageConverter에 의해 page가 아닌 JSON Object가 return 된다.
            return hello;
        }
    
        static class Hello {
            private String name;
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }

     

    결과

    Hello Object의 속성을 key로 가진 json object가 return 되는 것을 확인 할 수 있다.

     

     

    참고 문헌

    'Spring > Spring Boot' 카테고리의 다른 글

    [Build] Build Tool - Maven vs Gradle  (0) 2024.04.05
    [Spring Boot] 간편 프로젝트 생성  (0) 2024.04.04
Designed by Tistory.