Spring Initializr로 Spring Boot 3.x 프로젝트를 빠르게 만들고, Gradle/Maven 선택 기준과 스타터 의존성 개념, Java 17 설정 포인트를 정리합니다.
도입 (문제 상황)
Spring Boot로 시작하려고 하는데 “프로젝트는 어떻게 만들지?”, “Gradle이랑 Maven 중 뭘 골라야 하지?”에서 첫날 시간을 다 쓰는 경우가 많습니다. 게다가 Spring Initializr 화면에서 의존성을 몇 개만 잘못 고르면, 실행은 되는데 나중에 설정 지옥이 시작되기도 해요.
핵심 개념 (Spring Initializr, 빌드 도구, 스타터가 중요한 이유)
Spring Initializr는 “Spring Boot가 잘 돌아가는 기본 골격”을 안전하게 만들어 주는 생성기입니다. 단순히 폴더만 만들어 주는 게 아니라, Boot 버전과 Java 버전 호환, 빌드 플러그인 구성, 스타터 의존성 조합까지 한 번에 정리해 줍니다. 즉, 첫 단추를 덜 삐뚤게 끼우게 해주는 도구예요.
Gradle vs Maven, 무엇을 선택해야 할까요?
둘 다 정답입니다. 다만 실무에서 체감 차이가 나는 지점이 있어서, 팀 상황에 맞춰 고르는 게 좋아요.
| 항목 | Gradle | Maven |
|---|---|---|
| 설정 파일 | build.gradle(Groovy) / build.gradle.kts(Kotlin) |
pom.xml |
| 장점 | 빌드 성능/유연성 좋음, 멀티모듈 구성 편함 | 표준화/가시성 좋음, 레거시/기업 환경에서 흔함 |
| 단점 | DSL 학습 필요(특히 Kotlin DSL) | 복잡한 커스터마이징은 다소 장황 |
| 추천 상황 | 신규 프로젝트, 멀티모듈, CI 최적화 | 기존 Maven 기반 조직, 규정/템플릿 고정 |

개인적으로 새 프로젝트라면 Gradle(특히 Kotlin DSL)을 많이 선택하지만, 조직 표준이 Maven이면 Maven으로 가는 게 장기적으로 비용이 적습니다. “내가 편한 것”보다 “팀이 유지보수하기 쉬운 것”이 더 중요해요.
스타터(Starter) 의존성은 “부품 세트”입니다
Spring Boot의 핵심 생산성은 spring-boot-starter-*에서 나옵니다. 스타터는 비유하면 “라면 스프” 같은 역할이에요. 개별 재료(라이브러리)를 하나씩 고르는 대신, 서로 호환되는 조합을 묶어서 제공하니 충돌이 줄고 설정이 단순해집니다.
예를 들어:
spring-boot-starter-web: Spring MVC + 내장 톰캣 + JSON 처리(Jackson) 등 웹 API에 필요한 기본 세트spring-boot-starter-test: JUnit, Mockito, Spring Test 등 테스트 기본 세트
스타터를 잘 고르면 “왜 이 라이브러리 버전이 안 맞지?” 같은 문제를 초반에 크게 줄일 수 있습니다.
Java 17 설정은 “선택”이 아니라 “전제”입니다
Spring Boot 3.x는 Java 17 이상이 전제입니다. 따라서 Initializr에서 Java 17을 고르고, 로컬/CI에서도 동일하게 맞춰야 합니다.
특히 실무에서 흔한 함정은 “로컬은 21인데 CI는 17” 같은 버전 불일치예요. 컴파일 옵션과 실행 환경이 어긋나면, 빌드/런타임 오류가 뒤늦게 터집니다.
flowchart LR
A["Spring Initializr"] --> B["Project Metadata"]
B --> C["Build Tool: Gradle or Maven"]
B --> D["Java Version: 17+"]
B --> E["Dependencies: Starters"]
C --> F["Generated build file"]
D --> F
E --> F
F --> G["Run Application"]
Initializr는 빌드 도구/Java 버전/스타터 선택을 조합해 “바로 실행 가능한 프로젝트”를 생성합니다.
코드 예제 (Spring Initializr로 생성한 프로젝트 그대로 실행하기)
아래 예제는 Spring Initializr에서 다음처럼 선택했다고 가정합니다.
- Project: Gradle - Groovy (원하시면 Kotlin DSL로 바꿔도 됩니다)
- Language: Java
- Spring Boot: 3.x
- Java: 17
- Dependencies: Spring Web, Spring Boot Actuator
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
src/main/java/com/example/demo/HelloController.java
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
src/main/resources/application.yml
server:
port: 8080
management:
endpoints:
web:
exposure:
include: "health,info"
실행 방법
./gradlew bootRun
http://localhost:8080/hello→hellohttp://localhost:8080/actuator/health→ 상태 확인
Maven을 선택하셨다면
mvn spring-boot:run으로 동일하게 실행할 수 있습니다.
실무 팁
💡 실무에서는
Java 버전은 “프로젝트 설정”이 아니라 “팀 약속”으로 고정해 두는 게 안전합니다.
- Gradle이라면 위 예제처럼
toolchain { languageVersion = 17 }를 넣어두면, 로컬 JDK가 달라도 빌드 JDK를 일관되게 맞추기 쉬워요(단, CI에도 툴체인/JDK 설치는 필요합니다). - 운영 서버/컨테이너의 JRE 버전도 반드시 동일 계열(17)로 맞춰 주세요.
💡 실무에서는
스타터는 최소로 시작하고, 필요할 때 추가하는 방식이 유지보수에 유리합니다.
처음부터 이것저것 넣으면 “왜 자동 설정이 켜졌지?”를 추적하기 어려워집니다. 예를 들어 DB를 아직 안 쓰는데 spring-boot-starter-data-jpa를 넣어두면, 데이터소스 설정이 없어서 부팅이 실패하는 식의 불필요한 마찰이 생겨요.
핵심 요약
- Spring Initializr는 Boot 3.x + Java 17 환경에서 “바로 실행 가능한” 프로젝트 골격을 안전하게 만들어 줍니다.
- Gradle/Maven은 팀 표준과 운영/유지보수 관점에서 선택하는 게 가장 합리적입니다.
- 스타터 의존성은 호환되는 라이브러리 묶음이라, 초반 설정 비용과 충돌을 크게 줄여줍니다.
다음 글: [#03 프로젝트 구조와 실행 흐름(메인 클래스부터)]
'Spring Boot' 카테고리의 다른 글
| Spring Boot Bean과 DI(의존성 주입) 핵심만: @Component/@Bean, 생성자 주입, 순환참조 (0) | 2026.03.08 |
|---|---|
| Spring Boot 로깅 기본: SLF4J + Logback 빠르게 세팅 (레벨/패턴/MDC/마스킹) (0) | 2026.03.07 |
| Spring Boot application.yml 설정 기본기 — properties vs yml, 계층 구조, 타입 바인딩까지 (0) | 2026.03.06 |
| Spring Boot 프로젝트 구조와 실행 흐름: 메인 클래스부터 @SpringBootApplication까지 (0) | 2026.03.05 |
| Spring Boot는 왜 쓰는가? — Spring vs Spring Boot 차이와 실무 포지션 (0) | 2026.03.04 |