운영 환경에 맞게 설정 변경
운영 환경에서는 보통 데이터베이스, 메세징 큐, 로그 서버 등의 설정이 달라지므로 이를 application.yml에 하드 코딩 하지 않고 외부에서 관리
배포후 설정 변경 용이
운영 중 애플리케이션을 다시 빌드하거나 배포하지 않고 설정 파일 정보를 변경하여 서버를 재시작하여 설정을 변경
Docker, Kubernetes
컨테이너 기반 환경에서는 애플리케이션 설정을 외부에서 주입하는 방식이 일반적
중앙화된 설정 관리
여러 서비스나 인스턴스가 있을 경우, 각 인스턴스의 설정을 중앙화해서 관리하여 동일한 설정을 적용
jar {
enabled = true // bootJar와 함께 일반 jar도 생성
from sourceSets.main.output
manifest {
attributes("Main-Class": "com.exampe.Main",)
attributes("Application-Name": "$rootProject.name Eample Proejct")
attributes("Application-SymbolicName": "com.exampe.Main")
attributes("Application-Version": project.version)
}
}
/*tasks.named('startScripts') {
doLast { // $APP_HOME/conf 디렉토리를 클래스 패스에 추가함.
def windowsScriptFile = file getWindowsScript()
def unixScriptFile = file getUnixScript()
windowsScriptFile.text = windowsScriptFile.text.replace('CLASSPATH=%APP_HOME%\\\\lib', 'CLASSPATH=%APP_HOME%\\\\conf;%APP_HOME%\\\\lib')
unixScriptFile.text = unixScriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf:$APP_HOME/lib')
}
}*/
tasks.named('startScripts') {
doLast {
def windowsScript = file(getWindowsScript())
def unixScript = file(getUnixScript())
// Windows .bat 파일 수정: 긴 CLASSPATH → *.jar 동적 로딩 방식으로 대체
windowsScript.text = windowsScript.text.replaceAll(
/(?s)set CLASSPATH=.*?(\\r?\\n)/,
"""set CLASSPATH=%APP_HOME%\\\\conf\\r
for %%i in ("%APP_HOME%\\\\lib\\\\*.jar") do call :appendClasspath "%%i"\\r
goto afterClasspath\\r
\\r
:appendClasspath\\r
set CLASSPATH=%CLASSPATH%;%~1\\r
goto :eof\\r
\\r
:afterClasspath\\r
"""
)
// (선택) Unix .sh 파일 수정: 동일하게 *.jar 동적 로딩 방식으로 대체
unixScript.text = unixScript.text.replaceAll(
/(?s)CLASSPATH=.*?\\n/,
"""CLASSPATH="\\\\\\$APP_HOME/conf"\\n
for jar in "\\\\\\$APP_HOME"/lib/*.jar; do\\n
CLASSPATH="\\\\\\$CLASSPATH:\\\\\\$jar"\\n
done\\n
"""
)
// 확장자 .sh 붙이기
def renamed = new File(unixScript.parentFile, "${unixScript.name}.sh")
if (unixScript.exists()) {
unixScript.renameTo(renamed)
println "Renamed Unix script to: ${renamed.name}"
}
}
}
tasks.named('javadoc') {
enabled = false
}
tasks.named('distZip') {
doLast {
// zip 파일 명 : rtim-server-3.8.RELEASE.zip
def date = new Date().format('yyyyMMdd')
file("${destinationDirectory.get()}/${archiveFileName.get()}").renameTo("${destinationDirectory.get()}/${archiveBaseName.get()}-${archiveVersion.get()}_${date}.${archiveExtension.get()}")
}
}
JVM에서 파일 경로를 읽을 때, 슬래시(/
)와 백슬래시(\\
)의 차이는 운영 체제에 따라 다르게 해석될 수 있습니다. 그러나 Java는 경로 구분자로 /
를 사용하는데, 이는 플랫폼 독립성을 제공하기 위해 설계되었습니다.
실행shell파일에 다음 구문 추가
#!/bin/bash
JAVA_OPTS="$JAVA_OPTS \\
-Dspring.config.location=file:{설정파일 경로}/application.yml, file:{설정파일 경로}/application-{profile}.yml\\
-Dlogging.config=file:{설정파일 경로}/logback-spring.xml"
다음 예시는 spring profile을 쓴 예시로 {profile} 값은 application.yml의 spring.profiles.active 값과 동일하며, application-{profile}.yml내 spring.config.activate.on-profile 값과 동일해야 한다.
eval "set -- $(
printf '%s\\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |
tr '\\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
또한 해당 구문은 다음 위에 추가한다.
application.yml
과 같은 Spring 환경 설정 파일들을 지정한다.logback-spring.xml
파일을 지정하는 옵션Logback-sping.xml 설정
<property **file="{설정파일 경로}/logback.properties"**/>
3번째 줄 property resource
을 아래와 같이 변경