[Spring] 스프링 웹 개발 기초

    코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(by 김영한) 강의를 바탕으로 정리한 내용입니다.

     

    1. 정적 컨텐츠

     

    html파일을 그대로 웹브라우저에 전달하는 것이다.

     

    1) 웹브라우저에 localhost:8080/hello-static.html 을 침

    2) 내장 톰켓 서버거 요청을 받아서 컨트롤러에서 hello-static을 먼저 찾음

    3) hello-static과 매핑되는 컨트롤러가 없으면 resources내부의 html을 찾음

    4) html이 존재하면 웹브라우저에 반환함

     

     

    2. MVC와 템플릿 엔진

    MVC : Model + View + Controller

    : 서버에서 프로그래밍을 해서 html을 동적으로 변형 후 웹브라우저에 전달하는 것

     

     

    1) 웹브라우저에 localhost:8080/hello-mvc를 넘김

    2) 내장 톰켓 서버가 helloController의 메소드에 매핑이 되어 있음을 확인 후 메소드 호출

    3) viewResolver가 hello-template.html을 찾아서 thymeleaf 템플릿 엔진에 넘김

    4) thymeleaf가 렌더링 후 변환을 한 Html을 웹브라우저에 반환

     

     

    소스보기를 하면 다음과 같다.

     

     

    controller/HelloController

        @GetMapping("hello-mvc")
        public String helloMvc(@RequestParam(name = "name") String name, Model model) {
            model.addAttribute("name", name);
            return "hello-template"; // templates/hello-template.html으로 가게 됨
        }

     

    templates/hello.template.html

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

     

    실행)

     

    localhost:8080/hello-mvc?name="spring!"

     

    3. API

    @GetMapping("hello-string")
    @ResponseBody //Body에 직접 데이터를 넣어주겠다! html이 아니라 바로 데이터를 던져줌
    public String helloString(@RequestParam("name") String name) {
        return "hello" + name;
    }

     

    실행 )

     

    localhost:8080/hello-string?name="spring!"

     

    결과는 템플릿 엔진을 이용했을 때와 동일하지만 페이지 소스를 보면 html 태그가 하나도 없고 그냥 문자만 그대로 전달되었다!

     

     

    @ResponseBody

    @GetMapping("hello-api")
    @ResponseBody 
    /*ResponseBody가 있으면 http 응답에 데이터를 그냥 반환 
     -> 근데 지금은 객체 상태 -> 객체가 오면 JsonConverter가 json으로 반환 */
    
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello; //객체를 넘김
    }
    
    public class Hello {
        private String name;
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

     

    @ResponseBody를 사용하고 객체를 반환하면, key-value형태의 json을 반환하는 것을 볼 수가 있다.

     

     

    1) 웹브라우저에 localhost:8080/hello-api를 넘김

    2) 톰켓 서버가 hello-api가 왔다는 것을 스프링에 던짐

    3) 스프링은 hello-api가 있음을 확인 -> 하지만 @ResponseBody가 붙어있음 (@ResponseBody가 없으면 viewResolver에 던짐)

    4) 리턴값이 객체이므로 HttpMessageConverter(객체 : JsonConverter // 문자: StringConverter)가 동작함

    5) Json 형태로 Html을 웹브라우저에 반환

     

    댓글