1. Maven이란?
JSP에서 JSTL을 사용하기 위해서는 WEB-INF 폴더의 lib 폴더 안에 3가지 jar파일을 아래와 같이 추가해야 한다.
이때 이와 같은 파일들은 프로젝트에 참여하는 사용자가 많아질수록 관리하기가 어려워지면 배포에도 힘들다. 하지만 Maven을 사용하면 이와 같은 파일을 직접 다운받지 않아도 라이브러리를 사용할 수 있다. Maven을 사용하면 Maven의 설정대로 모든 개발자가 일관된 방식으로 빌드를 수행할 수 있게 된다.
2. pom.xml 파일
Maven 기반의 프로젝트의 경우 하위에 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>com.example</groupId>
<artifactId>examples</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>sample</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
...
</dependency>
</dependencies>
</project>
pom.xml 파일의 기본 구성을 알아보자. 먼저 <project> 태그는 xmlns, xmlns:xsi, xsi:schemaLocation 등 여러 속성들이 정의되어 있는데 이들은 모두 정해진 값이므로 신경 쓸 필요는 없다. <modelVersion>4.0.0</modelVersion>은 POM 모델의 버전을 의미한다. <groupId>com.example</groupId>는 프로젝트를 생성하는 조직의 고유 아이디를 의미한다. 즉, 현재 프로젝트를 진행하고 있는 팀을 식별하도록 하는 id라고 생각하면 된다. 이때 id는 도메인 주소를 거꾸로 작성한다. 즉, example.com의 경우 com.example로 작성하면 된다. <artifactId>examples</artifactId>는 해당 프로젝트에 의해 생성되는 artifact의 고유 아이디를 의미한다. 이때 artifact란 Maven의 빌드 결과로 생기는 jar, war 등을 의미한다. Maven을 이용해 pom.xml을 빌드하면 artifactid-version.packaging으로 artifact가 생성된다. 위의 경우 examples-0.0.1-SNAPSHOT.jar 파일이 생성된다. 이후 <packaging> 태그에는 해당 프로젝트를 어떤 형태로 packaging 할 것인지를 결정하며 jar, war ear 등을 사용할 수 있다. <version> 태그는 프로젝트의 현재 버전을 의미하며 개발 중인 프로젝트의 경우 SNAPSHOT을 접미사로 사용한다. 또한 <name> 태그는 프로젝트의 이름을 의미하며 <url> 태그는 프로젝트의 사이트가 있다면 해당 사이트의 URL을 등록하면 된다.
그리고 가장 중요한 것이 마지막에 나오는 <dependencies> 태그다. 우리는 pom.xml에 의존 라이브러리를 다운 받기 위해 <dependencies> </dependencies> 태그를 선언하여 그 안에 다운받을 의존 라이브러리 코드를 작성해야 한다. 이때 각 의존 라이브러리의 정보는 <dependency> 태그를 사용하여 작성해야 한다. 이때 <dependency> 태그는 필요한 만큼 <dependencies> 태그 안에 작성하면 된다.
3. Eclipse에서 Maven 사용 방법
Eclipse로 Maven을 사용해보자. 먼저 Eclipse의 File 탭에서 New를 선택해 아래와 같이 Maven Project를 선택하자. 그리고 아래와 같이 Maven 프로젝트 기존 워크스페이스 경로에 생성되도록 하고 next 버튼을 클릭하자.
위 과정을 거치면 Archetype을 결정해야 한다. Archetype이란 일종의 프로젝트 템플릿이라고 생각하면 된다. 이때 어떤 Archetype을 선택했냐에 따라 자동으로 여러 파일들을 생성하거나 라이브러리를 셋팅해주는 등의 일을 해준다. 우리는 웹 어플리케이션을 개발할 것이므로 아래와 같이 maven-archetype-webapp을 선택하면 된다.
이후에는 아래와 같이 Group Id, Artifact Id 등을 설정해야 한다. Group Id는 보통 회사나 팀의 도메인 이름을 거꾸로 적고, Artifact Id의 경우 해당 프로젝트의 이름으로 설정한다. 버전은 보통 기본값인 0.0.1-SNAPSHOT을 사용한다. package의 경우 group id와 artifact id가 조합된 이름으로 자동으로 설정된다. 원하는 값을 아래와 같이 입력했다면 finish 버튼을 클릭하자
finish 버튼을 누르면 Eclipse 하단에 아래와 같이 진행 정도가 표신된다.
생성된 maven 폴더의 구성은 다음과 같다.
Maven으로 생성된 프로젝트는 자바 소스를 src/main/java 폴더에 생성해야 한다. 하지만 위 사진에서 생성된 폴더 구조를 보면 해당 폴더는 존재하지 않는다. 이러한 필요 폴더는 별도로 우리가 만들어줘야 한다. Maven 폴더는 기본적으로 다음과 같이 구성된다.
Maven으로 생성된 프로젝트의 JDK 버전을 확인해자. 프로젝트를 우클릭해서 "Properties"를 선택하고 "Java Compiler"를 선택하면 아래와 같이 JDK의 버전을 화인할 수 있다. 현재 Maven은 JDK 1.7 버전을 사용하는 것을 확인할 수 있다.
만약 JDK 8과 같이 다른 버전을 사용하려면 pom.xml을 수정해야 한다. 이를 위헤 pom.xml에 plugin으로 아래 코드를 추가한다.
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
이후 프로젝트를 우클릭하여 "Properties"를 선택하고 Maven 메뉴의 Java EE Integration을 선택한다. 그리고 아래처럼 "Enable Project Specific Settings"를 체크해준다. 이후 apply and close를 클릭해주자.
위 과정을 거치고 다시 JDK 버전을 확인해보면 아래와 같이 잘 적용된 것을 확인할 수 있다.
추가적으로 생성된 Maven 폴더를 보면 index.jsp에 오류 메시지가 표시된다. 이는 HttpServlet을 찾을 수 없기 때문에 발생하는 문제다. 이전에 Servlet을 사용할 때는 WAS Runtime을 설정하면서 Tomcat을 지정했고, 해당 Tomcat안에 있는 Servlet 라이브러리를 사용했기 때문에 문제가 발생하지 않았다. Maven 프로젝트의 경우 WAS Runtime을 지정하지 않았기 때문에 Servlet 라이브러리를 찾을 수 없는 것이다. 따라서 우리는 dependencies 태그 아래에 다음 코드를 넣어줘야 한다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
이때 scope 태그에는 아래 4가지 종류를 사용할 수 있다.
- compile: 컴파일 할 때 필요하다는 의미다. scope를 지정하지 않는 경우 default 값으로 사용된다.
- runtime: 런타임에 필요하다는 의미다. 컴파일 시에는 필요하지 않고, 실행 시에만 필요한 경우다.
- provided: 컴파일 시에 필요하지만 실제 런타임 때는 컨테이너 같은 것에서 제공되는 모듈이다. servlet과 jsp api 등이 해당된다. 배포 시에는 제외된다.
- test: 테스트 코드를 컴퓨일 할 때 필요하다는 의미다. 즉, 배포 시 제외된다.
따라서 위 servlet 라이브러리는 컴파일 시에만 사용되고 배포 시에는 사용되지 않게 된다. 이번에는 JSTL 라이브러리를 추가해보자.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
JSTL은 Tomcat이 기본 제공하지 않으므로 컴파일 시에도 사용돼야 한다. 따라서 scope는 compile로 설정해준다. 추가 적으로 EL을 기본으로 사용하려면 Dynamic Web Module의 버전이 2.4 이상이어야 하므로 모듈 버전을 3.1이 되도록 설정해야 한다. 이를 위해 먼저 WEB-INF 폴더의 web.xml 파일을 수정해야 한다. web.xml의 초기 내용은 다음과 같다.
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
이 내용을 아래와 같이 수정해야 한다.
<?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">
<display-name>Archetype Created Web Application</display-name>
</web-app>
이후 숨겨진 폴더인 .settings폴더의 org.eclipse.wst.common.project.facet.core.xml 파일을 열면 아래와 같은 코드가 존재한다.
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="jst.web" version="2.3"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
</faceted-project>
이때 위 코드를 아래와 같이 수정한다.(2.3을 3.1로만 바꾸면 된다.)
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="jst.web" version="3.1"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
</faceted-project>
이 방식을 사용하면 다이나믹 웹 모듈의 버전이 3.1로 바뀐 것을 확인할 수 있을 것이다.
References
'BackEnd' 카테고리의 다른 글
MVC 패턴이란? (0) | 2023.02.01 |
---|---|
[Maven] Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer 에러 (0) | 2023.01.18 |
WAS(Web Application Server) (0) | 2022.12.19 |
웹 서버란? (0) | 2022.12.19 |
Apache Tomcat 다운 및 설치 (0) | 2022.11.21 |