스프링으로 웹 개발을 하는 방법은 크게 세가지가 있다.
- 정적 컨텐츠 : welcome page처럼 파일을 그대로 웹 브라우저에 전달해주는 방법
- MVC와 템플릿 엔진 : 서버에서 파일을 동적으로 바꿔서 전달해주는 방법 (가장 많이 사용)
- API : json이라는 데이터 포맷으로 클라이언트에 전달할 때, 서버끼리 통신할 때
정적 컨텐츠
src>resources>static에 html 파일을 작성해서 넣어주면 그대로 반환해줌 (프로그래밍은 불가)
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>
정적 컨텐츠 출력 과정
localhost:8080/hello-static.html 요청을 내장 톰캣 서버에서 받고, Spring은 먼저 Controller에 hello-static.html이 있는지 찾아본다. (Controller가 우선순위를 가짐) 파일이 존재하지 않으면 다음으로 resources에서 파일을 찾는다.
MVC와 템플릿 엔진
- MVC : Model, View, Controller
- 뷰에서는 화면과 관련된 일만 처리하고, 컨트롤러에서는 비즈니스 로직과 서버와 관련된 일만 처리하도록 나누어져 있다.
thymeleaf
- thymeleaf 장점 : 서버없이 파일을 열어서도 볼수있다.
- ex) C:\Users\suea7\hello-spring\hello-spring\src\main\resources\templates\hello-template.html
- 파일을 열어서 보면 <p>태그 사이의 내용이 출력된다.
- 서버를 돌면 내용은 치환된다.
HelloController에 매개변수를 받아 모델에게 넘겨주는 메서드 추가
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model ) {
model.addAttribute("name",name);
return "hello-template";
}
hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
처음 실행하게 되면 에러가 난다. 로그를 보면 name의 parameter가 없다는 메세지가 뜬다. @RequestParam에서 required는 default로 true이다. 즉 무조건 parameter(name)를 넣어줘야 한다는 것이다. name의 값으로 "spring"를 넘겨주면 제대로 작동한다.
웹 브라우저가 localhost:8080/hello-mvc를 요청하면 내장 톰캣 서버를 거쳐 Spring은 컨트롤러에서 hello-mvc를 찾고, "hello-template"을 반환하는데 이때 생성된 모델의 key값(name)에 대한 value가 spring으로 들어가면서 viewResolver에서 hello-template파일을 찾아 name의 값을 spring으로 변환하여 출력한다.
API
HelloController에 @ResponseBody를 사용하여 문자열을 반환하는 메서드 추가
@GetMapping("hello-string")
@ResponseBody // http의 body에 직접 넣어주겠다
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
@ResponseBody를 사용하면 viewResolver를 사용하지 않고 HTTP의 body에 문자 내용을 직접 반환한다. 웹 페이지의 소스 코드를 보면 출력된 결과가 그대로 출력된다.
HelloController에서 @ResponseBody를 사용하여 객체를 반환하는 메서드 추가
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello; // json 형식으로 반환
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ResponseBody를 사용하고 객체를 반환하면 객체가 JSON으로 변환된다. (최근 프로젝트는 XML보다 JSON을 많이 사용)
@ResponseBody 사용 원리
클라이언트로부터 요청이 들어오면 내장 톰캣 서버를 거쳐 컨트롤러의 메서드가 실행되고 이때 @ResponseBody가 사용된 메서드가 실행되면 HTTP의 body에 문자 내용을 직접 반환한다. 클라이언트에게 응답을 할 때 viewResolver가 아닌 HttpMessageConverter가 동작한다. 넘어온 반환값이 단순 문자일 경우 SpringConverter가 동작하고 객체일 경우 JsonConverter를 거쳐 json 형식의 데이터를 생성해서 클라이언트에게 넘겨준다.
강의 링크
[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
'Spring' 카테고리의 다른 글
[Spring] 스프링 입문 (4) - 스프링 빈과 의존 관계 (0) | 2022.02.27 |
---|---|
[Spring] 스프링 입문 (3) - 회원 관리 예제 (백엔드 개발) (0) | 2022.02.27 |
[Spring] 스프링 입문 (1) - 프로젝트 환경설정 (0) | 2022.02.26 |