IntelliJ로 Java & SpringBoot 작업을 하면서 Local에서 프로젝트를 실행할 때마다 어떻게 실행되는지 생각을 해 본 적이 딱히 없다. 하지만 공부를 하다가 빌드 과정을 알아보는 기회가 생겼고 알아두면 여러모로 좋을 듯 하다
스프링 프로젝트로 개발할 때 IntelliJ와 같은 IDE의 실행 버튼은 편리함을 제공하지만, 실제 배포를 위해서는 빌드 과정을 이해하고 직접 실행 가능한 .jar 파일을 생성하는 것이 중요하다. 이는 Docker 이미지 생성과 같은 다음 단계로 나아가기 위한 필수적인 지식이다
빌드(Build)란 무엇인가?
스프링 프로젝트는 소스코드(*.java 또는 *.kt)는 컴퓨터가 직접 실행할 수 있는 형태가 아니다. CPU가 이해하고 명령을 수행할 수 있도록 변환하는 과정이 필요한데, 이 일련의 과정을 빌드라고 한다
- 컴파일: .java 또는 .kt 소스 파일을 .class 파일(바이트코드)로 변환한다. 이 .class 파일들이 CPU가 실행할 수 있는 최소 단위이다
- 패키징: 프로젝트의 모든 .class 파일과 필요한 자원(resources)들을 하나의 압축된 실행 파일 형태로 묶는다. 스프링 부트 프로젝트의 경우, 이 최종 결과물이 바로 .jar 파일이다
- 실행 가능 상태: .jar 파일은 스스로를 실행할 수 있는 완전한 프로그램 패키지이다
IntelliJ의 실행 버튼: IDE에서 실행 버튼을 누르면, 내부적으로 위와 같은 빌드 및 패키징 과정을 거쳐 .jar 파일을 생성하고, 이 파일을 JVM(Java Virtual Machine)위에서 실행시키는 작업을 자동으로 수행해준다

- 실행하는 방법은 몇가지 더 있다
Gradle을 이용한 .jar 파일 직접 만들기
스프링 프로젝트는 주로 Gradle 또는 Maven과 같은 빌드 도구를 사용한다. 실무에서 많이 사용해본 Gradle을 기준으로 .jar 파일을 만드는 방법을 알아보자
프로젝트 루트 경로로 이동
터미널(또는 명령 프롬프트)을 열고 스프링 프로젝트의 최상위 경로(build.gradle 파일이 있는 곳)로 이동한다
gradlew 실행 권한 부여 (필요시)
./gradlew 명령 실행 시 permission denied 오류가 발생할 수 있다. 이는 gradlew 스크립트에 실행 권한이 없기 때문이다.
해당 명령어를 통해 실행 권한을 부여한다
<> bash
chmod +x gradlew
bootJar 태스트 실행
스프링 부트 애플리케이션의 실행 가능한 .jar 파일을 생성하기 위해 bootJar Gradle 태스크를 실행한다
<> bash
./gradlew bootJar
추가적인 유용한 Gradle 태스크
<> bash
./gradlew clean bootJar // 이전 빌드 결과 정리 후 빌드
./gradlew bootRun // 빌드 없이 직접 실행
bootJar vs Build
- bootJar: 실행 가능한 .jar 파일만 생성한다. 도커 이미지 생성 등 배포에 필요한 최소한의 결과물을 만든 때 유용하며, 일반적으로 많이 사용된다.
- build: bootJar를 포함하여 모든 빌드 태스크(컴파일, 태스크, 실행 가능한 .jar 파일, 소스 .jar 파일 등)를 수행한다
빌드 결과 확인
- bootJar 명령이 성공적으로 완료되면, 프로젝트 루트 경로의 build/libs 폴더 안에 .jar파일이 생성된다
- [rootProject.name]-[version].jar
- 이 파일이 빌드를 통해 생성된 실행 가능한 스프링 부트 애플리케이션 패키지이지만 실제로는 build.gradle의 version 설정에 따라 결정되며 0.0.1-SNAPSHOT은 기본값이지만, 프로젝트마다 다를 수 있다
.jar 파일 직접 실행하기
.jar 파일을 생성했다면, 이제 이를 JVM 위에서 직접 실행할 수 있다
Java 설치 확인
.jar 파일을 실행하려면 해당 시스템에 프로젝트가 빌드된 Java 버전과 일치하는 JVM(Java Runtime Enviroment)이 설치되어 있어야 한다. 예를 들어 프로젝트가 Java 17로 빌드되었다면, 시스템도 Java 17이 설치되어 있어야 한다
<> bash
java --version // 버전 확인 명령어
.jar 파일 실행
생성된 .jar 파일이 있는 build/libs 경로로 이동한 후, 명령어를 사용하여 애플리케이션을 실행한다
<> bash
java -jar [파일이름].jar
- 예시: java -jar project-name-0.0.0-SNAPSHOT.jar
실행 확인
명령어를 실행하면 콘솔에 스프링 부트 애플리케이션의 시작 로그가 출력되며, 애플리케이션이 정상적으로 시작되는 것은 확인할 수 있다. 이는 IntelliJ에서 실행 버튼을 눌렀을 때와 동일한 방식으로 애플리케이션이 구동되는 것이다
.jar 파일 직접 생성 – 실행의 중요성
- Docker 이미지 생성 이해: Docker 이미지를 만들 때는 이 .jar 파일을 이미지 안에 포함시키고, java -jar 명령어를 통해 컨테이너 내부에서 애플리케이션을 실행하는 방식을 사용한다. 직접 .jar 파일을 만들고 실행해보는 과정은 Dockerfile 작성 및 Docker 이미지 빌드 과정을 이해하는 데 필수적인 기반 지식이다
- 배포 환경 이해: 클라우드 서버 (예: AWS EC2)등에 애플리케이션을 배포할 때 .jar 파일을 전송하고 해당 서버에 맞는 Java를 설치한 후 직접 실행하는 것이 기본 방식이다. Docker를 사용하더라도 Dockerfile 내에서 이 .jar 파일으 다루는 방법을 이해해야 한다
- 문제 해결능력 향상: 빌드 및 실행 과정을 이해하면, 문제가 발생했을 때(예: ClassNotFoundException, 버전 불일치 등) 원인을 더 쉽게 파악하고 해결할 수 있다