Java/Spring

Spring MVC

태감새 2023. 2. 4. 23:34

웹서버


웹서버 : HTTP 기반 서버. 정적 리소스와 기타 부가기능을 제공 (APACHE)

WAS (Web Application Server) : HTTP 기반 서버. 웹서버 기능 대부분 제공. 동적인 HTML 생성, HTTP API(JSON)도 WAS를 통해서 제공 (톰캣)

정적 웹페이지
서버에 미리 저장된 파일(HTML,Image 등등)을 그대로 전달하는 웹페이지.
서버는 사용자의 요청에 해당하는 웹 페이지를 보냄.

동적 웹페이지
서버에 있는 데이터를 가공처리한 후 클라이언트에게 전송하는 웹페이지.
서버는 사용자의 요청을 해석하여 데이터를 가공한 후 생성된 웹 페이지를 보냄.
현재 대부분의 페이지들은 동적 웹페이지다.

동적 웹페이지의 종류
CSR (Client-Side Rendering)
자바 스크립트에 데이터를 포함해서 보낸 후 클라이언트 쪽에서 HTML을 완성하는 방법
서버는 JSON 파일만 보내줌.
SSR (Server-Side Rendering)
서버쪽에서 템플릿 HTML에 데이터를 끼워넣어 완성된 HTML을 보내는 방식

사실 둘의 경계는 모호하다. WAS는 애플리케이션 코드를 실행하는데 더 특화되어있다.

웹서버의 구성

클라이언트 -> 웹서버 -> WAS -> DB
정적은 웹서버에서 담당하고 동적은 WAS에 넘긴다. 그런데 WAS에서 설정 해야하는 일이 너무 많고 복잡하다. 그래서 서블릿을 사용하면 번거로운 과정을 모두 자동화해서 제공해준다.

  • Servlet?

서블릿은 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 어플리케이션 컴포넌트다.
동적 웹페이지를 지원하는 기술.


Spring MVC

Model - View - Controller 디자인 패턴

  • Model : 처음에 정의하는 상수, 초기화 값 등 어플리케이션의 데이터를 나타낸다.
    • 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
    • 규칙 1번
  • View : 사용자한테 보여지는 부분, UI(User Interface)를 의미. 컨트롤러로 받은 모델의 결과값을 화면에 출력하는 일을 한다.
    • 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
  • Controller : Model과 View를 이어주는 역할.

Model

스프링이 지원하는 기능으로 HashMap 자료구조이다.
addAttribute("key",value) 메서드로 데이터를 저장하고 이 값을 view에 전달한다.
view 파일에서는 ${key}로 value에 접근할 수 있다.

장점

유지보수가 용이하다.

규칙

  1. Model은 Controller와 View에 의존하지 않아야 한다. (Model 내부에 Controller와 View에 관련된 코드가 있으면 안된다. import x)
  2. View는 Model에만 의존해야 하고, Controller에는 의존하면 안된다. (View는 Model의 코드만 있을 수 있고, Controller의 코드가 있으면 안된다.)
  3. View가 Model로부터 데이터를 받을 때는, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
  4. Controller는 Model과 View에 의존해도 된다. (Controller 내부에는 Model과 View의 코드가 있을 수 있다.)
  5. View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.

동작 흐름

springmvc

  1. 요청이 들어오면 HandlerMapping을 통해서 요청을 처리할 수 있는 컨트롤러 빈을 검색하고 반환한다.
  2. DispatcherServlet은 HandlerMapping 에서 찾은 컨트롤러 빈을 HandlerAdapter에게 처리를 넘긴다.
  3. HandlerAdapter는 Condtroller에게 알맞은 메서드를 요청한다.
  4. HandlerAdapter는 Controller에게 받은 결과물을 ModelAndView로 변환하여 DispatcherServlet으로 전달한다.
    • RestController 경우 ResponseEntity를 반환
  5. DispatcherServlet은 스프링 컨테이너에서 ViewResolver 빈 객체를 찾아서 호출한다.
  6. ViewResolver는 View객체를 찾거나 생성해서 반환한다.

mvc 정리글


정리

MVC

  1. Dispatcher를 통해 HTTP요청을 받는다.
  2. Mapping을 통해 컨트롤러에 처리가능한 메서드를 발견하면 그 메서드를 작동시킨다.
  3. Model에 필요한 데이터를 저장하고 view name을 반환한다. (혹은 ModelAndView를 반환)
@GetMapping("hello")    
    public String hello(Model model) {  
    model.addAttribute("data","hello!!");  
    return "hello";  
}
// Model에 데이터 입력 후 view name 반환
@GetMapping("/")  
public ModelAndView home() {  
    return new ModelAndView("index");      
}
// ModelAndView 반환
// @RestController여서 ModelAndView로 반환한듯
// 원래는 ModelAndView(String viewName, Map model) 형식

4. view name을 이용해서 view resolver는 view를 그리고 필요한 데이터는 Model에서 가져와서 사용한다.

5. 완성된 view를 반환한다.

MVC와 Service, Repository

MVC패턴을 공부하면서 가장 헷갈렸던 부분이 Service와 Repository다. 예제를 보면 항상 Controller, Service, Repository 패키지를 만들고 시작한다. 내가 배운건 MVC인데 왜 Service, Repository를 사용하는지 의문이 들었다.

흐름

service와 repository는 controller가 명령을 받고 수행을 할 때 사용한다. controller는 요청을 수행하기 위한 로직을 service를 통해 수행한다. service는 로직에 필요한 데이터를 repository를 통해 얻고 비지니스 로직을 수행해서 반환한다. 반환된 결과로 controller가 결과를 반환한다. Member를 빼먹었는데 Model을 담당하지 않을까 짐작해본다.

추가로 궁금한 내용

  • controller에서 view name을 반환한 다음의 과정이 아직 이해가 안됐다.
  • 스프링 컨테이너와 스프링 빈이 뭔지

'Java > Spring' 카테고리의 다른 글

SpringMVC (1) - WAS와 WebServer  (0) 2023.04.19
스프링 배치 이해하기  (0) 2023.04.18
애너테이션  (0) 2023.02.05
스프링 컨테이너  (0) 2023.02.05
JPA 기초  (0) 2023.02.04