SpringBoot/inflearn - 스프링 입문

스프링 웹 개발 기초 - 정적 컨텐츠, MVC와 템플릿 엔진, API

퓨처디벨로퍼 2021. 6. 24. 18:56

1. 정적 컨텐츠

: 파일을 그냥 웹브라우저에 내려주는 것.

2. MVC와 템플릿 엔진

   

   - 템플릿 엔진: 과거에는 jsp와 php가 사용.

                      html을 서버에서 프로그래밍해서 html을 동적으로 바꿔서 내리는 것.

   - 그걸 위해 controller,model,view라고해서 MVC 사용. 

 

요청이 들어오면 처음 controller를 찾아본다. 

** viewResolver: 화면과 관련한 해결자, view를 찾아주고 템플릿엔진 연결

 

  - 과거: model 1방식, controller와 view가 구분되어있지 않고 view에서 모든걸 다함. jsp가지고 그렇게 개발을 많이 했             다. 

  - 현재: MVC 스타일 이용.

            View: 화면을 그리기.

            Controller나 Model:  비즈니스 로직과 관련있거나 내부적인걸 처리. 

           => View는 화면과 관련한 일. 비즈니스 로직과 서버 뒷단의 관련된것은 controller나 로직이 처리한 후 Model                  에다가 관련된 화면에 필요한 것들을 담아서 넘겨주는 패턴.

 

3. API

 @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음.

1) @ResponseBody 문자 반환

 - 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)

 

2) @ResponseBody 객체 반환

 - @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨(기본)

    - 요즘은 json이라는 data 포멧으로 클라이언트한테 data를 전달. view,json,react 쓸때 api로 data만 내려주면 화면은        클라이언트가 알아서 그리고 정리하는. 

 

@ResponseBody 를 사용

 - HTTP의 BODY에 문자 내용을 직접 반환

  - viewResolver 대신에 HttpMessageConverter 가 동작

  - 기본 문자처리: StringHttpMessageConverter

  - 기본 객체처리: MappingJackson2HttpMessageConverter

  - byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음 

 

참고: 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택된다. 

 

@Controller //spring은 해줘야함
public class HelloController {

    @GetMapping("hello")  //웹 어플리케이션에서 /hello라고 들어오면 처리해줌.
    public String hello(Model model){
        model.addAttribute("data","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에서 헤더부와 바디부가 있음. 바디부에 이 data를 직접 넣어주겠다.
    public String helloString(@RequestParam("name") String name){
        return "hello" + name; //name에 spring을 넣으면 hello spring , view가 없고 그대로 내려감.
    }

    @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;
        }
    }
}