[IntelliJ] 스프링 부트 없이 스프링 웹 MVC 프로젝트 만들고 설정하기
[IntelliJ] 스프링 부트 없이 스프링 웹 MVC 프로젝트 만들고 설정하기
※ 사용 IDE : IntelliJ IDEA 2019.3 Ultimate
1. 새 프로젝트 생성
사용하는 빌드툴(Maven, Gradle) 기반의 프로젝트를 생성한다.
새 프로젝트를 생성한다.
1) 사용할 빌드툴 선택 - 이 글에서는 Maven을 사용하겠습니다.
2) 사용할 JDK 선택
3) Next 클릭
프로젝트 정보를 입력하고 Finish를 클릭해서 프로젝트 생성을 완료한다.
2. 프로젝트 세팅
1. Java Compiler 버전 변경
2. 프로젝트에 Web Facet 추가
3. war packaging 설정
Maven 프로젝트를 생성하면 기본 Java Compiler 버전이 1.5로 되어있기 때문에 변경이 필요하다.
Settings - Build, Execution, Deployment - Compiler - Java Compiler에서 Target bytecode version을 사용하는 JDK 버전으로 바꾼다.
그리고 pom.xml에 자바 버전을 명시한다.
pom.xml
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
다음으로 프로젝트에 Web Facet을 추가한다.
프로젝트에서 마우스 우측 버튼 - Add Framework Support... 를 클릭한다.
목록에서 Web Application에 체크, Create web.xml에 체크하고 OK를 클릭한다.
web framework 추가 후 변경된 프로젝트 구조
Maven 프로젝트는 web resource directory가 기본적으로 src/main/webapp으로 잡히므로 생성된 web 디렉토리를 src/main 밑으로 옮기고 이름을 webapp으로 변경한다.
최종 프로젝트 구조
마지막으로 pom.xml에 <packaging>war</packaging>을 추가한다.
pom.xml
...
<groupId>com.atoz_develop</groupId>
<artifactId>spring-mvc-sample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
...
3. 의존성(Dependency) 설정
⚙️ 필요 의존성
- servlet-api(jsp를 사용한다고 가정)
- spring-webmvc
pom.xml
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
</dependencies>
4. 스프링 웹 MVC 설정
1. Configuration 설정
- @EnableWebMvc
2. DispatcherServlet 설정
- web.xml 또는 WebApplicationInitializer
3. DispatcherServlet 커스터마이징 설정
- WebMvcConfigurer
1) Configuration 설정
Configuration용 클래스를 새로 생성한다.
@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfiguration {
}
생성한 클래스에 @configuration, @EnableWebMvc 애노테이션을 붙인다.
이 두 개가 스프링 웹 MVC의 설정에 필수적인 애노테이션이다.
@ComponentScan은 편의상 빈 설정 파일을 따로 만들지 않기 위해 같이 붙여주었다.
2) DispatcherServlet 설정
스프링 MVC의 핵심은 DispatcherServlet이다.
스프링 MVC 웹 서비스는 클라이언트의 요청을 DispatcherServlet이 가장 앞단에서 제일 먼저 받기 때문에 DispatcherServlet을 설정해 주어야 한다.
DispatcherServlet은 두 가지 방법으로 설정할 수 있는데 web.xml과 WebApplicationInitializer 인터페이스의 구현체에서 설정할 수 있다.
둘 중 편한 방법을 택하면 된다.
(1) web.xml에 DispatcherServlet 설정하기
web.xml - 애노테이션 스프링 설정 사용 시
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.atoz_develop.WebConfiguration</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
<servlet>에 org.springframework.web.servlet.DispatcherServlet을 선언하고 <init-param>에 DispatcherServlet이 애노테이션 기반의 설정을 사용해서 ApplicationContext를 생성할 수 있도록 파라미터를 설정한다.
참고로 스프링 XML 설정을 사용하는 경우에는 다음과 같이 작성하면 된다.
web.xml - XML 스프링 설정 사용 시
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
contextConfigLocation의 value에 프로젝트의 스프링 XML 설정 경로를 적어야 한다.
(2) WebApplicationInitializer 구현체에 DispatcherServlet 설정하기
web.xml에 DispatcherServlet을 설정했다면 이 단계는 넘어간다. DispatcherServlet은 두 가지 방법 중 하나를 택하여 설정하면 된다.
WebApplicationInitializer를 구현할 클래스를 새로 생성한다.
public class WebApplication implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setServletContext(servletContext); // @EnableWebMvc 적용을 위한 필수 세팅
context.register(WebConfiguration.class);
context.refresh();
DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
ServletRegistration.Dynamic app = servletContext.addServlet("app", dispatcherServlet);
app.addMapping("/app/*");
}
}
위와 같이 onStartup()을 override한다.
web.xml에 DispatcherServlet을 설정하는 것과 동일한 동작을 하는 코드이다.
3) DispatcherServlet 커스터마이징 설정
WebMvcConfigurer 인터페이스를 implements해서 DispatcherServlet이 사용하는 빈들을 커스터마이징 할 수 있다.
여기서는 WebConfiguration 클래스가 WebMvcConfigurer 인터페이스를 구현하도록 하겠다.
필요하다면 WebMvcConfigurer 인터페이스를 구현할 클래스를 별도로 생성해도 된다.
@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfiguration implements WebMvcConfigurer {
}
WebMvcConfigurer 메소드들
5. 서버 배치 설정
사용하는 서버(톰캣 등)에 프로젝트를 추가한다.
여기까지가 스프링 부트 없이 기본적인 스프링 웹 MVC 프로젝트를 만들고 설정하는 방법이다.
추가로 이 프로젝트를 사용해 간단한 요청을 처리하는 웹 어플리케이션을 만들어 보자.
WEB-INF에 sample.jsp를 만든다.
sample.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>Hello Spring Web MVC!</h2>
</body>
</html>
SampleController를 만든다.
SampleController.java
@Controller
public class SampleController {
@GetMapping("/sample")
public String sample() {
return "/WEB-INF/sample.jsp";
}
}
위와 같이 작성하고 서버를 기동해서 결과를 확인해본다.
결과 확인
WebMvcConfigurer를 활용해서 ViewResolver를 커스터마이징하여 '/WEB-INF/sample.jsp'와 같이 리턴하던 뷰를 'sample'로 간단히 리턴할 수 있도록 해보자.
@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/", ".jsp");
}
}
WebMvcConfigurer 구현체에서 configureViewResolvers()를 위와 같이 override한다.
@Controller
public class SampleController {
@GetMapping("/sample")
public String sample() {
return "sample";
}
}
그리고 뷰 리턴부를 위와 같이 변경한다.
실행 결과는 이전과 동일하다.
최종 프로젝트 구조
#인텔리J 스프링 웹 MVC 프로젝트
#Maven 웹 프로젝트
#Maven 스프링
'Spring Framework > Spring MVC' 카테고리의 다른 글
관습적인 추상화 Service와 ServiceImpl 구조에 대해서 (1) | 2023.12.26 |
---|---|
Spring MVC - @PropertySource 사용 중 FileNotFoundException: Could not open ServletContext resource 에러 (0) | 2021.04.22 |
[IntelliJ] Spring Web MVC 프로젝트 생성 및 세팅 - 자바 설정 사용 (0) | 2021.04.22 |
[IntelliJ] Spring Web MVC 프로젝트 생성 및 세팅 - XML 설정 사용 (0) | 2021.04.22 |
[Spring MVC] Static Resources(정적 리소스) 설정 방법 (0) | 2021.04.22 |