오래전 Inside Spring (5) PropertyPlaceholderConfigurer를 @Bean으로 정의해서는 안되는 이유라는 글을 쓴 적이있다. 나름 흥미로운 분석을 통해서 정리한 재밌는 글이라고 생각했는데 별 반응이 없었다. 굳이 스프링 내에서 어떤 일이 일어나는지, BeanFactoryPostProcessor(BFPP)의 동작원리가 뭔지 이해해야 필요를 못 느껴서였을 수도 있고 PPC를 XML에서 사용하면 그만이지, 당시엔 활용도가 낮았던 @Configuration 클래스 내에서 @Bean으로 정의해서 @Value로 값을 받는데 사용할 필요가 없었기 때문일 수도 있다.

그런데 이제는 No XML이라는 슬로건을 걸친 스프링 3.1이 나와서 자바 코드만으로 XML의 모든 설정을 대체할 수 있을 뿐만 아니라 XML보다 더욱 편리하게 사용할 수 있다는 점을 강조하고 있다. 물론 스프링 3.1이라고 XML을 사용하면 안되는 것은 아니며 @Configuration을 사용할 의무도 없다. 하지만 3.0에서 자바 콘픽을 도입한 이후로 이를 충분히 성숙한 레벨로 올려서 실전에서 본격적으로 사용할 수 있도록 만든 것이 스프링 3.1 변화의 핵심이니 3.1을 사용한다면 한번쯤 XML 없는 스프링 설정에 도전해볼만 하다.

스프링 3.1에서 새롭게 소개된 자바코드 설정용 각종 애노테이션과 기법들은 천천히 얘기하기로 하고(실은 지금 그 내용을 담은 토비의 스프링 3 개정판을 열심히 준비하고 있다) 오늘은 BFPP를 @Bean으로 사용할 수 없었던 문제만 다시 짚어보고 스프링 3.1은 이를 어떻게 해결했는지(해결하기는 했는지?) 살펴보자.

PPC를 @Bean의 정의하면 기대한대로 동작하지 않는 이유에 대해서는 이전 글에서 자세히 설명했다. @Configuration 클래스를 이용한 빈 설정을 가능하게 하는 것도 BFPP이며 프로퍼티 파일의 내용을 가져와 ${..}으로 지정된, 빈 프로퍼티 내의 치환자에 값을 넣어주는 PropertyPlaceholderConfigurer도 BFPP이다. 문제는 @Bean으로 정의된 빈은 @Configuration을 담당하는 ConfigurationClassPostProcessor(CCPP)에 의해서 빈 인스턴스가 만들어지는데, 그렇게 만들어진 BFPP 빈은 이미 빈 인스턴스가 만들어져 사용된 @Configuration 빈의 @Value 프로퍼티 값을 바꿀 수 없기 때문이다.

이 이야기가 어려운 듯 보이지만 사실.. 어렵지 않아요.

BFPP와 BPP(BeanPostProcessor)의 차이점만 이해하면 쉽게 이해할 수 있다. BFPP는 빈의 메타 데이터(클래스는 뭐고 프로퍼티 값의 정의는 뭐고 등등)를 조작하는 후처리기고, BPP는 빈의 인스턴스 값을 조작하는 후처리기다. PPC는 BFPP이므로 메타 데이터만 조작할 수 있다. 하지만 PPC가 @Bean에 의해서 만들어지는 시점에 이미 @Configuration 클래스로 정의된 빈은 메타 데이터 단계가 아니라 인스턴스까지 만들어진 상태다. @Bean 메소드를 실행해서 PPC빈을 만들어야 하니 당연히 이미 @Configuration 인스턴스가 필요할 수 밖에. 결국 PPC가 아무리 메타 데이터에 있는 ${..}을 찾아서 봐꿔봐야. 이미 인스턴스 생성이 끝난 @Configuration 빈의 @Value가 붙은 프로퍼티의 값은 변경할 수가 없다. 빈을 다시 만들지 않을테니까. new XXX() 해서 인스턴스를 만들고 나서 XXX.class 파일을 아무리 조작해봐야 이미 만들어진 인스턴스는 변하지 않는 것과 마찬가지라고 보면 된다.

그렇다면 이를 피할 방법은 뭐가 있을까?

방법은 간단하다. BFPP가 만들어진 후에 @Value가 붙은 @Configuration 클래스가 빈으로 만들어지도록 하면 된다.

