오늘은 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고
정적컨텐츠, MVC와 템플릿 엔진, API에 대해서 정리해보고자 한다.
1. 정적 컨텐츠(서버에서 파일을 그대로 웹브라우저에 전달)
정적 컨텐츠란, 서버에서는 파일을 그대로 웹 브라우저에 보내 주는 방식을 의미한다. 이전에 설명한 Welcome Page와 같다고 볼 수 있다.
<과정 설명>
- 웹 브라우저에서 localhost:8080/hello-static.html 로 요청하면 내장 톰캣 서버가 해당 요청을 받는다.
- 톰캣 서버는 먼저 스프링 컨테이너에 hello-static.html요청이 왔음을 알린다.
- 스프링 부트에서는 ''컨트롤러''가 우선순위가 있기 때문에, 가장 먼저 컨트롤러 중에 hello-static.html 관련 내용이 있는지 확인한다.
- 컨트롤러에 해당 내용이 없으면 그 다음으로 resources: static에 hello-static.html 관련 내용이 있는지 찾는다.
- 있으면 해당 내용(html파일)을 반환한다.
2. MVC와 템플릿 엔진
템플릿 엔진(JSP, PHP 등) - HTML을 그냥 보내주는 것이 아닌, 서버에서 프로그래밍을 통해 동적으로 바꾸어서 보내주는 역할을 한다.
MVC: HTML을 동적으로 바꾸기 위한 요소 : Model, View, Controller를 의미한다.
Model과 Controller는 로직과 관련되거나 내부 처리를 담당한다.
예를 들어 Controller - HelloController.java 파일이 있다.
@RequestParam() : 외부(웹)에서 매개변수를 받아올 때 사용
View 뷰 : 화면을 그리는 역할 담당한다.
View - resources/template/hello-template.html 파일을 사용하는데, html 파일을 이용하는 것과 같다.
강의에서는 thymeleaf 템플릿 엔진을 사용해서 html 파일을 가져왔다.
<MVC와 템플릿 엔진 방식 설명>
- 웹 브라우저에서 localhost:8080/hello-mvc로 요청한다.
- 스프링부트의 내장 톰캣 서버에서 해당 요청을 받아 스프링 컨테이너로 넘겨준다.
- 스프링 컨테이너는 가장 먼저 컨트롤러를 살피며 해당 요청(hello-mvc)에 맵핑된(@GetMapping()) 사항이 있는지 확인한다.
- 맵핑된 사항이 있으면, 맵핑된 메서드 helloMvc()를 호출해 준다.
- helloMvc()가 실행된다.
- 리턴값인 hello-template를 보내고, 동시에 Model에 키=name, 값=spring인 데이터를 넣어 보낸다.
- 스프링 viewResolver가 이를 받아 동작한다.템플릿엔진은 해당 html파일을 받아 View라는 템플릿을 변환한 다음, 변환된 html파일을 웹브라우저에 넘겨 준다.
- src/main/resources/template에서 View(hello-template.html)를 찾아 주고, 템플릿엔진(여기서는 Thymeleaf)을 연결시켜 준다.
3. API
API가 뭔지 궁금했었는데, 오늘 조금 해소된 것 같다. API란 안드로이드/아이폰 개발에 사용이 되고, 서버끼리 통신 할 때 주로 사용된다고 한다.
즉, xml / JSON 데이터 구조 포맷으로 클라이언트에 데이터를 전달하는 방식을 API방식이라고 한다.
현재는 xml대신 JSON 방식으로 사용된다고 한다.
이때 JSON 방식이란 무엇일까?
태그로 표현하기 보다는 중괄호({}) 같은 형식으로 하고, 값을 ','로 나열하기에 그 표현이 간단하다.
{
"employees": [
{
"name": "Surim",
"lastName": "Son"
},
{
"name": "Someone",
"lastName": "Huh"
},
{
"name": "Someone else",
"lastName": "Kim"
}
]
}
이런식으로, key, value 값으로 나눠서 데이터를 전송하는 방식을 의미한다.
<API 방식 설명>
- 웹 브라우저에서 localhost:8080/hello-api 요청
- 내장 톰캣 서버에서 hello-api요청을 스프링 컨테이너에 전달한다.
- 스프링 컨테이너는 hello-api가 맵핑(@GetMapping("hello-api"))되어 있으면 해당 메소드(helloApi())를 실행한다.
- 이 때 메소드에 @ResponseBody 어노테이션이 있으면, HTTP응답에 해당 데이터(리턴값)을 그대로 넘기고 HttpMessageConverter가 동작한다.
- (반대로 메소드에 @ResponseBody 어노테이션이 없으면, MVC방식대로 viewResolver가 동작한다.)
- 이 때 해당 메소드의 리턴값이 객체이면, 기본적으로 JSON형식으로 데이터를 만들어 HTTP응답에 반환한다.
- return: hello(name:spring)
- 받은 객체를 가지고 HttpMessageConverter 가 동작한다.
- 받은 객체가 단순 문자(String) 라면 StringConverter가 동작한다.
- (기본 문자처리 : StringHttpMessageConverter)
- 받은 객체가 일반 객체라면 JsonConverter가 동작한다 - 객체를 키와 값을 가지는 JSON형식으로 변환한다.
- (기본 객체처리 : MappingJackson2HttpMessageConverter)
- byte처리 등 기타 여러 HttpMessageConverter가 기본 등록되어 있음.
- 변환된 내용을 웹브라우저에 반환한다.
'💻 Backend' 카테고리의 다른 글
회원 도메인과 리포지토리 만들기 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (0) | 2021.12.18 |
---|---|
인텔리제이(IntelliJ) 단축키 정리 (0) | 2021.12.18 |
무상태성 / JWT / Oauth란? (0) | 2021.11.21 |
RESTful 설계 방법 / Validation / Server to Server (0) | 2021.11.14 |
RESTful API에 대한 이해 (0) | 2021.11.07 |