Spring MVC 4(1): 웹 페이지 작성 실습 1 & 2 { DispatcherServlet 설정, Spring MVC 설정 }
Ben의 프로그램
2023. 8. 3. 20:52
728x90
수업목표
이번 시간에는 Spring MVC를 이용하여 웹 어플리케이션을 작성하는 방법에 대하여 실습을 통해 알아보도록 하겠습니다.
어떤 실습을 할거냐면
Maven 프로젝트 생성
우선 실습을 위한 메이븐 프로젝트를 하나 우선 생성하겠습니다.
archetype 을 설정해주고 next 를 누릅니다.
위와 같이 group id 와 artifact id 를 주고 생성합니다.
메이븐 프로젝트를 생성한 다음에는 라이브러리를 pom.xml 에 추가해주어야 합니다. spring-context, spring-webmvc, servlet-api, jsp-api 를 추가해주었습니다.
그 다음 project.facet 파일의 jst.web 의 버전을 3.1 로 수정한 다음 이클립스를 재시작 해줍니다.
프로젝트를 업데이트를 시켜주면 모든 준비가 끝났습니다.
DispatcherServlet 을 FrontController 로 설정하기
DispatcherServlet 이 FrontController 라는 것을 설정을 해주어야 해당 역할을 수행할 수 있게 됩니다. 위에서 보는 것처럼 3가지 방법으로 설정을 할 수 있습니다. 이 중에서 가장 많이 사용되는 방법은 web.xml 에 설정하는 방법과 WebApplicationInitializer 인터페이스를 구현해서 사용하는 방법입니다. 이 두가지를 사용해보겠습니다.
======================== [ web.xml 활용하여 설정하기 ] ==============================
web.xml 파일에 설정을 하게되는데요. 이 파일에 servlet 을 등록하게 되는데요. 실제 servlet name 은 servlet mapping 이 갖고 있는 servlet name 과 일치하기만 하면 됩니다. servlet class 가 실제로 내가 동작시킬 클래스를 의미하는데요. 이때는 spring이 제공하는 dispatcherservlet 을 이용할 것이기 때문에 반드시 패키지 명을 포함해서 클래스명을 잘 넣어주어야 합니다. init param 에서는 spring 이 제공하고 있는 dispatcherservlet 을 어떻게 사용할 것인지에 대해서 설정을 하고 있는 부분이라고 이해할 수 있습니다.
그 다음 설정인데요. Java Config spring 설정을 읽어들이도록 DispatcherServlet 설정을 해주고 있습니다. 위의 설정에서 두번째 param-value 부분을 보면 이전에 넣었던 xml 파일 대신에 java 클래스가 들어가 있는 것을 볼 수 있는데요. xml 파일이 아니라 java config 파일을 읽어오고 있구나라고 이해할 수 있습니다. 수업에서는 이 방법을 이용해서 설정들을 읽어오도록 할 겁니다. 이때 잘 보면 Servlet 이었을 경우에 요청이 들어오면 servlet-mapping 태그 안에 우리가 원하는 url 을 넣고 servlet name 과 같은 실제 servlet 을 위에서 servlet 태그 안에서 찾아서 실행한다라고 이해하시면 됩니다. 그런데, 여기서 <url-pattern> 태그에 '/' 슬러시가 입력되어 있는 것을 확인할 수 있는데요. 이 슬러시 덕분에 특정 하나의 요청만 받아들이는 것이 아니라 모든 요청을 받게 됩니다. 모든 요청을 DispatcherServlet 이 받도록 설정하는 것은 이렇게 간단하게 설정 가능했습니다.
=================== [ WebApplicationInitializer 활용하여 설정하기] ====================== Spring 이 제공하는 WebApplicationInitializer 를 활용할 수도 있다고 했었는데요. 이 방법의 단점은 애플리케이션 실행이 오래 걸릴 수도 있다는 점입니다. Spring MVC는 WebApplicationInitializer 구현체를 찾고 그 속에 있는 onStartup 을 활용하는데요. 구동 시간이 오래 걸린다는 단점이 있습니다.
위와 같이 설정을 하는데요. 우리 수업에서는 다루지 않습니다.
Spring MVC 설정
DispatcherServlet 에 대한 설정은 web.xml 에서 수행을 하고 DispatcherServlet 이 읽어들이는 설정은 별도로 하게 되는데요. 이런 설정을 Java Config 로 한다고 했었습니다. DispatcherServlet 은 해당 설정 파일을 읽어들여서 내부적으로 Spring Container 인 ApplicationContext 를 생성하게 됩니다. 우선 위의 코드에서 사용된 애노테이션들에 대해서 먼저 알아보고 넘어가겠습니다.
-) @Configuration : 이 어노테이션으로 인해서 Java Config 파일이구나라는 것을 알려줍니다.
-) @EnableWebMvc : @EnableWebMvc 애노테이션은 DispatcherServlet 의 RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, MessageConverter 등 Web 에 필요한 빈들을 대부분 자동으로 설정 해준다. 기본 설정 이외의 설정이 필요하다면 WebMvcConfigurerAdapter 를 상속받도록 Java config class 를 작성한 후, 필요한 메소드를 오버라이딩 하도록 한다. 소스코드를 직접 살펴보면 좀 더 자세히 살펴볼 수 있는데요. EnableWebMvc 인터페이스를 상속받고 있는 것을 확인할 수 있습니다.
-) @ComponentScan : Spring MVC 에서는 핸들러, 즉, 컨트롤러를 찾아야 하는데요. 어떤 애가 컨트롤러임을 찾기 위해서는 @ComponentScan 이라는 애노테이션이 사용이 됩니다. 여러분들이 직접 만들었던 빈을 xml 파일에 등록을 해보았었는데요. 그렇게 등록할 수도 있지만 애노테이션을 이용해서 사용할 수 있는데요. 현재 우리는 @Controller 라는 애노테이션을 사용할 예정이기 때문에 해당 애노테이션이 붙은 것들을 찾아낼 수 있도록 @ComponentScan 애노테이션을 사용합니다. 정리하자면, @ComponentScan 애노테이션을 이용하면 Controller, Service, Repository, Component 애노테이션이 붙은 클래스들을 찾아 스프링 컨테이너가 관리하게 된다. 한편 우리가 작성할 컨트롤러에는 URL Mapping 정보가 애노테이션으로 설정이 되어 있을 건데요. 이런 URL Mapping 정보는 DispatcherServlet 이 관리하는 Request Mapping 객체들로 설정이 될 거구요. 이것을 위해서 DefaultAnnotationHandlerMapping 과 RequestMappingHandlerMapping 의 구현체가 사용이 됩니다. 이 두 개의 구현체는 애노테이션을 사용해 매핑 관계를 찾는 매우 강력한 기능을 가지고 있습니다. 이들 구현체는 스프링 컨테이너 즉 애플리케이션 컨텍스트에 있는 요청 처리 빈에서 RequestMapping 애노테이션을 클래스나 메서드에서 찾아 HandlerMapping 객체를 생성하게 된다. 여기서 HandlerMapping 객체는 서버로 들어온 요청을 어느 핸들러로 전달할지 결정하는 역할을 수행합니다. DefaultAnnotationHandlerMapping 은 DispatcherServlet 이 기본으로 등록하는 기본 핸들러 맵핑 객체이고, RequestMappingHandlerMapping 은 더 강력하고 유연하지만 사용하려면 명시적으로 설정을 해야한다는 특징이 있습니다.