[Spring 5] 프로젝트 관리 도구 - Maven

2026. 2. 25. 17:42·프로젝트/Spring

1. Maven에 대하여

Maven은 프로젝트 관리를 위한 도구로 프로젝트 생성, 배포, 리포팅까지 전체 과정을 도와준다. Maven 이전에는 Ant라는 빌드 도구가 있었는데 라이브러리에 대한 의존성 관리가 불편했다. Maven은 라이브러리에 대한 의존성 관리를 자동으로 해주는 편리함이 있다. 또한 정해진 프로젝트 폴더 구조를 따르게 하는 등 편리한 점들이 있다. 하나하나 Maven에 대해 살펴보자

 

1. POM (Project Object Model)

IntelliJ에서 Maven을 선택해서 프로젝트를 생성하면 `pom.xml` 파일이 자동으로 생성된다. 이 XML 파일은 프로젝트 이름, 버전, 필요한 외부 라이브러리, 빌드 설정 등을 기술해주는 파일이다. Maven은 이 pom.xml을 읽어서 프로젝트 구조를 파악하고 실행한다. 아래는 pom.xml의 예시이다.

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.2</version>
    </parent>

    <groupId>com.finance.edu</groupId>
    <artifactId>maven-guide-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

pom.xml에서는 xml 형식으로 관리하는데 주요 태그들은 알아둘 필요가 있다.

  • `<parent>`: 다른 프로젝트의 pom.xml 설정을 상속받는다. 주로 여러 프로젝트에서 공통으로 사용하는 버전 정보나 플러그인 설정을 일관되게 관리하기 위해 사용한다. (예: 스프링 부트의 기본 설정 상속)
  • `<groupId>`: 프로젝트를 생성한 조직이나 그룹의 고유 식별자이다. (주로 도메인 역순)
  • `<artifactId>`: 프로젝트의 실제 이름이다. 빌드 시 생성되는 파일명(jar/war)이 이 이름을 따른다.
  • `<version>`: 해당 프로젝트의 현재 버전으로 SNAPSHOT은 개발 중인 버전을 의미한다.
  • `<properties>`: pom.xml 내에서 반복적으로 사용되는 값(버전, 인코딩 설정 등)을 변수로 선언한다. 예를 들어 `<java.version>17</java.version>`이라고 정의하면, 다른 곳에서 `${java.version}`으로 호출해 사용할 수 있는 식이다.
  • `<dependencies>`: 이 프로젝트가 작동하는 데 필요한 모든 외부 라이브러리(dependency)를 감싸는 태그이다.
  • `<dependency>`: 개별 라이브러리 정보로 groupId, artifactId, version 정보를 적고 Maven의 중앙저장소에서 라이브러리를 자동으로 가져온다.
  • `<build>`: 소스 코드를 컴파일하고 배포 가능한 파일로 패키징하는 과정에 대한 세부 설정을 담는다.
  • `<plugin>`: Maven의 기본 기능을 확장하여 특정 작업을 수행하는 도구이다. 예를 들어 `spring-boot-maven-plugin`은 애플리케이션을 실행 가능한 .jar로 패키징하거나 바로 실행하는 기능을 제공한다.

2. 프로젝트 폴더 구조 (Convention over Configuration)

IntelliJ에서 maven으로 프로젝트를 생성하면 위와 같은 기본 폴더 구조가 세팅된다. Maven은 미리 정해진 프로젝트 구조를 따를 것을 권장한다. 이를 통해 개발자가 프로젝트 구조 설정에 힘을 들이지 않게 해주고 다른 프로젝트를 볼 때도 빠르게 인식할 수 있게 도와준다. 

  • `src/main/java`: 자바 소스 코드 위치
  • `src/main/resources`: 설정 파일 및 자원 위치
  • `src/test/java`: 테스트 코드 위치
  • `target`: 빌드 결과물이 생성되는 위치

 

*(추가) JAR와 WAR

둘 다 zip 파일 처럼 여러개의 파일을 하나로 묶은 압축파일 (Java Archieve)이지만 목적과 내부 구조에 있어 약간 다른 점이 있다.

 

JAR (Java Archieve)는 자바 클래스 파일(.java), 메타데이터, 리소스 등을 하나로 묶은 파일 포맷이다. 자바 라이브러리로 배포하거나, 독립적으로 실행가능한 어플리케이션을 배포할 때 사용한다. `.jar` 파일은 JVM 위에서 바로 실행이 가능하다. 따라서 최근 SpringBoot 프로젝트는 내장 톰캣 서버를 포함하여 JAR 형식으로 배포하는 것이 일반적이다.

 