가장 쉬운 방법은 BFPP를 @Configuration내의 @Bean이 아닌 XML에 정의하고 이를 @ImportResource로 가져오는 것이다. XML에는 다음과 같이 PPC가 생성되도록 빈을 정의한다. 친절한 스프링 덕에 커스톰 태그 하나면 충분하다.

<context:property-placeholder location="message.properties" />

그리고 이 XML을 @Configuration 클래스에서 @ImportResource로 불러온다.

@Configuration
@ImportResource("context.xml")
public class Config {
    @Value("${name}") String name;

이렇게 해두면 친절한 스프링은 Config 빈을 만들기 전에 XML의 빈들을 먼저 만들고 이때 만들어진 PPC는 Config 빈의 메타 정보에 적용이되서 ${name}을 이용해서 name 프로퍼티 값이 설정이 된다.

또는, 이전 글에서 예로 보였던 것처럼 @Value가 붙은 @Configuration 클래스가 아닌 다른 빈 클래스를 정의해서 거기서 PPC가 만들어지게 하면 된다. PPC를 확장해서 @Component로 정의하는 것도 되고, 또 다른 @Configuration 클래스를 만들어서 그 안에 PPC를 만드는 @Bean을 넣어도 좋다.

@Configuration의 @Value에 ${..}를 적용할 수 있는 방법은 이 두가지 정도.

여기까지는 스프링 3.0의 경우고. 스프링 3.1의 새로운 방법을 살펴보자.

스프링 3.1에선 더이상 PPC를 쓰지 않는다. PropertySource라는 프로퍼티 값을 다루는 새로운 추상화 방식이 등장하면서 이전에 사용되던 다양한 접근방법들을 하나로 통합해버렸다.  이에 대한 자세한 설명은 나중에.

그래서 스프링 3.1에선 PPC 대신 PropertySourcePlaceholderConfigurer(PSPC)가 사용된다. <context:property-placeholder />에서도 PPC 대신 PSPC가 만들어진다. 이 두가지는 사실 차이점이 제법 있는데 일단 제껴두고 BFPP관점에서만 살펴보자.

PSPC도 여전히 BFPP다. 따라서 3.0에서와 마찬가지로 @Value에 ${..}을 적용하기 위해서는 같은 @Configuration 클래스에서 @Bean으로 PSPC를 정의하면 안된다. 물론 앞에서 소개한 두가지 방법을 이용해서 이를 피할 수 있다. 하지만 스프링 3.1은 이 문제를 보다 세련된 방식으로 해결해버렸다. 그래서 이제는 @Value와 PSPC @Bean 메소드가 같은 클래스에 정의해도 된다.

단, 이 PSPC @Bean은 다음과 같이 스태틱 메소드여야 한다.

@Bean static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

3.0에선 @Bean 메소드는 final 또는 private이어도 안되고, static 이어도 안됐다. 앞에 두개는 CGLib으로 확장할 때 문제가 되기 때문에 안 되는 것이고, static은 @Bean 메소드 호출을 통한 빈 생성과 참조라는 목적에 맞지 않기 때문이다.

반면에 스프링 3.1은 static @Bean 메소드를 특별한 용도에 한해서 허용한다. 바로 BFPP 빈을 정의할 때다.

@Configuration 빈이 생성되기 전에, 즉 메타 데이터 상태로 있을 때 적용되야할 BFPP 빈이 있다면 이를 static 메소드로 정의한다. 스태틱이므로 빈 인스턴스를 만들지 않아도 호출할 수 있다. 스프링은 @Configuration 클래스 내에 @Bean이 붙은 스태틱 메소드가 있으면 이를 먼저 호출해서 빈을 생성해두고, 그 후에 @Configuration 빈을 만든다. 따라서 BFPP @Bean 빈은 @Configuration 클래스에도 영향을 줄 수 있는 것이다.

스태틱 @Bean 메소드는 BFPP 빈의 문제를 해결하기 위해서 사용되도록 의도된 것이므로 BFPP가 아닌 일반 빈을 만들 때는 사용하지 않는 것이 좋다. 스태틱 메소드이므로 다른 @Bean 인스턴스 메소드를 호출할 수도 없고, @Autowired로 DI받은 빈을 참조할 수도 없다. 그래도 억지로 BFPP가 아닌 빈을 스태틱 @Bean으로 정의하면 스프링이 WARN 레벨의 로그로 경고를 때려줄 것이다. 에러가 나지는 않지만 나중에 코드 리뷰하다 쪽팔릴 수 있으니 쓸데없이 사용하지는 말자.

그런데 위에서 정의한 PropertySourcesPlaceholderConfigurer 빈 메소드는 예전에 PPC를 만드는 @Bean 메소드와 다른 점이 있다. 메시지 파일의 location을 지정하지 않는다는 것인데 그 이유는 스프링 3.1의 프로퍼티 체계가 완전히 다르기 때문이다. PSPC는 프로퍼티 정보를 특정 파일이 아니라 Environment로부터 가져온다. 이 얘기를 마저 하려면 너무 길어져서 여기서 그만. 자세한 것은 조만간 나올 토비의 스프링 3 개정판을 참고 하…

오늘은 여기까지.

혹시 이 설명을 듣고 머리가 너무 아프다면, 잠시 머리를 식힐 겸 아웃사이더 님의 node.js 프로그래밍 책을 구해서 보는 것이 좋겠다. 최근 스프링 프레임워크 개발자들이 관심을 가지는 기술의 하나는 node.js다. 작년 VMForum에서 스프링 소스 호주 지부장이자 스프링 시큐리티, ROO를 만든 벤 알렉스는 키노트에서 스프링과 node.js를 함께 사용하는 멋진 예제를 소개하며 스프링의 미래를 전망했다. 스프링 소스가 참여해서 개발되고 있는 PaaS인 CloudFoundry에도 스프링과 함께 node.js 런타임이 지원되고, 스프링과 손쉽게 연동해서 사용할 수 있는 다양한 방법이 제공되고 있다. 스프링 개발자라면 한번쯤 관심을 가져야 할 기술이다. 아웃사이더님의 책은 내가 node.js를 공부(리뷰에 참여한 덕분에 원고를 좀 일찍 받아봤다)하면서 참고하고 있는데 아주 맘에 든다. 뭐, 내가 이 책의 추천사를 썼기 때문에 하는 말은 아니고…

Related posts:

