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에서 자동으로 로드되며, 사용할 프로파일을 지정하면 해당 프로파일에 대한 설정이 활성화됩니다.
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 애플리케이션 실행 구문은 다음과 같습니다:
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 애플리케이션의 기본적인 실행 방식을 이해해보겠습니다.
- 먼저, 텍스트 에디터를 열어
Application.java
파일을 작성합니다:
$ vim Application.java
Application.java
파일에 다음과 같이main()
함수 코드를 입력합니다:
public class Application {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
Application.java
파일을 저장한 후, 해당 파일과 동일한 경로에서javac
명령어를 사용하여 클래스 파일로 컴파일합니다:
$ javac Application.java
- 컴파일이 성공하면, 현재 디렉토리에
Application.class
파일이 생성됩니다. 이.class
파일은 자바 컴파일러가 생성한 바이트코드로, JVM이 이해하고 실행할 수 있는 코드입니다:
$ 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
- 이제 다음 명령어를 사용하여 컴파일된 Java 애플리케이션을 실행합니다. 이 과정에서 JVM은
Application.class
파일을 읽고main()
메서드를 실행하여"Hello, Java!"
메시지를 출력합니다:
$ 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이 시작될 때 특정 속성을 설정하여 애플리케이션이 해당 속성을 활용할 수 있게 합니다.
$ java -Xmx1024m -Xms512m -Dfile.encoding=UTF-8 -jar catsriding.jar
이렇게 옵션을 추가하면 다음과 같이 내부적으로 동작합니다:
- JVM 동작 방식 조정:
-Xmx
및-Xms
옵션을 사용하여 최대 및 초기 힙 메모리 크기를 설정할 수 있습니다.-Xmx1024m
은 최대 힙 메모리 크기를 1024MB로 설정하고,-Xms512m
은 초기 힙 메모리 크기를 512MB로 설정합니다. - JVM 시스템 속성 설정:
-D
옵션은 JVM의 시스템 속성으로 값을 설정합니다. 이는System.setProperty()
메서드를 호출하여 설정하는 것과 동일한 효과를 가집니다. 현재 위 코드에서 사용된-Dfile.encoding=UTF-8
옵션은 시스템 속성file.encoding
을UTF-8
로 설정합니다. - JVM 초기화: JVM이 시작되면서 설정된 시스템 속성들이 JVM 내에서 전역적으로 유지됩니다. 이러한 시스템 속성은 JVM 실행 중 어디에서나 접근할 수 있습니다.
- Spring Boot 애플리케이션 초기화: Spring Boot 애플리케이션이
SpringApplication.run()
메서드를 호출하면서 초기화됩니다. - 환경 속성 로드: 초기화 과정에서 Spring Boot는
Environment
객체를 사용하여 애플리케이션의 환경 속성을 관리합니다.Environment
객체는application.yml
같은 기본 속성 파일, 환경 변수, 그리고 커맨드 라인 옵션 등 여러 소스로부터 속성을 로드합니다. - 시스템 속성 읽기:
System.getProperties()
메서드를 호출하여 JVM의 시스템 속성들이Environment
객체에 추가됩니다. 이 과정에서file.encoding
과 같은 속성들이Environment
객체에 설정됩니다. - 환경 설정 적용: 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 애플리케이션도 이를 통해 실행됩니다.
@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는 이를 애플리케이션 속성으로 자동 매핑하여 활용합니다.
$ java -jar catsriding.jar --spring.profiles.active=dev --server.port=8081
이렇게 옵션을 추가하면 내부적으로 다음과 같이 동작합니다:
- 커맨드 라인 인수 전달:
--
뒤의 인수들은 Spring Boot 애플리케이션 실행 시main()
메서드의String[] args
로 전달됩니다. - SpringApplication 초기화:
SpringApplication.run()
메서드는 전달된 인수를 받아ApplicationArguments
객체로 변환합니다. 이 객체는 커맨드 라인 인수를 파싱하는 역할을 합니다. - 인수 파싱 및 적용:
ApplicationArguments
인터페이스를 통해 커맨드 라인 인수를 파싱하고, 이를 Spring 환경 설정에 반영합니다. 커맨드 라인 인수는 높은 우선순위를 가지며, 기존의application.properties
나application.yml
설정을 덮어씁니다. - 환경 설정 적용: 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 태스크에는 적용되지 않습니다.
$ ./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.properties
나application.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을 실행할 수 있습니다.
$ ./gradlew bootRun --args='--spring.profiles.active={profiles}'
Using Gradle Commands
macOS에서 Homebrew를 통해 Gradle을 설치할 수 있습니다. 이렇게 로컬 머신에 Gradle을 설치하면 명령어가 더 단순해져서 CLI를 자주 사용하는 경우 더 편리하게 작업할 수 있습니다. 다음 명령어를 사용하여 Gradle을 설치하고 사용할 수 있습니다.
- Homebrew가 설치되어 있는지 확인합니다. Homebrew가 설치되어 있지 않다면 Homebrew 공식 사이트를 참고하여 설치합니다.
- 터미널을 열고 다음 명령어를 입력하여 Gradle을 설치합니다.
$ brew install gradle
- 설치가 완료되면 Gradle 명령어를 사용하여 Spring Boot 애플리케이션을 프로파일과 함께 실행할 수 있습니다.
$ 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을 실행할 수 있습니다.
$ ./mvnw spring-boot:run -Dspring-boot.run.profiles={profiles}
Using Maven Commands
macOS에서 Homebrew를 통해 Maven을 설치할 수 있습니다. 이렇게 로컬 머신에 Maven을 설치하면 명령어가 더 단순해져서 자주 사용하는 경우 작업이 훨씬 간편해집니다. 다음 명령어를 사용하여 Maven을 설치하고 사용할 수 있습니다.
- Homebrew가 설치되어 있는지 확인합니다. Homebrew가 설치되어 있지 않다면 Homebrew 공식 사이트를 참고하여 설치합니다.
- 터미널을 열고 다음 명령어를 입력하여 Maven을 설치합니다.
$ brew install maven
- 설치가 완료되면 Maven 명령어를 사용하여 Spring Boot 애플리케이션을 프로파일과 함께 실행할 수 있습니다.
$ mvn spring-boot:run -Dspring-boot.run.profiles={profiles}
Running Packaged Applications
Spring Boot 애플리케이션을 개발하고 나면, 애플리케이션을 패키징하여 배포 가능한 형태인 .jar
파일로 만들 수 있습니다. Java는 .jar
파일을 직접 실행할 수 있는 명령어를 제공합니다.
특정 프로파일과 함께 .jar
파일을 실행하려면 아래와 같은 명령어를 사용할 수 있습니다:
$ java -Dspring.profiles.active={profiles} -jar catsriding.jar
Running as Daemons
백그라운드에서 애플리케이션을 계속 실행시키고 싶을 때 nohup
명령어를 추가로 사용하면 됩니다. 이 명령어는 일반적으로 Linux 기반의 서버 환경 등에 애플리케이션을 배포하여 앱이 계속 실행되도록 하기 위해 사용됩니다.
$ nohup java -Dspring.profiles.active={profiles} -jar catsriding.jar &
- Spring
- Shell