[Spring] 스프링 MVC 시작하기

첫걸음 - 9

Posted by owin2828 on 2019-12-30 16:11 · 8 mins read

0. Goal


  • 스프링 MVC 설정
  • 웹 브라우저의 요청을 처리할 컨트롤러 구현
  • 컨트롤러의 처리 결과를 보여줄 코드 구현

이어지는 확장은 다음과 같다.

  • 컨트롤러에서 서비스DAO를 사용해 클라이언트의 요청 처리
  • 컨트롤러에서 요청 파라미터의 값을 하나의 객체로 받고 값 검증
  • 스프링이 제공하는 JSP 커스텀 태그를 이용해서 처리
  • 컨트롤러에서 세션이나 쿠키를 사용
  • 인터셉터로 컨트롤러에 대한 접근 처리
  • JSON 응답처리

0-1. MVC란?

  • MVC는 디자인 패턴중 하나로, Model, View, Controller의 약자
  • 하나의 애플리케이션이나 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴

    MVC1

  • controllermodel을 통해서 데이터를 가져오고, 그 정보를 바탕으로 시각적인 표현을 담당하는 view를 제어해서 사용자에게 전달
  • 각 구성요소가 지니는 특징은 다음과 같다.
    1. Model
      • 사용자가 원하는 모든 데이터를 가지고 있어야 한다.
      • 뷰나 컨트롤러에 관한 정보는 알 수 없다.
      • 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야만 한다.
    2. View
      • 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
      • 모델이나 컨트롤러와 같이 다른 구성요소들을 알 수 없다.
      • 변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.
    3. Controller
      • 모델이나 뷰에 대해서 알고 있어야 한다.
      • 모델이나 뷰의 변경을 모니터링 해야 한다.
  • MVC패턴을 사용함으로써 유지보수성, 확장성, 유연성이 증가하고 중복코딩은 사라지게 됨

0-2. 스프링 MVC 주요 구성 요소 및 처리 흐름

MVC

  • Dispatcher: 클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성
  • HandlerMapping: 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정
  • Controller: 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴
  • ModelAndView: 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음
  • ViewResolver: 컨트롤러의 처리 결과를 생성할 뷰를 결정
  • View: 컨트롤러의 처리 결과 화면을 생성, JSP 또는 Velocity 템플릿 파일 등을 뷰로 사용

1. 프로젝트 설정


웹 어플리케이션 개발을 위한 메이븐 프로젝트의 디렉토리 구조는 다음과 같다.

  • src/main.java
  • src/main/webapp
  • src/main/webapp/WEB_INF
  • src/main/webapp/WEB_INF/view

1-1. pom.xml

  • 기존 pom.xml 파일에 다음과 같은 dependency를 추가

      <packaging>war</packaging>
    
      <!-- 아래부터 dependency -->
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
    
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
    


1-2. Tomcat 설정

  • 본 프로젝트에서는 Tomcat 8.5.43 버전을 기준으로 수행

2. 스프링 MVC 기본 설정


스프링 MVC 실행을 위해 필요한 최소한의 설정은 다음과 같다.

  • 스프링 MVC의 주요 설정 - HandlerMapping, ViewResolver

  • 스프링의 DispatcherServlet 설정

2-1. 스프링 MVC 설정

    // MvcConfig.java  
    @Configuration
    @EnableWebMvc  // 스프링 MVC 설정을 활성화하는 어노테이션
    public class MvcConfig implements WebMvcConfigurer {

            /*
            * DispatcherServlet의 매핑경로를 '/'으로 주었을 때,  
            * JSP/HTML/CSS 등을 올바르게 처리하기 위한 설정을 추가
            */
        @Override
        public void configureDefaultServletHandling(
                DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }

            // JSP를 이용해 컨트롤러의 실행 결과를 보여주기 위한 설정 추가
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/view/", ".jsp");
        }

    }
  • 기존의 복잡한 설정을 대체하는 @EnableWebMvc 어노테이션을 이용시, 내부적으로 다양한 빈 설정을 추가해줌
  • WebMvcConfigurer 인터페이스는 스프링 MVC 개별 설정을 조절할 때 사용

2-2. web.xml 파일에 DispatcherServlet 설정

  • 스프링 MVC가 웹 요청을 처리하려면 DispatcherServlet을 통해 웹 요청을 받아야 함

  • 이를 위해 web.xml 파일에 DispatcherServlet을 등록

    web.xml 파일은 src/main/webapp/WEB_INF/ 에 위치

3. 코드 구현

다음 두 가지 코드를 구현

  • 클라이언트의 요청을 알맞게 처리할 컨트롤러
  • 처리 결과를 보여줄 JSP

3-1. 컨트롤러 구현

    // HelloController.java
    @Controller // 컨트롤러로 지정
    public class HelloController {

        @GetMapping("/hello") // 메서드가 처리할 요청 경로를 지정, 이 경우 /hello 경로
        public String hello(Model model,
                // name 요청 파라미터 값을 name 파라미터에 전달
                @RequestParam(value = "name", required = false) String name) {
            model.addAttribute("greeting", "안녕하세요, " + name);
            return "hello"; // 컨트롤러의 처리 결과를 보여줄 뷰 이름으로 "hello"를 사용
        }
    }
  • 스프링 MVC 프레임워크에서 컨트롤러란 웹 용청을 처리하고 그 결과를 뷰에 전당하는 스프링 Bean 객체
  • 컨트롤러로 사용될 클래스는 @Controller 어노테이션을 붙임
  • @GetMapping 어노테이션이나 @PostMapping 어노테이션과 같은 요청 매핑 어노테이션을 이용해 경로 지정
  • @RequestParam 어노테이션은 HTTP 요청 파라미터를 매서드의 파라미터로 전달

    http://localhost:8080/sp5-chap09/hello?name=bk
    여기서 name의 파라미터에 해당하는 값을 전달

  • addAttribute() 매서드는 뷰에 전달할 데이터를 지정하기 위해 사용

      // ControllerConfig
      @Configuration
      public class ControllerConfig {
    
          @Bean
          public HelloController helloController() {
              return new HelloController();
          }
    
      }
    
  • 컨트롤러를 스프링의 Bean객체로 등록

3-2. JSP 구현

  • 컨트롤러가 생성한 결과를 보여줄 뷰 코드는JSP로 구현

      <%-- hello.jsp --%>
      <%@ page contentType="text/html; charset=utf-8" %>
      <!DOCTYPE html>
      <html>
      <head>
          <title>Hello</title>
      </head>
      <body>
          인사말: ${greeting}
      </body>
      </html>
    
  • HelloController()의 hello() 매서드가 리턴한 뷰 이름은 “hello”와 동일한 파일명
  • 뷰 이름과 JSP 파일과의 연결은 MvcConfig 설정 클래스의 다음 설정을 통해 이루어짐

      // MvcConfig.java
      @Override
      public void configureViewResolvers(ViewResolverRegistry registry) {
          registry.jsp("/WEB-INF/view/", ".jsp");
      }
    
  • 다음과 같이 사용된 JSP EL(Expression Language)는 컨트롤러의 구현에서 Model에 추가한 속성의 이름과 동일

      인사말: ${greeting}
    

실행결과
주소창에 http://localhost:8080/sp5-chap09/hello?name=bk 를 입력하였을 경우 다음과 같은 화면이 출력
인사말: 안녕하세요, bk