  1. Spring 3.0 (56) @Bean 사용의 주의사항
  2. Spring 3.0 (33) JavaConfig의 통합과 변신. 메타-빈(meta-bean) 개념의 등장.
  3. Spring 3.0 (58) Static Class를 XML없이 빈으로 등록하기
  4. 테스트 코드에서 static import를 편하게 넣는 방법
  5. 테스트 할 수 없는 것을 테스트 하기. Spring ROO와 static method mocking.
  6. S1A 2008 셋째날 – Spring JavaConfig
  7. Inside Spring (5) PropertyPlaceholderConfigurer를 @Bean으로 정의해서는 안되는 이유
  8. InsideSpring (1) Annotated Factory Method (@Configuration)을 쓰는 4가지 방법 (1)
  9. Spring 3.0 (54) 드디어 등장한 ConfigurationClassApplicationContext
  10. Spring 3.0 (57) Spring 3.0.0 GA 출시
  11. 스프링 3.1 (3) @Enable~
  12. 기업의 오픈소스제품 공개
  13. 스프링 빈의 이름은 한글로 지어도 된다
  14. 스프링 3.1 (7) 프로퍼티 소스 추상화와 PropertySourcePlaceholderConfigurer
  15. 스프링에서 자신을 DI하는 빈을 정의할 수 있을까?

Facebook comments:

to “스프링 3.1 (4) Static @Bean 메소드”

  1. viagra hinta
    You desire your house to differentiate yourself from the competition. Consumers not only have to recall your premises, they likewise have being thrilled adequate to create an offer upon it. The details incorporated in this article will bring you started off on the path to residence marketing good results.Raising a child Ideas Every Mom or dad Should Know About
    Viagra online
    Property owners in cold areas where by snowfall and freezing may be the tradition ought to protect all cellar domestic plumbing pipes with foam to keep hot water very hot and stop water lines from perspiring in the more comfortable weather. Appropriately insulated plumbing save cash on boiling water heating expenses and greatly reduce the potential risk of freezing pipes in the winter.
    cialis senza ricetta
    When you are traveling anyplace, don’t assume that the coach services will be bad. The tour bus professional services anyplace are often very valuable. They can be less expensive than a taxi of vehicle lease service and may be used everywhere which you go. Additionally you don’t will need to go via all the hassle of hiring a car.
    cialis ireland

