본문 바로가기
  • soobinhand의 기술 블로그
Computer Science/SpringBoot

[SpringBoot] SpringBoot 웹 개발 기초

by soobinhand 2021. 11. 4.
728x90

SpringBoot 웹 개발 세 가지 방법

  • 정적 컨텐츠 (static contents)
  • MVC와 템플릿 엔진 
  • API

정적 컨텐츠

  • 정적 컨텐츠는 HTML 파일 그대로 화면에 출력하는 방식입니다.
  • resources의 static 폴더에 name.html파일을 넣고, localhost:8080/name.html을 쳐주면 그대로 뜨게 됩니다.

정적 컨텐츠 동작 방식

 

MVC와 템플릿 엔진

  • MVC : Model, View, Controller
  • 흔히 개발할 때, 이 방식을 사용하게 됩니다. 저희는 Thymeleaf라는 템플릿 엔진을 통해서 백엔드와 프론트엔드를 연결한 형태로 코드를 짰습니다.
  • 컨트롤러를 통해, / 뒤에 올 것을 적고 그 메서드를 코드로 짭니다.

MVC와 템플릿 엔진 동작 구조

  • 아래는 코드입니다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model){
     model.addAttribute("name",name);
     return "hello-template";
}
  • 하지만 위의 코드처럼 URL에 localhost:8080/hello-mvc를 치게 된다면 오류가 납니다. 그 이유는 @RequestParam때문입니다. 무언가 매개변수로 들어와야 오류가 나지 않게되는 것입니다. 
  • 그래서 localhost:8080/hello-mvc?name=spring 이라고 쳐줘야 하는 것입니다. 

 

API

  • 요즘은 API로 개발을 많이 하는 시대입니다.
  • @ResponseBody
    • 이 어노테이션은 HTTP에서 header와 body에서 body 부분에 이 data를 직접 넣어주겠다고 선언하는 어노테이션입니다. 
    • template 엔진과의 차이점은 그냥 view라는게 없다는 것입니다.
    • 기존엔 HTML에 data를 줘서 보내는 방식이라면 API는 그대로 그걸 HTTP로 내보내게 됩니다.
    • HttpMessageConverter가 동작합니다.
    • ResponseBody 사용 원리를 아래 그림으로 설명하겠습니다.

 

@ResponseBody 사용 원리

 

  • ResponseBody 가 없으면 template 엔진으로 진행합니다.
  • 그러나 ResponseBody가 있다면 HTTP의 body에 직접 전송합니다.
    • 문자열이 넘어오면 그냥 HTML 파일대로 넘기지만
    • 객체가 넘어오면 기본이 JSON 방식으로 data를 만들어서 HTTP응답에 반환합니다.
  • @ResponseBody 사용
    • HTTP의 body에 문자 내용을 직접 반환합니다.
    • viewResolver 대신에 HttpMessageConverter가 동작합니다.
    • 기본 문자처리 : StringConverter
    • 기본 객체처리 : MappingJackson2Converter
    • byte처리 등등 기타 여러 Converter가 기본으로 등록되어 있습니다.
  • 아래는 코드입니다.
    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
        return "hello " + name; //"hello spring"
    }

    @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;
        }
    }
  • 기본 문자처리와 객체 처리.
참고
클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택됩니다.

 

결론

  • 정적 컨텐츠
    • 그냥 파일을 그대로 내려줍니다.
  • MVC와 템플릿 엔진
    • 템플릿 엔진을 MVC방식으로 쪼개서 view를 템플릿 엔진으로 (HTML을 프로그래밍한 것)으로 렌더링합니다.
    • 렌더링된 HTML을 전달합니다.
  • API
    • 객체를 반환하는 것입니다.
    • HttpMessageConverter를 통해서 JSON 스타일로 바꿔서 반환합니다.
    • view 이런 것 없이 그냥 바로 그대로 HTTP Response에다가 값을 넣어서 반환합니다. (ResponseBody)
728x90

댓글