catsridingCATSRIDING|OCEANWAVES
Dev

Spring Boot 애플리케이션 터미널에서 프로파일 선택하여 실행하기

jynn@catsriding.com
Oct 26, 2023
Published byJynn
999
Spring Boot 애플리케이션 터미널에서 프로파일 선택하여 실행하기

Running Spring Boot Application with Profiles on Terminal

Spring Boot에서는 서로 다른 환경에 대한 구성을 분류하고 관리하기 위해 프로파일(Profiles)이라는 개념을 사용합니다. 이번 글에서는 Spring Boot 프로젝트를 주요 빌드 도구인 Gradle 및 Maven을 통해서 프로파일과 함께 터미널에서 어떻게 실행하는지에 대해서 알아보겠습니다.

Understanding Spring Profiles

Spring 프로파일은 특정 기능들을 활성화하거나 특정 환경 변수를 설정하는 등, 애플리케이션의 구성을 변화시킵니다. 예를 들어, 개발, 테스트, 프로덕션 등의 환경에 대한 설정을 각각 다르게 하여 프로파일로 관리할 수 있습니다. 이런 방식은 환경에 더욱 유연하게 앱을 구성하고 실행하는 데 도움이 됩니다.

Spring Boot에서는 프로파일을 application.yml 파일 또는 application.properties 파일을 통해 설정할 수 있습니다. 예를 들어, application.yml 파일은 여러 프로파일을 포함하도록 구성될 수 있습니다. 이 파일은 Spring Boot에서 자동으로 로드되며, 사용할 프로파일을 지정하면 해당 프로파일에 대한 설정이 활성화됩니다.

application.yml
spring:
  profiles:
    active: local
  datasource:
    url: jdbc:mysql://localhost:3306/test_db
    username: {LOCAL_DATASOURCE_USERNAME}
    password: {LOCAL_DATASOURCE_PASSWORD}

---

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db
    username: {DEV_DATASOURCE_USERNAME}
    password: {DEV_DATASOURCE_PASSWORD}

---

spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://localhost:3306/prod_db
    username: {PROD_DATASOURCE_USERNAME}
    password: {PROD_DATASOURCE_PASSWORD}

하나의 application.yml 파일로 여러 프로파일을 설정할 수 있습니다. 각 프로파일의 설정을 파일 단위로 분리하고 싶다면, application-{profiles}.yml 형식의 파일을 생성해야 합니다. Spring Profiles 관리하기에서 자세한 내용을 확인할 수 있습니다.

Running Java Applications via CLI

Spring Boot 애플리케이션도 기본적으로 Java 애플리케이션이므로, 먼저 Java 애플리케이션 실행 구문을 이해하는 것이 중요합니다. Java 애플리케이션은 java 또는 javaw 명령을 사용하여 시작할 수 있으며, 설정은 커맨드 라인 인수, 환경 변수, 속성 파일을 통해 전달됩니다.

Syntax for Running Java Applications

Java 애플리케이션 실행 구문은 다음과 같습니다:

Syntax
java [options] <class> [arguments]
java [options] -jar <file.jar> [arguments]
javaw [options] <class> [arguments]
javaw [options] -jar <file.jar> [arguments]
  • java: 자바 애플리케이션을 실행하는 기본 명령어로, JVM 설정을 조정하고 main() 메서드를 포함하는 클래스를 실행합니다.
  • javaw: 콘솔 창 없이 자바 애플리케이션을 실행하는 명령어로, 주로 GUI 애플리케이션을 실행할 때 사용되며 오류 메시지는 별도의 창에 표시됩니다.
  • [options]: JVM에 전달되는 커맨드 라인 옵션으로, 메모리 설정, 시스템 속성 설정, 가비지 컬렉션 로그 출력 등의 다양한 기능을 포함합니다.
  • -jar: JAR 파일을 실행하기 위한 옵션입니다.
  • <file.jar>: 실행할 JAR 파일을 나타내며, JAR 파일 내의 META-INF/MANIFEST.MF 메타데이터 파일에 Main-Class가 명시되어 있어야 합니다.
  • <class>: main() 메서드를 포함하는 자바 클래스입니다. 커맨드 라인 인수와 함께 사용하여 특정 클래스를 실행합니다.
  • arguments: 실행할 클래스나 JAR 파일에 전달할 커맨드 라인 인수로, 애플리케이션의 main(String[] args) 메서드에 전달됩니다.

