본문 바로가기

Spring Study

Spring 입문 Study - 정적 컨텐츠, MVC, 템플릿 엔진, API방식

728x90

✅ 정적 컨텐츠

 

정적 컨텐츠란 클라이언트의 요청을 받고 서버에 미리 저장된 HTML, CSS, JS 등의 파일을 그대로 응답해

보여주는 것을 말한다. 모든 클라이언트들의 요청에 대해 동일한 결과를 보여준다.

 

 

resources 폴더 아래 static에  hello-static.html 파일을 만들었다.

그리고 @SpringBootApplication 어노테이션이 있는 파일을 실행시킨 뒤

http://localhost:8080/hello-static.html 에 접속하면 화면이 뜨게 된다.

 

 

 

정적 컨텐츠를 띄우게 되는 원리는 다음과 같다.

 

1. 내장 톰켓 서버가 웹 브라우저로 부터 요청을 받는다.

2. springboot가 hello-static 에 관련된 컨트롤러를 확인한다. 

3. springboot가 resources 아래 static 폴더에서 hello-static.html을 찾는다.

4. 요청받은 파일이 존재하면 화면에 띄운다.

 

 

✅ MVC & 템플릿 엔진

🖥️ MVC 패턴

 

View : 화면을 그리는데에 집중

Model & Controller : 비즈니스 로직을 처리하는데 집중

 

 

🖥️ 템플릿 엔진

 

다음과 같은 메소드를 만들었다. 

@RequestParam은 서블릿 요청 파라미터를 컨트롤러의 메소드 인수로 바인딩 할 수 있는 어노테이션이다.

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestparam.html

 

@RequestParam :: Spring Framework

By default, method parameters that use this annotation are required, but you can specify that a method parameter is optional by setting the @RequestParam annotation’s required flag to false or by declaring the argument with an java.util.Optional wrapper.

docs.spring.io

쉽게말해 웹에서 name이라는 데이터가 전달되면 helloMvc 메소드의 파라미터인 String name에 해당 데이터를

바인딩 하겠다는 어노테이션이다.

데이터 전달은 다음과 같이 할 수 있다. http://localhost:8080/hello-mvc?name=""

"" 에 원하는 name 데이터를 적으면 된다.

 

@RequestParam은 name을 받기로 되어있는데 http://localhost:8080/hello-mvc?age="" 와 같이 

요청을 보내면 전달이 되지 않는다. ? 뒤에는 파라미터의 키라고 생각하면 될듯

 

이처럼 name이 아닌 age를 전달하니 오류가 발생했다.

 

helloMvc 메소드가 리턴한 "hello-template" 파일에 name 인수가 전달되어

 

동그라미 친 부분에 데이터가 들어가게 된다. 

동그라미 옆에 hello! empty 같은 경우는 서버가 켜지지않은 상태에서 동작했을 때 나타나는 

디폴트 값? 이다.

 

좀더 구체적으로 작동 순서를 정리하자면

 

1. 웹브라우저에서 내장 톰켓 서버에 localhost:8080/hello-mvc 를 넘긴다

2. 내장 톰켓이 스프링에게 전달하고 스프링이  helloController에 해당 메소드(helloMvc)가 매핑되어있는 것을 확인한다

3. 메소드를 호출하고 hello-template에 @RequestParam으로 받은 데이터를 함께 전달하기 위해 스프링에게 넘긴다.

4. 스프링이 건네 받은 것을 (화면에 관련된, 뷰를 찾아서 템플릿 엔진에 연결시켜 주는) viewResolver에 전달한다.

5. viewResolver가 name 에 해당되는 값을 템플릿 엔진에게 처리 요청하고

6. 템플릿 엔진이 렌더링하여 변환된 HTML을 웹브라우저에게 넘긴다.

 

 

✅ API 방식

view 가 없이 데이터를 JSON 형식으로 반환하는 방식이다.

 

helloApi 메소드를 만들고 위에서 했던 것처럼 @RequestParam 어노테이션을 통해 name 데이터를 받았다.

위에서 했던 방식과 2가지 다른 점이 있는데, 하나는 Hello 객체가 생겼다는 것, 2번째는 

@ResponseBody 어노테이션이 생겼다는 것이다.

 

@ResponseBody 는 HTTP Body 부에 return 하는 데이터를 직접 넣어주기 위해 사용한다.

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestbody.html

 

@RequestBody :: Spring Framework

You can use @RequestBody in combination with jakarta.validation.Valid or Spring’s @Validated annotation, both of which cause Standard Bean Validation to be applied. By default, validation errors cause a MethodArgumentNotValidException, which is turned in

docs.spring.io

 

API 방식으로 데이터를 건낼 경우 JSON 형식으로 데이터가 반환된다.

 

HTTP 응답의 반환으로 객체를 반환하게 되는 경우 Spring 에서 디폴트로 JSON 형식으로 반환하게 되어있다.

@ResponseBody를 사용하면 HTTP의 BODY에 문자 내용을 직접 반환한다. 그리고 viewResolver 가 아닌 HttpMessageConverter 가 동작한다.

만약 반환된 값의 형식이 단순 String, 기본 문자라면 StringHttpMessageConverter 가 동작하고

객체라면 MappingJackson2HttpMessageConverter가 동작한다. Jackson은 객체를 Json으로 바꿔주는 라이브러리이다.

스프링은 Json변환 라이브러리를 기본으로 Jackson으로 채택했다.

MappingJackson2HttpMessageConverter 가 넘겨받은 객체를 JSON 형식으로 바꾸고 웹 브라우저에 전달한다.

728x90
반응형