22. 메이븐 사용법

메이븐(Maven)을 이용한 프로젝트 빌드, 의존성 관리, 로깅(log4j) 설정 방법을 다룬다.


1. 메이븐이란?

지금까지는 스프링 라이브러리를 직접 다운로드하여 프로젝트에 추가했다. 하지만 스프링 버전이 업데이트될 때마다 관련 라이브러리를 일일이 수정해야 하는 불편함이 있었다.

**메이븐(Maven)**은 이런 문제를 해결하는 빌드 도구다. 프로젝트 구조와 의존성을 선언적으로 관리하며, 컴파일·테스트·패키징·배포까지 자동화한다.

  빌드 도구의 역할

  소스 코드
       │
       ▼
  ┌────────────────┐
  │  컴파일         │
  └───────┬────────┘
          │
          ▼
  ┌────────────────┐
  │  테스트 실행     │
  └───────┬────────┘
          │
          ▼
  ┌────────────────┐
  │  패키징 (WAR)   │
  └───────┬────────┘
          │
          ▼
     배포 / 실행
빌드 도구설정 방식특징
AntXML (build.xml)절차적, 자유도 높음
MavenXML (pom.xml)선언적, 표준 구조
GradleGroovy/Kotlin DSL유연함, 빌드 속도 빠름
빌드란 단순히 컴파일만 의미하지 않는다. 컴파일 → 테스트 → 패키징 → 배포까지의 전체 과정을 빌드라고 한다. 메이븐은 이 과정을 자동으로 수행해 주는 빌드 도구이다.

2. 메이븐 프로젝트 구조

메이븐은 표준 디렉터리 구조를 사용한다. 모든 메이븐 프로젝트는 동일한 구조를 따르므로 프로젝트 간 이동 시에도 쉽게 파악할 수 있다.

  메이븐 프로젝트 구조

  my-project/
  ├── pom.xml
  ├── src/
  │   ├── main/
  │   │   ├── java/
  │   │   ├── resources/
  │   │   └── webapp/
  │   └── test/
  │       ├── java/
  │       └── resources/
  └── target/
구성 요소설명
pom.xml프로젝트 정보와 라이브러리 의존성을 설정하는 핵심 파일
src/main/java애플리케이션 자바 소스 파일
src/main/resources프로퍼티, XML 등 리소스 파일
src/main/webappJSP, HTML, WEB-INF 등 웹 리소스
src/test/javaJUnit 등 테스트 코드
src/test/resources테스트용 리소스 파일
target/빌드 결과물이 생성되는 디렉터리

3. pom.xml 구성

pom.xmlProject Object Model의 약자로, 메이븐 프로젝트의 모든 설정이 담긴 핵심 파일이다.

프로젝트 정보

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-web-app</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>
</project>
태그설명
groupId프로젝트 그룹 ID (보통 도메인 역순)
artifactId프로젝트 이름 (패키지 이름)
version프로젝트 버전
packaging패키징 타입 (war, jar 등)

의존성(dependency) 설정

<dependencies>
    <!-- 스프링 프레임워크 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.30.RELEASE</version>
    </dependency>

    <!-- log4j 로깅 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>
태그설명
dependency의존하는 라이브러리 정보를 기술
groupId라이브러리의 그룹 ID
artifactId라이브러리의 아티팩트 ID
version라이브러리 버전
  의존성 관리 흐름

  pom.xml 작성
       │
       ▼
  ┌────────────────┐
  │ 메이븐 실행      │
  └───────┬────────┘
          │
          ▼
  ┌────────────────┐
  │ 중앙 저장소에서   │
  │ 라이브러리 다운   │
  └───────┬────────┘
          │
          ▼
  ┌────────────────┐
  │ 로컬 저장소      │
  │ (~/.m2)에 캐시  │
  └───────┬────────┘
          │
          ▼
  프로젝트 빌드에 사용
메이븐은 의존 라이브러리가 또 다른 라이브러리에 의존하는 **전이적 의존성(transitive dependency)**까지 자동으로 해결한다. spring-webmvc를 추가하면 spring-core, spring-beans 등 관련 라이브러리가 함께 다운로드된다.

4. log4j — 로깅 프레임워크

실제 애플리케이션에서는 사용자 접속 정보, 메서드 호출 시각 등 다양한 정보를 로그로 남겨야 한다. log4j는 이런 로그 기능을 제공하는 라이브러리다.