이러한 옵션과 인수들은 다양한 실행 환경에서 Java 애플리케이션의 동작을 유연하게 조정하는 데 유용합니다.

다음은 간단한 Java 애플리케이션을 만들어서 컴파일하고 실행하는 과정을 통해 Java 애플리케이션의 기본적인 실행 방식을 이해해보겠습니다.

  1. 먼저, 텍스트 에디터를 열어 Application.java 파일을 작성합니다:
Terminal
$ vim Application.java
  1. Application.java 파일에 다음과 같이 main() 함수 코드를 입력합니다:
Application.java
public class Application {

    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}
  1. Application.java 파일을 저장한 후, 해당 파일과 동일한 경로에서 javac 명령어를 사용하여 클래스 파일로 컴파일합니다:
Terminal
$ javac Application.java
  1. 컴파일이 성공하면, 현재 디렉토리에 Application.class 파일이 생성됩니다. 이 .class 파일은 자바 컴파일러가 생성한 바이트코드로, JVM이 이해하고 실행할 수 있는 코드입니다:
Terminal
$ eza -alhF --icons
Permissions Size User       Date Modified Name
.rw-r--r--   428 catsriding 27 May 18:21   Application.class
.rw-r--r--   126 catsriding 27 May 18:21   Application.java
  1. 이제 다음 명령어를 사용하여 컴파일된 Java 애플리케이션을 실행합니다. 이 과정에서 JVM은 Application.class 파일을 읽고 main() 메서드를 실행하여 "Hello, Java!" 메시지를 출력합니다:
Terminal
$ java Application
Hello, Java!

간단한 "Hello, Java!" 메시지를 출력하는 Java 애플리케이션을 작성하고 실행해보았습니다. 이 과정을 통해 Java 애플리케이션이 어떻게 컴파일되고 실행되는지 확인할 수 있었습니다. Spring Boot 애플리케이션도 이러한 Java 애플리케이션 실행 방식을 따르기 때문에, 이 기본적인 실행 과정을 이해하는 것이 중요합니다.

Dynamic Application Arguments

Spring Boot 애플리케이션 실행 시 커맨드 라인 인수(Command Line Arguments)를 통해 다양한 설정을 동적으로 변경할 수 있어 애플리케이션 운영에 매우 유용합니다. 이를 통해 애플리케이션의 동작을 현재 상황이나 요구 사항에 맞게 유연하게 조정할 수 있습니다.

JVM Options

-X 옵션은 메모리 설정, 가비지 컬렉션 동작 등 JVM의 동작 방식을 조정하는 데 사용됩니다. -D 옵션은 JVM 시스템 속성을 설정하는 방법이며, Java 애플리케이션 전반에서 활용되어 Spring Boot 애플리케이션에서도 사용할 수 있습니다. 이러한 옵션들은 JVM이 시작될 때 특정 속성을 설정하여 애플리케이션이 해당 속성을 활용할 수 있게 합니다.

Terminal
$ java -Xmx1024m -Xms512m -Dfile.encoding=UTF-8 -jar catsriding.jar

