[Spring 입문] 02. 스프링 웹 개발
🌱 스프링 웹 개발
정적 컨텐츠
웰컴 페이지 처럼 서버에서 하는 일 없이 파일을 그대로 웹 브라우저에 내려주는 것.
MVC와 템플릿 엔진
템플릿 엔진: html을 서버에서 동적으로 렌더링. ex) JSP, php
→ Model - View - Controller 라고 함.
API
API 방식: json이라는 데이터 구조 포맷으로 클라이언트에게 데이터를 전달, 서버끼리의 데이터 전달
정적 컨텐츠
- 스프링부트 정적 컨텐츠 기능 (
파일명.html
→/파일명.html
)
스프링 부트는 기본 설정으로 정적 파일을 resources/static
폴더에서 찾아 그대로 화면에 렌더링
- 웹 브라우저에서 localhost:8080/hello-static.html 을 치면 내장 톰켓 서버가 요청을 받고 스프링 컨테이너로 넘김
- 컨트롤러가 우선 순위를 가지므로 "hello-static"관련 컨트롤러를 찾음.
- 관련 매핑된 컨트롤러가 없으므로 resources에서 hello-static.html을 찾아 반환.
MVC와 템플릿 엔진
뷰를 찾아 템플릿 엔진을 통해 화면을 렌더링해 html을 웹 브라우저에 넘겨주는 방식
- MVC: Model, View, Controller
과거에는 Controller와 View가 분리되어 있지 않고, View에서 모든 걸 다 했음.
관심사 분리
→ 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";
}
}
**@RequestParam**
: 단일 파라미터를 전달 받을 때 사용하는 어노테이션
→ @RequestParam("가져올 데이터의 이름") [데이터 타입][가져온 데이터를 담을 변수]
helloMvc
메소드의 인자값으로@RequestParam()
어노테이션을 넣어 값을 받아온다.- Model 객체를 이용해서 뷰로 값을 넘겨준다.
cf) url에 값을 안 넘겨주면 400에러가 발생한다 → defaultValue 지정 가능
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name", required = false, defaultValue = "Spring") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
View
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
동작 방식
- 웹 브라우저에서 실행: http://localhost:8080/hello-mvc?name=spring
- 내장 톰켓 서버가 맵핑된 helloMvc 컨트롤러를 찾아 던짐.
- url로 넘겨준 name값이 model의 name attribute로 할당 되어 View에게 전달.
- 화면과 관련된 일을 처리하는 viewResolver가 resource에서 hello-template.html을 찾음.
${name}
부분에서 모델에서 name 값을 꺼내 치환.- 템플릿 엔진은 변환된 html을 웹 브라우저에 넘겨줌.
API
웹 브라우저에 html 대신 data를 전달하는 방식
**ResponseBody**
: 메소드에서 리턴되는 값이 View를 html로 렌더링 되지 않고 HTTP Response의 Body부분에 직접 메세지를 넣어줌
- @ResponseBody 를 사용하면 뷰 리졸버(viewResolver)를 사용하지 않음
- 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)
- 본문에 담기는 데이터 형식: 주로 JSON(JavaScript Object Notation)
Json: { "key": "value"}로 이루어진 데이터 구조 - @ResponseBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
public static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ResponseBody 사용 원리
- 웹 브라우저에서 localhost:8080/hello-api 실행
- 톰켓 내장 서버에서 스프링에 던짐
- 스프링은 Controller에 hello-api가 있으니 컨트롤러로 보내줌
- 컨트롤러에 @ResponseBody 어노테이션이 붙어있음
(어노테이션이 안 붙어있다면 맞는 템플릿 찾아서 돌려주도록 viewResolver로 던짐) - @ResponseBody 어노테이션이 붙어있다면 문자열을 http 응답(response)에 넣어 그대로 반환
- 반환할 것이 문자가 아니라 객체 → JSON으로 data를 만들어 http 응답에 넣어 반환
- HttpMessageConverter가 동작 (viewResolver 대신)
- 단순 문자열이라면 StringConverter가 동작
- 객체라면 JsonConverter가 동작 → 객체를 Json으로 변환
- 요청한 웹 브라우저에 응답
정리
- @ResponseBody 를 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter 가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
객체를 JSON으로 변환해주는 대표적인 라이브러리: Jackson, Gson - byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
Author And Source
이 문제에 관하여([Spring 입문] 02. 스프링 웹 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lychee/Spring-02.-스프링-웹-개발저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)