IntelliJ에서 더이상 지원하지 않는 Spring MVC
Spring MVC 세팅을 IntelliJ에 새로 올리려고 프로젝트를 생성하고 Frame work를 add시키려는데
IntelliJ add framework support에 Spring이 없다
벌써 뭔가 지끈거리기 시작했다 이거 MVC를 사장시키고있는 현 Backend시장의 추이반영이 분명하다
Spring boot를 쓰라는 IntelliJ의 선언이였겠지만 인간은 적응의 동물 이미 적응된 MVC를 고집하겠다. MVC를 직접 세팅하자.
완성된 프로젝트 링크.
https://github.com/meencodewriter/springMVCSetup4IntelliJ
GitHub - meencodewriter/springMVCSetup4IntelliJ
Contribute to meencodewriter/springMVCSetup4IntelliJ development by creating an account on GitHub.
github.com
IntelliJ CE IDE로 Spring MVC project 만들기
프로젝트를 새로 생성하자 작업환경은 다음과 같다 Java 버전은 1.8을 사용했다
maven project 생성
New Project를 누르고 Maven Project를 생성한다 Name과 JDK version을 설정한다 다음과 달라도 상관 없으나 후에 pom.xml에서 설정한 값과 일치하도록 수정해줘야 한다.
Archetype을 maven-archetype-webapp으로 설정하고 Create해준다.
프로젝트가 생성되고 build가 끝났다.
처음 만든 Maven project구조에서 Spring MVC Project구조로 변화시키기 위해서는 Spring setting 파일들이 필요하다. 기존 구조를 살짝 지우고 다시 만들기 위해 다음 두 파일을 삭제한다.
1. WEB-INF > web.xml
2. index.jsp
만약 사진처럼 Tree 형태로 프로젝트 디렉토리가 보이지 않는다면 우상단 톱니바퀴를 눌러 아래와 같이 설정되어있는지 확인한다.
다음 두 파일을 삭제하고 Spring Frame work Setting에 필요한 파일과 Directory를 생성할거다 Spring setting files는 다음 3가지를 생성할거고 역할또한 다음과 같다.
- web.xml
- servlet-context.xml
- root-context.xml
우선 다음 링크에서 위 세 파일을 다운로드 받는다
https://github.com/meencodewriter/springMVCSetup4IntelliJ/tree/main/xmlFiles
web.xml
Spring Web Application이 실행되면 WAS는 처음으로 web.xml을 읽는다
web.xml은 모든 servlet-container에 대한 설정과 정보를 가지고 있고, 들어온 요청을 전부 Dispatcher Servlet으로 전달한다.
ServletContext.xml
요청과 관련된 객체를 정의한다. Controller, 어노테이션, ViewResolver등의 설정을 하는 파일
RootContext.xml
servlet-context와는 반대로 view와 관련되지 않은 객체를 정의. Service, Repository(DAO), DB등 비즈니스 로직과 관련된 설정을 한다
위의 자료에서 다수의 서블릿을 가지게 되는 경우 다수의 servlet-context가 root-context의 bean 정보들을 참조하는 구조가 될 수 있다.
세 파일을 다운로드 받아 해 WEB-INF에 Spring > appServlet 두개의 Directory를 생성해
WEB-INF 디렉토리에 web.xml
spring 디렉토리에 root-context.xml
spring > appServlet 디렉토리에 servlet-context.xml
세 세팅파일을 각 위치에 모두 넣었으면 servlet-context.xml파일을 확인한다
<context:component-scan base-package="com.meencodewriter.springMVCSetup" />
파일의 다음 코드를 보면 base-package를 가리키고있는데 해당 base-package를 본인이 원하는 package양식으로 설정한다.
일반적으로 도메인주소의 역순으로 작성하며 마지막에 프로젝트명을 총 3단으로 작성한다.
중요한것은 해당 base-package에 작성된 그대로 package를 생성해 java file을 관리해야 한다. Http Request는 Dispatcher Servlet에 의해 다음 base-package controller로 maaping된다 위 경로에서 잘 지정해주지 않으면 경로를 찾지 못하는 문제가 발생한다.
다음 base-package를 수정 완료했다면 해당 이름대로 package를 생성해야한다
src > main 을 우클릭 한 뒤 new -> Directory를 눌러 하단 Maven Source Directories를 눌러 파란색 Java 디렉토리를 생성한다.
생성한 java Directory 우클릭 -> new -> package ( command + n ) 패키지를 생성한다. 패키지 명은 베이스 패키지와 동일하게 설정
package의 생성이 끝났다면 pom.xml에서 Spring Frame work의 의존성객체를 주입할것이다. 다음 객체들을 MAVEN 설정파일인 pom.xml에서 불러오는것이다.
각자의 pom.xml에 다음 pom.xml에서 필요한 부분을 잘라 붙여넣는다
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springMVCSetup</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>springMVCSetup Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java-version>1.8</java-version>
<org.springframework-version>5.3.20</org.springframework-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- data base -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>9.0.31</version>
</dependency>
<!-- fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- json -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>springMVCSetup</finalName>
<!-- lock down plugins versions to avoid using Maven defaults (maybe moved to parent pom) -->
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
다음 pom.xml에서
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java-version>1.8</java-version>
<org.springframework-version>5.3.20</org.springframework-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
<properties> ... </properties>
<dependencies> ... </dependencies>
부분을 붙여넣고
<build> 에서 <finalName>springMVCSetup</finalName> 부분을 제외한 코드를 붙여넣으면 된다
귀찮은 사람은 전체 코드를 집어넣은 뒤
<artifactId>springMVCSetup</artifactId>
<name>springMVCSetup Maven Webapp</name>
<finalName>springMVCSetup</finalName>
를 각자의 프로젝트명으로 수정하면 된다
JAVA 1.8 version을 사용하지 않는경우
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java-version>1.8</java-version>
<org.springframework-version>5.3.20</org.springframework-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
부분의 <java-version>을 수정해준다.
pom.xml을 전부 작성한 뒤에는 우측상단의 다음 새로고침 버튼을 눌러준다
Maven과 Spring setup이 끝났다.
메인 페이지를 띄우기 위해 views Directory와 jsp를 생성하자.
src > webapp > WEB-INF > 위치에 views 폴더를 생성
그 안에 index.jsp를 생성한다 jsp의 내용을 간단하게 작성하자
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello Spring</h1>
</body>
</html>
방금 만든 jsp로 응답을 전달할 Controller를 작성한다
springMVCSetup 내부에 controller package를 하나 더 생성하고 HomeController.java 클래스파일을 생성했다 해당 파일에서 프로젝트의 root 주소로 이동시키는 url controller를 정의할것이다.
package com.meencodewriter.springMVCSetup.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String index() {
return "index";
}
}
요청을 받을 controller까지 준비가 끝났다.
다음을 서버에 올려 화면을 즐겨보자.
localhost를 얻었다 즐겁다.