Taeyoung Kim

Engineering

2. 스프링 웹 개발 기초

2. 스프링 웹 개발 기초 학습 내용을 정리한 백필 노트입니다.

이 글은 2025년 학습 기록을 블로그 형식으로 정리한 백필 노트입니다.


스프링 웹 애플리케이션 개발의 기초로서, 정적 콘텐츠 처리, MVC와 템플릿 엔진, API 응답 처리의 세 가지 주요 영역으로 구성되어 있다.


1️⃣ 정적 컨텐츠 (Static Content)

📄 개요

스프링 부트는 정적 리소스를 쉽게 제공하기 위한 내장 기능을 제공한다.

정적 파일은 resources/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>

▶ 실행

브라우저에서 다음 주소로 접근:

http://localhost:8080/hello-static.html

🧠 동작 원리

스프링 부트는 /static, /public, /resources 등의 경로에서 정적 리소스를 자동으로 서빙한다.

따라서 별도의 컨트롤러 없이도 HTML, CSS, JS 파일을 바로 제공할 수 있다.


2️⃣ MVC와 템플릿 엔진

🧩 MVC란?

MVC (Model-View-Controller)

  • Model: 데이터 및 비즈니스 로직 담당
  • 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";
    }
}

🪞 View 템플릿 (Thymeleaf)

resources/templates/hello-template.html

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

▶ 실행

브라우저 주소:

http://localhost:8080/hello-mvc?name=spring

⚙️ 동작 흐름

  1. 사용자가 /hello-mvc 요청
  2. 컨트롤러가 name 파라미터를 받아 모델에 저장
  3. hello-template.html 뷰 파일이 렌더링되며, $&#123;name&#125;이 실제 값으로 치환되어 출력됨

3️⃣ API

📤 @ResponseBody 문자 반환

@Controller
public class HelloController {

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }
}

  • @ResponseBody를 사용하면 **뷰 리졸버(viewResolver)**를 거치지 않고,
  • HTTP 응답 본문(Body)에 문자열을 직접 반환한다.

▶ 실행

http://localhost:8080/hello-string?name=spring


🧱 @ResponseBody 객체 반환

@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 형태로 변환하여 응답한다.
  • 즉, "hello": "spring" 형태의 JSON 데이터가 반환됨.

▶ 실행

http://localhost:8080/hello-api?name=spring


⚙️ @ResponseBody 동작 원리

  • @ResponseBody가 선언된 메서드는 HttpMessageConverter를 통해 변환 처리된다.
  • 변환 방식은 컨트롤러 반환 타입HTTP Accept 헤더 정보를 조합하여 자동 선택된다.

🔧 기본 등록된 변환기

| 타입 | 클래스 | | --- | --- | | 문자열 | StringHttpMessageConverter | | 객체(JSON) | MappingJackson2HttpMessageConverter | | 바이트 등 기타 | 다양한 HttpMessageConverter 내장 |


🧩 정리 요약

| 구분 | 설명 | 대표 예제 | | --- | --- | --- | | 정적 컨텐츠 | 정적 파일 제공 (/static) | HTML, CSS, JS | | MVC와 템플릿 엔진 | 서버 렌더링 방식 | @Controller, Thymeleaf | | API | 데이터 반환(JSON 등) | @ResponseBody, HttpMessageConverter |