이렇게 옵션을 추가하면 다음과 같이 내부적으로 동작합니다:

  1. JVM 동작 방식 조정: -Xmx-Xms 옵션을 사용하여 최대 및 초기 힙 메모리 크기를 설정할 수 있습니다. -Xmx1024m은 최대 힙 메모리 크기를 1024MB로 설정하고, -Xms512m은 초기 힙 메모리 크기를 512MB로 설정합니다.
  2. JVM 시스템 속성 설정: -D 옵션은 JVM의 시스템 속성으로 값을 설정합니다. 이는 System.setProperty() 메서드를 호출하여 설정하는 것과 동일한 효과를 가집니다. 현재 위 코드에서 사용된 -Dfile.encoding=UTF-8 옵션은 시스템 속성 file.encodingUTF-8로 설정합니다.
  3. JVM 초기화: JVM이 시작되면서 설정된 시스템 속성들이 JVM 내에서 전역적으로 유지됩니다. 이러한 시스템 속성은 JVM 실행 중 어디에서나 접근할 수 있습니다.
  4. Spring Boot 애플리케이션 초기화: Spring Boot 애플리케이션이 SpringApplication.run() 메서드를 호출하면서 초기화됩니다.
  5. 환경 속성 로드: 초기화 과정에서 Spring Boot는 Environment 객체를 사용하여 애플리케이션의 환경 속성을 관리합니다. Environment 객체는 application.yml 같은 기본 속성 파일, 환경 변수, 그리고 커맨드 라인 옵션 등 여러 소스로부터 속성을 로드합니다.
  6. 시스템 속성 읽기: System.getProperties() 메서드를 호출하여 JVM의 시스템 속성들이 Environment 객체에 추가됩니다. 이 과정에서 file.encoding과 같은 속성들이 Environment 객체에 설정됩니다.
  7. 환경 설정 적용: Spring Boot는 Environment 객체에 설정된 값을 기반으로 애플리케이션의 환경을 구성합니다. 예를 들어, file.encoding=UTF-8 속성이 설정되면, 애플리케이션 내에서 파일 인코딩 설정이 UTF-8로 적용됩니다.

실무에서 자주 사용되는 JVM 옵션으로는 다음과 같은 것들이 있습니다:

  • -D<name>: 시스템 속성 설정
  • -Xmx<size>: 최대 힙 메모리 크기 설정
  • -Xms<size>: 초기 힙 메모리 크기 설정
  • -XX:+UseG1GC: G1 가비지 컬렉터 사용
  • -XX:+UseConcMarkSweepGC: CMS 가비지 컬렉터 사용
  • -Xdebug: 디버깅을 위한 설정
  • -Xrunjdwp: 원격 디버깅 설정
  • -XX:+PrintGCDetails: 가비지 컬렉션 상세 정보 출력
  • -XX:+PrintGCTimeStamps: 가비지 컬렉션 타임스탬프 출력
  • -classpath, -cp: 클래스 경로 설정
Program Arguments

Spring Boot 프로젝트를 구성하면 main() 함수를 지닌 클래스가 항상 있습니다. 이 main() 함수는 Java 프로그램의 시작점이며, Spring Boot 애플리케이션도 이를 통해 실행됩니다.

Application.java
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Java 애플리케이션의 시작점인 main(String[] args) 메서드는 인자로 String[] 배열을 받아 애플리케이션 실행 시 외부에서 명령줄 인수를 전달받을 수 있습니다. 일반적인 Java 애플리케이션뿐만 아니라 Spring Boot 애플리케이션에서도 -- 옵션을 활용하여 커맨드 라인 인수를 전달할 수 있으며, 이러한 인수들은 main() 함수의 String[] args 배열을 통해 애플리케이션에 전달됩니다. 이후 Spring Boot는 이를 애플리케이션 속성으로 자동 매핑하여 활용합니다.

Terminal
$ java -jar catsriding.jar --spring.profiles.active=dev --server.port=8081

이렇게 옵션을 추가하면 내부적으로 다음과 같이 동작합니다:

  1. 커맨드 라인 인수 전달: -- 뒤의 인수들은 Spring Boot 애플리케이션 실행 시 main() 메서드의 String[] args로 전달됩니다.
  2. SpringApplication 초기화: SpringApplication.run() 메서드는 전달된 인수를 받아 ApplicationArguments 객체로 변환합니다. 이 객체는 커맨드 라인 인수를 파싱하는 역할을 합니다.
  3. 인수 파싱 및 적용: ApplicationArguments 인터페이스를 통해 커맨드 라인 인수를 파싱하고, 이를 Spring 환경 설정에 반영합니다. 커맨드 라인 인수는 높은 우선순위를 가지며, 기존의 application.propertiesapplication.yml 설정을 덮어씁니다.
  4. 환경 설정 적용: Spring의 Environment 객체는 파싱된 커맨드 라인 인수를 관리하며, 이를 통해 프로파일 활성화 및 기타 설정값들을 애플리케이션에 적용합니다. 예를 들어, --spring.profiles.active=dev가 설정되면, dev 프로파일에 정의된 모든 빈과 설정이 활성화됩니다.

