여기에 나오는 코드 및 내용은 김영한님의 인프런 강의에서 가져왔습니다.
[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
정적 컨텐츠
정적 컨텐츠란 말 그대로 html 있는 그대로 클라이언트에게 보여주는 컨텐츠이다. 즉 클라이언트가 조작을 하든 말든 바뀌는게 없다.
정적 컨텐츠를 추가할려면 'src -> resources -> static' 디렉토리에 추가하면 된다.
저번 주차에 넣었던 index.html 도 정적 컨텐츠다.
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
static에 hello-static.html을 추가해준다. 그러고 서버를 실행해준 다음 localhost:8080/hello-static.html을 치면 제대로 들어가진다.
정적 컨텐츠 동작 원리
1. 웹 브라우저에서 localhost:8080/hello-static.html을 입력한다
2. 내장 톰켓 서버에서 스프링 컨테이너에 hello-static 관련 컨트롤러가 있는지 찾아본다.(1주차 컨트롤러 파트)
3. 만약 스프링 컨테이너에 관련 컨트롤러가 없는 경우 곧바로 resources/static 디렉토리에서 해당 페이지를 찾는다.
4. 웹 브라우저로 뿌려준다. (없을 경우 에러)
MVC와 템플릿 엔진
MVC란?
Model + View + Controller로 나눠진 패턴이다.
Model을 건들지 않고, 컨트롤러를 통해 사용자가 조작하면 Model에서 수정이 일어난 후,
업데이트 된 결과값을 View로 보여준다.
MVC 패턴에 대해서 알아봤으니 컨트롤러에 추가를 해보자.
1주차때 사용했던 HelloController에 아래 코드를 추가해준다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
(위 코드가 Controller 파트이다.)
그리고 resources/templates 디렉토리에 hello-template.html을 추가해준다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
(위 코드는 View 파트이다.)
컨트롤러에서 어노테이션(@RequestParam)으로 파라미터를 요청하기 때문에 값을 넣어줘야한다.
localhost:8080/hello-mvc?name=spring 으로 입력을 해보자.
쿼리 스트링을 넘길땐 주소?(변수)=(값)&(변수)=(값)으로 들어간다고 보면된다.
name=spring이기 때문에 ${name}에 spring이 들어간다.
MVC, 템플릿 동작원리
1. localhost:8080/hello-mvc 입력
2. 내장 톰켓 서버에서 스프링 컨테이너 컨트롤러에서 hello-mvc를 찾는다.
3. hello-template에 Model을 리턴해준다. (이때, model(name:spring)이다.)
4. viewResolver가 templates/hello-template.html을 톰켓 서버를 통해 웹 브라우저로 뿌려준다.
API
API는 Application Programming Interface의 약자로, 어떤 서버의 특정한 부분에 접속해서 그 안에 있는 데이터와 서비스를 이용할 수 있게 해주는 소프트웨어 도구라 보면 된다. (허용된 사람에게만 접근성을 부여할 수도 있다.)
즉 OS와 응용 프로그램, 응용 프로그램과 프레임워크(플랫폼) 사이 사이 중간 제어 인터페이스라고 보면된다.
@ResponseBody
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello " + name;
}
@ResponseBody를 사용하면 뷰 리졸버를 사용하지 않는다.
대신에 HTTP Body에 문자 내용을 직접 반환한다.
얼핏 봤을 땐 MVC를 사용했을 때봐 별 차이는 없어 보이지만, F12를 눌러서 확인해보면
body에만 내용이 적혀있는걸 확인할 수 있다.
mvc에서는 뷰 리졸버가 html으로 변환해서 보여주는걸 확인할 수 있다.
@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;
}
}
@ResponseBody를 사용하고 객체를 반환하면 JSON 형식으로 변환된다.
JSON은 'key:value'로 이뤄진 데이터 포맷이다.
스프링 컨테이너에서 @ResponseBody 어노테이션이 붙어있으면 HttpMessageConverter가 Json형식으로 변환할건지, String형식으로 변환할건지 결정한다.
이때 객체 반환은 Json으로 변환된다.
요약
1. 정적 컨텐츠는 스프링 컨테이너에서 관련 컨트롤러가 없을 경우, static 디렉토리에서 찾아서 뿌려준다.
2. MVC 패턴은 Controller를 조작하여 model을 업데이트하여 view를 통해 볼 수 있다.(view resolver가 html으로 변환해준다)
3. @ResponseBody를 사용하면 View Resolver를 사용하지 않고 HTTP의 Body에 직접 반환한다.
4. @ResponseBody를 사용하면 View Resolver 대신 HttpMessageConverter가 작동하여 객체를 반환하면 JSON로 처리해준다.
'개발공부 > JAVA,스프링' 카테고리의 다른 글
[JAVA] static, final, static final (0) | 2023.02.26 |
---|---|
[스프링] Model 객체 (0) | 2023.02.22 |
인프런 스프링 입문(4) - 스프링 빈 (0) | 2023.02.22 |
인프런 스프링 입문 (3) - 회원 관리 및 테스트 작성 (0) | 2023.02.20 |
인프런 스프링 입문 (1) - 개발환경 세팅 및 라이브러리 (2) | 2023.02.12 |