package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    // 정적 컨텐츠
    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data","hello!!");
        String tmp = "hello";
        return "hello";
    }
    // MVC와 템플릿 엔진
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name")String name,Model model){
        model.addAttribute("name",name);
        return "hello-template";
    }

    // api 방식 문자열 반환
    @GetMapping("hello-string")
    @ResponseBody // http 응답 바디부에 해당 내용을 직접 넣겠다는 어노테이션
    public String helloString(@RequestParam("name") String name){
        return "hello "+name; //"hello spring"
    }
    // api JSON 반환
    @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;
        }
    }
}

정적 컨텐츠

  1. 웹(클라이언트 요청) url 입력
  2. 톰캣(서버) 
  3. 스프링 컨테이너에서 매핑되어 있는 컨트롤러가 있는지 탐색
  4. 관련된 컨트롤러가 없다면 resources 디렉토리에서 관련된 항목을 찾아 전달

MVC와 템플릿 엔진

<관심사의 분리 + 타임리프 엔진을 통한 html 변환>

  1. 웹(클라이언트 요청) url 입력
  2. 톰캣(서버) 
  3. 스프링 컨테이너에서 매핑되어 있는 컨트롤러 발견
  4. 해당 컨트롤러에서 model에 필요한 데이터를 넣고 return 해야 하는 view의 이름과 model을 viewResolver에게 전달
  5. Thymeleaf 템플릿 엔진이 처리하여 변환한 html을 웹 브라우저에게 반환 

API

@ResponseBody 어노테이션을 활용해 http 응답 바디부에 해당 내용을 직접 넣어 전달

String을 전달해 주어도 좋으나 객체(Class)를 반환하여 JSON 형식으로 전달하는 것이 기본

  1. 웹(클라이언트 요청) url 입력
  2. 톰캣(서버) 
  3. 스프링 컨테이너에서 @ResponseBody 의 매핑되어 있는 컨트롤러 발견 
  4. HttpMessageConverter가 객체(JSON) 혹은 문자열을 웹 브라우저에게 그래도 반환
    1. 문자처리 StringHttpMesaageConverter
    2. 객체처리: MappingJackson2HttpMessageConverter

+ 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 반환 데이터의 타입을 결정

 

 

+ Recent posts