숑숑이의 개발일기
article thumbnail

웹 개발은 크게 아래 3가지로 나뉜다.

정적 컨텐츠

  • 파일을 그대로 웹브라우저에 내려주는 것
  • 스프링부트에서는 기본적으로  /static or /public or /resources or /META-INF/resources의 경로에 위치한다.
  • css, js, ttf 등등등 바뀌지않는 리소스 파일들이 위치하는 곳이다.

아래의 문서에 더 자세한 내용이 있다.

https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

먼저 스프링 컨테이너에서 컨트롤러를 탐색 후 컨트롤러가 없으면, resources 에서 찾아 반환한다.

 

MVC와 템플릿 엔진

MVC : Model, View, Controller

  • 과거의 jsp, php는 view의 분리없이 한 파일에서 현재의 MVC 역할을 모두 수행하여 유지보수에 어려움이 있었다
  • 서버에서 프로그래밍을 통해 동적인 html을 내려준다
// Controller
@GetMapping("hello-mvc")
// intellij parameter 정보 단축키 : ctrl + p
public String helloMvc(@RequestParam(name = "name") String name, Model model) {
    model.addAttribute("name", name);
    return "hello-template";
}
<html xmlns:th="http://www.thymeleaf.org">
    <body>
    <p th:text="'hello ' + ${name}">hello! empty</p>
    </body>
</html>

컨트롤러를 정의해주고, http://localhost:8080/hello-mvc?name=냠의 형태로 주소창에 입력해보면 아래의 사진과 같이 입력한 name 값이 나오는 것을 알 수 있다. 기존 p 태그 내부의 text는 속성으로 치환된다. 서버에서가 아닌 html에서 볼때는 내부 text 값이 보인다.

 

API

  • 주로 json의 포맷으로 변환하여 데이터를 반환한다.
  • 서버끼리의 통신에도 사용한다
@GetMapping("hello-string")
@ResponseBody   // http 통신시 response body에 해당 데이터를 넣어주겠다는 의미
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}

이런 형태에서 http://localhost:8080/hello-string?name=숑숑 를 주소창에 입력 후 소스를 보면 html이 아닌 단순 텍스트인걸 알 수 있다. 

 

객체를 생성후 객체를 return 할 수도 있는데, json의 형태로 리턴한다.

@GetMapping("hello-api")
@ResponseBody
// 객체를 반환하면 json형태로 리턴한다
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

static class Hello {
    private String name;    // getter setter 생성 단축키 : alt + insert

    // 프로퍼티 접근방식 : getter, setter
    public String getName() {
        return name;
    }

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

}

@ResponseBody 어노테이션

  • 뷰 리졸버(viewResolver)를 사용하지 않고 HTTP BODY에 해당 내용을 직접 반환한다.
  • 뷰 리졸버 대신 HttpMessageConverter가 동작
  • 기본적으로 문자는 StringHttpMessageConverter, 객체는 MappingJackson2HttpMessageConverter가 처리한다.
  • 이외 기타 등등 처리 모두 HttpMessageConverter가 동작하여 처리한다.

객체는 Google의 라이브러리도 있는데 spring에서는 Jackson을 차용한다. 아무래도 좀더 범용적이라고 생각한다.

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

 

위 글은 김영한 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 무료강의를 듣고 정리한 내용입니다.

 

profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다