웹 강좌 기록 11 - Maven
강좌: 2. DB 연결 웹 앱 - 1) Maven 이란? 2) Maven을 이용한 웹 어플리케이션 실습
1. Maven이란?
(1) 정리:
애플리케이션 개발을 위해 반복적으로 진행하는 작업을 지원하기 위하여 등장한 도구
(2) 기능
- 빌드 : 모든 개발자가 일관된 방법으로(설정파일에 정의한 대로) 빌드할 수 있다.
- 라이브러리 관리:
- 패키징
- 의존성(라이브러리) 관리: 설정파일에 몇 줄 적어줌으로서 관련 라이브러리를 직접 다운받지 않아도 라이브러리를 사용할 수 있다. pom.xml 파일에서 <dependencies> 엘리먼트 안의 각각의 <dependency> 태그에 라이브러리를 지정하게 된다.
EX) Maven을 사용하지 않고 라이브러리 사용시 라이브러리 관련 파일을 직접 다운로드하여 /WEB-INF/lib 폴더에 넣어주어야 한다.
- 문서화
- 테스트, 테스트 리포팅
- git
- 의존성 관리
- svn등과 같은 형상 관리 서버와 연동(SCMs)
- 배포
- 플러그인 제공: 여러가지 자동화 지원
(3) 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>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>3.8.1</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Maven pom.xml 파일의 엘리먼트 | 설명 |
<project> | pom.xml 파일의 최상위 root element |
<modelVersion> | POM model의 버전 |
<groupId> | 프로젝트를 생성하는 조직(회사나 팀)의 고유 아이디로서, 일반적으로 회사나 팀의 도메인 이름을 거꾸로 쓴다. (그냥 이름) |
<artifactId> | 해당 프로젝트에의해 생성되는 artifact의 고유 아이디. Maven으로 pom.xml을 빌드할 때 [artifactId]-[version].[packaging]으로 artifact가 생성됨. 위의 pom.xml의 경우 examples-1.0-SNAPSHOT.jar 파일이 생성 |
<packaging> | 해당 프로젝트를 어떤 형태의 파일로 패키징 할지. ex) jar, war, ear 등 |
<version> | 프로젝트의 현재 버전. 개발 중일 땐 보통 SNAPSHOT을 뒤에 붙여서 씀 |
<name> | 프로젝트의 이름 |
<url> | 프로젝트 사이트가 있다면 사이트 url을 등록할 수 있음 |
<dependencies> | dependency management(라이브러리 추가하는 것) 기능을 하는 것으로 해당 엘리먼트 안에 필요한 라이브러리들을 지정하면 직접 라이브러리를 다운받아 WEB-INF 폴더에 넣지 않아도 된다. |
(4) Maven 웹 애플리케이션 실습
1) File - New - Maven Project 선택
2) 아키타입(Archetype) 선택: 프로젝트 템플릿으로, 자동으로 여러 파일을 생성해주고 라이브러리를 세팅해주는 등의 일을 해준다. maven-archetype-webapp를 선택한다.
3) 이름 설정.
artifact id는 프로젝트 이름을 넣어준다.
package는 group id와 artifact id가 조합된 이름인 kr.or.connect.mavenweb이 된다.
4) 프로젝트 생성 완료!
5) Maven 프로젝트의 디렉토리 구조
- java 소스 파일: src/main/java (만들어 주면 된다.)
- 웹 앱의 html, css 등: src/main/java
6) Maven 웹 프로젝트 설정하기! : 기본값으로 java compiler JDK 버전이 1.5이다.
JDK8 을 사용하도록 하려면 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>
</build>
</project>
* 의존성 부분에 junit은 기본으로 추가된 라이브러리로, 테스트를 위한 라이브러리이다.
이제 JDK 8을 maven web 프로젝트에서 사용할수 있도록 pom.xml 의 <project> 엘리먼트 안에 다음을 추가하자.
<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>
이제 pom.xml 파일을 저장하고, 해당 Maven 웹 프로젝트 오른쪽 클릭 - Properties 에서 왼쪽 메뉴의 Maven - Java EE Integration에서
Enable Project Specific Settings 체크박스 선택하고, Apply 한 다음!
왼쪽 메뉴의 Java Compiler를 다시 선택하여 자바 컴파일러 버전을 확인해보면
다음과 같이 1.8로 바뀌어 있다.
7) Maven web 프로젝트 설정하기 2: 서블릿 실행시 WAS 위에서 실행되기 때문에 Tomcat을 등록하여 Tomcat의 라이브러리중 하나인 WAS 서블릿 라이브러리를 사용하도록 설정해주기.
Dynamic Web Application 생성시에는 WAS Runtime 지정 시 Tomcat을 지정해주어 Tomcat의 라이브러리를 이클립스에서 사용할 수 있게 된 것이었습니다.
Maven Project에서 그걸 안해줬기 때문에 실행 시 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 종류 | 설명 | 사용되는 라이브러리 |
compile | 컴파일 할 때 필요. 테스트, 런타임 모두 클래스 패스에 포함된다. scope 엘리먼트를 설정하지 않으면 기본값으로 compile이 들어간다. | |
runtime | 런타임에만 필요한 경우. 컴파일할 때는 필요하지 않지만, 실행 시에 필요한 경우 사용 | JDBC 드라이버 |
provided | 컴파일에만 필요한 경우. 컴파일할때는 꼭 필요하지만, 실제 런타임에는 컨테이너 등에서 제공되는 모듈. | servlet, jsp api |
test | 테스트 코드를 컴파일 할 때 필요한 경우. 테스트 경우에만 클래스 패스에 포함되고, 배포시에는 제외되는 모듈 |
8) 이제 실행
런타임을 지정한다. tomcat으로. 그리고 하단의 Always use this server when running this project에 체크한다. 항상 이 런타임을 사용하기 위해.
9) Hello World! 를 보여주는 페이지가 나오는 것을 확인
(4) Maven 프로젝트에 JSTL 라이브러리 추가해보기
1) 다음을 pom.xml에 추가해보자.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2) src/webapp 폴더에 jstl02.jsp를 넣어보자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setAttribute("n", 10);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${n == 0}">
n은 과 0과 같습니다.
</c:if>
<c:if test="${n == 10}">
n은 과 10과 같습니다.
</c:if>
</body>
</html>
실행이 안 될 것입니다.
왜냐하면 다이나믹 웹 모듈의 버전이 2.3이기 때문입니다. 이는 프로젝트 익스플로러에서 프로젝트 오른쪽 클릭 - Properties - Project Facets 에 보면 나옵니다.
EL 라이브러리는 다이나믹 웹 모듈의 2.4 버전부터 사용할 수 있기 때문에 EL 표기법의 결과가 출력되지 않습니다.
다이나믹 웹 모듈 3.1로 설정해봅시다.
3) 다이나믹 웹 모듈 3.1로 설정하기
* WEB-INF/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 파일에서 jst.web 버전을 3.1로 바꿉니다.
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<!-- servlet version 2.3(x) 3.1(o) -->
<installed facet="jst.web" version="3.1"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
</faceted-project>
저장하고 나서 해당 프로젝트 오른쪽 클릭 - Properties - Project Facet에 가보면 다음과 같이 dynamic web module 버전이 3.1로 바뀌어 있습니다.
하지만 실행 시 다음과 같은 오류가 나오면서 실행되지 않고 있습니다.
이런 경우 저처럼 해보세요.
- 기존 tomcat을 종료합니다.
- 혹시 바뀌지 않았다면 프로젝트를 선택하고, 우측버튼을 눌러서 Maven 메뉴 아래의 update project를 선택한 후 확인하세요.
- Servers view에서 기존 Tomcat Runtime을 삭제
- Project 메뉴의 Clean선택
- 프로젝트 익스플로러에서 Server 삭제
근데 이거 말고도 다른 이유가 있을 수 있으니 한번 찾아보시기 바랍니다.
댓글에 많이들 달아주셨는데 댓글 참고하세요.
https://www.edwith.org/boostcourse-web/lecture/16724/
[LECTURE] 2) Maven을 이용한 웹 어플리케이션 실습 : edwith
들어가기 전에 이번 시간엔 이클립스를 이용해 메이븐 프로젝트로 웹 어플리케이션을 작성해 보도록 하겠습니다. 이클립스에서 메이븐을 이용해 웹 어플리케이션을 만들 때는 몇 가지 어려움... - 부스트코스
www.edwith.org
실행결과는 다음과 같습니다.