스프링 웹 개발의 3가지 방법
- 정적 컨텐츠 : like WELCOME pages
- MVC와 템플릿 엔진 : jsp, php → HTML을 서버에서 프로그래밍해서 동적으로 내려줌
- API : json이라는 데이터 포맷으로 클라이언트한테 데이터 전달
정적 컨텐츠
- resources/static/hello-static.html
- 인텔리제이 파일 생성 단축키 Ctrl + Alt + Insert
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
실행해보자
- run을 돌리고 http://localhost:8080/hello-static.html로 접속하여 확인
정적 컨텐츠는 어떻게 동작하는 걸까?
- 웹 브라우저에 localhost:8080/hello-static.html을 입력
- 내장 톰캣 서버가 요청을 받아서 스프링한테 전달
- 스프링은 먼저 컨트롤러에 있는지 찾아봄(컨트롤러에 우선권)
- 관련 매핑 컨트롤러가 없다면 resources/static 안에서 찾음
- 있으면 웹 브라우저까지 반환
MVC와 템플린 엔진
- MVC란? Model, View, Controller
- View에서 모든 로직을 구현 → MVC1 패턴
- 요즘 떠오르는 키워드 → 관심사 분리, 역할과 책임
- View는 화면을 그리는 데에 집중
- Controller나 Model은 비즈니스 로직과 관련이 있거나 내부적인 것을 처리하는 데에 집중
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이라는 어노테이션을 사용
- 받아온 name을 Model에 담으면 View에서 랜더링 할 때 사용
View
- resource/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
- Thymeleaf 템플릿 엔진 사용
- 파일 우클릭 → Copy Path → Absolute Path
이렇게 하면 서버 없이 파일 자체 확인 가능
실행해보자
- http://localhost:8080/hello-mvc 이렇게만 입력하면 에러, 파라미터가 없기 때문
- @RequestParam 부분에서 Ctrl + P → 파라미터 정보 단축키
- required라는 옵션의 기본값이 true이기 때문에 파라미터가 반드시 들어와야 함
- http://localhost:8080/hello-mvc? name=spring!으로 접속하여 확인
MVC와 템플릿 엔진은 어떻게 동작하는 걸까?
- 웹 브라우저에 localhost:8080/hello-mvc를 입력
- 내장 톰캣 서버가 요청을 받아서 스프링한테 전달
- 스프링은 HelloController에 매핑되어 있는 메서드를 찾음
- hello-template로 리턴하면서 model에 (name:spring)을 담아 스프링한테 전달
- viewResolver가 동작하면서 templates에서 위의 메서드의 리턴 값과 똑같은 이름의 파일을 찾음
- Thymeleaf 템플릿 엔진이 변환하여 웹 브라우저에 반환
API
- 템플릿 엔진을 이용하여 HTML을 내리는 것이 아닌 API 방식으로 데이터를 바로 내려줌
@ResponseBody 문자 반환
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody // HTTP BODY에 데이터를 직접 넣겠다는 의미
public String helloString(@RequestParam("name") String name) {
return "hello " + name; // name에 spring을 넣는다면 "hello spring"
}
}
- @ResponseBody를 사용하면 뷰리졸버(viewResolver)를 사용하지 않음
- 대신 HTTP의 BODY에 문자 내용을 직접 반환
실행해보자
- http://localhost:8080/hello-string? name=spring!으로 접속하여 확인
- 소스보기로 보면 html 태그 없이 문자만 있는 것을 확인할 수 있음
@ResponseBody 객체 반환
@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;
}
}
}
- Hello라는 객체를 만들고 Getter와 Setter를 설정(단축키 Alt + Insert, 자바 빈 규약, 프로퍼티 접근방식)
- 메서드의 리턴 값으로 객체를 반환
- @ResponseBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨
- 과거에는 XML 방식을 사용했으나, 요즘은 대부분 JSON 방식 사용
실행해보자
- http://localhost:8080/hello-api? name=spring!으로 접속하여 확인
- 소스보기로 보면 JSON 형태로 반환된 것을 확인할 수 있음
@ResponseBody 사용 원리는 뭘까?
- 웹 브라우저에 localhost:8080/hello-api를 입력
- 내장 톰캣 서버가 요청을 받아서 스프링한테 전달
- 스프링은 HelloController에 매핑되어 있는 메서드를 찾음
- @ResponseBody를 사용했다면?
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신 HttpMessageConverter가 동작
- 기본 문자처리 : StringHttpMessageConverter
- 기본 객체처리 : MappingJackson2HttpMessageConverter (Jackson은 객체를 JSON으로 바꿔주는 스프링 기본 라이브러리)
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
- JSON 형태 그대로 웹 브라우저에 반환
💡 참고 : 클라이언트의 HTTP Accept 해더와
서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택된다
※ 이 내용은 인프런에서 김영한 님의 스프링 입문 강의를 듣고 정리한 내용입니다.
'🌎 Web > Spring' 카테고리의 다른 글
[Spring] IoC(제어의 역전)와 DI(의존성 주입) 그리고 Spring (0) | 2023.02.23 |
---|---|
[Spring] 스프링 프로젝트 환경설정 (0) | 2022.09.10 |