[Web] Maven

Maven
애플리케이션 개발에서 반복적으로 진행되는 작업들을 편리하게 지원해주는 도구이다. 빌드, 패키징, 문서화, 테스트와 테스트 리포팅, git, 의존성 관리 등과 같은 형상관리서버와 연동, 배포 등의 작업을 손쉽게 할 수 있다.
Maven을 이해하려면 CoC (Convention over Configuration)이라는 단어를 먼저 이해해야한다. CoC란 일종의 관습을 말하는데 예를 들자면 프로그램의 소스파일은 어떤 위치에 있어야하고, 소스가 컴파일된 파일들은 어떤 위치에 있어야하고 이러한 약속을 말한다.
Maven을 사용할 경우 얻게 되는 가장 큰 이점 중 하나는 편리한 의존성 라이브러리 관리가 있다. Maven을 사용하면 설정 파일에 몇 줄 적어줌으로써 직접 다운로드 받지 않아도 라이브러리를 사용 할 수 있다. 프로젝트 참여 개발자가 많아질수록, 사용하는 라이브러리가 많아질 수록 가이드라인을 주는 것이 어려워지는데 Maven은 다양한 플러그인을 제공해줘서 굉장히 많은 일을 자동화 해준다.

Maven의 기본
이클립스에서 Maven Project를 생성하면 생성 프로젝트 하위에 pom.xml 파일이 생성된다.
'pom.xml'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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>kr.or.connect</groupId>
    <artifactId>examples</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>mysample</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
cs

프로젝트를 생성할 때 입력하는 정보들에 의해 만들어진다.
groupId 는 프로젝트를 생성하는 조직의 고유 아이디이다. 일반적으로 작업하는 회사 도메인 이름을 거꾸로 적는다.
Dependency Management기능을 사용하기 위해서는 위 파일의 <dependencies/> 엘리먼트 사이에 필요한 라이브러리를 지정하면된다.
프로젝트 생성 후 프로젝트에서 사용되고있는 라이브러리들의 버젼 확인은 project explorer 또는 Navigator에서 프로젝트이름에서 우클릭 후 Properties 탭에서 할 수 있다.
예를 들어 Properties 탭의 Java Compiler를 확인해보면 Maven이 기본적으로 선택하는 1.5 버전을 사용하고 있는 것을 알 수 있다. 이를 1.8로 바꿔보자. pom.xml 파일로 들어가서 

1
2
3
4
5
6
7
8
9
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
</plugin>
cs

위 플러그인을 추가하고 저장하자. 그리고 다시 프로퍼티 탭으로 들어가 Java EE Integration을 선택하고 'Enable Project Specific Settings' 를 체크 해준다. Apply and Close 버튼을 누르고 java compiler 를 다시 확인해보면 1.8로 변경돼있다.

webapp 폴더 아래 index.jsp파일을 열어보면 오류가 발생하고 있다. HttpServlet을 찾을 수 없다는 오류 메시지가 보일 것이다.
Dynamic Web Application을 마들 때는 WAS Runtime 설정을 하면서 Tomcat을 지정한다. WAS Runtime이 지정되면 Tomcat에 있는 라이브러리를 이클립스에서 사용할 수 있게 된다. Tomcat안에 있는 서블릿 라이브러리가 사용되면서 문제가 없게된다. 실행시에도 WAS 위에서 실행되기 때문에 WAS 서블릿 라이브러리를 사용하게 된다.
반면 Maven프로젝트를 생성했을 때는 WAS Runtime 지정을 안 했기 때문에 서블릿 라이브러리를 찾을 수 없어서 오류가 발생하는 것이다.

1
2
3
4
5
6
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
cs

dependency를 지정할 때 scope 항목이 있는데 다음 4가지로 지정할 수 있다.

  • compile : 컴파일 할 때 필요.  테스트 및 런타임에도 클래스 패스에 포함된다. scope 을 설정하지 않는 경우 기본값
  • runtime : 런타임에 필요. JDBC 드라이버 등이 예. 컴파일 시에는 필요하지 않지만, 실행 시에 필요한 경우
  • provided : 컴파일 시에 필요하지만, 실제 런타임 때에는 컨테이너 같은 것에서 제공되는 모듈. servlet, jsp api 등이 이에 해당. 배포 시 제외
  • test : : 테스트 코드를 컴파일 할 때 필요. 테스트 시 클래스 패스에 포함되며, 배포 시 제외됨
설정을 마치고 파일을 저장하고 index.jsp 파일에 다시 가보면 오류가 나지 않는다. 

그리고 JSTL 라이브러리를 추가해보자. 앞서 일반 프로젝트에서 작업 할 때는  jstl 라이브러리 jar 파일을 다운로드 받아 폴더에 추가 해줘야했는데 Maven에서는 그럴 필요가 없다. 
pom.xml에 아래 라이브러리를 추가해주자


1
2
3
4
5
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
cs


그리고 jstl 문법이 포함된 .jsp 파일을 run on server 실행하면 인식을 못한다. 프로젝트 프로퍼티에서 Project facets 항목을 보면 dynamic web module 버전이 2.3 일 것이다. 2.4버전부터 EL이 기본으로 사용될 수 있도록 설정되어있기 때문에 2.3일 경우 EL표기법을 인식하지 못한다. 버전을 3.1로 설정해보자. 먼저 WEB-INF의 web.xml 파일을 아래와 같이 수정하자.


1
2
3
4
5
<?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>
cs


Navigator 탭에서 .settings/org.eclipse.wst.common.project.facet.core.xml 파일을 열고 아래와 같이 수정한다. 


1
2
3
4
5
6
7
<?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>
cs


그리고 Project properties의 Project facets 항목을 보면 버전이 3.1로 변경된 것을 볼 수 있다. 다시한번 jsp file with jstl 을 실행시켜보자. 출력이 잘 되는 것을 볼 수 있다. 
간혹 오류가 나면서 실행이 안되는 경우가 있는데 그럴 때는 아래 Server 탭에서 Tomcat Runtime 을 삭제하자. 그리고 Project 메뉴의 Clean을 선택하자. 다시한번 Run on server로 실행하면 제대로 될 것이다. 

No comments:

Powered by Blogger.