빠른 비교
src/
main/
java/
test/
java/
pom.xml # Maven
build.gradle # Gradle갈리는 기준
어떤 빌드 도구와 구조를 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 표준 구조를 빠르게 익히기 | 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, 복잡한 빌드 자동화에 자주 보임선택 기준
| 상황 | 적합한 선택 |
|---|---|
| 입문, 표준 구조 학습 | 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