[Spring 입문] 02. 스프링 웹 개발

PADO·2021년 1월 20일
1

Spring 입문

목록 보기
3/8
post-thumbnail

🌱 스프링 웹 개발

정적 컨텐츠

웰컴 페이지 처럼 서버에서 하는 일 없이 파일을 그대로 웹 브라우저에 내려주는 것.

MVC와 템플릿 엔진

템플릿 엔진: html을 서버에서 동적으로 렌더링. ex) JSP, php
→ Model - View - Controller 라고 함.

API

API 방식: json이라는 데이터 구조 포맷으로 클라이언트에게 데이터를 전달, 서버끼리의 데이터 전달

 

정적 컨텐츠

  • 스프링부트 정적 컨텐츠 기능 (파일명.html/파일명.html)

스프링 부트는 기본 설정으로 정적 파일을 resources/static폴더에서 찾아 그대로 화면에 렌더링

  • 웹 브라우저에서 localhost:8080/hello-static.html 을 치면 내장 톰켓 서버가 요청을 받고 스프링 컨테이너로 넘김
  • 컨트롤러가 우선 순위를 가지므로 "hello-static"관련 컨트롤러를 찾음.
  • 관련 매핑된 컨트롤러가 없으므로 resources에서 hello-static.html을 찾아 반환.

 

MVC와 템플릿 엔진

뷰를 찾아 템플릿 엔진을 통해 화면을 렌더링해 html을 웹 브라우저에 넘겨주는 방식

  • MVC: Model, View, Controller

과거에는 Controller와 View가 분리되어 있지 않고, View에서 모든 걸 다 했음.

관심사 분리

→ View는 화면과 관련된 일만

→ Controller는 비즈니스 로직, 뒷단 내부적인 걸 처리

→ Model은 View(화면)에 필요한 것들을 담아 넘겨줌

Controller

@Controller
  public class HelloController {
      @GetMapping("hello-mvc")
      public String helloMvc(@RequestParam("name") String name, Model model) {
          model.addAttribute("name", name);
          return "hello-template";
      }
}

**@RequestParam**: 단일 파라미터를 전달 받을 때 사용하는 어노테이션

→ @RequestParam("가져올 데이터의 이름") [데이터 타입][가져온 데이터를 담을 변수]

  • helloMvc 메소드의 인자값으로 @RequestParam() 어노테이션을 넣어 값을 받아온다.
  • Model 객체를 이용해서 뷰로 값을 넘겨준다.

cf) url에 값을 안 넘겨주면 400에러가 발생한다 → defaultValue 지정 가능

@Controller
  public class HelloController {
      @GetMapping("hello-mvc")
      public String helloMvc(@RequestParam(value = "name", required = false, defaultValue = "Spring") String name, Model model) {
          model.addAttribute("name", name);
          return "hello-template";
      }
}

View

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

동작 방식

  • 웹 브라우저에서 실행: http://localhost:8080/hello-mvc?name=spring
  • 내장 톰켓 서버가 맵핑된 helloMvc 컨트롤러를 찾아 던짐.
  • url로 넘겨준 name값이 model의 name attribute로 할당 되어 View에게 전달.
  • 화면과 관련된 일을 처리하는 viewResolver가 resource에서 hello-template.html을 찾음.
  • ${name} 부분에서 모델에서 name 값을 꺼내 치환.
  • 템플릿 엔진은 변환된 html을 웹 브라우저에 넘겨줌.

 

API

웹 브라우저에 html 대신 data를 전달하는 방식

**ResponseBody**: 메소드에서 리턴되는 값이 View를 html로 렌더링 되지 않고 HTTP Response의 Body부분에 직접 메세지를 넣어줌

  • @ResponseBody 를 사용하면 뷰 리졸버(viewResolver)를 사용하지 않음
  • 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)
  • 본문에 담기는 데이터 형식: 주로 JSON(JavaScript Object Notation)
    Json: { "key": "value"}로 이루어진 데이터 구조
  • @ResponseBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨
@GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }

    public static class Hello {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

@ResponseBody 사용 원리

  • 웹 브라우저에서 localhost:8080/hello-api 실행
  • 톰켓 내장 서버에서 스프링에 던짐
  • 스프링은 Controller에 hello-api가 있으니 컨트롤러로 보내줌
  • 컨트롤러에 @ResponseBody 어노테이션이 붙어있음
    (어노테이션이 안 붙어있다면 맞는 템플릿 찾아서 돌려주도록 viewResolver로 던짐)
  • @ResponseBody 어노테이션이 붙어있다면 문자열을 http 응답(response)에 넣어 그대로 반환
  • 반환할 것이 문자가 아니라 객체 → JSON으로 data를 만들어 http 응답에 넣어 반환
  • HttpMessageConverter가 동작 (viewResolver 대신)
    • 단순 문자열이라면 StringConverter가 동작
    • 객체라면 JsonConverter가 동작 → 객체를 Json으로 변환
  • 요청한 웹 브라우저에 응답

정리

  • @ResponseBody 를 사용
    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신에 HttpMessageConverter 가 동작
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter
      객체를 JSON으로 변환해주는 대표적인 라이브러리: Jackson, Gson
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

0개의 댓글