다음은 자주 사용되는 커맨드 라인 인수들입니다:

  • --spring.profiles.active: Spring 프로파일 활성화
  • --server.port: 서버 포트 설정
  • --spring.config.location: Spring 설정 파일 위치 지정
  • --logging.level.root: 로깅 레벨 설정
  • --spring.datasource.url: 데이터베이스 URL 설정
  • --spring.datasource.username: 데이터베이스 사용자 이름 설정
  • --spring.datasource.password: 데이터베이스 비밀번호 설정
  • --spring.jpa.hibernate.ddl-auto: Hibernate DDL 자동 설정
  • file.txt: 입력 또는 출력에 사용될 파일의 경로 지정
  • username: 시스템 또는 애플리케이션에서 사용할 사용자 이름 지정
  • input: 처리할 입력 파일의 경로 지정
  • output: 결과를 저장할 출력 파일의 경로 지정
Gradle Arguments

--args 옵션은 Gradle의 bootRun 태스크에 전달할 커맨드 라인 인수를 설정하는 데 사용됩니다. 이는 Gradle 스크립트 내에서 Spring Boot 애플리케이션을 실행할 때 사용됩니다. 이 옵션은 Gradle의 bootRun 태스크에서만 사용되며, 다른 Gradle 태스크에는 적용되지 않습니다.

Terminal
$ ./gradlew bootRun --args='--spring.profiles.active=dev --server.port=8081'

이렇게 옵션을 추가하면 다음과 같이 내부적으로 동작합니다:

  • Gradle 태스크 실행: bootRun 태스크를 실행할 때 --args 옵션을 통해 커맨드 라인 인수를 전달합니다.
  • 인수 전달 및 파싱: Gradle은 bootRun 태스크를 실행할 때 --args 옵션으로 전달된 인수를 SpringApplication.run() 메서드에 전달합니다. 이 인수들은 main(String[] args) 메서드의 args 배열을 통해 전달됩니다.
  • SpringApplication 초기화: Spring Boot는 ApplicationArguments 객체를 사용하여 전달된 인수를 파싱합니다. 이 객체는 String[] args를 기반으로 생성되며, 커맨드 라인 인수를 구조화된 형태로 제공합니다.
  • Spring 환경 설정: Spring Boot는 파싱된 인수를 Spring 환경 설정에 반영합니다. 이 과정에서 --args 옵션으로 전달된 인수는 기존의 application.propertiesapplication.yml 파일의 설정보다 높은 우선순위를 가지며, 이를 덮어씁니다.
  • 애플리케이션 초기화: 최종적으로 설정된 속성 값은 애플리케이션 컨텍스트와 빈 초기화에 사용됩니다. 예를 들어, --args='--spring.profiles.active=dev'가 설정되면, dev 프로파일에 정의된 모든 빈과 설정이 활성화됩니다.

이러한 메커니즘을 통해 Spring Boot 애플리케이션은 다양한 실행 환경에서 유연하게 설정값을 전달받아 동작할 수 있습니다.

Running Spring Boot Applications via CLI

Spring Boot 애플리케이션을 다양한 환경에서 실행하기 위해 Gradle, Maven, 그리고 패키징된 애플리케이션을 커맨드 라인을 통해 간편하게 프로파일과 설정을 조정할 수 있습니다.

Running with Gradle

Gradle은 오픈 소스 빌드 자동화 시스템으로, Java, Groovy, Kotlin 등을 지원하며 유연성과 성능이 뛰어납니다. 최신 기술을 활용하여 빠른 빌드 속도를 제공하며, 빌드 캐시 및 증분 빌드를 통해 효율성을 극대화합니다. 또한 다양한 플러그인과 확장을 통해 다양한 빌드 시나리오를 지원하며, Groovy 또는 Kotlin DSL을 사용하여 직관적이고 명확한 빌드 스크립트를 작성할 수 있는 장점이 있습니다.

Using Gradle Wrapper

Spring Boot 프로젝트를 Gradle을 기반으로 구성한 경우, Gradle Wrapper를 사용할 수 있습니다. 로컬 머신에 Gradle이 설치되지 않은 경우에도 프로젝트 폴더에 있는 ./gradlew 스크립트를 이용하면 로컬 설치 없이 Gradle을 실행할 수 있습니다.

