Quick Comparison
src/
main/
java/
test/
java/
pom.xml # Maven
build.gradle # Gradle| 필요 | 먼저 볼 도구·위치 | 운영 경계 |
|---|---|---|
| 관례 중심의 선언형 build | Maven + pom.xml | wrapper로 version을 고정 |
| plugin·build logic 확장 | Gradle + build.gradle(.kts) | build logic 복잡도를 분리 |
| production source | src/main/java | test source와 classpath가 다름 |
| test source | src/test/java | test dependency scope를 분리 |
갈리는 기준
어떤 빌드 도구와 구조를 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 표준 구조를 빠르게 익히기 | Maven |
| 유연한 빌드 스크립트가 필요 | Gradle |
| 애플리케이션 코드 위치 | src/main/java |
| 테스트 코드 위치 | src/test/java |
| 테스트 전용 의존성 | Maven test / Gradle testImplementation |
build 도구 역할: 컴파일부터 패키징까지
Java 프로젝트는 소스 컴파일, dependency 다운로드, 테스트 실행, JAR/WAR 패키징 같은 반복 작업이 항상 따라옵니다. Maven과 Gradle은 이 흐름을 자동화하는 도구입니다. pom.xml이나 build.gradle에 dependency를 선언하면 빌드 도구가 필요한 라이브러리를 Maven Central 같은 저장소에서 자동으로 내려받습니다.
<!-- Maven — pom.xml에 dependency 선언 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope> <!-- 테스트에서만 사용 -->
</dependency>// Gradle — build.gradle에 dependency 선언
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}Maven: 규약 중심 구조
Maven은 표준 디렉터리 구조와 lifecycle이 정해져 있어 입문자가 전체 흐름을 파악하기 좋습니다. src/main/java에 소스, src/test/java에 테스트, src/main/resources에 설정 파일을 두는 규약을 따르면 추가 설정 없이 빌드됩니다.
프로젝트/
src/
main/
java/ ← 소스 코드
resources/ ← 설정 파일, 템플릿
test/
java/ ← 테스트 코드
resources/ ← 테스트 전용 설정
pom.xml ← 빌드 설정
target/ ← 빌드 결과물 (자동 생성)Gradle: 유연한 스크립트 기반
Gradle은 Groovy 또는 Kotlin DSL로 빌드 설정을 작성합니다. 멀티모듈 프로젝트, Android, 복잡한 빌드 파이프라인에서 더 많이 보입니다. 유연한 만큼 처음엔 "무엇이 어디서 설정되는가"가 Maven보다 덜 눈에 들어올 수 있습니다.
// build.gradle (Groovy DSL)
plugins {
id 'java'
}
dependencies {
implementation 'com.google.guava:guava:32.1.3-jre'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}
test {
useJUnitPlatform()
}Maven vs Gradle을 실제로 고르는 기준
둘 다 의존성 관리, 테스트 실행, 패키징은 해 줍니다. 차이는 "규약을 따라 빨리 익힐 것인가"와 "스크립트로 더 유연하게 커스터마이즈할 것인가"에 가깝습니다.
Maven:
- 표준 디렉터리 구조와 lifecycle이 강함
- pom.xml을 보면 의존성과 플러그인 구성이 비교적 눈에 잘 들어옴
Gradle:
- 빌드 로직을 더 유연하게 작성 가능
- 멀티모듈, Android, 복잡한 빌드 자동화에 자주 보임새 프로젝트와 CI는 설치된 전역 도구 대신 Maven Wrapper(mvnw) 또는 Gradle Wrapper(gradlew)로 실행해 build tool version을 고정합니다. Java language level과 toolchain도 build file에 명시하고, transitive dependency graph, lock/verification 정책, update 절차를 운영 요구사항에 맞춰 관리합니다.
선택 기준
| 상황 | 적합한 선택 |
|---|---|
| 입문, 표준 구조 학습 | Maven (규약 중심, 이해 쉬움) |
| Android 개발 | Gradle (공식 빌드 도구) |
| 대형 멀티모듈 프로젝트 | Gradle (유연한 커스터마이징) |
| Spring Boot 입문 | Maven 또는 Gradle 모두 가능 |
| 빌드 도구 공통 역할 | dependency 관리, 테스트 실행, 패키징 |
주의할 점
테스트 전용 라이브러리를 compile/implementation scope로 추가하면 운영 배포 파일에 불필요한 의존성이 포함됩니다.
<!-- ❌ JUnit을 compile scope로 선언 — 운영 JAR에 포함됨 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<!-- scope 없음 → 기본값 compile -->
</dependency>
<!-- ✅ test scope 명시 — 테스트에서만 사용 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>소스와 테스트를 표준 디렉터리 밖에 섞어 두면, 입문 단계에서 빌드 실패 원인을 찾기 어려워집니다.
// ❌ src 아래에 코드와 테스트를 섞어 둠
src/
App.java
AppTest.java
// ✅ 표준 구조
src/
main/java/
test/java/참고 링크
3 sources