3월 06, 2024

Spring MVC, 템플릿 엔진 동작방식

1. Spring MVC 방식

지난 포스팅에서 Spring의 정적 컨텐츠 방식에 대하여 다루어보았다. 

https://www.programmingstory.com/2024/02/spring-boot.html

오늘은 한 단계 더 나아가서 Spring의 MVC 방식에 대하여 다루어보려고 한다. 

MVC는 모두가 알고 있겠지만 model, view, controller 방식을 지칭하며 기술면접이나 기술필기시험에 단골로 등장하는 개념이기도 하다. 하지만 Spring 초보자에게는 MVC 방식을 정확히 이해하기 어렵기에 오늘 한 번 자세히 다루어보려고 한다. 

2. Spring MVC diagram 



일단 스프링의 MVC 방식을 하나의 그림으로 정리하면 위와 같다. 


3. Spring MVC 소스 예제 

그리고 Controller java source와 html 파일이 하나 필요하여 두 가지 소스를 먼저 정리하고 방식을 설명해보도록 하겠다. 

 

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ExampleController {

    @GetMapping("example-mvc")
    public String ExampleMvc(@RequestParam("name")String name, Model model){
        model.addAttribute("name", name);
        return "example-template";
    }
}

 

먼저 예시로 만들어준 ExampleController이다. 

 

여기서 @GetMapping("example-mvc") 를 통해 

http://localhost:8080/example-mvc.html

url로 들어오게 되면 

 

내장된 Tomcat Server를 거쳐 Controller의 처리가 들어가게 된다. 

 

해당 메서드에서는 name이라는 parameter를 받고 있으므로 url에 name 도 포함하여 넣어주어야 한다. 

 

아니면 이렇게 whitelabel error page가 뜰 것이다. 

 

url을 통해 name parameter를 전달 받게 되면 model.addAttribute를 통해 model에도 name parameter를 전달해주게 되고 

return으로 example-template이라는 template을 반환한다. 

 

 

이렇게 되면

templates/example-template.html

이라는 경로의 template을 참고하게 되고 viewResolver를 통해 템플릿엔진 처리를 하게 된다. 

 

그러면 example-template.html 파일을 templates라는 폴더 아래 만들어주어야 한다. 

 

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'Your name is ' + ${name}"></p>
</body>

간단하게 위와 같이 html 을 만들어보았다. 

 

그러면 전달받은 name이라는 모델의 값이 html로 전달이 되는 것이다. 

 

그러면 위 name을 치환하여 html을 변환하고 이를 다시 웹 브라우저에 전달하여 변환된 html이 보여지는 것이다. 정적 컨텐츠로 보여주는 것과는 다른 부분이라고 할 수 있다. 

 



name=Tom이라는 parameter까지 url에 넣어서 전달하면 

이렇게 변환된 html이 web browser에 보여지는 것을 알 수 있다.

 

이렇게 해서 오늘은 간단한 Spring의 mvc 방식에 대하여 알아보았다. 


2월 05, 2024

[Spring MVC 패턴] MVC 정의, 구성요소, 다이어그램, 장단점 총정리

 오늘은 Spring MVC 구조에 대하여 살펴보도록 하겠다. 


1) MVC 패턴이란? 


Spring MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴으로, 각 영역을 Model, View, Controller로 나누어 코드를 작성하는 개발 방식이다. 


- Model: 웹 애플리케이션이  Client의 요청을 받아 요청사항을 처리하기 위한 작업을 한다. 응답을 돌려줄 때 작업의 처리 결과 데이터를 model이라고 부른다. 

- View: web 상에서 보이는 리소스를 제공하는 역할을 한다. 우리가 흔히 아는 HTML 페이지나 JSP 등이 View에 해당된다. 

- Controller: Controller는 Model과 View 사이의 상호작용을 해주는 역할을 수행한다. 



2) Spring MVC 구조 다이어그램



MVC 디자인 패턴이 Model, View, Controller로 구성되어 있는 디자인 패턴이라는 것은 많은 사람들이 알지만 실제로 안에서 구체적으로 어떻게 동작하는지는 모르는 사람들이 있다.


위 다이어그램을 보고 각 구성요소를 하나씩 공부해보자.


- DispatcherServlet

DispatcherServlet은 Client의 요청(Request)을 받는다. https://www.programmingstory.com/2024/01/front-controller-pattern.html

위 이전 글에서 다루었듯이 Controller의 Controller로 Front Controller라고 불리기도 한다. 


- HandlerMapping

HandlerMapping은 요청으로 들어온 클라이언트의 요청 URL을 어떤 Controller에서 처리할지를 결정한다. 


- HandlerAdapter

해당 Controller를 처리할 수 있는 Adapter를 찾아서 Controller의 작업을 수행해준다. Controller에서 비즈니스 로직을 수행하면 나오는 Model은 HandlerAdapter를 통해 ModelAndView로 return된다.


- ModelAndView

Controller에서 처리한 결과 정보와 View에 필요한 정보를 담는다.


- ViewResolver 

ModelAndView로 전달을 받으면 실제 Client에게 보여질 View를 렌더링하기 위해 어떤 View를 사용할지 결정한다.


- View

ViewResolver에 의해 View가 결정되면 해당 객체에 해당되는 View가 렌더링된다. 


3) MVC 디자인 패턴의 장단점

