Spring Boot 기반 Jar 파일

2023. 4. 17. 09:32Spring Boot

Spring Boot Application 실행 파일 생성

아래 그림처럼 Maven build... 메뉴 아이템을 선택합니다.

 

다음과 같이 clean package 명령어를 실행하여 해당 어플리케이션의 실행 파일을 생성합니다.

 

clean package 실행 결과는 다음과 같습니다.

 

프로젝트의 target 디렉토리에 해당 어플리케이션의 실행파일인, jar 파일이 생성되었음을 확인할 수 있습니다.

cmd 프로그램에서 해당 target 디렉토리로 이동한 후, 아래와 같이 해당 어플리케이션을 실행시키기 위해 명령어를 실행합니다.

java -jar taco-cloud-0.0.1-SNAPSHOT.jar

또는 gitbash가 로컬 호스트 PC에 설치되었다면, 아래와 같이 Git Bash Here을 선택합니다.

 

다음과 같이 해당 어플리케이션을 실행하기 위해 명령어를 실행합니다.

 

다음과 같이 해당 어플리케이션이 실행됨을 확인할 수 있습니다.

 

JAR 파일 내부 구

 

classpath.idx

classpath.idx 파일은 Spring Boot 기반 웹 어플리케이션의 JAR 파일 내부에 포함될 수 있는 파일 중 하나입니다. 이 파일은 Spring Boot의 실행 가능한 JAR 파일 형식의 일부로 사용되며, 클래스로드 성능을 최적화하는 데 도움을 줍니다.

Spring Boot는 내장된 Tomcat 서버와 같은 내장 컨테이너를 사용하여 독립 실행 가능한 애플리케이션을 제공합니다. 이러한 실행 가능한 JAR 파일은 uber-jar 또는 fat jar라고도 하는데, 이는 애플리케이션의 모든 종속성을 포함하고 있기 때문입니다. 이 방식은 배포가 매우 간단해지지만, 애플리케이션 시작 시 모든 클래스를 로드하는 데 시간이 걸릴 수 있습니다.

classpath.idx 파일은 Spring Boot가 클래스 경로를 효율적으로 스캔할 수 있도록 지원합니다. 이 파일은 JAR 파일 내의 클래스와 리소스의 인덱스를 포함하고 있어, Spring Boot가 필요한 클래스와 리소스를 빠르게 찾을 수 있게 해줍니다. 이는 애플리케이션의 시작 시간을 단축시키는 데 기여합니다.

