부스트코스 강의를 듣고 정리한 내용.
Maven을 이용한 웹 어플리케이션 실습
언젠가는 슥삭 할 수 있길 바라며 작성해두기..
이클립스를 이용해 메이븐 프로젝트로 웹 어플리케이션을 작성해 보자.
먼저 이클립스를 실행해 File > New Project > Maven > Maven Project를 클릭하고 Use default Workspace location을 체크해준 다음 Next
그러면 archetype을 선택하는 화면으로 넘어간다(시간이 좀 걸림). archetype이란 일존의 프로젝트 템플릿이라 할 수 있는데, 어떤 아키타입을 선택했느냐에 따라 자동으로 여러 가지 파일들을 생성하거나 라이브러리 세팅 등을 해준다.
메이븐을 이용해 웹 어플리케이션을 개발하기 위해서는 maven-archetype-webapp를 선택한 후 Next
아키타입을 선택했으면 아키타입의 파라미터를 명시해준다.
파라미터들은 다음과 같다:
- Group Id: 보통 프로젝트를 진행하는 회사나 도메인 이름을 거꾸로 적음
- Artifact Id: 프로젝트 이름
- Version: 보통 기본값인 0.0.1-SNAPSHOT으로 설정
- Package: group id와 artifact id가 조합된 이름
Finish를 누르면 프로젝트가 생성된다.
디렉토리의 구조를 보자.
maven으로 생성된 프로젝트의 경우 자바 소스는 src/main/java 폴더에 생성되고, 웹 어플리케이션과 관련된 html, css 등은 src/main/webapp 폴더에서 작성해야 한다. src/main/java 폴더는 직접 만들어줘야 한다.
다음은 JDK 버전을 맞춰보자. jdk 버전은 프로젝트를 우클릭 > Properties > Java Compiler에서 확인할 수 있는데, 메이븐으로 프로젝트를 생성하면 기본적으로 JDK 1.5를 사용한다. JDK 8을 사용하기 위해서는 메이븐 설정 파일인 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>kr.or.connect</groupId>
<artifactId>mavenweb</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>mavenweb Maven Webapp</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>
<build>
<finalName>mavenweb</finalName>
<plugins>
<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>
</plugins>
</build>
</project>
그러나 수정 후 Properties > Java Compiler에서 다시 확인한 자바 컴파일러는 여전히 1.5이다.
이를 해결하기 위해 Properties > Maven > Java EE Integration에서 Enable Project Specific Settings 체크박스를 선택한 다음 Apply를 누른다. 메이븐의 설정을 바꾸면 이클립스 프로젝트 설정이 연동되도록 하는 것이다.
이제 JDK 1.8이 사용되는 것을 확인했으니 webapp 폴더 아래의 index.jsp를 열어보자.
HttpServlet을 찾은 수 없다는 에러가 뜬다. 앞에서 Dynamic Web Application을 만들 때는 WAS Runtime설정을 하면서 Tomcat을 지정했기 때문에 WAS Runtime이 지정되면 Tomcat에 있는 라이브러리를 이클립스에서 사용할 수 있었다. 그래서 톰캣 안에 있는 서블릿 라이브러리가 사용되는데 문제가 없었는데, 메이븐 프로젝트로 생성한 경우 WAS 런타임이 지정을 안 했기 때문에 서블릿 라이브러리를 찾지 못해 발생한 에러이다.
pom.xml의 dependencies 엘리먼트 아래에 다음 코드를 추가한다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
위 코드에서 <scope>provided</scope>
는 servlet라이브러리를 컴파일 시에만 사용되고 배포 시에는 사용되지 않는다는 것을 의미한다.
scope에는 네 가지가 있다:
- compile: default값. 컴파일 할 때 필요. 테스트 및 런타임에도 클래스 패스에 포함됨,
- runtime: 런타임에 필요. 컴파일 시에는 필요하지 않지만 실행할 때 필요함. JDBC 드라이버 등이 있다.
- provided: 컴파일 시 필요하지만 실제 런타임 등에는 컨테이너 같은 것에서 제공되는 모듈. 서블릿, JSP API 등이 해당됨
- test: 테스트 코드를 컴파일할 때 필요. 테스트 시 클래스 패스에 포함되며 배포할 때는 제외됨
이제 index.jsp를 실행하면 잘 돌아간다.
이번에는 pom.xml 파일에 JSTL 파이브러리를 추가해보자. dependencies 엘리먼트 아래에 다음 코드를 추가해준다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
JSTL은 톰캣이 기본으로 제공하지 않기 때문에 컴파일할 때나 배포할 때도 사용돼야 한다. 그래서 그래서 scope에 provided가 없음
webapp 폴더에 전에 썼던 jstl02.jsp를 복붙한 다음 run on server하면 안 돌아갈 것이다.
Project Properties > Project Facets에서 Dynamic Web Module의 버전이 2.3인데, 다이나믹 웹 모듈의 2.4부터 EL이 기본으로 사용할 수 있도록 설정되기 때문에 2.3일 경우에는 EL표기법의 결과가 출력되지 않는 것이다. 그래서 다이나믹 웹 모듈 3.1이 되도록 설정하자.
먼저 WEB-INF의 web.xml 파일을 다음과 같이 수정한다. 이때 <!DOCTYPE ~~
에서 에러가 나는 경우는 이 라인을 지워줘야 한다.
<?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 파일을 열어 <installed facet="jst.web" version="2.3"/>
을 <installed facet="jst.web" version="3.1"/>
로 수정한다.
다시 jstl02.jsp를 run on server로 실행해보자. 여전히 실행이 안 될 수도 있는데, 수정되기 전의 데이터와 수정된 데이터가 섞여서 실행되기 때문이다. 이 경우 웹 어플리케이션을 깔끔히 초기화하고 실행하는 것이 좋을 수 있다.
- 기존 tomcat 종료
- Project Properties > Maven > Update Project
- Servers view에서 기존 Tomcat Runtime 삭제
- Project 메뉴의 clean 선택
- Project Explorer에서 Server 삭제
을 실행 후 run on server로 다시 실행해보면 정상적으로 작동할 것이다.