log4j 구성 요소

  log4j 동작 흐름

  애플리케이션 코드
  (logger.info(...))
         │
         ▼
  ┌────────────────┐
  │  Logger        │
  │  (레벨 판단)    │
  └───────┬────────┘
          │
          ▼
  ┌────────────────┐
  │  Appender      │
  │  (출력 위치)    │
  └───────┬────────┘
          │
          ▼
  ┌────────────────┐
  │  Layout        │
  │  (출력 형식)    │
  └────────────────┘
태그역할설명
<Logger>로그 전달로그 레벨을 기준으로 출력 여부 결정
<Appender>출력 위치콘솔, 파일, DB 등 어디에 출력할지 결정
<Layout>출력 형식날짜, 레벨, 메시지 등 출력 포맷 결정

Appender 종류

Appender 클래스출력 대상
ConsoleAppender콘솔(터미널)
FileAppender지정한 파일
RollingFileAppender파일 크기 초과 시 새 파일로 교체
DailyRollingFileAppender날짜 단위로 새 파일 생성

log4j.xml 설정 예시

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM
    "log4j.dtd">
<log4j:configuration>

    <!-- 콘솔 출력 설정 -->
    <appender name="console"
        class="org.apache.log4j.ConsoleAppender">
        <layout
            class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{yyyy-MM-dd HH:mm:ss}
                       [%-5p] %c - %m%n" />
        </layout>
    </appender>

    <!-- 루트 로거 설정 -->
    <root>
        <priority value="info" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

PatternLayout 출력 속성

속성설명출력 예시
%p로그 레벨INFO, ERROR
%m로그 메시지개발자가 작성한 내용
%d발생 시각2026-03-22 10:30:00
%c클래스 전체 경로com.example.MyClass
%F파일 이름MyClass.java
%L라인 번호42
%M메서드 이름doProcess
%n줄바꿈-

5. log4j 로그 레벨

log4j는 6단계 로그 레벨을 제공한다. 설정한 레벨 이상의 메시지만 출력된다.

레벨용도설명
FATAL치명적 오류시스템이 동작 불가능한 상태
ERROR오류실행 중 문제 발생
WARN경고잠재적 문제 가능성
INFO정보운영 관련 상태 변경
DEBUG디버그개발 시 디버깅 정보
TRACE추적DEBUG보다 상세한 정보
  로그 레벨 계층 (위로 갈수록 심각)

  FATAL  ← 가장 심각
  ERROR
  WARN
  INFO   ← 운영 환경 기본
  DEBUG  ← 개발 환경 기본
  TRACE  ← 가장 상세
로그 레벨을 DEBUG로 설정하면 DEBUG 이상(DEBUG, INFO, WARN, ERROR, FATAL)의 메시지가 모두 출력된다. 운영 환경에서는 INFO 이상으로 설정하여 불필요한 로그 출력을 방지하자.

사용 예시

import org.apache.log4j.Logger;

public class MemberController {

    private static final Logger logger =
        Logger.getLogger(
            MemberController.class);

    public void login(String userId) {
        logger.debug("로그인 시도: " + userId);
        logger.info("로그인 성공: " + userId);
        logger.warn("비밀번호 3회 오류: "
            + userId);
        logger.error("DB 연결 실패");
    }
}

6. 메이븐 기반 스프링 프로젝트

기존 방식 vs 메이븐 방식 비교

항목기존 방식메이븐 방식
라이브러리수동 다운로드·추가pom.xml에 선언
버전 관리수동 교체버전 번호만 변경
의존성직접 파악·추가자동 해결
프로젝트 구조자유 형식표준 구조
빌드수동mvn 명령으로 자동화

스프링 MVC 메이븐 pom.xml 예시

<dependencies>
    <!-- Spring Web MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.30.RELEASE</version>
    </dependency>

    <!-- MyBatis-Spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>

    <!-- Oracle JDBC -->
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0</version>
    </dependency>

    <!-- log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>
메이븐 중앙 저장소(https://mvnrepository.com)에서 필요한 라이브러리의 groupId, artifactId, version을 검색하여 pom.xml에 추가하면 된다. 한 번 다운로드된 라이브러리는 **로컬 저장소(~/.m2/repository)**에 캐시되어 재사용된다.

요약

개념한 줄 정리
메이븐프로젝트 빌드와 의존성을 자동 관리하는 빌드 도구
pom.xml프로젝트 정보와 라이브러리 의존성을 선언하는 설정 파일
표준 구조src/main/java, resources, webapp 등 일관된 디렉터리
의존성 관리dependency 선언만으로 라이브러리 자동 다운로드
log4jLogger, Appender, Layout으로 구성된 로깅 프레임워크
로그 레벨TRACE → DEBUG → INFO → WARN → ERROR → FATAL 순