먼저 메이븐(Maven)에 대해 알아보겠습니다.
Maven (Apache Maven - 메이븐)
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
https://maven.apache.org
소프트웨어 프로젝트 관리(management and comprehension) 도구로써 프로젝트 객체 모델(POM, Project Object Model)의 개념을 기반으로 프로젝트 관리에 필요한 환경 설정과 라이브러리에 대한 의존성을 관리합니다. 그리고 플러그인(plugin)을 기반으로 프로젝트 빌드(build), 보고(reporting), 문서(documentation) 기능 등을 관리할 수 있습니다.
프로젝트 객체 모델(POM)의 정보는 프로젝트의 pom.xml 파일에 있습니다.
Eclipse Maven Integration - m2eclipse™
이클립스(Eclipse)에서는 Indigo 버전부터 아파치 메이븐(Apache Maven)을 통합하여 Maven의 “pom.xml”을 편집하고 IDE(Integrated Development Environment, 통합 개발 환경)에서 빌드를 실행하는 등의 작업을 더 쉽게 할 수 있도록 지원하고 있습니다.
Maven Dependency (메이븐 의존성 관리)
라이브러리 다운로드 및 라이브러리 간의 버전 문제에 대해 관리를 합니다.
POM(pom.xml)에서 선언된 <dependency> 설정으로 빌드 및 배포에 필요한 라이브러리(JAR파일)들을 메이븐 저장소에서 다운로드 받아서 로컬 저장소로 저장하고 사용합니다.
만약, 이클립스(Eclipse)에서 메이븐 프로젝트(Maven Project)를 생성한 적이 없다면 자세한 설명이 있는 "이클립스 메이븐 프로젝트 만들기 1 - https://carrotweb.tistory.com/19?category=975285"을 보시고 오시기 바랍니다.
이클립스(Eclipse)에서 메이븐 프로젝트(Maven Project) 생성하기
1. 메뉴에서 [File > New > Maven Project]를 클릭합니다.
2. "New Maven Project"창에서 "Create a simple project (skip archetype selection)"를 체크하고 "Next >"버튼을 클릭합니다.
3. "Artifact"정보를 입력합니다.
"Artifact"정보는 다음처럼 입력합니다.
"Group Id"는 "com.home.study"으로 입력하겠습니다.
"Artifact Id"는 "test1"로 입력하겠습니다. (원하시는 아이디로 입력하세도 됩니다.)
"Version" : "Artifact"의 버전으로 기본 버전인 "0.0.1-SNAPSHOT"으로 하겠습니다.
"Packaging" : 프로젝트의 패키징 방식으로 웹 프로젝트임으로 "war"를 선택합니다.
"Name" : "test1"로 입력하겠습니다.
"Description"는 "test1"로 입력하겠습니다.
"Finish"버튼을 클릭하면 메이븐 프로젝트가 생성됩니다.
그렇지만, 2개의 경고와 2개의 에러가 발생합니다.
1. 이클립스 버전에 따라 maven-war-plugin의 버전이 너무 낮으면 pom.xml에서 org.apache.maven.plugin.war.util.WebappStructureSerializer 클래스를 초기화할 수 없다는 오류가 발생합니다.
Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer
이럴 때는 pom.xml에서 <build>의 <plugins>에 maven-war-plugin을 <plugin>으로 추가하면 됩니다.
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.home.study</groupId>
<artifactId>test1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>test1</name>
<description>test1</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
</project>
2. Project에 web.xml이 없고 <failOnMissingWebXml>이 true로 설정되어 있다는 오류가 발생합니다.
web.xml is missing and <failOnMissingWebXml> is set to true
이럴 때는 "Project Explorer"의 "test1"에서 오른쪽 버튼을 클릭하여 콘텍스트 메뉴에서 [Java EE Tools > Generate Deployment Descriptor Sub]를 클릭하여 web.xml 파일을 생성해주면 됩니다.
war에서는 web.xml 파일이 필수지만 Project에서 아무런 설정을 하지 않으면 web.xml 파일이 필요 없을 수 있습니다. 그럴 때는 maven-war-plugin의 <configuration>에 <failOnMissingWebXml>을 false로 설정하면 됩니다. (이 부분은 권장하지 않습니다.)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
3. 컴파일러의 compliance level과 JRE이 버전이 맞지 않거나 빌드 경로의 실행 환경에 맞게 설치된 JRE가 없으면 경고가 발생합니다.
The compiler compliance specified is 1.5 but a JRE 1.8 is used
Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment.
"Project Explorer"의 "test1"에서 오른쪽 버튼을 클릭하여 콘텍스트 메뉴에서 [Project > Properties]를 클릭하고 Java Compiler를 선택해보면 Compiler compliance level이 1.5인걸 확인할 수 있습니다. 하단 메시지에도 Compiler compliance level(1.5)이 설치된 JRE(1.8)과 맞지 않는다고 알려줍니다.
이럴 때는 Java Build Path에서 Libraries 탭의 "JRE System Libary [J2SE-1.5]"를 선택하고 Edit 버튼을 클릭합니다.
Edit Library 창의 System library에서 Execution environment로 JavaSE-1.8 (java-se-8u42-ri)를 선택하거나 Workspace default JRE (java-se-8u42-ri)를 선택하고 Finish 버튼을 클릭합니다.
적용을 위해 Apply 버튼을 클릭합니다.
그러면 Java Compiler에서 Compiler compliance level이 1.8로 변경되어 경고가 없어진 것을 확인할 수 있습니다.
4. 컴파일러 레벨이 설치된 Project Facet의 버전과 다르면 에러가 발생합니다.
Java compiler level does not match the version of the installed Java project facet.
이럴 때는 Project Facets에서 Java의 Version를 1.5에서 1.8로 변경하고 적용을 위해 Apply 버튼을 클릭합니다.
마지막으로 Apply and Close 버튼을 클릭하여 다시 한번 적용해 줍니다.
메이븐 프로젝트(Maven Project)에 Spring Framework을 적용하기
1. 메이븐 리포지토리(https://mvnrepository.com)에서 "spring-webmvc"으로 검색합니다.
2. 검색된 결과 중에 "Spring Web MVC"를 선택합니다.
3. "Version"중에서 "5.2.22.RELEASE"를 선택합니다.
4. "Maven"탭을 선택하고 복사합니다.
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
5. 메이븐 프로젝트에서 pom.xml 파일을 오픈하고 "<dependencies></dependencies>"을 입력합니다. 그리고 복사한 내용을 붙여 넣기하고 저장합니다.
그러면 자동으로 Spring Framework 라이브러리 파일(JAR)들이 다운로드됩니다.
spring-webmvc-5.2.22.RELEASE.jar
spring-aop-5.2.22.RELEASE.jar
spring-beans-5.2.22.RELEASE.jar
spring-context-5.2.22.RELEASE.jar
spring-core-5.2.22.RELEASE.jar
spring-jcl-5.2.22.RELEASE.jar
spring-expression-5.2.22.RELEASE.jar
spring-web-5.2.22.RELEASE.jar
"spring-webmvc"만 추가해도 다른 Spring Framework 라이브러리 파일(JAR)들 자동으로 다운로드되는 이유는 라이브러리 간에 의존관계가 있어서 관련된 라이브러리들이 같이 다운로드되게 됩니다. 그래서 spring-core나 spring-web과 같은 라이브러리를 추가로 설정할 필요가 없습니다.
"spring-webmvc"에 대한 라이브러리 의존관계와 라이브러리에 대한 설명은 다음과 같습니다.
spring-webmvc-5.2.22.RELEASE --> MVC 모듈 (Servlet, View)
+- spring-aop-5.2.22.RELEASE --> 모듈 관리(AOP – Aspect Oriented Programming)
+- spring-beans-5.2.22.RELEASE --> 객체 생성 및 생명주기 관리
+- spring-core-5.2.22.RELEASE --> Core 모듈
+- spring-jcl-5.2.22.RELEASE --> Logging 모듈 JCL(Jakarta Commons Logging)
+- spring-context-5.2.22.RELEASE --> 프레임워크 모듈
+- spring-expression-5.2.22.RELEASE --> 객체를 조회하고 조작 모듈 (SpEL - #{})
+- spring-web-5.2.22.RELEASE --> web 모듈 (http, web)
이제 Spring Framework(스프링 프레임워크)를 기반으로 웹 사이트를 만들 수 있게 되었습니다.