본문으로 바로가기

목차

    0. 환경

     


    1. 정적 컨텐츠

    1.1. 예시

    • resources/static/hello-static.html 파일을 생성해 줍니다.
    • 아래의 소스를 입력해줍니다.
    • Spring Boot 실행 후 웹 브라우저를 이용해 접속합니다. 
      • http://localhost:8080/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>

    접속화면

    1.2. 동작 방식

    [웹 브라우저] --- [ {내장 톰캣 서버} --- {스프링 컨테이너} ]

    1. 웹 브라우저로부터 http://localhost:8080/hello-static.html 요청(request)을 받습니다.
    2. 내장 톰캣 서버에서 요청 관련 컨트롤러가 있는지 찾아봅니다.
    3. 없는 상황이므로 정적 경로를 찾아 정적 컨텐츠가 있는 것을 확인합니다.
    4. 웹 브라우저에 해당 정적 컨텐츠(resource/static/hello-static.html)를 응답(response) 합니다.

     


    2. MVC와 템플릿 엔진

    • MVC(Model, View, Controller)
      • Model: DATA, 정보들의 가공을 책임지는 부분입니다.(정보, 데이터, 상수, 데이터베이스, 변수 등) = 자바 빈즈(getter, setter)
      • View: 데이터 및 객체의 입력, 그리고 보여주는 출력을 담당합니다. = jsp, html 등
      • Controller: 사용자가 데이터를 클릭하고, 수정하는 것에 대한 이벤트들을 처리합니다. = @Controller, @RestController 등
    • 템플릿 엔진: 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어를 말합니다.
      • 템플릿 엔진은 view code와 data logic code를 분리하는 기능을 합니다.
      • Freemarker, Mustache, Thymeleaf 등의 종류가 있습니다.
    • 요청을 컨트롤러로 받아 템플릿 엔진(Thymeleaf)에 넘겨서 렌더링 작업 후 html 형태로 브라우저에 전달합니다.

    2.1. 예시

    [Controller]

    • 컨트롤러(HelloController.java)에 아래의 소스를 입력해줍니다.
    @Controller
    public class HelloController {
    
        //required = false로 하는 경우 파라미터가 필수가 아니게 됨(기본 값은 true)
        @GetMapping("hello-mvc")
            public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model) {
            model.addAttribute("name", name);
            return "hello-template";
        }
    }

     

    [View]

    • resources/template/hello-template.html 파일을 생성해줍니다.
    <html xmlns:th="http://www.thymeleaf.org">
    	<body>
    		<p th:text="'hello ' + ${name}">hello! empty</p>
    	</body>
    </html>
    • Spring Boot 실행 후 웹 브라우저를 이용해 접속합니다. 
      • localhost:8080/hello-mvc?name=veneas

    템플릿 엔진 결과

     

    2.2. 동작 방식

    [웹 브라우저] --- [ {내장 톰캣 서버} --- {스프링 컨테이너Controller, viewResolver ) } ]

    1. 웹 브라우저로부터 localhost:8080/hello-mvc?name=veneas 요청(request)을 받습니다.
    2. 내장 톰캣 서버에서 요청 관련 컨트롤러가 있는지 찾아봅니다.
      •     @GetMapping("hello-mvc")
            public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model) {
                model.addAttribute("name", name);
                return "hello-template";
            }
    3. 컨트롤러(HelloController)에 존재하므로 해당 메서드를 호출합니다.
      • public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model)
    4. return 값과 모델 데이터를 viewResolver에게 넘깁니다. 
      • model.addAttribute("name"name); return "hello-template";
      • 뷰를 찾아주고 템플릿 엔진을 연결시켜주는 역할
      • 사용자가 요청한 것에 대한 응답 view를 렌더링 하는 역할(매핑)
    5. 템플릿 엔진이 렌더링 해서 변환을 한 것을 웹 브라우저에 응답(response) 합니다.
      • resources/template/hello-template.html

     


    3. API

    • 뷰를 찾아 템플릿 엔진을 이용해 렌더링을 하지 않고 데이터를 바로 넘겨주는 형태입니다.
    • @ResponseBody 어노테이션을 사용합니다.
    • @ResponseBody 사용 시 viewResolver를 사용하지 않고 http body에 내용을 직접 반환합니다.
    • 객체 형태로 반환할 경우 JSON형태로 변환돼서 전달됩니다.

    3.1. 예시 1(문자 반환)

    [Controller]

     

    • 컨트롤러(HelloController.java)에 아래의 소스를 입력해줍니다.
    @Controller
    public class HelloController {
    
        @GetMapping("hello-string")
        @ResponseBody
        public String helloString(@RequestParam("name") String name) {
            return "hello " + name;
        }
    }
    • Spring Boot 실행 후 웹 브라우저를 이용해 접속합니다. 
      • http://localhost:8080/hello-string?name=veneas
    • html 형태가 아닌 문자열 형태로 응답이 온 것을 확인할 수 있습니다.

    api 예시1

    3.2. 예시 2(객체 반환)

    [Controller]

    • 컨트롤러(HelloController.java)에 아래의 소스를 입력해줍니다.
    • 중첩 클래스를 사용해 자바 빈즈(getter, setter) 형태의 클래스를 생성해줍니다. (응답 시 객체로 넘기기 위해 작성함)
    @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;
            }
        }
    }
      • Spring Boot 실행 후 웹 브라우저를 이용해 접속합니다. 
        • http://localhost:8080/hello-api?name=veneas
      • 객체가 json 형태로 변환되어 응답(response) 한 것을 확인할 수 있습니다.
        • response header { Content-Type: application/json }

    api 예시 2
    헤더

    3.3. 동작 방식

    [웹 브라우저] --- [ {내장 톰캣 서버} --- {스프링 컨테이너(Controller, HttpMessageConverter ) } ]

    1. 웹 브라우저로부터 요청(request)을 받습니다.
    2. 내장 톰캣 서버에서 요청 관련 컨트롤러가 있는지 찾아봅니다.
      1.     @GetMapping("hello-string")
            @ResponseBody
            public String helloString(@RequestParam("name") String name) {
                return "hello " + name;
            }
        
            @GetMapping("hello-api")
            @ResponseBody
            public Hello helloApi(@RequestParam("name") String name) {
                Hello hello = new Hello();
                hello.setName(name);
                return hello;
            }
    3. 컨트롤러(HelloController)에 존재하므로 해당 메서드를 호출합니다.
      • public String helloString(@RequestParam("name") String name)
      • public Hello helloApi(@RequestParam("name") String name)
    4. @ResponseBody 사용 시 viewResolver를 사용하지 않는 대신에 HttpMessageConverter를 사용합니다.
      • 문자는 StringConverter 동작합니다. 
      • 객체는 JsonConverter 동작(객체를 Json형태로 변환)합니다. (스프링 기본 라이브러리 Jackson) 
    5. 웹 브라우저에 변환된 값으로 응답(response)합니다.