스프링 3.1에 도입된 런타임 환경 추상화는 프로파일과 프로퍼티 소스로 구성되어있다. 스프링 설정 파일 외부에 설정용 프로퍼티 값을 두고 관리하는 방법을 사용하려면 프로퍼티 파일(.proerties, .xml)에 값을 넣고 XML에서 ${} 프로퍼티 치환자를 사용하거나 SpEL을 이용해서 <util:properties/>로 정의된 프로퍼티 빈의 값을 끌어오는 방법뿐이었다. 참. 스프링이 ApplicationContext나 BeanFactory처럼 기본으로 @Resource 해주는 systemProperties와 systemEnvironment 빈을 이용하는 방법도 있긴하다. 아참. 웹이라면 컨트롤러 등에서 서블릿 컨텍스트를 가져와서 애트리뷰트나 컨텍스트 파라미터를 읽어도 되겠지. 아차차. <jee:jndi-lookup>으로 JNDI에 설정해둔 값을 가져오는 방법도 가능하게다. 이런. 빈 초기화 하는 즈음에 DB에 넣어둔 프로퍼티 값을 읽거나 RestTemplate으로 다른 서버에서 끌어오는 방법도 가능하겠네.

애플리케이션의 구성 정보를 담은 XML설정파일 말고 주로 런타임 환경과 관련이 있는 속성은 이렇게 다양한 위치에 넣어두고 다양한 방법으로 가져와서 사용할 수 있다. 그런데 이 모든 방법이 대부분 “키와 값의 쌍으로 이루어진 애플리케이션 외부에 정의된 프로퍼티 값을 가져온다”는 공동점이 있으니 추상화를 하면 좋겠다.

그래서 스프링 3.1은 앞에서 말한 다양한 방법(환경변수, 시스템 프로퍼티, JNDI, 서블릿 컨텍스트 파라미터 , 서블릿 콘픽 파라미터, DB나 서버에서 끌어오기 같은 기타 등등)으로 정의된 프로퍼티를 ProperySource라는 개념으로 추상화하고, 이를 PropertyResolver에서 일관된 방법으로 가져올 수 있도록 만들었는데, 환경 추상화 API인 Environment가 바로 이 PropertyResolver의 서브 인터페이스다.

스프링은 고맙게도 프로퍼티 소스로 추상화 했다고 옛정을 버리지는 않았다. 원한다면 이전에 쓰던 placeholder configurer를 그대로 사용할 수 있다. <context:property-placeholder>와 ${}를 그대로 사용할 수 있다는 뜻이다. 대신 내부에선 프로퍼티 소스 추상화를 이용해 통합된 프로퍼티 정보에 접근하는 방법을 사용하도록 변경됐다.

자세한 내용은 올 봄에 나올지도(-_-;;) 모르는 토스3 개정판에서…

그런데 얼마전에 권남님의 http://kwon37xi.egloos.com/4665590 를 읽어보니

properties-placeholder는 부모 자식 관계에 있는 Application Context XML 설정파일들의 경우에도 동일한 properties 파일임에도 모든 Bean 설정 파일에 property-placeholder를 명시해줘야 하는 문제가 있다.

는 얘기가 나온다. 그래서 빈으로 프로퍼티를 정의하고 SpEL로 끌어오는 방법을 추천한다는.

부모-자식 관계의 컨텍스트 구조는 웹 환경에서 루트와 서블릿 컨텍스트가 분리되는 경우가 대표적인데, 루트에 <context:property-placeholder>를 넣어도 서블릿 컨텍스트의 ${}에는 안 먹는다는 얘기인 것 같다. 당연하다. 왜냐하면 기존 <c:pp>는 빈 팩토리의 ${}등이 들어있는 메타 정보(프로퍼티 값)를 가공하는 방식이다. pull이 아니라 push개념인 셈인데, 루트에 정의된 <c:pp>에서 아직 만들어지지도 않은 서블릿 컨텍스트의 메터 정보를 가공한다는 것은 불가능하기 때문이다. 반면에 SpEL은 다른 빈의 값을 끌어오는 pull 방식이라 컨텍스트 생성 시점에 이미 루트 컨텍스트를 부모 컨텍스트로 주입받은 서블릿 컨텍스트 입장에서 루트 컨텍스트의 빈으로 정의된 프로퍼티의 값을 가져오는 건 간단하다.

