밍경송의 E.B

SPRING 4- 스프링 웹 개발 (정적 컨텐츠, MVC와 템플릿 엔진, API) 본문

lang./SPRING

SPRING 4- 스프링 웹 개발 (정적 컨텐츠, MVC와 템플릿 엔진, API)

m_gyxxmi 2023. 3. 17. 00:43

**이 글은 인프런의 <스프링 입문-코드로 배우는 스프링부트, 웹 MVC, DB접근 기술>의 내용을 바탕으로 작성하였습니다.

 

안녕하새우 이번에는 스프링 웹 개발에 대해 아주 조금.. 아주 조금 더 자세히 이해해보는 시간을 가져보겠숩니다.!

 

스프링 웹 개발은 크게 3가지로 나뉘는데요.

1 정적 컨텐츠

2 MVC와 템플릿 엔진

3 API

 

차례대로 공부한 내용을 적어보도록 하겠습니다.

 

 

먼저 1 정적 컨텐츠는 스프링부트는 기본적으로 static 폴더에 정적 컨텐츠를 제공한다는 특징을 갖습니다.

간단한 html 코드를 작성 , run한 후 localhost:8080/static/hello-static.html으로 접속해보면,

그냥 코드를 입력한 그대로 반환되는 진짜 정적인 방법인데요.! 어떤 원리로 돌아가는지 안 봐도 아시겠조..?

아래 그림을 통해 자세히 살펴보겠습니다.

웹 브라우저에 localhost:8080/hello-static.html을 치면 내장 톰캣 서버가 이 요청을 받습니다. 

후에 이것을 springboot로 넘겨주는데 이때, 1) controller가 우선 순위를 가지고 hello-static이라는 컨트롤이 있는지

찾아봅니다. 없으면 2) resources 안에 있는 static에서 이를 찾게 되는데, hello-static이라는 파일이 있으면

이를 웹브라우저에 그대로 반환해줍니다. 그래서 소스 코드를 봐도 입력한 html 코드가 그대로 보여집니다.

 

 

다음으로 2 MVC(Model View Controller) 와 템플릿 엔진 에 대해 살펴보겠습니다. 이전에 Tomcat에 대해 배울 때 MVC에 대해 간략하게 설명을 했었는데 기억하실랑가요~!>?

강의를 들어보니 예전에는 MVC 각각이 분리되지 않은 회사들이 많았는데, 최근의 경향은 View는 화면에 관련된 일만, Controller는 비즈니스 로직과 서버 뒷단의 일만 하는 것으로 분리된 편이라고 하네요>!@

 

이전에 만들었던 HelloController.java 파일에 새로운 함수를 생성해줍니다. return값은 hello-template으로 합니다.

그럼 hello-template의 이름을 가진 html 파일도 새로 작성해야겠죠?

resources/templates/hello-template.html 생성 후 간단한 코드 입력합니다.

thmeleaf의 장점! 파일 자체의 경로를 COPY 해서 파일을 서버 없이 그냥 열어봤을 때도 껍데기를 볼 수 있답니다.

이 파일에서는 hello! empty 만이 출력되겠네요!

그리고 localhost:8080/hello-mvc?name=spring 으로 들어가시면 두둥탁 hello spring이라는 글씨가 뜹니다.

 

*여기서 주의할 점 ..

평소대로 localhost:8080/hello-mvc만 친다면? Required String parameter 'name' is not present라는 에러가 뜹니다.

돌아가서 우리가 작성한 Parameter의 정보를 확인해보면, required 의 기본이 TRUE라고 뜨기 때문인데요.

그 말은 즉슨 서버에 접속할 때 을 꼭 넘겨줘야 한다는 소리...!!!!!!!!!!!

무슨 말인지 어려우시죠..,, 넹 저두 그렇습니다..

 

그래도 일단 처음이니까 이해를 잘 해봅시다!

localhost:8080/hello-mvc?name=spring (get방식에서는 ? =로 값을 넣음) 처럼

?name=나의입력값 을 적어줘야만 에러 없이 제대로 된 출력물을 볼 수 있습니다.

(parameter의 required가 false면 값을 입력하지 않아도 된대요_)

 

그래야 name이라는 Key의 data 값이 spring으로 바뀌고, 후에 controller에서 return 값인 hello-template.html로 넘어가서 ${name}(model의 key값이 name인 것에서 값을 치환) spring으로 바뀌는 것입니다.

 

