HTTP(HyperText Transfer Protocol)
응답과 요청
- 응용계층에 정의된 통신 규약
- 서버와 클라이언트 간에 메시지를 전달하는 형식을 정의한 규약
요청
- Request Line: Method, Path, Version
- Request Headers: HTTP 요청에 대한 부수적인 데이터
- Request Body: HTTP 요청에 관한 실제 데이터
응답
- Status Line: 요청 처리에 대한 상태 표시 줄
- Response Headers: HTTP 응답에 대한 부수적인 데이터
- Response Body: 응답 데이터
JSON
- 데이터를 주고받을 때 흔히 사용하는 형태
- 속성(Attribute) - 값(Value)의 형태와 배열(Array)을 활용한다.
MVC & Controller & RestController
MVC
MVC(모델-뷰-컨트롤러)는 소프트웨어 디자인 패턴이다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고있다. 이러한 “관심사 분리”는 더나은 업무의 분리와 향상된 관리를 제공한다
Model
- 데이터와 비즈니스 로직을 관리
- 애플리케이션이 포함해야할 데이터가 무엇인지를 정의
- Java Beans
View
- 레이아웃과 화면을 처리
- 애플리케이션의 데이터를 보여주는 방식을 정의
- Thymeleaf 등 여러 Template Engine이 있음
Controller
- View와 Model 사이의 인터페이스 역할
- 애플리케이션 사용자의 입력에 대한 응답으로 Model 및 View를 업데이트하는 로직을 포함
참고
@Controller와 @RestContoller의 차이점
차이점: HTTP Response Body가 생성되는 방식
@Contoller
- 전동적이 Spring MVC의 컨트롤러
- View를 반환
- @ResponseBody를 사용하면 View를 리턴하지 않고 Controller에서 직접 데이터 리턴 가능
- @Controller가 Data를 반환하는 경우 @ResponseBody 어노테이션을 활용 → JSON형태로 데이터를 반환
@RestController
- RESTful 웹 서비스의 컨트롤러
- @RestController = @Copntroller + @ResponseBody
- JSON/XML 타입의 HTTP 응답을 직접 리턴
- 주용도로는 JSON 형태로 객체 데이터를 반환하는 것
Controller에서 View를 반환하는 케이스 이외에 JSON Data를 반환해야되는 케이스에 @Controller + @ResponseBody를 함께 쓰는 번거로움을 해결하기 위해서 @RestController 탄생
참고
HTML Template
- Static(정적) Contents: 이미 작성이 완료되어 변하지 않는 파일들, HTML, CSS, JS, Image
- Dynamic(동적) Web Page: 서버에서 HTML 문서의 내용을 데이터에 따라 다르게 작성하여 제공되는 페이지
- 템플릿 엔진
- 동적 컨텐츠를 생성하는 방법
- FreeMarker, Groovy, Thmeleaf, Mustache 등이 있다.
Thymeleaf
비교적 최근에 만들어진 템플릿 엔진이며 서버사이드 자바 템플릿 엔진의 한 종류
의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Controller
@Controller
public class SampleController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "dsunni");
return "hello";
}
}
Thymeleaf 사용
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${name}">Name</h1>
</body>
</html>
참고