Terminal
$ ./gradlew bootRun --args='--spring.profiles.active={profiles}'
Using Gradle Commands

macOS에서 Homebrew를 통해 Gradle을 설치할 수 있습니다. 이렇게 로컬 머신에 Gradle을 설치하면 명령어가 더 단순해져서 CLI를 자주 사용하는 경우 더 편리하게 작업할 수 있습니다. 다음 명령어를 사용하여 Gradle을 설치하고 사용할 수 있습니다.

  1. Homebrew가 설치되어 있는지 확인합니다. Homebrew가 설치되어 있지 않다면 Homebrew 공식 사이트를 참고하여 설치합니다.
  2. 터미널을 열고 다음 명령어를 입력하여 Gradle을 설치합니다.
Terminal
$ brew install gradle
  1. 설치가 완료되면 Gradle 명령어를 사용하여 Spring Boot 애플리케이션을 프로파일과 함께 실행할 수 있습니다.
Terminal
$ gradle bootRun --args='--spring.profiles.active={profiles}'

Running with Maven

Maven은 Gradle과 마찬가지로 널리 사용되는 빌드 자동화 도구로, 주로 Java 프로젝트에서 사용됩니다. Maven은 프로젝트 객체 모델(POM)이라는 개념을 통해 프로젝트의 빌드, 보고서 및 문서화 작업을 관리합니다. Maven은 오랫동안 사용되어 왔으며, 풍부한 자료와 안정적인 환경을 제공합니다. 모든 프로젝트가 동일한 구조를 가지며 표준화된 빌드 과정을 따릅니다. 또한 중앙 리포지토리를 통해 의존성 라이브러리를 쉽게 관리하고 다운로드할 수 있으며, 다양한 플러그인 시스템을 통해 빌드 프로세스를 확장할 수 있는 장점이 있습니다.

Using Maven Wrapper

Spring Boot 프로젝트를 Maven을 기반으로 구성한 경우, Maven Wrapper를 사용할 수 있습니다. 로컬 머신에 Maven이 설치되지 않은 경우에도 프로젝트 폴더에 있는 ./mvnw 스크립트를 이용하면 로컬 설치 없이 Maven을 실행할 수 있습니다.

Terminal
$ ./mvnw spring-boot:run -Dspring-boot.run.profiles={profiles}
Using Maven Commands

macOS에서 Homebrew를 통해 Maven을 설치할 수 있습니다. 이렇게 로컬 머신에 Maven을 설치하면 명령어가 더 단순해져서 자주 사용하는 경우 작업이 훨씬 간편해집니다. 다음 명령어를 사용하여 Maven을 설치하고 사용할 수 있습니다.

  1. Homebrew가 설치되어 있는지 확인합니다. Homebrew가 설치되어 있지 않다면 Homebrew 공식 사이트를 참고하여 설치합니다.
  2. 터미널을 열고 다음 명령어를 입력하여 Maven을 설치합니다.
Terminal
$ brew install maven
  1. 설치가 완료되면 Maven 명령어를 사용하여 Spring Boot 애플리케이션을 프로파일과 함께 실행할 수 있습니다.
Terminal
$ mvn spring-boot:run -Dspring-boot.run.profiles={profiles}

Running Packaged Applications

Spring Boot 애플리케이션을 개발하고 나면, 애플리케이션을 패키징하여 배포 가능한 형태인 .jar 파일로 만들 수 있습니다. Java는 .jar 파일을 직접 실행할 수 있는 명령어를 제공합니다.

특정 프로파일과 함께 .jar 파일을 실행하려면 아래와 같은 명령어를 사용할 수 있습니다:

Terminal
$ java -Dspring.profiles.active={profiles} -jar catsriding.jar

Running as Daemons

백그라운드에서 애플리케이션을 계속 실행시키고 싶을 때 nohup 명령어를 추가로 사용하면 됩니다. 이 명령어는 일반적으로 Linux 기반의 서버 환경 등에 애플리케이션을 배포하여 앱이 계속 실행되도록 하기 위해 사용됩니다.

Terminal
$ nohup java -Dspring.profiles.active={profiles} -jar catsriding.jar &
  • Spring
  • Shell