업데이트:

Spring 입문

정적 컨텐츠

정적 컨텐츠(static content) 에서는 이름 그대로 정적인, 즉 이미 적재된 콘텐츠를 그대로 불러와 보여주게 된다.

Spring Boot에서는 정적 컨텐츠 기능을 지원하는데, 공식 문서에서 확인해 볼 수 있다.

직접 정적 컨텐츠를 만들어 보자.

resources/static/hello-static.html

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
  <head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    정적 컨텐츠 입니다.
  </body>
</html>

이후 서버를 다시 실행 후 localhost:8080/hello-static.html 에 접근해 보면 아래와 같이 잘 작동함을 확인할 수 있다.

static

웹 브라우저에서 localhost:8080/hello-static.html을 통해 톰캣 내장 서버에 요청을 보내게 되면, 우선적으로 스프링 컨테이너에서 hello-static 과 관련된 컨트롤러의 존재 여부를 판단하고, 컨트롤러가 없기에 빠져 나와 resources/static/hello-static.html 을 브라우저에 보내주게 된다.

MVC와 템플릿 엔진

앞서 살펴보았던 Thymeleaf 예제의 경우에 해당하는 부분이다.

MVCModel, View, Controller 의 앞글자를 따서 만들어진 약자인데, 데이터가 정의되는 Model, 화면을 구성하는 View, 사용자와의 상호작용과 모델/뷰의 업데이트 등의 로직을 담당하는 뒷단인 Controller 로 소프트웨어를 구성하는 패턴이다.
MDN 문서에 잘 정리되어 있으니 참고로 읽어보면 좋을 것 같다.

이전에 만들었던 helloController.java 에 다음 메서드를 추가해 보자.

controller/HelloController.java

1
2
3
4
5
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam("name") String name, Model model) {
     model.addAttribute("name", name);
     return "hello-template";
 }

View 에 해당하는 hello-template 또한 만들어주자.

resources/templates/hello-template.html

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

http://localhost:8080/hello-mvc?name=Myoungjin%20Oh 를 통해 접근해보자.

mvc

주의할 점은 @RequestParam("name") 을 통해 파라미터를 지정해 주었기 때문에 꼭 ?name={원하는 이름} 으로 지정해 주어야 한다. 이름이 바뀌면 내용도 바뀌게 된다.

만약 http://localhost:8080/hello-mvc 로 접근하게 되면 파라미터가 없어 오류가 나게 되는데, 이 경우 컨트롤러를 다음과 같이 수정해 주어 해결할 수 있다.

controller/HelloController.java

1
2
3
4
5
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model) {
     model.addAttribute("name", name);
     return "hello-template";
 }

브라우저에서 요청을 보내게 되면 톰캣 내장 서버를 거쳐 컨트롤러로 이동해 hello-template return을 통해 hello-template.html 을 받아온 모델을 이용해 Thymeleaf 엔진이 처리해 viewResolver 를 거쳐 html로 변환 후 브라우저에 띄우게 된다.

API

API 란, Application Programming Interface 의 약어로, 서로 다른 프로그램 사이에서 상호작용하기 위한 인터페이스를 뜻한다.
대개의 경우 웹 개발에서 백엔드 api에 요청을 보내어 응답받은 결과를 이용해 프론트에서 렌더링을 하는 등으로 사용된다.

간단한 예시로 @ResponseBody 의 사용부터 알아보자.
아래 코드를 HelloController.java 에 추가해 보자.

controller/HelloController.java

1
2
3
4
5
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}

이후 서버를 실행시키고 localhost:8080/hello-string?name=Spring 으로 접속해 보면 아래와 같은 화면을 볼 수 있다.

body example

겉보기엔 이전과 비슷해 보이지만, 페이지 소스 보기로 확인해 보면, 이는 html이 브라우저를 통해 렌더링 된 것이 아닌, hello Spring 이라는 평문인 것을 볼 수 있다.
@ResponseBody 로 인해 응답의 body 부분에 함수에서 return한 "hello" + name 이 들어간 결과이고, 이를 그대로 브라우저에서 보여준 것이다.

실제 개발 시에는 이러한 평문은 프로그램 간의 소통에 비효율적이며, API 로서 좋은 형태는 아니다.
따라서 다양한 형태의 데이터를 주고 받기에 특화된 JSON 형태로 데이터를 주고받는 경우가 많다.

JSON 참고

보다 실전에 가까운 api를 구현해 보자.
아래 코드를 HelloController.java 에 추가해 보자.

controller/HelloController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

static class Hello {
    public String name;

    public String getName() {
        return name;
    }

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

위와 같이 객체를 생성해 객체를 반환하게 되는데, 브라우저로 확인해 보면 다음과 같이 JSON 으로 나오는 것을 확인할 수 있다.

api-json

이전에는 XML도 종종 쓰였으나, 현재는 대부분 JSON을 사용하고 있고, Spring boot 또한 JSON을 기본으로 채택하고 있다.

Spring 입문

댓글남기기