웹 개발 방식
웹 개발에는 크게 세 가지 방법이 있다. 정적 컨텐츠, MVC와 템플릿 그리고 API이다.
정적 컨텐츠 방식
💡 정적 컨텐츠란?
서버에서 파일을 클라이언트(웹 브라우저)에 그대로 전달해주는 것
- Spring Boot에서 자동으로 제공하는 기능
- Link
https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content
Spring Boot Features
Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest
docs.spring.io
- Spring Boot 기반으로 생성한 Java 프로젝트의 src/resources/static 패키지에 생성 가능하다.
🔎 ex. resources/satic/exmaple.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 주소로 들어가보면 된다.
💡 동작 원리

- 브라우저가 내장 서버로 localhost:8080/hello-static.html HTTP 요청을 보낸다.
- 내장 톰캣 서버는 이 요청을 스프링으로 넘긴다.
- 스프링 MVC는 먼저 이 URL을 처리할 컨트롤러가 있는지 확인한다.
- @Controller나 @RestController가 해당 경로를 매핑하고 있으면 그 컨트롤러가 실행된다.
- 관련 컨트롤러가 없으면 정적 리소스 처리기로 넘어간다.
- Spring Boot에서 기본적으로 resources/static 폴더의 HTML 정적 파일을 찾아 그대로 반환한다.
MVC와 템플릿 엔진
💡 MVC란?
- Model, View, Controller의 약자
- 서버에서 HTML을 변형해서 클라이언트에게 전달
- Model, View, Controller 각각의 역할을 분리
- Model : Controller에서 View에 필요한 데이터를 담아 View로 전달
- View : 화면과 관련된 로직 처리
- Controller : 비즈니스 로직과 관련 있거나 서버와 관련된 내부적 처리에 집중
🔎 Contollrer 예시
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
🔎 View 예시 (path : resources/templates/hello-template.html)
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
💡 템플릿 엔진이란?
- HTML 문서 안에 동적 데이터를 끼워 넣을 수 있는 문법을 제공하고, 서버에서 데이터를 채워 넣어 최종 HTML을 생성
- ex. "OOO님 환영합니다!" 처럼 로그인한 사용자 이름에 따라 데이터가 달라져야 하는 상황에서 사용
- 스프링 부트에서는 Thymeleaf (타임리프)를 많이 사용한다.
🔎 Thymeleaf (MVC에서 View 역할을 함) 예시
<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 와 같이 name 값(parameter, 파라미터)을 URL에서 같이 넘겨줘야한다.
➡️ Tip : html 파일을 copy → absolute path로 복사해 URL 창에 실행하면, HTML 파일을 서버 없이 볼 수 있다.
💡 MVC 동작 원리

- 웹 브라우저에서 localhost:8080/hello-mvc?name=spring 요청을 보냄
- ?name=spring은 GET 방식으로 name이라는 파라미터에 "spring" 값을 담아 전달하는 것
- 내장 톰캣 서버가 요청을 받고, 스프링 MVC의 DispatcherServlet을 통해 해당 URL을 처리할 컨트롤러(helloController)를 찾음
- helloController는 파라미터 name 값을 받아서 "spring"을 model에 담음
- model.addAttribute("name", "spring") 같은 식으로 처리
- 컨트롤러는 뷰 이름 "hello-template"을 반환
- 이 이름을 받은 viewResolver(뷰 리졸버)가 templates/hello-template.html 파일을 찾아줌
- 찾은 템플릿 파일을 타임리프(Thymeleaf) 템플릿 엔진에 넘겨줌
- 템플릿 안에 ${name} 같은 표현식이 있으면, 모델에서 name 키를 찾아 "spring" 값으로 치환함
- 최종적으로 렌더링된 완성 HTML이 브라우저에 전달됨
API 방식
💡 API 방식이란?
- JSON 데이터 구조 포맷으로 클라이언트에게 데이터를 그대로 전달
- View 없이 HTTP body에 직접 데이터를 전달
💡 사용 방법
1️⃣ @ResponsBody 문자 반환
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
- View 없이 문자를 JSON 형태로 반환 ex. {"name" : "spring"}
- viewResolver 대신 HttpMessageConverter가 동작
- 단순 문자인 경우, StringMessageConvert로 처리됨
- HTTP BODY에 문자 내용을 직접 반환
2️⃣ @ResponsBody 객체 반환
@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;
}
}
}
- 문자가 아닌 객체를 처리하는 경우, HttpMessageConverter 중 JsonConverter가 동작
- 객체를 JSON 형태로 변환하여 반환
💡 동작 원리

- 컨트롤러에서 @ResponsBody를 사용 → HTTP의 BODY에 데이터 내용 직접 반환
- 웹 브라우저에서 localhost:8080/hello-api 요청을 보냄
- 내장 톰캣 서버가 요청을 받고, 스프링 MVC의 DispatcherServlet을 통해 해당 URL을 처리할 컨트롤러(helloController)를 찾음
- 컨트롤러에 @ResponseBody 어노테이션이 붙어 있으면, 반환값을 뷰로 해석하지 않고 그대로 HTTP Body에 실어서 응답으로 보냄
- 만약 @ResponseBody가 없다면, 스프링은 뷰 이름으로 인식해서 viewResolver를 통해 템플릿(HTML)을 찾으려 함
- 반환 타입에 따라 다른 Converter가 동작
- 반환 타입이 단순 문자열이면 → StringHttpMessageConverter가 동작
- 반환 타입이 객체라면 → MappingJackson2HttpMessageConverter 같은 JSON 변환기가 동작해서 객체를 JSON으로 직렬화(변환)
- 최종적으로 변환된 데이터(JSON 등)가 HTTP 응답 Body에 담겨 브라우저로 전달됨
💡 HttpMessageConverter
✅ 동작 원리
- 클라이언트가 요청 시 Accept Header를 통해 원하는 응답 포맷을 지정할 수 있음
- ex. Accept: application/json → JSON 변환기 동작
- 명시하지 않으면, 스프링이 적절한 기본 메시지 컨버터를 선택해서 응답을 내려줌
✅ 종류
- 기본 문자처리 : StringHttpMessageConverter
- 기본 객체처리 : MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
출처
https://www.inflearn.com/course/dashboard
[지금 무료]스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술| 김영한 - 인프런 강의
현재 평점 5.0점 수강생 117,433명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다. 예제를 만들면서 자연스럽게 스
www.inflearn.com
'Java Framework > [인프런] 스프링 입문' 카테고리의 다른 글
| [Spring] 프로젝트 환경 설정 (0) | 2025.09.10 |
|---|