물론 하나의 프로퍼티 파일 정보를 루트와 서블릿 컨텍스트 간에 공유하게 하는게 바람직한지 시비를 걸 수도 있겠지만, 뭐 쓰는 사람 맘이지.

그리고, “모든 Bean 설정 파일에 p-p를”이라는 건 아닌듯 싶다. <import>를 쓰거나 configLocation에 *를 사용해서 한 컨텍스트가 여러개의 빈 설정 파일을 사용하게 하는 경우라면 p-p는 한번만 넣어줘도 된다.

아무튼 3.0은 그랬지만 3.1에선 더 이상 이런 문제가 없다. 3.1에선 런타임 환경 정보를 통해서 다양한 프로퍼티 소스를 하나로 통합해서 가져오게 하는 방식을 사용하기 때문에 개념적으로 pull인 셈이다. 심지어 <context:property-placeholder>를 사용하더라도 그렇다. 3.1 스타일로 @PropertySource를 사용해서 p-p와 분리한다면 말할 것도 없고.

그러니 3.1에선 프로퍼티 파일 하나를 일개 빈으로 설정하는 SpEL방식보다 프로퍼티 소스로 추상화해서 사용하는 방식을 추천하고, ${} 스타일을 원한다면 예전에 한번 설명했던 PropertySourcePlaceholderConfigurer를 사용하면 될 것이다. XML을 사용하지 않는 경우라면 @Value의 ${}보다는 Environment에서 직접 프로퍼티를 읽는 방식을 써도 좋다.

스프링이 기본적으로 제공하는 6가지 프로퍼티 소스(구현 클래스가 아니라 정말 소스)외에 커스톰 프로퍼티 소스를 사용하고 싶으면 ApplicationContextInitializer를 쓰면 되는데 이게 3.1.1에서도 살짝쿵 버그가 있는 것 같아서 조금 주의해야 할 것 같다. 이 얘긴 다음에.

Related posts:

  1. Spring 3.0 (59) 프로퍼티 파일 이용하기 – placeholder vs SpEL
  2. 스프링 3.1 (4) Static @Bean 메소드
  3. 스프링 3.1 (6) web.xml의 활성 프로파일 설정
  4. Spring 3.0 (60) 클래스패스 리소스를 지정할 때 주의사항과 팁
  5. 유쾌한 이슈처리 재촉 메일
  6. Inside Spring (5) PropertyPlaceholderConfigurer를 @Bean으로 정의해서는 안되는 이유
  7. Maven POM에 attribute 사용하기 (2)
  8. GoF 디자인 패턴에서 느끼는 DI의 향기
  9. Spring 3.0 (14) Context Support 모듈의 선택 라이브러리 분석
  10. InsideSpring (1) Annotated Factory Method (@Configuration)을 쓰는 4가지 방법 (3)
  11. 스프링 3.1 (3) @Enable~
  12. DI의 본질 – 다이나믹 (타입) 언어는 Dependency Injection이 필요없는가?
  13. Spring 3.0 (33) JavaConfig의 통합과 변신. 메타-빈(meta-bean) 개념의 등장.

Facebook comments:

