Skip to content

Latest commit

 

History

History
120 lines (109 loc) · 4.58 KB

2. 스프링 웹 개발 기초.md

File metadata and controls

120 lines (109 loc) · 4.58 KB

2. 스프링 웹 개발 기초

2-1. 정적 컨텐츠

  • 파일을 그대로 웹 브라우저에 전달하는 방식
  • 스프링 부트 정적 컨텐츠 기능 (관련 설명)
  • 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>
    • 실행: http://localhost:8080/hello-static.html
    • 동작 원리
      • 웹 브라우저에서 localhost:8080/hello-static.html 요청
      • 내장 톰켓 서버가 해당 요청을 받아서 스프링 컨테이너에 넘김
      • 스프링은 먼저 컨트롤러에서 hello-static이 있는지 찾아봄 (컨트롤러가 우선순위를 가짐)
      • 없다면 내부의 resources 안에 있는 static/hello-static.html을 찾아서 있다면 그대로 반환


2-2. MVC와 템플릿 엔진

  • 서버에서 변형을 해서 html을 동적으로 바꿔서 전달하는 방식
  • MVC: Model, View, Controller
  • Controller (HelloController에 추가)
    @Controller
    public class HelloController {
      
        @GetMapping("hello-mvc")
        public String helloMvc(@RequestParam("name") 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>
    • 실행: http://localhost:8080/hello-mvc?name=spring!!!
    • 동작 원리
      • 웹 브라우저에서 localhost:8080/hello-mvc 요청
      • 내장 톰켓 서버가 해당 요청을 받아서 스프링 컨테이너에 넘김
      • 스프링은 helloController에 매핑되어있는 해당 메소드 호출, hello-template을 return
      • 스프링의 viewResolver가 return과 똑같은 이름을 찾아서 templates/hello-template.html 파일을 Thymeleaf 템플릿 엔진에게 처리해달라고 넘김
      • 템플릿 엔진이 렌더링을 해서 변환한 html 파일을 웹 브라우저에 반환


2-3. API

  • @ResponseBody 문자 반환
    @Controller
    public class HelloController {
    
        @GetMapping("hello-string")
        @ResponseBody
        public String helloString(@RequestParam("name") String name) {
            return "hello " + name;
        }
    }
  • @ResponseBody 객체 반환
    @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;
            }
        }
    }
  • @ResponseBody 동작 원리
    • 웹 브라우저에서 localhost:8080/hello-api 요청
    • 내장 톰켓 서버가 해당 요청을 받아서 스프링 컨테이너에 넘김
    • 스프링은 helloController에 매핑되어있는 해당 메소드 호출
    • @ResponseBody가 붙어 있으므로, HTTP의 BODY에 문자 내용을 직접 반환
      • viewResolver 대신에 HttpMessageConverter 동작
      • 기본 문자처리: StringHttpMessageConverter
      • 기본 객체처리: MappingJackson2HttpMessageConverter
      • 객체가 오면, 디폴트가 JSON 방식으로 데이터를 만들어서 반환하도록 되어있음
    • JSON 값 {"name":"spring"} 웹 브라우저에 반환
  • 참고: byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
    • 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택되는 것 ResponseBody