본 포스팅은 인프런 - 스프링 입문을 강의를 바탕으로 공부하고 정리한 글입니다.
스프링 웹을 개발하는 3가지 방식에 대해 알아보도록 하자.
- 정적 컨텐츠 : 서버에서 무언가 하지 않고 html 파일을 웹 브라우저에 그대로 내려주는 방식
- MVC와 템플릿 엔진 : 서버에서 프로그래밍을 통해 html을 동적으로 바꿔서 웹 브라우저에 내려주는 방식
- API : json 이라는 데이터 구조 포맷으로 바꿔서 웹 브라우저에 내려주는 방식
정적 컨텐츠
- 스프링 부트는 정적 컨텐츠 기능을 기본적으로 제공한다. 참고
- 정적 컨텐츠는 파일 그대로를 클라이언트에게 전달해주는 방식이다.
👉 View
📁 resources/static/hello-static.html
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
👉 실행
동작 원리
- 웹 브라우저로부터 내장 톰켓 서버가 hello-static.html라는 요청을 받아 스프링에게 넘긴다.
- 스프링은 우선적으로 hello-static 관련 컨트롤러가 있는지 찾는다.
- 컨트롤러에 매핑되는 것이 없으면 resources/static 안에 hello-static.html 파일이 있는지 찾는다.
- 찾으면 파일을 그대로 웹 브라우저에 전달해준다.
MVC와 템플릿 엔진
- 뷰를 템플릿 엔진으로 처리하여 렌더링된 html을 클라이언트에게 전달해주는 방식이다.
- Model, View, Controller
- View는 화면을 그리는 것에 집중
- Model과 Controller는 비즈니스 로직, 내부적인 처리에 집중
- 즉, 화면에 관련 된 일은 모두 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";
}
}
- 컨트롤러는 Model을 이용해 데이터를 가져오고 View에 데이터를 넘겨 적절한 View를 생성하는 역할을 한다.
- @RequestParam("name")
- @RequestParam 애노테이션을 사용해 외부로부터 파라미터를 받아올 수 있다.
- 외부 url을 통해 파라미터를 받아옴
- model.addAttribute("name", name)
- addAttribute() 메소드를 사용해 Model에 데이터를 담는다.
- "name"이라는 key에 받아온 값(name)을 value로 추가
👉 View
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">안녕하세요 손님</p>
</body>
- ${name} : Model에서 key값이 name인 value를 꺼내와 치환해준다.
👉 실행
- http://localhost:8080/hello-mvc?name=spring!
- url에서 입력받은 spring!이 key(name)-value(name)의 value로 전달되어 화면에 출력되는 것을 확인 할 수 있다.
동작 원리
- 웹 브라우저에서 hello-mvc 요청을 보내면 톰켓 서버가 요청을 받아 스프링에게 넘겨준다.
- 스프링은 우선적으로 hello-mvc에 매핑되는 컨트롤러가 있는지 확인하며, helloController가 매핑되므로 해당 메소드(helloMvc)를 호출한다.
- model에 name:spring!을 저장해서 넘겨주고 hello-template를 리턴한다.
- 뷰 리졸버가 hello-template에 해당하는 뷰를 찾아 템플릿 엔진을 연결시켜준다.
- 템플릿 엔진은 랜더링해서 변환한 html을 웹 브라우저에게 반환해준다.
API 방식
- 뷰 없이 데이터를 그대로 클라이언트에게 전달하는 방식이다.
- @ResponesBody 애노테이션을 사용하면 HTTP의 헤더부와 바디부 중 바디부에 데이터를 직접 넣어줄 수 있다.
👉 @ResponseBody 문자 반환
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
👉 실행
- http://localhost:8080/hello-string?name=spring!!
- name에 spring!!을 전달받고 hello spring!! 문자 그대로 전달해준다.
👉 @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;
}
}
}
👉 실행
- http://localhost:8080/hello-api?name=spring
- 객체를 반환하면 json 방식으로 데이터를 내려주는 것을 확인 할 수 있다.
- json은 key:value 구조로 이뤄져 있다.
동작 원리
- 웹 브라우저에서 hello-api 요청을 보내면 톰켓 서버가 요청을 받아 스프링에게 넘겨준다.
- 스프링은 우선적으로 hello-api와 매핑되는 컨트롤러 있는지 확인해 helloController를 찾는다.
- 이때 @ResponseBody 애노테이션이 붙어있으면 스프링은 HTTP 응답으로 데이터를 그대로 넘겨야되겠구나 하고 동작한다.
- return 값으로 문자가 오면 StringConverter가 동작해 그대로 넘겨주고, 객체가 오면 JsonConverter가 동작해 json방식으로 데이터를 만들어 넘겨준다.
💡 ResponseBody 사용 원리
- @ResponeseBody를 사용
- HTTP의 바디에 문자 내용을 직접 반환한다.
- ViewResolver 대신 HttpMessageConverter가 동작한다.
- 기본 문자처리 : StringHttpMessageConverter → 단순 문자 반환 시 HTTP 바디영역에 문자 내용을 그대로 반환
- 기본 객체처리 : MappingJackson2HttpMessageConverter → 객체 반환 시 json 방식으로 데이터를 만들어 반환
'🌱 Spring > Core' 카테고리의 다른 글
[기본] #2 회원, 주문, 할인 도메인 개발 및 테스트 (0) | 2022.02.21 |
---|---|
[기본] #1 객체 지향 설계와 스프링 (0) | 2022.02.18 |
[입문] #7 AOP (0) | 2022.02.17 |
[입문] #6 DB 접근기술(JDBC, JdbcTemplate, JPA, SpringJPA) (0) | 2022.02.16 |
[입문] #5 웹 MVC 개발 (0) | 2022.02.15 |
[입문] #4 스프링 빈과 의존관계 (0) | 2022.02.15 |
[입문] #3 회원관리 예제 만들기 (0) | 2022.02.15 |
[입문] #1 스프링 프로젝트 환경설정 (0) | 2022.02.14 |