Spring

Maven project 와 War, Jar파일 차이

천방지축 개발노트 2019. 9. 26. 16:12

 

Spring Framework 기반의 프로젝트를 진행할 때 일반적으로 Maven을 사용하는 경우가 많은데,

이때 실질적인 사용법인 'pom.xml'파일 작성방법과

WAS(Tomcat)에 의해 변화되는 패키지(package) 위치에 대해 정리해보겠습니다.


 

Maven Project란 무엇인가??

우선, 메이븐은 자바소스파일(war또는 jar파일)을 빌드(build), 라이브러리 의존성(dependency), 컴파일(compile), 배포(deploy)를 해결해주는 도구입니다. 쉽게 말해 자바용 프로젝트 관리도구이며, 이것을 사용하는 프로젝트가 바로 Maven project입니다.

 

1) pom.xml 구성

 ① <property> : pom.xml내의 dependency환경 설정을 위한 변수를 SET.

 ② <dependeny> : 여기다가 프로젝트에서 사용할 라이브러리들을 명시. → 명시된 라이브러리들은 '메이븐 중앙 저장소'에서 자동으로 다운받아준다.

 ③ <build>내 <plugin> : Maven project build를 위한 라이브러리 명시.

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>kr.co.itcen</groupId>
  <artifactId>hellospring</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  
  <!-- 변수 설정 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.springframework-version>4.3.24.RELEASE</org.springframework-version>
  </properties>
  
  <!-- 라이브러리를 추가 -->
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
  </dependencies>
  
  <build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <finalName>hellospring</finalName>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>      

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <warSourceDirectory>src/main/webapp</warSourceDirectory>
          <failOnMissingWeb>false</failOnMissingWeb>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
</project>

 

 

2) WAR, JAR

Java위에서 war나 jar가 실행된다. 하지만 war의 경우 실행을 위해서는  Java 위에 WAS(Tomcat)이 더 필요하다.

① Jar : 동작에 톰캣이 필요없는 Application으로 bin내에 있는 .class파일을 패키지로 묶은 것.

② War : 톰캣 위에서 동작하는 Application으로 webapp폴더 아래에 있는 파일들이 war로 묶여진다.

(webapp폴더는 크게 assets폴더와 WEB-INF폴더로 구성된다)

③ maven project생성 시 ~~.jar, ~~war파일이 생성되는데, 이 때 파일이름이 되는 것이 Maven환경설정을 위한 pom.xml에 있는 [artifact id + version + packaging]로 정해진다.

Web Deployment Assembly

 

 

 

3) webapp/WEB-INF폴더 아래로 이동되는 파일들

 ① src/main/java: .java파일이 컴파일되어 생성된 .class파일은 /WEB-INF/classes폴더 하위에 옮겨져 저장된다.

 ② src/main/resources: 아래에 있는 xml파일 및 mybatis등의 파일들은 전부 복사되어 /WEB-INF/classes폴더 하위에 저장된다.

 ③ Maven Dependencies: Maven에 설정한 라이브러리들은 /WEB-INF/libs폴더 하위에 저장된다.

java또는 resources내의 파일들을 Package하여 만들지 않았으면 classes하위에 파일들이 바로 가짐. package내에 만들었다면 package까지 함께 classes로 이동된다. 따라서 파일생성시 package를 꼭 만들어 관리하는 것이 좋다.

 

 

4) Maven장점

 ① pom.xml에 작성하기만 하면 모든 프로젝트에 일괄적으로 프로세스 적용 가능.

 ② 한눈에 확인가능하여 이해하기 좋음. 따라서 관리하기에 용이.

 ③ 편리한 의존성으로 관련된 라이브러리들 자동 업데이트.

 ④ 모듈화하기 좋기 때문에, war파일 기반의 배포용으로 좋다.