Spring Boot 애플리케이션을 빌드할 때, Maven 또는 Gradle과 같은 빌드 도구와 Spring Boot의 Maven 플러그인 또는 Gradle 플러그인을 사용하면 `classpath.idx 파일이 자동으로 생성되고 JAR 파일에 포함됩니다. 이 과정은 빌드 시간에 약간의 오버헤드를 추가할 수 있지만, 실행 시간의 성능 이점이 이를 상쇄합니다.

classpath.idx는 Spring Boot가 실행 가능한 JAR 파일 내부에서 클래스와 리소스를 효율적으로 로드하고 관리할 수 있도록 도와주는 인덱스 파일입니다. 이는 특히 대규모 애플리케이션에서 시작 시간을 줄이는 데 중요한 역할을 합니다.

 

layers.idx

layers.idx 파일은 Spring Boot 2.3.0 이상 버전에서 도입된 레이어 기반 JAR 구조의 일부입니다. 이 기능은 애플리케이션의 다양한 부분을 분리된 레이어로 구성하여 Docker 이미지 빌드 시 효율성과 성능을 향상시키기 위해 설계되었습니다. layers.idx 파일은 각 레이어에 어떤 파일이 포함되어야 하는지에 대한 정보를 제공하며, 이를 통해 이미지 레이어 캐싱과 재사용을 최적화할 수 있습니다.

 

레이어 기반 JAR의 이점

  • 캐싱과 재사용: Docker와 같은 컨테이너 기술은 이미지 레이어를 캐싱하여 재사용합니다. 애플리케이션의 변경되지 않은 부분은 다시 빌드할 필요 없이 재사용될 수 있어, 이미지 빌드 시간과 저장소 사용량이 줄어듭니다.
  • 분리된 종속성: 애플리케이션의 종속성, Spring Boot 라이브러리, 사용자가 작성한 코드 등을 분리하여 관리할 수 있으므로, 코드 변경 시에만 관련 레이어를 재빌드하면 됩니다.
  • 효율적인 배포: 레이어를 통해 변경 빈도가 낮은 부분과 높은 부분을 분리함으로써 배포 과정을 최적화할 수 있습니다.

 

layers.idx 파일 구조

layers.idx 파일은 Spring Boot 애플리케이션의 레이어 구조를 정의합니다. 기본적으로, Spring Boot는 다음과 같은 레이어를 사용합니다:

  • dependencies layer: 애플리케이션의 외부 라이브러리 종속성이 포함됩니다.
  • spring-boot-loader layer: Spring Boot의 실행 가능한 JAR 파일을 로드하는 데 필요한 클래스가 포함됩니다.
  • snapshot-dependencies layer: 스냅샷 종속성이 포함됩니다. 이는 개발 중 자주 변경될 수 있습니다.
  • application layer: 애플리케이션의 실제 코드와 리소스가 포함됩니다.

개발자는 spring-boot-maven-plugin 또는 spring-boot-gradle-plugin의 설정을 통해 이 레이어를 커스터마이징할 수 있습니다. layers.idx 파일에는 이러한 레이어 구조와 각 레이어에 포함된 파일의 목록이 정의됩니다.

 

사용 방법

레이어 기반 이미지를 빌드할 때, spring-boot:build-image 명령을 사용하면 Spring Boot의 Maven 또는 Gradle 플러그인이 자동으로 layers.idx 파일을 생성하고 이를 사용하여 이미지 레이어를 구성합니다.

이 기능을 사용함으로써, Docker 이미지의 재빌드와 배포가 필요할 때 변경된 부분만 업데이트되므로, 전체 프로세스의 효율성이 크게 향상됩니다.

 

BOOT-INF/lib

BOOT-INF/lib 디렉토리는 Spring Boot 실행 가능 JAR 파일(.jar)의 내부에 위치하며, 애플리케이션을 실행할 때 필요한 모든 외부 라이브러리와 종속성을 포함합니다. Spring Boot 애플리케이션은 자체적인 클래스 로더를 사용하여 이러한 라이브러리를 로드하고, 애플리케이션의 실행에 필요한 모든 클래스와 리소스에 접근할 수 있도록 합니다.


BOOT-INF/lib 디렉토리의 역할:

  • 종속성 포함: 애플리케이션의 빌드 프로세스 중에 Maven, Gradle 등의 빌드 도구를 통해 정의된 모든 종속성은 BOOT-INF/lib 디렉토리에 복사됩니다. 이는 애플리케이션 실행 시 필요한 모든 외부 라이브러리가 포함되어 있음을 의미합니다.
  • 클래스 로딩: Spring Boot 애플리케이션을 시작할 때, 내장된 클래스 로더는 BOOT-INF/classes 디렉토리에 있는 애플리케이션의 클래스와 리소스 뿐만 아니라 BOOT-INF/lib에 있는 JAR 파일들을 로드합니다. 이를 통해 애플리케이션은 실행 시 모든 필요한 클래스와 리소스에 접근할 수 있습니다.
  • 독립 실행 가능: BOOT-INF/lib 디렉토리에 종속성을 포함시킴으로써, Spring Boot 애플리케이션은 독립 실행 가능한 JAR 파일로 패키징됩니다. 이는 애플리케이션을 쉽게 배포하고 실행할 수 있게 해줍니다. 애플리케이션을 실행하기 위해 필요한 것은 Java 런타임 환경과 이 JAR 파일뿐입니다.

실행 방법:
Spring Boot JAR 파일을 실행하는 것은 매우 간단합니다. Java 명령어를 사용하여 JAR 파일을 직접 실행할 수 있습니다:

java -jar your-application.jar

 

이 명령은 JAR 파일 내의 Spring Boot 로더를 활성화하고, 로더는 BOOT-INF/lib 디렉토리에 있는 종속성과 BOOT-INF/classes에 있는 애플리케이션의 클래스를 로드하여 애플리케이션을 시작합니다.

BOOT-INF/lib 디렉토리는 Spring Boot의 실행 가능한 JAR 파일 포맷의 핵심적인 부분으로, 애플리케이션의 포터블하고 독립적인 배포를 가능하게 하는 데 중요한 역할을 합니다.

 

org 디렉토리

org 디렉토리는 Java 또는 Spring Boot 애플리케이션의 패키지 구조 내에서 흔히 볼 수 있는 디렉토리입니다. Java에서 패키지는 클래스와 인터페이스를 조직화하는 데 사용되는 네임스페이스입니다. org라는 이름의 디렉토리는 주로 조직(organizations)이나 오픈 소스 프로젝트에서 사용하는 패키지의 루트를 나타냅니다. 예를 들어, org.springframework는 Spring 프레임워크의 클래스들을 포함하고, org.apache는 Apache 소프트웨어 재단의 프로젝트 클래스들을 포함합니다.

org 디렉토리의 역할:

  • 패키지 조직: org 디렉토리는 조직이나 프로젝트의 고유한 네임스페이스를 제공합니다. 이를 통해 클래스 이름 충돌을 방지하고, 코드의 모듈성과 재사용성을 향상시킬 수 있습니다.
  • 라이브러리 통합: 많은 Java 라이브러리와 프레임워크는 org 디렉토리 아래에 자신의 패키지 구조를 가지고 있습니다. 이를 통해 개발자들은 필요한 라이브러리를 쉽게 찾고, 애플리케이션에 통합할 수 있습니다.
  • 코드 이해와 유지보수: 명확한 패키지 구조는 코드의 이해와 유지보수에 큰 도움이 됩니다. `org` 디렉토리와 그 아래의 패키지 구조는 코드를 논리적으로 구분하고, 관련 기능을 함께 그룹화하여 프로젝트의 구조를 명확하게 합니다.

사용 예:

  • org.apache.commons: Apache Commons 프로젝트의 클래스들을 포함합니다. 이는 Java에서 널리 사용되는 유틸리티 클래스들을 제공합니다.
  • org.springframework: Spring 프레임워크 관련 클래스들을 포함합니다. Spring은 엔터프라이즈 애플리케이션 개발을 위한 포괄적인 프로그래밍 및 구성 모델을 제공합니다.

org 디렉토리는 소스 코드의 패키지 구조에서 찾을 수 있으며, 빌드 과정에서 생성된 실행 가능한 JAR 파일이나 WAR 파일 내에도 포함될 수 있습니다. JAR 파일 내에서 org 디렉토리는 클래스 로더에 의해 참조되며, 애플리케이션 실행 시 필요한 클래스와 리소스를 로드하는 데 사용됩니다.

 

org/springframework/boot/loader

org/springframework/boot/loader 디렉토리에 있는 클래스 파일들은 Spring Boot의 실행 가능한 JAR 파일 형식을 지원하기 위한 클래스 로더와 관련 유틸리티를 포함합니다. 이들은 Spring Boot 애플리케이션의 자체적인 실행과 패키징 메커니즘의 핵심 부분을 구성합니다.

org/springframework/boot/loader의 주요 기능:

  • 실행 가능한 JAR 지원: Spring Boot는 독립 실행 가능한 JAR 파일(fat JAR 또는 uber JAR라고도 함)을 생성할 수 있게 해주며, 이 JAR 파일은 애플리케이션과 모든 종속성을 포함합니다. loader 디렉토리에 있는 클래스들은 이런 형식의 JAR 파일을 로드하고 실행할 수 있는 기능을 제공합니다.
  • 클래스 로딩: Spring Boot는 전통적인 Java 클래스 로더와는 다른 사용자 정의 클래스 로더를 구현하여, 실행 가능한 JAR 파일 내부에 있는 클래스와 리소스를 로드합니다. org/springframework/boot/loader에 있는 클래스 파일들은 이 사용자 정의 클래스 로더의 구현체입니다.
  • 리소스 접근: 실행 가능한 JAR 파일 내부의 리소스에 접근하기 위한 매커니즘을 제공합니다. 이는 BOOT-INF/classes와 BOOT-INF/lib 내부의 리소스와 클래스를 적절히 참조할 수 있게 해줍니다.
  • 애플리케이션 실행: loader 디렉토리 내의 클래스들은 JAR 파일이 실행될 때 초기 진입점(entry point)을 제공하며, 애플리케이션의 메인 클래스를 로드하고 실행하는 역할을 합니다.

예시 클래스:

  • JarLauncher: 실행 가능한 JAR 파일을 시작하는 데 사용됩니다.
  • WarLauncher: 실행 가능한 WAR 파일을 위한 것으로, 주로 웹 애플리케이션에 사용됩니다.
  • PropertiesLauncher: 프로퍼티 파일을 통해 더 세밀한 클래스 로딩 설정이 가능한 로더입니다.
  • LaunchedURLClassLoader: Spring Boot 애플리케이션에서 사용되는 사용자 정의 클래스 로더입니다.

이 클래스들은 Spring Boot 애플리케이션의 실행 가능한 JAR 파일이 자체적으로 실행될 수 있게 만드는 데 필수적입니다. 사용자는 일반적으로 이러한 내부 메커니즘을 직접 다루지 않아도 되며, Spring Boot의 빌드 플러그인과 스타터가 이러한 복잡성을 추상화하고 관리합니다.

 

BOOT-INF/lib 디렉토리와 org 디렉토리에 있는 클래스 파일들 사이의 차이점

BOOT-INF/lib 디렉토리와 org 디렉토리에 있는 클래스 파일들 사이의 차이점을 이해하려면, 먼저 이들이 위치하는 컨텍스트와 각각의 용도를 알아야 합니다.

BOOT-INF/lib 디렉토리:

  • 위치와 용도: BOOT-INF/lib는 Spring Boot의 실행 가능한 JAR 파일 내부에 위치합니다. 이 디렉토리는 애플리케이션의 외부 라이브러리와 종속성을 포함합니다. 여기에 포함된 파일들은 주로 JAR 파일 형태로, 애플리케이션 실행 시 필요한 외부 코드와 리소스를 제공합니다.
  • 종류: 이 디렉토리에는 Spring Framework, Apache Commons, Hibernate 등과 같이 애플리케이션에서 사용되는 외부 라이브러리의 JAR 파일들이 포함됩니다.
  • 클래스 로딩: Spring Boot 애플리케이션을 시작할 때, 내장된 클래스 로더는 이 디렉토리의 JAR 파일들을 로드하여 애플리케이션에 필요한 추가 기능과 기능성을 제공합니다.

org 디렉토리:

  • 위치와 용도: org 디렉토리는 일반적으로 소스 코드 레벨에서 패키지 구조의 일부로 나타납니다. 이 디렉토리 및 그 하위 디렉토리에는 주로 조직(organizations)이나 오픈 소스 프로젝트의 패키지 네임스페이스 하에 구성된 Java 클래스 파일들이 포함됩니다.
  • 종류: org 디렉토리 내의 클래스 파일들은 애플리케이션 또는 사용된 라이브러리에 속한 실제 Java 클래스들입니다. 예를 들어, org.springframework 디렉토리는 Spring 프레임워크의 구성 요소를 구현한 클래스 파일들을 포함할 수 있습니다.
  • 클래스 로딩: 애플리케이션 실행 시, org 디렉토리에 있는 클래스 파일들은 클래스 로더에 의해 직접 또는 해당 라이브러리의 JAR 파일 내부에서 참조되어 로드됩니다.

차이점:

  • 용도: BOOT-INF/lib 디렉토리는 외부 라이브러리와 종속성을 포함하는 반면, org 디렉토리는 실제 Java 클래스 파일들, 즉 소스 코드 또는 라이브러리의 구성 요소를 구조화하는 데 사용됩니다.
  • 형태: BOOT-INF/lib에는 JAR 파일 형태의 라이브러리가 포함되어 있는 반면, org 디렉토리에는 주로 .class 파일 형태의 컴파일된 Java 클래스가 포함됩니다.
  • 클래스 로딩 메커니즘: BOOT-INF/lib의 JAR 파일들은 애플리케이션 시작 시 클래스 로더에 의해 집합적으로 로드되며, org 디렉토리의 클래스 파일들은 필요에 따라 개별적으로 로드됩니다.

따라서 이 두 디렉토리는 Java 및 Spring Boot 애플리케이션의 구조와 기능성을 지원하는 서로 다른 역할을 수행합니다.

'Spring Boot' 카테고리의 다른 글

@Autowired  (0) 2023.04.17
Spring Boot DevTools  (0) 2023.04.17
@Conditional  (0) 2023.04.13
3. Spring Data JPA Query Methods Naming Rules  (0) 2023.04.13
MySQL 스키마 생성  (0) 2023.04.12