티스토리 뷰

728x90
반응형

스프링으로 웹 개발을 하는 방법은 대표적으로 3가지가 있다.

  • 정적 컨텐츠
  • MVC와 템플릿 엔진
  • API

각각을 활용한 예시와 동작 방법을 아주 간략하게 알아보겠다.

정적 컨텐츠


스프링 부트에서 제공하는 정적 컨텐츠 기능을 사용하여 개발하는 방법으로 html 파일을 직접 만들어 웹 서버로 응답하는 방법이다.

By default, Spring Boot serves static content from a directory called /static(or /public or /resources ...) in the classpath

참고 : 스프링 부트 공식 문서 - Static Content

스프링 부트 공식 문서를 살펴보면 정적 컨텐츠는 /static 경로에서 찾아 제공한다고 설명되어 있다.

resources/static/hello-static.html

<!DOCTYPE HTML>
<html>
<head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    정적 컨텐츠 입니다.
</body>
</html>
  • 결과

 

정적 컨텐츠를 스프링 부트가 웹 브라우저로 응답하는 이미지(간략화)

  1. URL : 서버 주소/hello-static.html 로 요청
  2. 내장 톰캣 서버가 이 요청을 스프링 컨테이너로 넘겨주면 스프링 컨테이너는 서버 주소를 제외한 URL에 매핑되는 컨트롤러를 찾음
  3. 관련 컨트롤러가 없으면 내장 톰캣 서버가 이번에는 정적 콘텐츠가 저장되어 있는 경로에서 찾음(디폴트 값이 resources/)
  4. 찾은 html 파일을 내장 톰캣 서버가 웹 브라우저로 응답

 

MVC와 템플릿 엔진


Model-View-Controller 디자인 패턴과 템플릿 엔진을 활용한 방법이다.

/controller/HelloController.java

@Controller
public class HelloController {

    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}
  • @RequestParam 클라이언트로부터 파라미터 값을 요청받아 지정한 변수에 저장
  • model.addAttribute("name", name) : model 객체 내부에 name 값을 "name" 이라는 변수(키)에 담아 저장
  • return "hello-template" : hello-template이라는 이름을 가진 정적 파일(html)을 찾아 모델 객체 반환

resources/templates/hello-template.html

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

 

MVC 패턴과 템플릿 엔진을 활용해 웹 브라우저로 응답하는 이미지(간략화)

  1. @GetMapping("hello-mvc")에 의해 helloController 클래스 내부의 helloMvc 메소드가 호출됨
  2. helloMvc 내부 로직에 의해 model 객체가 만들어 지고, 결과를 hello-template에 반환
  3. viewResolver hello-template라는 이름의 정적 파일이 있는지 찾고, 있다면 해당 파일에 맞는 템플릿 엔진 처리를 하여 랜더링 후 웹 브라우저로 응답

API


이 방법은 html 같은 뷰를 생성해 반환하는 것이 아닌 json 같은 데이터만을 반환하는 방법이다.

단순 문자열 데이터만 응답하는 방법

/controller/HelloController.java

@Controller
public class HelloController {
    //...

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }
}
  • @ResponseBody : HTTP 응답 객체 본문(body)에 반환된 데이터를 매핑
  • 실행

 

객체(인스턴스)로 응답하는 방법

/controller/HelloController.java

@Controller
public class HelloController {
    // ...

    @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;
        }
    }
}
  • 실행

자바의 객체 데이터를 json 포맷 문자열로 변환해 응답한 결과

@ResponseBody 사용 원리 이미지

  • HTTPBODY에 문자 내용(데이터)을 직접 반환
  • viewResolver 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리: StringConverter → StringHttpMessageConverter
  • 기본 객체처리: JsonConverter → MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

 

References

728x90
반응형
댓글