  2. There are some interesting deadlines in this article however I don’t know if I see all of them middle to heart. There is some validity but I will take maintain opinion until I look into it further. Good article , thanks and we would like more! Added to FeedBurner as effectively

  3. Here is a good Blog You may Discover Interesting that we Encourage You

  4. cialis switzerland
    Usually go through a whole new formula carefully before you start cooking food, preheating, or prepping. This helps prevent the problems of jogging into big surprise elements, devices, or methods and gives you a chance to hunt lower substitutions–or perhaps a new recipe–if needed. If at all possible, browse the formula before you do your purchasing to actually grab all you need.
    Levitra bayer
    Think about using the wind flow to potential your property to have an superb method to obtain environmentally friendly electricity. You simply will not only be off the strength grid, although the wind flow is undoubtedly an emission cost-free method to obtain energy is at plentiful supply in lots of locations on the planet. The original cost may be substantial, nevertheless the cost savings in the end are substantial also.
    kamagra shop
    Try interesting the customer while using issue collection of the email. Your electronic mail have to grab your reader’s interest the moment it lands within their inbox, or else it could go into their trash. If you have a weakened or uninteresting topic range, that is exactly what may happen. So try out spicing increase your subject line with many creativity.
    cheap viagra

  5. Thank you so much for providing individuals with a very remarkable opportunity to check tips from this website. It is usually very nice and also full of a great time for me and my office fellow workers to visit your blog minimum three times in a week to see the fresh guidance you have. And indeed, I am also actually fulfilled with your impressive tips served by you. Selected 1 tips in this article are indeed the very best I have ever had.

  6. Here is a superb Blog You may Come across Fascinating that we Encourage You

  7. Youre so cool! I dont suppose Ive learn something like this before. So nice to seek out somebody with some authentic thoughts on this subject. realy thanks for starting this up. this website is something that is needed on the web, someone with slightly originality. helpful job for bringing one thing new to the internet!

  8. Viagra pris
    Golfing can be a sports activity of determination and finesse. Golfers need to coordinate their palms and eyeballs hitting the ball within the ideal place about the eco-friendly. The greater a golfer gets to be, the greater their placing and driving skills improve. The recommendations on this page will assist you to become a much better golfing player.
    dapoxetine kopen
    You could be aware about the lighting function of your own screen less than configurations. However, if you’re looking at iBooks, you can do this much easier. It possesses its own options, and you will easily dim your lighting fixtures or brighten them by utilizing the slider bar which happens to be found easily near the top of the display.
    viagra rezeptfrei
    View price ranges even with you publication. Some flight and hotel businesses offer you a reimburse if the buying price of your reservation drops after you book it, so keep an eye on the price. Alternatively, establish-up a free account having a value watcher web site. When you enter into the concerns you made and the selling price you compensated, it is going to inform you if the cost has dropped by the lowest volume needed for a reimburse.
    kamagra switzerland

  9. Someone necessarily help to make significantly articles I would state. This is the first time I frequented your web page and to this point? I amazed with the research you made to make this particular put up extraordinary. Great task!

  10. please take a look at the web-sites we follow, which includes this one, as it represents our picks in the web

  11. below youll find the link to some sites that we think you’ll want to visit

  12. one of our guests not long ago encouraged the following website

  13. Here are several of the internet sites we recommend for our visitors

  14. Hmm it seems like your website ate my first comment
    (it was super long) so I guess I’ll just sum it up what I
    wrote and say, I’m thoroughly enjoying your blog. I too
    am an aspiring blog writer but I’m still new to everything.
    Do you have any recommendations for first-time blog writers?
    I’d genuinely appreciate it.

  15. It’s actually a cool and useful piece of info. I am glad that you shared this useful info with us. Please keep us up to date like this. Thanks for sharing.

  16. I went over this internet site and I think you have a lot of superb info, saved to my bookmarks (:.

  17. Oh my goodness! a tremendous article dude. Thank you Nonetheless I am experiencing difficulty with ur rss . Don’t know why Unable to subscribe to it. Is there anybody getting an identical rss drawback? Anyone who is aware of kindly respond. Thnkx

  18. usually posts some very fascinating stuff like this. If youre new to this site

  19. always a big fan of linking to bloggers that I really like but really don’t get a whole lot of link love from

  20. Why people still make use of to read news papers when in this technological globe
    everything is presented on web?

  21. very handful of sites that take place to be comprehensive below, from our point of view are undoubtedly properly really worth checking out

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