어느 책을 보다가 .properties 파일에 구분자로 = 대신 : 를 기재한 것을 보고

잘못 사용했음이 분명하다!!

라고 생각하고 열심히 찾아봤다. 그런데 java.util.Properties#load메서드를 찾아보니 =  : 가 사용가능하다고 나와있다.

The key contains all of the characters in the line starting with the first non-white space character and up to, but not including, the first unescaped '=', ':', or white space character other than a line terminator. All of these key termination characters may be included in the key by escaping them with a preceding backslash character; for example,

\:\=

키에 대한 값으로 :, = 또는 공백문자가 아닌 첫번째 문자부터 시작하여 줄의 끝까지 값으로 포함된다.

그러나, 관례라고 하긴 그렇지만 넓게 사용되는 것은

.properties
server.port=9090
app.info.name=honeymon
app.info.ver=v1.0
.yml
server.port: 9090
app.info:
name: honeymon
ver: v1.0

가 아닐까 생각한다. 그냥 문득…​


○ SpringBoot 레퍼런스 가이드 설정부분

# FLYWAY (FlywayProperties)
flyway.check-location=false # check that migration scripts location exists
flyway.locations=classpath:db/migration # locations of migrations scripts
flyway.schemas= # schemas to update
flyway.init-version= 1 # version to start migration
flyway.init-sqls= # SQL statements to execute to initialize a connection immediately after obtaining it
flyway.sql-migration-prefix=V
flyway.sql-migration-suffix=.sql
flyway.enabled=true
flyway.url= # JDBC url if you want Flyway to create its own DataSource
flyway.user= # JDBC username if you want Flyway to create its own DataSource
flyway.password= # JDBC password if you want Flyway to create its own DataSource

예제에 보면 1 이 등록된 것을 볼 수 있다. 하지만!!

Caused by: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'flyway' on field 'initVersion': rejected value [1]; codes [typeMismatch.flyway.initVersion,typeMismatch.initVersion,typeMismatch.org.flywaydb.core.api.MigrationVersion,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [flyway.initVersion,initVersion]; arguments []; default message [initVersion]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.flywaydb.core.api.MigrationVersion' for property 'initVersion'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.flywaydb.core.api.MigrationVersion] for property 'initVersion': no matching editors or conversion strategy found]
    at org.springframework.boot.bind.PropertiesConfigurationFactory.validate(PropertiesConfigurationFactory.java:296)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:255)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:227)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:296)
    ... 26 more

ㅡ_-);; 그대로 따라해보면 저렇게 오류를 뱉는다.

스프링부트 1.2.3 에서 Flyway와 관련된 ... 부분에서 initVersion 항목이 Integer 가 아니라 MigrationVersion으로 변경이 되었다. 스프링부트 1.2.3 에서 제공하는 flywayDB는 3.1 버전으로, Flyway.class의 코드를 살펴보면

/**
 * Sets the version to tag an existing schema with when executing baseline.
 *
 * @param initVersion The version to tag an existing schema with when executing baseline. (default: 1)
 * @deprecated Use setBaselineVersion() instead. Will be removed in Flyway 4.0.
 */
@Deprecated
public void setInitVersion(MigrationVersion initVersion) {
    LOG.warn("Flyway.setInitVersion() is deprecated. Use setBaselineVersion() instead. Will be removed in Flyway 4.0.");
    this.baselineVersion = initVersion;
}
 
/**
 * Sets the version to tag an existing schema with when executing baseline.
 *
 * @param initVersion The version to tag an existing schema with when executing baseline. (default: 1)
 * @deprecated Use setBaselineVersion() instead. Will be removed in Flyway 4.0.
 */
@Deprecated
public void setInitVersion(String initVersion) {
    LOG.warn("Flyway.setInitVersion() is deprecated. Use setBaselineVersion() instead. Will be removed in Flyway 4.0.");
    this.baselineVersion = MigrationVersion.fromVersion(initVersion);
}

에서 보는 것처럼, 1, 2, 3으로 정의하던 initVersion 관련 항목이 @Depercated 처리되었다.

initVersion 으로 설정하는 부분

String initVersionProp = properties.getProperty("flyway.initVersion");
if (initVersionProp != null) {
    LOG.warn("flyway.initVersion is deprecated and will be removed in Flyway 4.0. Use flyway.baselineVersion instead.");
    setBaselineVersion(MigrationVersion.fromVersion(initVersionProp));
}

baselineVersion

String baselineVersionProp = properties.getProperty("flyway.baselineVersion");
if (baselineVersionProp != null) {
    setBaselineVersion(MigrationVersion.fromVersion(baselineVersionProp));
}

flyway의 릴리즈 노트를 보면 init 관련항목들이 baseline으로 변경된 것을 확인할 수 있었다. 두둥.

Issue 860 Deprecated init(), use baseline() instead.
Issue 860 Deprecated initVersion, use baselineVersion instead.
Issue 860 Deprecated initDescription, use baselineDescription instead.
Issue 860 Deprecated initOnMigrate, use baselineOnMigrate instead.
Issue 860 Deprecated FlywayCallback.beforeInit(), use FlywayCallback.beforeBaseline() instead.
Issue 860 Deprecated FlywayCallback.afterInit(), use FlywayCallback.afterBaseline() instead.
Issue 860 Deprecated MigrationState.PREINIT, use MigrationState.BELOW_BASELINE instead.
Issue 860 Deprecated MigrationType.INIT, use MigrationType.BASELINE instead.

◎ 정리

  • initVersion 보다는 baselineVersion으로 옮겨가자.
  • MigrationVersion 은 LATEST와 EMPTY 로 변환가능...
  • 스프링부트에서 사용한 외부 라이브러리에서 오류가 발생한다면, 외부라이브러리와 관련된 가이드를 살펴보자.
    • 스프링부트 레퍼런스 가이드에 반영이 안되어 있을수도 있다.


파일명 : config.properties

property.thisReadUrl=/app/test/show



파일명 : testFreemarker.ftl

<#list "${props['property.thisReadUrl']}"?split(",") as url>

    <#if (RawRequest.requestURI?index_of((url!)?trim) == -1)>

구현내용 ~~~~

    </#if>

</#list>

** RawRequest.requestURI 는 http RAW Request 정보를 가져오는 것 같은데, 이 부분에 대해서는 공부할 필요가 있겠다

기능 : 현재 URL 위치를 반환한다.


위의 형태처럼 ${props['properties']} 를 이용하여 서버에 적용된 properties 들을 조회하여 동일한 이름을 가진 property를 freemarker 파일을 구성하는 과정에서 사용할 수가 있다.


이를 위해서는 applicationContext.xml 내에 



    
         
            properties 파일 위치
        
         
    



에 대한 내용들을 설정해줘야 한다. 


+ Recent posts