horizonyeong
스프링 웹 개발 기초 : 정적 컨텐츠/ MVC 와 템플릿 엔진 / API 본문
정적 컨텐츠
맵핑된 컨트롤러가 없으면 스프링부트가 resources 안에 html을 찾아서 반환
정적 컨텐츠 : 파일 그대로 반환
mvc와 템플릿 엔진
Controller
View
MVC 패턴 개념
MVC는 Model-View-Controller의 약자.
스프링 웹 애플리케이션에서 이 패턴은 구조를 이렇게 나눈다.
1️⃣ Model (모델)
- 데이터를 담는 그릇
- DB나 비즈니스 로직의 데이터를 담아서 컨트롤러 → 뷰로 전달
2️⃣ View (뷰)
- 화면을 담당 (HTML, Thymeleaf, JSP, 등).
- Model의 데이터를 이용해 사용자에게 보여줄 화면을 만든다
3️⃣ Controller (컨트롤러)
- 사용자의 요청을 받고, 처리하고, 어떤 뷰를 보여줄지 결정
코드 상세 분석
🔹 @GetMapping("hello-mvc")
- 이 메서드는 HTTP GET 요청을 처리
- http://서버주소/hello-mvc 라는 URL로 GET 요청이 들어오면 이 메서드가 실행
- @GetMapping은 @RequestMapping(method = RequestMethod.GET)의 축약형
🔹 public String helloMvc(...)
- 메서드의 반환형이 String
- 이 String 값은 뷰의 이름을 의미
즉, hello-template 이라는 이름의 뷰 파일을 찾아서 렌더링 (보통 resources/templates/hello-template.html).
🔹 @RequestParam("name") String name
- @RequestParam → 사용자 입력 데이터를 받아오는 과정
- 요청에서 값을 꺼내기 위해 (RequestParam) → 자바 코드 안에서 name 값을 쓸 수 있게 한다.
- hello-mvc?name=김철수 와 같이 URL에 포함된 name 파라미터 값을 가져온다.
- HTTP 요청으로부터 name 파라미터 값을 가져와서 자바 변수 name에 넣는 것
- 예: http://localhost:8080/hello-mvc?name=김철수 → name = "김철수"
- 이 name 변수는 컨트롤러 메서드 내부에서 사용하기 위한 자바 변수일 뿐
- 만약 name 파라미터가 없으면 400 Bad Request 오류가 발생 (required = true가 기본).
🔹 Model model
- 스프링 MVC는 컨트롤러가 뷰에 데이터를 전달할 수 있도록 Model이라는 객체를 제공
- Model 객체는 컨트롤러에서 뷰로 데이터를 전달할 때 사용
- [Model model을 메서드에 선언해 놓으면]
- "Spring, 나 이 메서드에서 뷰에 데이터 전달할 거니까 Model 객체 좀 넘겨줘" 라는 의미.
- 즉, Model은 뷰에 데이터 전달하는 바구니(객체) 👉 이걸 메서드에서 쓸 수 있도록 Spring에게 요청하는 것
- 1️⃣ Spring이 Model 객체를 만들어서 전달
2️⃣ 그 Model 객체에 데이터를 담아서 뷰로 넘기게 할 수 있다
🔹 model.addAttribute("name", name);
- 컨트롤러 메서드에서 뷰(HTML 템플릿)로 데이터를 전달하는 것
- model.addAttribute(key, value)로 데이터를 담으면, 뷰에서 ${key} 로 출력 가능.
- model.addAttribute → 받아온 데이터를 화면에 넘겨주는 과정
- 뷰에 데이터를 넘기기 위해 (Model) → 뷰에서 name 값을 보여주거나 활용할 수 있게 한다.
- 즉, model.addAttribute("name", name); 이걸 하면 Model에 name이라는 key와 값(김철수)을 담는다.
- 그럼 뷰에서 ${name} 이렇게 해서 출력할 수 있게 된다
- 뷰가 데이터를 쓸 수 있도록 모델에 값을 넣는 과정
🔹 return "hello-template";
- 컨트롤러는 뷰 이름을 반환
- 스프링 부트 + Thymeleaf의 경우:이 경로의 파일을 찾아 렌더링
resources/templates/hello-template.html
- 렌더링할 때, Model에 담긴 데이터를 전달
전체 동작 흐름
1️⃣ 사용자가 브라우저에서 http://localhost:8080/hello-mvc?name=김철수 요청
2️⃣ 스프링이 @GetMapping("hello-mvc")에 매핑된 메서드를 실행
3️⃣ URL의 name 값(김철수)을 파라미터로 전달
4️⃣ model.addAttribute("name", name)으로 데이터를 담음
5️⃣ hello-template.html 뷰 파일을 찾아서 Model 데이터를 넘겨 렌더링
6️⃣ 사용자에게 HTML 화면이 응답으로 전달됨
정적 컨텐츠와 차이 : html 변환 후 반환
@RequestParam("name") 값은 어떻게 전달?
✅ GET 요청 URL에 직접 쿼리 파라미터로 넣어서 전달
http://localhost:8080/hello-mvc?name=김철수
👉 여기서 ?name=김철수 이 부분이 쿼리 파라미터
👉 스프링이 이 URL을 보고
@RequestParam("name") String name
에 name="김철수" 값을 넣어준다.
쿼리 파라미터 형식
GET 요청은 보통 이렇게 전달.
http://호스트:포트/경로?파라미터=값&파라미터2=값2...
http://localhost:8080/hello-mvc?name=김철수&age=30
👉 name=김철수, age=30 두 개의 파라미터를 전달
hello! empty
hello! empty 는 없어도 되나 thymleaf template 의 장점을 보여준다.
웹브라우저에 경로를 입력하면 파일을 웹브라우저에서 열 수 있다.
html파일을 서버 없이 열 수 있고 껍데기를 볼 수 있다.
template 이 template 엔진으로써 작동을 하면 hello! empty는
<p th:text="'hello, ' + ${name}">hello! empty</p>
hello, (name의 파라미터값) 으로 치환된다.
-> hello, 김철수
hello empty 는 동작전에 파일만 열어볼때
넣고자 하는 요소의 위치나 형식을 미리보는 용도로 적어놨다 생각하면 될듯..?
API
@ResponseBody
(HTML 의 BODY 태그 X) (HTTP의 HEAD부와 BODY부)
BODY부에 이 데이터를 직접 넣어주겠다는 의미
retrun의 데이터를 요청한 클라이언트에 그대로 대려간다
페이지 소스 보기를 하면 return 된 문자열만 있다.
return으로 객체를 반환할 때 JSON 방식으로 나온다
(JSON : KEY 와 VALUE로 이루어진 구조)
@ResponseBody 의 사용 원리
@ResponseBody 애노테이션이 없으면
MVC 패턴처럼 ViewResolver 에게 맞는 템플릿을 찾아 반환 시키게 하지만
@ResponseBody 애노테이션이 있으면
HTTP 응답에 데이터를 넘긴다.
데이터가 문자가 아닌 객체일 경우 기본 디폴트는, JSON 방식으로 만들어서 HTTP 응답에 반환.(간단하게 말하면)
retrun으로 Hello객체를 넘기면 HttpMessageConverter가 작동한다
단순 문자라면 StringConverter 가, 객체라면 JsonConverter가 작동한다.
Json구조의 데이터를 요청한 요청한 웹브라우저에 응답한다.
- @ResponseBody를 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체 처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 포맷에 대하여 HttpMessageConverter가 기본으로 등록되어 있음
참고: 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택된다.
HTTP Accept 해더 : 난 이러한 포맷으로 받고싶어 라고 요청,
요약
정적 컨텐츠 : 파일 그대로
템플릿 엔진: 템플릿 엔진을 MVC로 쪼개서 view로 html파일을 프로그래밍하고, 랜더링된 html파일을 클라이언트에게 전달.
API : 객체를 반환 ( HttpMessageConverter 로 JSON 구조로), view 없이 http response에 값을 넣어 반환
1. 스프링 웹 개발의 세 가지 주요 방식인 정적 컨텐츠, MVC, API는 각각 어떤 결과를 주로 반환할까요?
정적 컨텐츠: 가공되지 않은 파일, MVC: 처리된 HTML, API: 데이터
각 방식은 서버 응답의 형태가 달라요. 정적은 파일 그대로, MVC는 가공된 HTML, API는 데이터 형태를 주로 반환하죠.
2. 정적 컨텐츠 방식으로 파일을 전달할 때 서버에서 어떤 처리를 거치게 될까요?
정적 컨텐츠는 서버에서 내용을 변경하거나 처리하지 않고 요청된 파일을 그대로 브라우저에 전달하는 방식이에요.
3. MVC 패턴에서 Controller와 View를 분리하는 주된 이유는 무엇일까요?
관심사를 분리하고 코드의 유지보수성을 높이기 위해
MVC는 역할을 분리(관심사 분리)하여 코드를 더 체계적이고 관리하기 쉽게 만드는 설계 패턴이에요.
5. 스프링에서 컨트롤러 메서드가 객체를 반환하고 @ResponseBody 어노테이션이 붙어있을 때, 객체를 클라이언트에 전달 가능한 형태로 변환하는 역할을 하는 것은 무엇일까요?
HTTP 메시지 컨버터 (HTTP Message Converter)
@ResponseBody가 붙으면 뷰 리졸버 대신 HTTP 메시지 컨버터가 동작하여 객체를 JSON 등으로 변환해 응답 본문에 담아줘요.
본 내용과 자료는 인프런의 김영한 님의
스프링 입문 - 코드로 배우는 스프링부트, 웹 MVC, DB접근기술" 강의를 참고하고 있습니다.
'김영한님 강의 정리 > 스프링 입문' 카테고리의 다른 글
오류 및 JAVA_HOME 설정 (0) | 2025.06.26 |
---|