본문으로 건너뛰기
안동민 개발노트 아이콘

안동민 개발노트

본문 시작
1장 : Spring Boot 소개와 실행 기반

Java 25와 Maven Wrapper로 첫 프로젝트 고정

"내 컴퓨터에서는 된다"는 대개 소스보다 실행 기준이 다를 때 생깁니다. Java 버전은 사용할 수 있는 언어와 JVM 기능을, Spring Boot 버전은 함께 관리되는 라이브러리 조합을, Maven Wrapper는 실제 빌드 도구 버전을 결정합니다.

이 교재의 기준은 Java 25, Spring Boot 4.1.0, Maven 3.9.16입니다. 전역 Maven 설치에 기대지 않고 저장소의 mvnw를 사용하면 학습자와 CI가 같은 빌드를 실행할 수 있습니다.


버전은 개발 환경이 아니라 프로젝트 계약이다

세 버전은 서로 대신할 수 없습니다. <java.version>은 컴파일 대상과 JVM 기준을 고정하고, Boot parent는 Spring 생태계 의존성의 호환 버전과 플러그인 기본값을 관리합니다. Wrapper는 그 pom.xml을 해석하고 빌드를 수행하는 Maven 자체를 고정합니다.

오류 메시지에 release version not supported가 보이면 Java 도구 체인을, 의존성 메서드가 없다면 Boot가 관리하는 라이브러리 조합을, 개발자마다 빌드 결과가 다르면 Wrapper 사용 여부를 먼저 확인합니다.


완전한 pom과 애플리케이션 진입점 만들기

다음 pom.xml은 실행에 필요한 웹 MVC와 검증, 상태 확인 기능만 넣은 출발점입니다. starter는 관련 라이브러리를 검증된 조합으로 묶어 주며, parent가 각 하위 의존성의 버전을 관리하므로 개별 버전을 반복해서 적지 않습니다.

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 https://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>4.1.0</version>
    <relativePath/>
  </parent>
  <groupId>com.andongmin</groupId>
  <artifactId>study-log-api</artifactId>
  <version>1.0.0</version>
  <properties>
    <java.version>25</java.version>
    <project.build.outputTimestamp>2026-07-13T00:00:00Z</project.build.outputTimestamp>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

spring-boot-maven-plugin은 일반 jar를 의존성까지 포함한 실행 가능한 jar로 다시 묶습니다. 반면 Maven Wrapper 파일은 pom.xml과 별도로 생성되어 저장소에 커밋됩니다. 둘은 모두 빌드에 관여하지만 하나는 산출물 형식, 다른 하나는 빌드 도구 재현성을 담당합니다.


Wrapper와 health 응답으로 재현성을 판정한다

Wrapper를 한 번 생성한 뒤에는 전역 mvn 대신 ./mvnw만 사용합니다. Windows PowerShell에서는 같은 위치의 mvnw.cmd를 실행하면 됩니다.

mvn -N wrapper:wrapper -Dmaven=3.9.16
./mvnw --version
./mvnw -q clean verify
Maven 3.9.16 확인 결과
Maven 3.9.16과 Java 25가 표시되고 verify가 성공해야 합니다.

./mvnw --version에 다른 Java가 표시되면 pom.xml을 바꾸기 전에 JAVA_HOMEPATH를 바로잡습니다. clean verify는 이전 산출물을 지우고 컴파일·검증 수명주기를 끝까지 실행하므로 단순히 IDE에서 실행되는 것보다 재현성을 더 정확히 보여 줍니다.


버전이 고정되었으니 다음에는 Boot가 이 클래스패스를 보고 어떤 Bean을 자동으로 구성했는지 추적합니다.