💻 Backend

정적 컨텐츠 / MVC와 템플릿 엔진 / API 란? - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

미미누 2021. 12. 18. 17:37

오늘은 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고 

정적컨텐츠, MVC와 템플릿 엔진, API에 대해서 정리해보고자 한다.

 

 

1. 정적 컨텐츠(서버에서 파일을 그대로 웹브라우저에 전달)

 

 정적 컨텐츠란, 서버에서는 파일을 그대로 웹 브라우저에 보내 주는 방식을 의미한다. 이전에 설명한 Welcome Page와 같다고 볼 수 있다. 

 <과정 설명>

  1. 웹 브라우저에서 localhost:8080/hello-static.html 로 요청하면 내장 톰캣 서버가 해당 요청을 받는다.
  2. 톰캣 서버는 먼저 스프링 컨테이너에 hello-static.html요청이 왔음을 알린다.
  3. 스프링 부트에서는 ''컨트롤러''가 우선순위가 있기 때문에, 가장 먼저 컨트롤러 중에 hello-static.html 관련 내용이 있는지 확인한다.
  4. 컨트롤러에 해당 내용이 없으면 그 다음으로 resources: static에 hello-static.html 관련 내용이 있는지 찾는다.
  5. 있으면 해당 내용(html파일)을 반환한다.

 

2. MVC와 템플릿 엔진 

 템플릿 엔진(JSP, PHP 등) - HTML을 그냥 보내주는 것이 아닌, 서버에서 프로그래밍을 통해 동적으로 바꾸어서 보내주는 역할을 한다. 

 

MVC: HTML을 동적으로 바꾸기 위한 요소 : Model, View, Controller를 의미한다.

 

Model과 Controller는 로직과 관련되거나 내부 처리를 담당한다.

예를 들어 Controller - HelloController.java 파일이 있다.

 

@RequestParam() : 외부(웹)에서 매개변수를 받아올 때 사용

 

View 뷰 : 화면을 그리는 역할 담당한다.

View - resources/template/hello-template.html 파일을 사용하는데, html 파일을 이용하는 것과 같다. 

강의에서는 thymeleaf 템플릿 엔진을 사용해서 html 파일을 가져왔다. 

 

<MVC와 템플릿 엔진 방식 설명>

  1. 웹 브라우저에서 localhost:8080/hello-mvc로 요청한다.
  2. 스프링부트의 내장 톰캣 서버에서 해당 요청을 받아 스프링 컨테이너로 넘겨준다.
  3. 스프링 컨테이너는 가장 먼저 컨트롤러를 살피며 해당 요청(hello-mvc)에 맵핑된(@GetMapping()) 사항이 있는지 확인한다.
  4. 맵핑된 사항이 있으면, 맵핑된 메서드 helloMvc()를 호출해 준다.
  5. helloMvc()가 실행된다.
  6. 리턴값인 hello-template를 보내고, 동시에 Model에 키=name, 값=spring인 데이터를 넣어 보낸다.
  7. 스프링 viewResolver가 이를 받아 동작한다.템플릿엔진은 해당 html파일을 받아 View라는 템플릿을 변환한 다음, 변환된 html파일을 웹브라우저에 넘겨 준다.
  8. src/main/resources/template에서 View(hello-template.html)를 찾아 주고, 템플릿엔진(여기서는 Thymeleaf)을 연결시켜 준다.

 

3. API

API가 뭔지 궁금했었는데, 오늘 조금 해소된 것 같다. API란 안드로이드/아이폰 개발에 사용이 되고, 서버끼리 통신 할 때 주로 사용된다고 한다. 

즉, xml / JSON 데이터 구조 포맷으로 클라이언트에 데이터를 전달하는 방식을 API방식이라고 한다.

현재는 xml대신 JSON 방식으로 사용된다고 한다.

 

이때 JSON 방식이란 무엇일까? 

태그로 표현하기 보다는 중괄호({}) 같은 형식으로 하고, 값을 ','로 나열하기에 그 표현이 간단하다. 

 

{
  "employees": [
    {
      "name": "Surim",
      "lastName": "Son"
    },
    {
      "name": "Someone",
      "lastName": "Huh"
    },
    {
      "name": "Someone else",
      "lastName": "Kim"
    } 
  ]
}

이런식으로, key, value 값으로 나눠서 데이터를 전송하는 방식을 의미한다. 

 

<API 방식 설명>

  1. 웹 브라우저에서 localhost:8080/hello-api 요청
  2. 내장 톰캣 서버에서 hello-api요청을 스프링 컨테이너에 전달한다.
  3. 스프링 컨테이너는 hello-api가 맵핑(@GetMapping("hello-api"))되어 있으면 해당 메소드(helloApi())를 실행한다.
  4. 이 때 메소드에 @ResponseBody 어노테이션이 있으면, HTTP응답에 해당 데이터(리턴값)을 그대로 넘기고 HttpMessageConverter가 동작한다.
  5. (반대로 메소드에 @ResponseBody 어노테이션이 없으면, MVC방식대로 viewResolver가 동작한다.)
  6. 이 때 해당 메소드의 리턴값이 객체이면, 기본적으로 JSON형식으로 데이터를 만들어 HTTP응답에 반환한다.
  7. return: hello(name:spring)
  8. 받은 객체를 가지고 HttpMessageConverter 가 동작한다.
    • 받은 객체가 단순 문자(String) 라면 StringConverter가 동작한다.
    • (기본 문자처리 : StringHttpMessageConverter)
    • 받은 객체가 일반 객체라면 JsonConverter가 동작한다 - 객체를 키와 값을 가지는 JSON형식으로 변환한다.
    • (기본 객체처리 : MappingJackson2HttpMessageConverter)
    • byte처리 등 기타 여러 HttpMessageConverter가 기본 등록되어 있음.
  9. 변환된 내용을 웹브라우저에 반환한다.