어느 책을 보다가 .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 파일 위치
        
         
    



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


저작자 표시
신고
  1. Freemarker 2013.01.09 13:00 신고

    위와같은 설정을 다하고 Freemarker 에서
    <#list "${props['property.thisReadUrl']}"?split(",";) as url>
    ${url}
    </#list>
    다음과같이 이용을하였는데 props 에서 알수없다고 Freemarker 에러가뜨는데요.. 어덯케사용하는건지?.
    google에 검색을해도 props같은 Freemarker 문법 검색결과는 안나오네요 ㅠㅠ 답변좀

  2. Freemarker 2013.01.09 16:11 신고

    conf.propertise 에 base.path.domain = http://localhost:8080
    저내용을 뿌려주려고하는거고요 . Spring 에서 설정은 다맞췄습니다.
    그런데 Freemarker 에서 사용하려고할때 오류가나네요
    <#list "${props['base.path.domain']}" as url>
    ${url}
    </#list> 사용할때 이렇케사용하였고요.
    Freemarker 에서는 : Expression props is undefined on line 27, column 11 in
    이렇케 Error를 내내요 Props를 모르는거같아요..
    표현법이 틀린거 같기도하고..
    Google에서도 Freemarker Props 문법은 나오지않구.. 답변부탁드립니다. ㅜ

    • Controller 에서 화면에 반환해주는 model attribute 에다가
      model.addAttribute("props", appProperties.get("property.thisReadUrl";));
      를 추가해줘야 할겁니다.

      컨트롤러에서 등록해준 model map에 담긴 props 객체에서
      property.thisReadUrl 에 해당하는 값을 꺼내온다고 이해하시면
      될겁니다.

  3. Freemarker 2013.01.09 18:10 신고

    오노.. 저는 Jsp 처럼 <%=%> 서버내에 자원을 페이지에서 자체적으로 렌더링하길원해서 찾아본거엿는데 이룬..
    Controller에서 따로안보내고 쓰고싶었었는데 아쉽네요..
    빠른답변 감사합니다.!

    • 그건 무리입니다. @_@); freemarker는 템플릿 엔진일 뿐이기 때문에, 서버에 저장되어 있는 properties 정보를 직접 읽어들일 수 없습니다.

      생각하시는 방식으로 화면단에서 서버 내의 자원을 직접 읽어들이는 방식은 Model1 방식이기도 하고, 보안상의 취약점을 가져올 수 있습니다.

  4. Freemarker 2013.01.09 18:33 신고

    혹시 그러면 주소를 일괄적으로 관리하기위해서 어떤식으로 하시는지 알수있을까요?
    css/script/img 주소들을 바꿔줘야할때가있어서 일괄적으로관리하기위해 주소를 propertise 에둔후 jsp에서 주소를 가져와 사용하는데
    다른방법이 혹시있을까요?.?//

    • 그렇게 사용해본 경험이 없어서 답변하기 어렵네요.
      딱히 주소를 일괄적으로 관리한 경우가 없었거든요.

      css/javascript는 별도의 tag 로 분리해두고 그걸 import 시키는 형태로 사용했고, img주소는 변경시키는 경우가 거의 없었고...

      img 경로에 대해서는 properties에 지정해두고 가져와 쓴 경험이 없습니다.

+ Recent posts