웹 개발은 크게 아래 3가지로 나뉜다.
정적 컨텐츠
- 파일을 그대로 웹브라우저에 내려주는 것
- 스프링부트에서는 기본적으로 /static or /public or /resources or /META-INF/resources의 경로에 위치한다.
- css, js, ttf 등등등 바뀌지않는 리소스 파일들이 위치하는 곳이다.
아래의 문서에 더 자세한 내용이 있다.
먼저 스프링 컨테이너에서 컨트롤러를 탐색 후 컨트롤러가 없으면, resources 에서 찾아 반환한다.
MVC와 템플릿 엔진
MVC : Model, View, Controller
- 과거의 jsp, php는 view의 분리없이 한 파일에서 현재의 MVC 역할을 모두 수행하여 유지보수에 어려움이 있었다
- 서버에서 프로그래밍을 통해 동적인 html을 내려준다
// Controller
@GetMapping("hello-mvc")
// intellij parameter 정보 단축키 : ctrl + p
public String helloMvc(@RequestParam(name = "name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
컨트롤러를 정의해주고, http://localhost:8080/hello-mvc?name=냠
의 형태로 주소창에 입력해보면 아래의 사진과 같이 입력한 name 값이 나오는 것을 알 수 있다. 기존 p 태그 내부의 text는 속성으로 치환된다. 서버에서가 아닌 html에서 볼때는 내부 text 값이 보인다.
API
- 주로 json의 포맷으로 변환하여 데이터를 반환한다.
- 서버끼리의 통신에도 사용한다
@GetMapping("hello-string")
@ResponseBody // http 통신시 response body에 해당 데이터를 넣어주겠다는 의미
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
이런 형태에서 http://localhost:8080/hello-string?name=숑숑
를 주소창에 입력 후 소스를 보면 html이 아닌 단순 텍스트인걸 알 수 있다.
객체를 생성후 객체를 return 할 수도 있는데, json의 형태로 리턴한다.
@GetMapping("hello-api")
@ResponseBody
// 객체를 반환하면 json형태로 리턴한다
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name; // getter setter 생성 단축키 : alt + insert
// 프로퍼티 접근방식 : getter, setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ResponseBody 어노테이션
- 뷰 리졸버(viewResolver)를 사용하지 않고 HTTP BODY에 해당 내용을 직접 반환한다.
- 뷰 리졸버 대신
HttpMessageConverter가 동작
- 기본적으로 문자는
StringHttpMessageConverter
, 객체는MappingJackson2HttpMessageConverter
가 처리한다. - 이외 기타 등등 처리 모두
HttpMessageConverter
가 동작하여 처리한다.
객체는 Google의 라이브러리도 있는데 spring에서는 Jackson을 차용한다. 아무래도 좀더 범용적이라고 생각한다.
클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보를 조합해 HttpMessageConverter가 선택된다.
위 글은 김영한 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 무료강의를 듣고 정리한 내용입니다.
'Backend > Spring' 카테고리의 다른 글
[Spring] 의존성 주입(Dependency Injection) 4가지 방법 (0) | 2023.12.29 |
---|---|
Configuration은 어떻게 Bean을 등록하고 관리할까? (0) | 2023.12.28 |
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #4 스프링 빈과 의존관계 (0) | 2023.11.21 |
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #3 회원 관리 예제(백엔드) (0) | 2023.09.12 |
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #1 (1) | 2023.08.30 |