카테고리 없음

웹 강좌 기록 11 - Maven

wakeandweep 2019. 10. 28. 00:55
728x90

 

강좌: 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 프로젝트의 디렉토리 구조

maven web app 프로젝트 디렉토리 구조

- java 소스 파일: src/main/java (만들어 주면 된다.)

- 웹 앱의 html, css 등: src/main/java

 

maven web app 프로젝트 디렉토리 구조 기본

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 서블릿 라이브러리를 사용하도록 설정해주기.

Maven 프로젝트에서 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로 바뀌어 있습니다.

 

하지만 실행 시 다음과 같은 오류가 나오면서 실행되지 않고 있습니다.

 

이런 경우 저처럼 해보세요.

  1. 기존 tomcat을 종료합니다.
  2. 혹시 바뀌지 않았다면 프로젝트를 선택하고, 우측버튼을 눌러서 Maven 메뉴 아래의 update project를 선택한 후 확인하세요.
  3. Servers view에서 기존 Tomcat Runtime을 삭제
  4. Project 메뉴의 Clean선택
  5. 프로젝트 익스플로러에서 Server 삭제

근데 이거 말고도 다른 이유가 있을 수 있으니 한번 찾아보시기 바랍니다.

댓글에 많이들 달아주셨는데 댓글 참고하세요.

 

https://www.edwith.org/boostcourse-web/lecture/16724/

 

[LECTURE] 2) Maven을 이용한 웹 어플리케이션 실습 : edwith

들어가기 전에 이번 시간엔 이클립스를 이용해 메이븐 프로젝트로 웹 어플리케이션을 작성해 보도록 하겠습니다. 이클립스에서 메이븐을 이용해 웹 어플리케이션을 만들 때는 몇 가지 어려움... - 부스트코스

www.edwith.org

실행결과는 다음과 같습니다.