to “스프링 3.1 (7) 프로퍼티 소스 추상화와 PropertySourcePlaceholderConfigurer”

  1. jqGrid로 리스트을 뿌려주는 작업을 하는데, jQuery().ready 이벤트에서 뿐만 아니라 사용자 이벤트를 받아서 동적으로 처리하는 방법입니다. 며칠간 삽질 했네요…구글링 해도 별로 내용도 없고…헐~~~.. 일단 제가 한 방법은 특정 사용자가 이벤트를 발생시켰을 때 마다 해당 jqGrid에 데이터를 갱신하는 것입니다. 본론으로 들어가면, 1. ready 이벤트에서 jqGrid을 생성합니다. 단, read 이벤트에서는 할게 없으므로 postData는 값을 설정할 필요가 없습니다. <script type=”text/javascript”> jQuery().ready(function () { jQuery(“#list1″).jqGrid({ url: “/_layouts/LibDocumentHandler.aspx”, datatype: “xml”, postData: { //postData 데이터가 read에 필요없어서 공백으로 처리. WebId: ”, ListId: ”, FolderId: ”, RowCount: 0, CurrentPage:0 }, colNames: ['FileName', 'Author', 'UpdateDate'], colModel: [ { name: 'fileName', index: 'fileName', width: 150 }, { name: 'author', index: 'author', width: 125 }, { name: 'date', index: 'date', width: 125 } ], rowNum: 10, autowidth: true, rowList: [10, 20, 30], //pager: jQuery(‘#pager1′), sortname: ‘fileName’, viewrecords: false, sortorder: “desc”, height: “328″, caption: “XML Example” }); }); 2. 이벤트 발생시에 수행생할 함수를 정의합니다.

  2. a9VAyd Payday loans called so as you are approved smaller cash credit status. , unsecured loans, [url="http://swanderer.ws"]unsecured loans[/url], http://swanderer.ws unsecured loans, 197678, visit this site, [url="http://muddysocks.com"]visit this site[/url], http://muddysocks.com visit this site, riwmg,

  3. 1xEDws zwybwrdawwpd, [url=http://pcpgcyrgjvqk.com/]pcpgcyrgjvqk[/url], [link=http://tqyvitvuejqh.com/]tqyvitvuejqh[/link], http://rluvlayiupkk.com/

  4. 필수는 아니지만 선택적으로 데이터베이스 드라이버에 프로퍼티를 전달할 수 도 있다. 그러기 위해서는 다음 예제처럼 “driver.” 로 시작하는 접두어로 프로퍼티를 명시하면 된다.

  5. 필수는 아니지만 선택적으로 데이터베이스 드라이버에 프로퍼티를 전달할 수 도 있다. 그러기 위해서는 다음 예제처럼 “driver.” 로 시작하는 접두어로 프로퍼티를 명시하면 된다.

  6. 이렇게 대답하실 것입니다. 정답은, ‘그럴 수도 있고 아닐 수도 있다!’ 입니다. 먼 소린지 알 듯 말 듯 하시지요? 어떤 범위 내에서 명령을 사용하느냐에 따라 달라진다는 의미입니다. 즉 Cells 속성 앞에 아무 것도 없이 그냥 Cells(3, 2)라고 한다면 3행과 2열이 만나는 B3 셀을 의미합니다. 하지만 앞에 단서가 붙어 있으면 사정은 달라집니다. 다음과 같은 문장이 있다고 할 경우, 어느 셀에 100이라는 값을 넣어주게 될까요?

  7. 위 3가지 사용법을 보자. 먼저 nonatomic은 다중 쓰레드에 대해서 고려할지를 선택하기 위한 것이다. 만약 다중 쓰레드 환경에서 여러 쓰레드가 경쟁적으로 접근하는 프로퍼티가 있다면 atomic 으로 설정해야 한다. 하지만 그외의 대부분의 경우 nonatomic 을 사용한다.

  8. w0JRj9 vvvpfdcurhdn, [url=http://hdaavgloefvb.com/]hdaavgloefvb[/url], [link=http://xgzaqlbiizom.com/]xgzaqlbiizom[/link], http://cgxlltkurear.com/

  9. w9YK4P lrtkgwaotnxi, [url=http://ftawwhxlthyt.com/]ftawwhxlthyt[/url], [link=http://kdjanxvxhpuc.com/]kdjanxvxhpuc[/link], http://jesledskrehu.com/

  10. ujSxuR rlkzpksgjlpx, [url=http://gpmeiqloaoqb.com/]gpmeiqloaoqb[/url], [link=http://hinkvdjvupxj.com/]hinkvdjvupxj[/link], http://semhyhojgnfh.com/

  11. ○ <form:radiobuttons> 커스텀 태그 – itmes 속성을 이용하여 값으로 사용할 컬렉션을 전달 받음. – path 속성을 이용하여 값을 바인딩 할 커맨드 객체의 프로퍼티를 지정.

  12. 스프링 3.1에 도입된 런타임 환경 추상화는 프로파일과 프로퍼티 소스로 구성되어있다. 스프링 설정 파일 외부에 설정용 프로퍼티 값을 두고 관리하는 방법을 사용하려면 프로퍼티 파일(.proerties, .xml)에 값을 넣고 XML에서 ${} 프로퍼티 치환자를 사용하거나 SpEL을 이용해서 <util:properties/>로 정의된 프로퍼티 빈의 값을 끌어오는 방법뿐이었다. 참. 스프링이 ApplicationContext나 BeanFactory처럼 기본으로 @Resource 해주는 systemProperties와 systemEnvironment 빈을 이용하는 방법도 있긴하다. 아참. 웹이라면 컨트롤러 등에서 서블릿 컨텍스트를 가져와서 애트리뷰트나 컨텍스트 파라미터를 읽어도 되겠지. 아차차. <jee:jndi-lookup>으로 JNDI에 설정해둔 값을 가져오는 방법도 가능하게다. 이런. 빈 초기화 하는 즈음에 DB에 넣어둔 프로퍼티 값을 읽거나 RestTemplate으로 다른 서버에서 끌어오는 방법도 가능하겠네.

  13. You Could Try THESE Out

  14. 스프링에서 바인딩이라고 말할 때는 오브젝트의 프로퍼티에 값을 넣는 것을 말한다. 반대로 프로퍼티로부터 값을 읽어 오는 경우도 있다. 스프링에서는 크게 두 가지의 프로퍼티 바인딩일 지원한다. 첫 번째 바인딩은 XML 설정파일을 사용해서 빈을 정의하면서 <property> 태그로 값을 주입하도록 설정하는 것이다. XML 은 기본적으로 텍스트 문서이기 때문에 프로퍼티 값을 문자열로 정의해야 한다. 빈의 프로퍼티가 스트링 타입이라면 간단히 값을 넣어줄 수 있겠지만, 그 외의 모든 타입은 바인딩을 하려면 적절한 변환이 필요하다. 예를 들어 다음과 같이 dataSource 빈의 설정에는 driverClass 프로퍼티가 있다.

  15. thank you for share!

  16. We absolutely love your blog and find a lot of your post’s to be just what I’m looking for. Does one offer guest writers to write content for you? I wouldn’t mind composing a post or elaborating on many of the subjects you write concerning here. Again, awesome weblog!

  17. thank you for share!

  18. thanks for share!

  19. Pop Over To THIS Web-Site
    ugg outlet online http://outlettonlineshop.com

  20. mbt shoes women 스프링 3.1 (7) 프로퍼티 소스 추상화와 PropertySourcePlaceholderConfigurer » Toby’s Epril

  21. mbt shoes 스프링 3.1 (7) 프로퍼티 소스 추상화와 PropertySourcePlaceholderConfigurer » Toby’s Epril

  22. the official release of the single to radio was moved up to August 18. The single debuted at number 21 on the Billboard Rock Songs Chart, and in the same position on the Alternative Songs chart. The music video features Odette Yustman . The song was first played live on August 23, 2009 in Toronto, Ontario at the Molson Amphitheatre .

  23. What an awesome way to explain this-now I know evrgythine!

  24. Ray Ban Shop Deutschland
    So, here are some tips you would like to keep in mind when considering insurance:

    https://www.phj-glas-klima.dk/images/phj2/1258-nike-roshe-run-danmark.jpg

    Student organizations and organizations aren’t pretty much looking good to your possible workplace. Participation will benefit pupils at the same time, the two emotionally and culturally. You’ll get other people who share your interests and might investigate more of your options around the grounds. You could also get comprehension of whether your chosen key is the best determination.

    https://www.pliz-buch.de/images/pli2/19594-yeezy-boost-950-chocolate.jpg

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha