Java Framework/[인프런] 스프링 입문

[Spring] 스프링 웹 개발 기초

annovation 2025. 9. 11. 11:15

웹 개발 방식

웹 개발에는 크게 세 가지 방법이 있다. 정적 컨텐츠, MVC와 템플릿 그리고 API이다.


정적 컨텐츠 방식

 

💡 정적 컨텐츠란?

 

서버에서 파일을 클라이언트(웹 브라우저)에 그대로 전달해주는 것

 

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 주소로 들어가보면 된다.

 

 

💡 동작 원리

정적 컨텐츠

  1. 브라우저가 내장 서버로 localhost:8080/hello-static.html HTTP 요청을 보낸다.
  2. 내장 톰캣 서버는 이 요청을 스프링으로 넘긴다.
  3. 스프링 MVC는 먼저 이 URL을 처리할 컨트롤러가 있는지 확인한다.
    • @Controller나 @RestController가 해당 경로를 매핑하고 있으면 그 컨트롤러가 실행된다.
  4. 관련 컨트롤러가 없으면 정적 리소스 처리기로 넘어간다.
  5. 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 동작 원리

MVC

 

  1. 웹 브라우저에서 localhost:8080/hello-mvc?name=spring 요청을 보냄
    • ?name=spring은 GET 방식으로 name이라는 파라미터에 "spring" 값을 담아 전달하는 것
  2. 내장 톰캣 서버가 요청을 받고, 스프링 MVC의 DispatcherServlet을 통해 해당 URL을 처리할 컨트롤러(helloController)를 찾음
  3. helloController는 파라미터 name 값을 받아서 "spring" model에 담음
    • model.addAttribute("name", "spring") 같은 식으로 처리
  4. 컨트롤러는 뷰 이름 "hello-template"을 반환
    • 이 이름을 받은 viewResolver(뷰 리졸버)가 templates/hello-template.html 파일을 찾아줌
  5. 찾은 템플릿 파일을 타임리프(Thymeleaf) 템플릿 엔진에 넘겨줌
    • 템플릿 안에 ${name} 같은 표현식이 있으면, 모델에서 name 키를 찾아 "spring" 값으로 치환함
  6. 최종적으로 렌더링된 완성 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 형태로 변환하여 반환

 

💡 동작 원리

API

  1. 컨트롤러에서 @ResponsBody를 사용 → HTTP의 BODY에 데이터 내용 직접 반환
  2. 웹 브라우저에서 localhost:8080/hello-api 요청을 보냄
  3. 내장 톰캣 서버가 요청을 받고, 스프링 MVC의 DispatcherServlet을 통해 해당 URL을 처리할 컨트롤러(helloController)를 찾음
  4. 컨트롤러에 @ResponseBody 어노테이션이 붙어 있으면, 반환값을 뷰로 해석하지 않고 그대로 HTTP Body에 실어서 응답으로 보냄
    • 만약 @ResponseBody가 없다면, 스프링은 뷰 이름으로 인식해서 viewResolver를 통해 템플릿(HTML)을 찾으려 함
  5. 반환 타입에 따라 다른 Converter가 동작
    • 반환 타입이 단순 문자열이면 → StringHttpMessageConverter가 동작
    • 반환 타입이 객체라면 → MappingJackson2HttpMessageConverter 같은 JSON 변환기가 동작해서 객체를 JSON으로 직렬화(변환)
  6. 최종적으로 변환된 데이터(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