Spring/강의

[📗 스프링 입문] 2. 스프링 웹 개발 기초

가지코딩 2025. 5. 8. 10:57

📗 목차

  1. 정적 컨텐츠
  2. MVC와 템플릿 엔진
  3. API
  4. [퀴즈]

1. 정적 컨텐츠

정적 컨텐츠

  • 서버에서 별도의 처리 없이 그대로 클라이언트에게 전달되는 파일
  • ex. HTML, CSS, JavaScript, 이미지(jpg, png, gif 등)

 

스프링부트에서는 정적 컨텐츠

  • src/main/resources/static 디렉토리 아래에 위치한 파일들을 정적 컨텐츠로 인식하고, 자동으로 서빙한다.
  • http://localhost:8080/{파일명} 으로 접근 가능하다.

 

 

[실습]

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>static content</title>
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>


2. MVC와 템플릿 엔진

MVC (Model-View-Controller)

  • 애플리케이션을 세 가지 책임으로 나누는 아키텍처 패턴
    • Model: 애플리케이션의 데이터와 비즈니스 로직 처리 (예: 서비스, 도메인 객체)
    • View: 사용자에게 보여지는 화면 처리 (예: HTML, Thymeleaf)
    • Controller: 요청을 받고 Model을 호출한 후 View에 데이터를 넘기는 중간 조정자 역할

 

템플릿 엔진

  • 서버에서 데이터를 조합해 HTML 등의 정적인 문서로 출력하기 위한 도구
  • View 영역에서 사용된다.
  • 역할
    • 동적인 HTML 생성: 서버에서 데이터를 전달받아 HTML에 삽입
    • 템플릿 문법 제공: 반복문, 조건문, 변수 출력 등 HTML 내에서 제어 가능
  • 종류: Thymeleaf, JSP, Freemarker, Mustache 등

 

 

[실습]

@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
    model.addAttribute("name", name);
    return "hello-template";
}
<!-- resources/templates/hello-template.html -->
<html xmlns:th="http://www.thymeleaf.org" lang="ko">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>


3. API

@ResponseBody

  • HTTP 응답의 body 영역에 직접 데이터를 반환
  • 뷰(View)를 거치지 않고 문자열, 객체 등을 직접 HTTP 응답으로 반환할 때 사용한다.
구분 반환 방식 결과 형식
@ResponseBody + 문자열 문자열 그대로 반환 text/plain
@ResponseBody + 객체 객체 → JSON 변환 후 반환 application/json

 

 

[실습]

 

@ResponseBody 문자 반환

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

 

 

@ResponseBody 객체 반환 - JSON 반환

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


4. [퀴즈]

1. 스프링 웹 개발의 세 가지 주요 방식인 정적 컨텐츠, MVC, API는 각각 어떤 결과를 주로 반환할까요?

  • 정적 컨텐츠: 처리된 HTML, MVC: 가공되지 않은 파일, API: 데이터
  • 정적 컨텐츠: 가공되지 않은 파일, MVC: 처리된 HTML, API: 데이터
  • 정적 컨텐츠: 데이터, MVC: 가공되지 않은 파일, API: 처리된 HTML
  • 정적 컨텐츠: 처리된 HTML, MVC: 데이터, API: 가공되지 않은 파일

 

2. 정적 컨텐츠 방식으로 파일을 전달할 때 서버에서 어떤 처리를 거치게 될까요?

  • 템플릿 엔진으로 내용을 수정해요.
  • 데이터를 JSON 형식으로 변환해요.
  • 특별한 처리 없이 파일을 그대로 전달해요.
  • 컨트롤러에서 비즈니스 로직을 수행해요.

 

3. MVC 패턴에서 Controller와 View를 분리하는 주된 이유는 무엇일까요?

  • 파일 크기를 줄이기 위해
  • 데이터베이스 연결을 빠르게 하기 위해
  • 관심사를 분리하고 코드의 유지보수성을 높이기 위해
  • 정적 컨텐츠 전달 속도를 높이기 위해

 

4. 웹 개발에서 API 방식(특히 객체 반환)은 주로 어떤 목적을 위해 사용될까요?

  • 서버에서 미리 완성된 HTML 페이지를 보여주기 위해
  • 웹 브라우저가 요청한 파일을 그대로 전달하기 위해
  • 클라이언트(앱, 웹)나 다른 서버에 구조화된 데이터만 전달하기 위해
  • 템플릿 엔진으로 HTML 내용을 동적으로 생성하기 위해

 

5. 스프링에서 컨트롤러 메서드가 객체를 반환하고 @ResponseBody 어노테이션이 붙어있을 때, 객체를 클라이언트에 전달 가능한 형태로 변환하는 역할을 하는 것은 무엇일까요?

  • 뷰 리졸버 (View Resolver)
  • 템플릿 엔진 (Template Engine)
  • HTTP 메시지 컨버터 (HTTP Message Converter)
  • 모델 (Model)