MVC 디자인 패턴은 모델, 뷰, 컨트롤러를 나누어 개발할 수 있기에 개발이 파트별로 나뉘어 진행될 수 있다는 장점을 가진다. 테스트 및 디버그가 쉽다는 장점이 있으며, 각 구성요소별로 나누어져 있어 중복된 코드를 제거할 수 있다는 장점이 있다. 


다만 구성요소별로 나누어져 있기 때문에 많은 파일이 생성될 수 있고 유지보수가 어렵다는 단점이 있다. 


2월 05, 2024

[Spring MVC] Controller Interface, Forward Controller, Handler Mapping 자바 소스로 구현해보기

 https://www.programmingstory.com/2024/01/forward-redirect.html

이전 포스팅에서 Forward 방식과 Redirect 방식의 차이점에 대해 다루어보았다. 


오늘은 Forward 방식을 구현한 Forward Controller와 Controller Interface를 구현해보겠다. 


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class ForwardController implements Controller {

    private String url;


    public ForwardController(String url) {

        this.urlurl;

    }


    @Override

    public String handle(HttpServletRequest request, HttpServletResponse response) throws Exception {

        return url;

    }

}

위가 Forward 방식을 구현한 간단한 Controller이다. 


다양한 방식의 Controller가 있을 수 있기 때문에 Controller라는 Interface를 하나 더 만드는 것이 좋다.


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {

    String handle(HttpServletRequest request, HttpServletResponse response) throws Exception;

}


이런 식으로 구현을 할 수 있다.


또 MVC에서는 HandlerMapping을 통해 Controller를 찾아주는데 위 소스도 아래와 같이 구현해볼 수 있다. 


즉, 원하는 HandlerMap과 Controller를 Map<> 자료구조로 받아 놓고 HandlerMap을 Key값으로 하여 매핑되어 있는 Controller를 반환해주는 형식이다. 아래 소스에서는 /user/register로 URL이 GET 요청으로 들어오면 ForwardController가 해당 url로 forward 시켜주는 소스이다. 


import java.util.HashMap;

import java.util.Map;


public class RequestMappingHandlerMapping{

    private Map<HandlerMap, Controller> handlerMappings = new HashMap<>();


    void init() {

        handlerMappings.put(new HandlerMap("/user/register", RequestMethod.GET), new ForwardController("/user/register"));

    }

    public Controller findHandler(HandlerMap handlerMap) {

        return handlerMappings.get(handlerMap);

    }

}


8월 30, 2023

Spring Web MVC 아키텍쳐 알아보기

[Spring] - 모델-뷰-컨트롤러(MVC) 패턴이란?

 

이전 포스팅에서 모델-뷰-컨트롤러라는 전체적인 MVC 패턴에 대하여 알아보았다. 오늘은 더 범위를 좁혀서 Spring Web MVC 아키텍쳐에 대하여 알아보도록 하겠다.

 

Spring Web MVC 아키텍쳐는 아래의 그림 하나로 요약이 가능하다. 



  

위 다이어그램에서 볼 수 있듯이 Srping Web MVC에서 핵심이 되는 것은 "DispatcherServlet"이다. 이는 등록된 요청 핸들러라고 할 수 있으며 요청을 전달하는 프론트 컨트롤러이다. 프론트 컨트롤러는 다른 컨트롤러들을 관리하는 최상위 컨트롤러라고 할 수 있다. 

 

각 핸들러는 서비스의 역할을 수행하며 DispatcherServlet이 요청을 전달할 뷰를 지정하게 된다. 


위 다이어그램을 통해서 Spring Web MVC에서 어떠한 과정으로 플로우가 흘러가는지 간단히 설명하도록 하겠다.

 

1. HTTP 요청 : 요청이 DispatcherServlet에 연결된다. 

 

2. 요청에 따른 컨트롤러 확인: DIspatcherServlet은 요청 경로에 따라 등록된 핸들러 중 어떤 핸들러가 호출되어야 할 지 결정하여 요청을 다시 전달하게 된다.

 

3. HTTP 요청: HTTP 요청을 핸들러가 처리하게 된다. 1번은 HTTP 요청이 DIspatcherServlet 즉 최상위 컨트롤러에 전달되어 어떤 컨트롤러에게 전달되어야 되는지 확인했던 과정이라면, 3번에서는 직접 연결되는 컨트롤러에 HTTP 요청이 전달된 것이라고 보면 된다. 

 

4. 모델 쿼리 업데이트: 핸들러는 모델에 대한 쿼리나 업데이트를 수행한다.

 

5. 모델 데이터 반환: 모델에서 필요한 작업을 수행한 뒤 모델 데이터가 반한된다. 

 

6. 모델 및 뷰 반환: 핸들러는 데이터와 논리 뷰 이름을 최상위 컨트롤러인 DIspatcherServlet으로 반환한다.

 

7. 뷰 이름으로 뷰 찾기: 논리 뷰 이름을 전달받은 DispatcherServlet은 뷰 이름을 확인하여 뷰 이름으로 뷰를 찾는다.

 

8. 모델 데이터 전달: 실제 뷰에 모델 데이터를 전달한다. 

 

9. 페이지 렌더링: 뷰에서는 모델 데이터를 전달받아 응답을 생성하고 DispatcherServlet은 응답을 클라이언트로 내보낸다. 

 


전반적인 개념 설정은 위와 같고, 실제 구체적인 예시를 통해 Spring Web MVC 응용프로그램을 만드는 것은 다음 포스팅에서 다루어보도록 하겠다.