스프링 웹 개발 기초
웹을 개발하는 3가지 방법
정적 컨텐츠
- 정적 컨텐츠는 파일을 그대로 그냥 고객한테 웹브라우저로 전달해주는 방식
MVC와 템플릿 엔진
- 서버에서 변형을 해서 HTML을 바꿔서 내려주는 방식
API
- JSON 데이터 구조 포멧으로 클라이언트에게 데이터를 전달하는 방식
- 서버끼리 데이터들을 통신할 때
정적 컨텐츠
[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>
http://localhost:8080/hello-static.html
- 웹브라우저에 http://localhost:8080/hello-static.html을 친다.
- 내장 Tomcat 서버가 이 요청을 받고, 스프링 컨테이너에 넘기게 된다.
- 먼저 컨트롤러(우선순위 ↑) 쪽에서 hello-static이 있는지 확인을 한다.
- resources 안에 hello-static.html을 찾는다.
- 다시 역순으로 웹브라우저에 반환을 해준다.
MVC와 템플릿 엔진
MVC: Model, View, Controller
Controller
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) { // 외부에서 파라미터 받음
model.addAttribute("name", name);
return "hello-template";
}
}
View
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p th:text="'hello ' + ${name}">hello empty</p>
</body>
</html>
http://localhost:8080/hello-mvc
이대로 실행하면 파라미터로 넘긴 값이 없다고 에러가 발생하게 됩니다.
WARN 20012 --- [hello-spring] [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]
- required 가 기본으로 true 이기 때문에 기본으로 값을 넘겨야 한다.
- 파라미터 값 없이 해당 메서드를 호출하고 싶다면 required = false 로 설정해준다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model) { // @RequestParam 외부에서 파라미터 받기
model.addAttribute("name", name);
return "hello-template";
}
http://localhost:8080/hello-mvc?name=spring!
- http get 방식에서 ?(물음표) &(and) &(and) 같은 방식으로 파라미터를 넘겨줄 수 있다.
실행 과정
1. @GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
2. @GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name = spring!, Model model) {
model.addAttribute("name", spring!);
return "hello-template";
}
- Controller 에서 name은 spring! 으로 바뀌고 model 에 담긴다.
- hello-template 으로 반환된다.
- ${name} 이 model 의 key 값을 꺼내고 spring! 으로 치환된다.
API
@ResponseBody 문자 반환
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
- @ResponsBody 의 Body는 body 태그를 얘기하는 것이 아닌 http Body부에 이 데이터를 직접 넣어주겠다는 뜻
- HTML(View) 필요 없이 문자가 그대로 내려 간다.
http://localhost:8080/hello-string?name=ssambbong
위에 경우는 잘 쓰지 않는 방식이지만 문자 같은 것이 아니라 데이터를 줘봐 라고 하면 말이 달라집니다.
이런 이유 때문에 API 방식을 많이 쓰고 있습니다.
@ResponseBody 객체 반환
@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;
// JavaBean 표준방식(Getter/Setter) or 프로퍼티 접근 방식
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- HelloController 안에 새로운 클래스를 만들고 멤버 변수와 메서드를 작성해주었다.
- helloApi 메서드가 실행되면 Hello 객체를 만들고 파라미터로 받은 name의 값을 지정한다.
- 객체 값을 리턴하였다.
http://localhost:8080/hello-api?name=ssambbong!
- 이것은 JSON 이라는 방식이다.
- Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.
- 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용힌다.
- 현재 트렌드는 xml 방식보다 json 방식으로 넘어왔다.
@ResponseBody 사용 원리
@ResponseBody 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신 HttpMessageConveter 가 동작
- 기본 문자처리: StringHttpMessageConverter 가 처리
- 기본 객체처리: MappingJackson2HttpMessageConverter 가 처리
- byte 처리 등등 여러 HttpMessageConverter가 기본으로 등록되어 있다.
정리
- 정적 컨텐츠: 파일을 있는 그대로 내려준다.
- MVC와 템플릿 엔진 : 템플릿 엔진을 이용해서 렌더링된 파일을 내려준다.
- API 방식: 객체 반환이 된다면 JSON 형식으로 변환해서 내려준다.
'Spring' 카테고리의 다른 글
[Spring] 객체 지향 설계 SOLID 원칙 (0) | 2024.06.10 |
---|---|
[Spring] AOP (0) | 2024.06.10 |
[Spring] 스프링 DB 접근 기술 (0) | 2024.06.10 |
[Spring] spring-boot-devtools (0) | 2024.06.09 |
[Spring] 정적 페이지, 템플릿 엔진 동작 (1) | 2024.03.28 |