후라이

Spring Boot - 스프링 입문 (3) 본문

Spring

Spring Boot - 스프링 입문 (3)

힐안 2024. 1. 7. 22:54

스프링 웹 개발 기초

 

  • 정적 컨텐츠 : HTML 파일, CSS 스타일시트, JavaScript 파일, 이미지, 폰트와 같이 서버에서 변경되지 않고 그대로 웹 브라우저에게 전송되는 것 -> 그냥 파일 찾아서 응답으로 보내주면 끝
  • MVC와 템플릿 엔진 : Model-View-Controller 부분으로 나눠짐 / 동적으로 HTML을 생성하는데 활용
  • API : 클라이언트와 서버 간의 데이터 전송, 서버-서버 간의 데이터 전송 시 활용 
    JSON 형식(데이터 구조 포맷)이 많이 사용됨

-> 이렇게 3가지 방식이 있음. 당연히 API가 많이 쓰임

 


 

정적 컨텐츠

 

: 스프링 부트 정적 컨텐츠 기능

Spring Boot Features

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

<!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 객체가 만들어짐  

 

JSON 방식

localhost:8090/hello-api?name=spring!!!!

 

결과적으로

Hello 객체는 스프링에 의해 JSON 형식으로 변환되어 HTTP 응답으로 전달되면서

JSON형태로 응답을 생성한다.

(JSON 데이터 형식은 적절히 활용하여 원하는 동작을 수행할 수 있도록 함.)

 

 

 

- HTTP의 BODY에 문자 내용을 직접 반환

- viewResolver 대신에 HttpMessageConverter가 동작

- 기본 문자 처리 : StrnigHttpMessageConverter

- 기본 객체 처리 : MappingJackson2HttpMessageConverter

- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음