후라이
Spring Boot - 스프링 입문 (3) 본문
스프링 웹 개발 기초
- 정적 컨텐츠 : HTML 파일, CSS 스타일시트, JavaScript 파일, 이미지, 폰트와 같이 서버에서 변경되지 않고 그대로 웹 브라우저에게 전송되는 것 -> 그냥 파일 찾아서 응답으로 보내주면 끝
- MVC와 템플릿 엔진 : Model-View-Controller 부분으로 나눠짐 / 동적으로 HTML을 생성하는데 활용
- API : 클라이언트와 서버 간의 데이터 전송, 서버-서버 간의 데이터 전송 시 활용
JSON 형식(데이터 구조 포맷)이 많이 사용됨
-> 이렇게 3가지 방식이 있음. 당연히 API가 많이 쓰임
정적 컨텐츠
: 스프링 부트 정적 컨텐츠 기능
<!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에 접속하면
추가적인 처리도 없고, 템플릿 처리없이 그대로 클라이언트에게 컨텐츠가 제공된다.
위에서는 hello-static.html 파일을 요청했으니, 그 파일을 그냥 보여줌
MVC : Model, View, Controller
1. Model(모델) : 어플리케이션의 데이터, 비즈니스 로직, 상태를 나타냄
모델은 데이터의 가공, 변경, 유지 관리 등을 책임지며, 뷰(View)나 컨트롤러(Controller)에 독립적으로 존재함
2. VIew(뷰) : 사용자에게 정보를 표시하고, 모델의 데이터를 시각적으로 나타내는 부분 -> 동적으로 생성되는 내용을 담당
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
3. Controller(컨트롤러) : 클라이언트로부터의 요청을 받아들이고, 해당 요청에 대한 비즈니스 로직을 처리
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String hellomvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
localhost:8090/hello-mvc?name=spring!!
에 접속하면 해당 요청이 실행되었음을 알 수 있음
앞 과정은 정적 컨텐츠와 동일함
1. 컨트롤러 선택 및 실행 : DispatcherServlet은 클라이언트의 요청에 대응하는 핸들러(Controller)를 찾아서 실행함
-> Controller는 해당 요청을 처리하고 비즈니스 로직 수행
2. 모델 및 뷰 생성 : Controller는 수행 결과로 model이 생성되고, viewResolver에 의해 특정한 뷰 템플릿 파일과 연결됨
해당 뷰 템플릿 파일을 렌더링하여 최종적인 응답을 생성한다.
(웹 서버는 클라이언트로부터 HTTP 요청을 받아들이고, 정적인 웹 페이지나 다양한 형태의 정적 컨텐츠를 제공하는 서버임.
주로 HTML, CSS, JavaScript, 이미지 파일 등과 같은 정적 파일을 처리, 동적인 컨텐츠는 주로 "웹 어플리케이션 서버"에게 위임)
API방식
: 웹 API는 HTTP 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 담당 -> 데이터는 주로 JSON, XML 형식
HelloController 클래스에 내용 추가
* @ResponseBody 문자 반환
@GetMapping("hello-string")
@ResponseBody //Body부에 이 부분을 바로 넣어주겠다.
public String helloString(@RequestParam("name") String name) {
return "hello "+ name; //"hello spring"
//이건 뷰 없이 문자가 바로 내려간다고 생각하면 됨
//URL에 쓴 name을 바꾸면 그 바꾼 문자 내용이 웹에 바로 반영
}
@ResponseBody를 사용하면 viewResolver를 사용하지 않음
-> 대신에 HTTP의 BODY에 문자 내용을 직접 반환 (HTML BODY TAG 아님)
*ResponseBody 객체 반환
@GetMapping("hello-api")
@ResponseBody //이게 없으면 위에 처럼 viewResolver에게 전달
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello(); //문자가 아닌 객체를 넣어줌
hello.setName(name);
return hello;
//객체가 오면 JSON 방식으로 만들어서 HTML에 보냄
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ReponseBody : 스프링 MVC에서 컨트롤러의 메서드가 HTTP 응답의 바디 부분을 작성하도록 지정하는 애너테이션
view를 거치지 않고 직접 HTTP 응답으로 전송됨.
@RequestParam("name") String name : URL의 쿼리 파라미터에서 "name"이라는 이름의 값을 읽어와서 메서드의 매개변수인 name에 저장하는 역할
-> 여기서는 쿼리 파라미터의 값이 "spring!!!!"가 되는 거고 name 매개변수에 전달됨 --> 이 값을 가지고 Hello 객체가 만들어짐
localhost:8090/hello-api?name=spring!!!!
결과적으로
Hello 객체는 스프링에 의해 JSON 형식으로 변환되어 HTTP 응답으로 전달되면서
JSON형태로 응답을 생성한다.
(JSON 데이터 형식은 적절히 활용하여 원하는 동작을 수행할 수 있도록 함.)
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter가 동작
- 기본 문자 처리 : StrnigHttpMessageConverter
- 기본 객체 처리 : MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
'Spring' 카테고리의 다른 글
[Spring Boot] - H2 데이터베이스 연결 / Database not found (0) | 2024.02.12 |
---|---|
[Spring Boot] - 스프링 입문 (5) (1) | 2024.01.21 |
[Spring Boot] - 스프링 입문 (4) (0) | 2024.01.21 |
Spring Boot - 스프링 입문 (2) (1) | 2024.01.07 |
Spring Boot - 스프링 입문 (1) (1) | 2024.01.06 |