[Spring] Spring MVC 프로젝트 생성

Fortice·2021년 1월 29일
0

Spring

목록 보기
8/13
post-thumbnail

스프링 MVC 시작하기 - Maven, VSCode

프로젝트 생성

VSCode 환경에서 Maven for Java 를 이용해 Maven 프로젝트를 만들고 웹 어플리케이션 개발을 위한 src/main/webapp 폴더를 생성한다.

webapp은 웹 어플리케이션을 구현하는데 필요한 코드가 위치한다. HTML, CSS, JS, JSP등 파일이 존재하며, 하위 폴더 WEB-INF에는 web.xml이 있어 웹 어플리케이션 설정을 할 수 있다.

구조는 아래와 같다.
디렉터리 구조

pom.xml을 설정을 살펴본다.

서블릿/JSP를 이용한 웹 어플리케이션을 개발할 경우 war(web application archive)로 패키징 해야하기 때문에 설정을 해야하지만, Maven for Java가 자동으로 설정해 주었다.

기본적으로 스프링 부트 Dependency가 있는데, 이를 제거하고, 필요한 모듈을 추가한다.

  • javax.servlet-api (서블릿 API)
  • javax.servlet.jsp-api (JSP API)
  • jstl (JSP Tag)
  • spring-webmvc (spring mvc)

톰캣 설정

  1. 톰캣 공식 홈페이지 에서 톰캣 9.0을 설치한다.
  2. VSCode Tomcat for Java Extention을 설치한다.
  3. 톰캣 설치 한 폴더를 지정한다 --> 톰캣 서버가 등록된다.

스프링 MVC 설정

이번 실습을 위해 간단한 최소 설정을 한다.

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

1. MVC 설정

// main/java/com/fortice/config/MvcConfig.java
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{
    
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // TODO Auto-generated method stub
        //WebMvcConfigurer.super.configureDefaultServletHandling(configurer);
        configurer.enable();
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // TODO Auto-generated method stub
        // WebMvcConfigurer.super.configureViewResolvers(registry);
        registry.jsp("/WEB-INF/view/",".jsv");
    }
}

@EnableWebMvc 어노테이션으로 스프링 MVC의 다양한 기본 설정을 대신 해준다.

어노테이션이 기본 설정을 대신 하준다면 WebMvcConfigurer 인터페이스는 개별 설정을 위한 것이다.

configureDefaultServletHandlingDispatcherServlet의 매핑 경로를 "/"로 주었을 때, JSP/HTML/CSS 를 올바르게 처리하기 위함이다.

configureViewResolvers 는 JSP를 이용해서 컨트롤러의 실행 결과를 보여주기 위한 설정이다.

Servlet과 DispatcherServlet

  • Servlet

웹 어플리케이션을 만들기 위해 클라이언트의 요청에 대해 동적으로 동작하는 Java 기술이다. Java Thread로 동작하며, HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다. MVC의 C의 역할로 보면 된다.

  • Dispatcher Servlet

클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿컨테이너가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러 이다. 원래는 모든 서블릿에 대해 url 매핑을 활용하기 위해 web.xml에 등록을 해주어야 했지만 이를 관리하여 해소해주었다.

더 자세한 내용들은 다음에 알아보겠다.

2. web.xml 파일 설정 (DispatcherServlet 설정)

스프링 MVC가 웹 요청을 처리하기위해 DispatcherServlet을 이용해 요청을 받는데, 이를 web.xml에 등록해주어야 한다.

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">

	<servlet>
		<!-- Dispacher Servlet을 dispatcher 이름으로 등록 -->
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
      
  		<!-- contextClass 초기화 파라미터를 설정. 아래 클래스는 자바 설정을 이용하는 웹앱 용 스프링 컨테이너 클래스-->
		<init-param>
			<param-name>contextClass</param-name>
			<param-value>
				org.springframework.web.context.support.AnnotationConfigWebApplicationContext
			</param-value>
		</init-param>
		<!-- contextConfiguration 초기화 파라미터 값 설정 ( 스프링 설정 클래스 목록 지정) -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
				config.MvcConfig
				config.ControllerConfig
			</param-value>
		</init-param>
		<!-- 톰캣과 같은 컨테이너가 웹앱 구동 시 서블릿을 함께 실행하도록 설정 -->
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- 모든 요청을 dispatcher가 처리하도록 서블릿 매핑-->
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- HTTP 요청 파라미터의 인코딩 처리를 위한 서블릿 필터 등록 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

코드 구현

설정을 완료했으므로, 실제로 코드를 구현한다.

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

1. 컨트롤러 구현

예제 컨트롤러를 따라해 보았다.

@Controller
public class FirstController {
    
    @GetMapping("/test")
    public String enter( Model model, @RequestParam(value = "name", required = false) String name ) {
    	//Model addAttribute(String attributeName, @Nullable Object attributeValue);
        model.addAttribute("greeting","name = " + name);
        return "whatisthis";
    }
}
  • @Controller - 해당 클래스를 스프링 MVC에서 컨트롤러로 사용한다. 웹 요청을 처리하고 결과를 뷰에 전달하는 스프링 빈 객체로 설정한다.
  • @GetMapping - 메소드가 처리할 요청 경로를 지정한다. method = GET
  • Model - 컨트롤러의 처리 결과를 뷰에 전달할 때 사용하는 객체
  • @RequestParam - HTTP 요청 파라미터의 값을 메소드의 파라미터로 전달한다. 위의 경우 name 요청 파라미터의 값을 name 파라미터에 전달한다.
  • model.addAttribute - model의 "greeting" 속성에 값을 설정한다. JSP에서 이 속성을 불러와 사용한다.
  • return - 컨트롤러의 처리 결과를 보여줄 뷰 이름으로 해당 값을 사용한다. 해당 VIEW는 ViewResolver가 찾아 준다.

http://localhost/test?name=fortice 에서 test가 Mapping, name이 RequestParam의 value이다.

위 객체도 마찬가지로 빈으로 관리되기 때문에 설정 파일에 등록해주어야 한다.

2.JSP 구현

JSP는 웹에서 사용하는 용도기 때문에 기존에 만들었던 webapp/WEB-INF/view에 위치한다.

//main/webapp/WEB-INF/view/whatisthis.jsp
<%@ page controllerType="text/html; charset=utr-8" %>
<!DOCTYPE html>
<html>
    <head>
        <title>
            JSP TEST
        </title>
    </head>
    <body>
        무슨 기능? : ${greeting}
    </body>
</html>

위에서 ${greeting}와 같은 방식으로 불러오는데 이는 JSP EL방식으로 다양한 방식이 존재한다. EL 문법 정리 블로그 를 참고하여 필요할 때 공부하면 될 것 같다.

실행하기

  1. Maven for Java에서 프로젝트 clean - package - install 하기
  2. 해당 과정으로 war파일을 생성한다.
  3. Tomcat for Java의 서버에서 Debug War Package로 해당 war 파일을 설정한다.
  4. 브라우저를 통해 접근하거나, Tomcat for Java의 Open in Browser를 통해 접근한다.
profile
서버 공부합니다.

0개의 댓글