WAR (Web Application Archieve)는 웹 어플리케이션을 배포하기 위한 파일 포맷이다. 서블릿(Servlet), JSP, HTML, Javascript 등 웹 관련 자원을 포함하며, 이를 실행시키기 위해서는 톰캣 같은 별도의 웹어플리케이션 서버 (WAS)가 필요하다. 즉 외부 서버에 배포되어야 동작하는 것이 특징이다.


3. 라이브러리 관리 저장소와 의존성 관리

라이브러리 관리를 위한 저장소는 중앙 저장소(Central Repository), 원격 저장소(Remote Repository), 로컬 저장소(Local Repository)로 구분된다.

  • 중앙 저장소(Central Repository): 오픈소스 라이브러리, 플러그인, 아키타입을 관리하는 저장소이다.
  • 원격 저장소(Remote Repository): 내부망에 구축하는 저장소, 혹은 중앙저장소에 없는 별개의 라이브러리 저장소를 뜻한다.
  • 로컬 저장소(Local Repository): 개발자 컴퓨터의 저장소로 `USER_HOME/.m2/repository`의 위치를 갖는다.

우리가 사용하려는 라이브러리는 중앙저장소에 위치해있다. 아래 Maven Repository에서 내가 사용하고 싶은 라이브러리를 Maven에 맞게 복사해서 가져올 수 있다.

 

Maven Repository: spring

Support for programmatic and declarative transaction management for classes that implement special interfaces or any POJO. Last Release on Feb 18, 2026

mvnrepository.com

 

위 사이트에서 내가 사용하고 싶은 라이브러리의 dependency를 복사해서 pom.xml의 dependencies에 추가해주고 maven을 새로고침 해주면 자동으로 중앙저장소에서 로컬저장소로 해당 라이브러리들을 쉽게 가져올 수 있다. 또한 라이브러리가 의존하는 또다른 라이브러리까지 연쇄적으로 maven이 알아서 관리해주기 때문에 개발자이러한 의존성 관리를 할 필요가 없기 때문에 편하다.


4. Maven 빌드 라이프싸이클

Maven은 일련의 단계를 거쳐 빌드를 수행하며, 이를 LifeCycle이라고 한다. 주요 단계는 아래와 같다.

  1. Clean: 이전 빌드에서 생성된 파일들을 삭제한다. (target 폴더 제거)
  2. Compile: 소스코드를 컴파일 하여 클래스파일을 생성한다.
  3. Test: JUnit 등을 이용해 단위 테스트를 진행한다.
  4. Package: 컴파일 된 코드를 JAR 또는 WAR 파일로 압축한다.
  5. Install: 빌드된 파일을 로컬 저장소에 복사한다. (다른 프로젝트에서 참조 가능)
  6. Deploy: 최종 빌드물을 원격 저장소에 배포한다.

 

터미널에서는 아래 명령어를 통해 프로젝트를 빌드 가능하다.

  • `mvn clean`: 기존 빌드 결과물이 담긴 target 디렉토리를 삭제한다.
  • `mvn compile`: src/main/java 아래의 소스코드를 컴파일한다.
  • `mvn test`: src/test/java 아래의 단위 테스트를 진행한다.
  • `mvn package`: 컴파일 된 코드를 pom.xml에 설정된 JAR 또는 WAR 파일로 압축해 배포 파일을 생성한다.
  • `mvn install`: 생성된 jar/war 파일을 로컬저장소(`.m2/repository`)에 복사한다.
  • `mvn deploy`: 최종 빌드물을 원격 저장소에 배포한다.

명령어는 조합해서 사용할 수 있는데 예를 들면 아래와 같다.

  • `mvn clean install`: 기존 빌드 파일을 모두 지우고 새로 빌드하여 로컬 저장소에 저장한다.
  • `mvn clean package`: 깨끗한 상태에서 배포 파일(JAR/WAR)만 생성할 때 사용한다.

'프로젝트 > Spring' 카테고리의 다른 글

[Spring 5] Spring MVC, DispatcherServlet  (0) 2026.02.28
[Spring 5] REST API, RESTful API 이름 짓기  (0) 2026.02.26
[Spring 5] 제어의 역전(IoC), 의존성 주입(DI)  (0) 2026.02.24
'프로젝트/Spring' 카테고리의 다른 글
  • [Spring 5] Spring MVC, DispatcherServlet
  • [Spring 5] REST API, RESTful API 이름 짓기
  • [Spring 5] 제어의 역전(IoC), 의존성 주입(DI)
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16) N
        • Java (8)
        • Spring (4) N
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[Spring 5] 프로젝트 관리 도구 - Maven
상단으로

티스토리툴바