만약 제가 localhost:8080/hello-mvc?name=spring@@@ 라고 적었다면 hello spring@@@ 이 떴을 것이라는 것 아시겠조..?

그렇다면 MVC는 어떤 원리로 돌아가는 걸까요? 

웹 브라우저에서 이를 넘기면 내장 톰캣 서버를 거쳐서, 이것은 spring으로 넘어가 controller로 들어가서 그 메소드를 호출해줍니다. 거기서 리턴값과 모델에 대한 내용을 viewResolver가 동작을 하는데요.  return값이었던 것의 이름과 같은 html을 찾아서 Thymeleaf 엔진에게 이를 넘깁니다. 그럼 Thymeleaf 엔진이 이를 변환한 후에 웹브라우저로 넘겨줍니다.

그래서 소스 코드를 보면 hello spring 이라고 뜨는 것을 확인할 수도 있을 것입니다.

 

 

이제 마지막으로 3 API 방법에 대해서 배워보겠습니다.

API는 html로 변환하거나 하는 과정을 거치지 않고 data 자체를 그대로 내려주는 방법이라고 하는데요.  

 

controller/HelloController.java에 아래 코드를 추가해서 정확히 어떤 방법인지 확인해봅시다.

 

 

@ResponseBody

ㄴ> http통신에서  body 부에 이 내용을 직접 넣어주겠다는 의미로 추가하는 것인데요,이것이 과연 어떤 차이를 불러올지..

 

ㄴ이전에 배웠듯, ?= data 의 방법을 이용합니다.

*개발자 소스를 확인해봤는데요,.!+

html태그가 하나도 안 보이고 data를 넣은 그대로 보여지는 게 보이시나요? 이전에 배웠던 방법들과는 다르게 

emplate 조작을 하지 않고 data를 그대로 내려주는 방법이라는 게 정말인 것 같습니다.

 

이번에는 Controller/HelloController.java 아래 객체를 반환하는 코드를 자봅시다.

@GetMapping("hello-api")
 @ResponseBody
 public Hello helloApi(@RequestParam("name") String name) {
 Hello hello = new Hello();
 hello.setName(name);
 return hello;
 }
 static class Hello {
 private String name;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }

 hello라는 문자가 아닌 객체를 넘겨봤는데요, 과연 어떤 일이 일어날까요!!!

두둥탁 .. 이전과는 다르게 key와 value 값이 : 을 통해 그대로 나타났네요! 

우리는 @Responsebody를 사용하고 객체를 반환하면 객체가 JSON방식으로 변환된다는 걸 확인할 수 있습니다.

 

잠깐 ..그렇다면, JSON이란 무엇일까요?

JSON이란 JavaScriptObjectNotation의 줄임말로, 데이터를 저장/전송할 때 사용되는 '경량'의 DATA 교환 형식입니다.

JSON은 이전에 많이 사용되었던 XML 방식과 비교해볼 수 있는데요.

 

XML은 데이터 값 양쪽으로 태그가 존재합니다. 그래서 아무리 간단한 표현식이라도 양쪽에 꼭 태그가 필요하죠

우리가 잘 아는 HTML이 바로 XML입니다.

 

한편, JSON은 {}(중괄호)와 같은 형식으로 이를 표현하고, 값은 ','로 나열하기 때문에 표현이 비교적 간단합니다.

앞서 본 것처럼 { String key : String value } 이렇게 표현되곤 합니다. 이해가 되시나욧..?

 

그렇다면 API의 원리에 대해 좀 더 자세히 알아보겠습니다.

서버로부터 받은 요청에 @Responsebody라는 게 안 적혀있었으면 viewresolver가 동작합니다. (MVC)

하지만 적혀있다면? viewresolver 대신에 HttpMessageConverter가 동작합니다\.

1 단순 문자가 온 경우 -> stringconverter가 data를 그대로 넘겨주고,

2 객체가 온 경우 -> JsonConverter가 넘어온 요청을 Json 스타일(형식으)로 바꿔서 요청한 서버한테 보내줍니다.

*spring은 Jackson이라는 lib를 넣어놓아서 -> MappingJackson2HttpMessageConverter 가 돌아가게 한다고 하네요.

 

 

 

이상으로 스프링 웹 개발 기초에 대한 작성을 마치겠습니다. 다음에 또 바요 뿅`