본문 바로가기

Java/spring

[Java/스프링 입문] 스프링 웹 개발 기초 - 정적 컨텐츠, MVC와 템플릿 엔진, API(@ResponseBody)

들어가며

📜 정적 컨텐츠: 파일을 그대로 클라이언트단에 보여주는 방식
🛠️ MVC와 템플릿 엔진: 서버에서 변형을 하여 html을 바꿔서 내려주는 방식
🔄 API 방식: json 포맷으로 클라이언트에게 데이터를 전달하는 방식이라고 할 수 있습니다.

 

1. 정적 컨텐츠 (파일을 그대로)

  • main > 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>

 

 

  • 정적 컨텐츠 동작원리
    • 웹 브라우저에서 localhost:8080/hello-static.html을 치면 내장 톰캣 서버가 이  요청을 받습니다.
    • 스프링은 우선 컨트롤러를 먼저 찾아보지만, hello-static 관련 컨트롤러는 없습니다.
    • 컨트롤러가 없기에 이후 resouces: static/hello-static.html를 찾아 이를 웹 브라우저에 반환해 줍니다.

 


 

2. MVC와 템플릿 엔진 (View를 템플릿 엔진으로 렌더링된 html을 클라이언트에게 전달)

1) MVC

  • Model: 데이터와 비즈니스 로직을 관리합니다.
  • View: 레이아웃과 화면을 처리합니다.
  • Controller: 모델과 뷰로 명령(사용자의 입력에 대한 응답으로 모델 또는 뷰를 업데이트하는 로직 포함)을 전달합니다.

 

  • main > 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>

 

 

2) 템플릿 엔진

  • main > java > hello > hello.hello_spring > controller > HelloController
    • @GetMapping: hello-mvc가 들어오면 GET 메서드로 받을 수 있도록 매핑합니다.
    • @RequestParam(value = "name", required = true)
      • name 파라미터를 반드시(required = true) 받습니다.
package hello.hello_spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam(value = "name", required = true) String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}

 

  • main > resources > templates  > hello-template.html
    • html로 직접 접근하면 <p> 태그 내 hello! empty가 출력됩니다.
    • controller를 거치면 name이 반영되어 html로 렌더링 후 출력됩니다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

 

 

  • MVC와 템플릿 엔진 동작원리
    • 웹 브라우저에서 localhost:8080/hello-mvc?name=spring!!!!! → 내장 톰캣 서버에서 이 내용이 스프링 부트로 전달됩니다.
    • hello-mvc는 helloController에 매핑이 되어 있기에, hello-templete + model(name: spring!!!!!)와 함께 리턴됩니다.
    • 이 내용을 받아서 viewResolver가 동작하고, templates/hello-template.html 타임리프 템플릿 엔진에게 처리 요청합니다.
    • 타임리프 템플릿 엔진이 렌더링하여 html으로 변환 후 웹 브라우저에게 넘겨줍니다.

 


 

3. API (HttpMessageConverter를 통해서 객체 반환)

  • main > java > hello > hello_spring > controller > HelloController
    • @ResponseBody: http 응답 body에 return에 작성한 "hello" + name 데이터를 직접 넣어주겠다는 의미입니다.
    • hello-string은 String을 반환, hello-api는 객체를 반환합니다.
    • setter 메서드로 hello 객체에 name을 넣고, return hello 이 hello 객체를 반환합니다.
package hello.hello_spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("hello-string")
    @ResponseBody // 중요! http 응답 body에 return에 쓴 "hello" + name이라는 데이터를 직접 넣어주겠다는 의미
    public String helloString(@RequestParam("name") String name) {
        return "hello" + name;
    }

    @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;
        }
    }
}

 

hello-string / hello-api

 

  • API 동작원리
    • 웹 브라우저에서 localhost:8080/hello-api를 받으면, 톰캣이 스프링에 전달합니다.
    • 스프링 helloController에 ResponseBody 어노테이션을 인식합니다. (만약 ResponseBody가 없었다면, 이후 VeiwResolver가 리턴값을 받아 동작합니다.)
    • HttpMessageConverter로 리턴값을 받는데
      • string이라면 StringConverter로
      • 객체라면 JsonConverter가 기본으로 동작하여 객체를 json 스타일로 변경합니다.
    • 이를 통해 변경된 json을 웹 브라우저에게 다시 보내줍니다.
  • @ResponseBody
    • HTTP의 BODY에 문자 내용을 직접 반환합니다.
    • viewResolver 대신에 HttpMessageConverter 가 동작합니다.
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter
      • MappingJackson2: 객체를 json으로 바꿔주는 라이브러리입니다. (스프링이 기본으로 사용하는 라이브러리)
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있습니다.

 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확

www.inflearn.com

 

반응형