"없다" 시리즈 두 번째

스프링 빈의 lifecycle을 구분하는 스코프는 세 가지이다. 싱글톤, 프로토타입, 그리고 기타 스코프. 기타 스코프는 서블릿 컨텍스트(application), Request, Session 등등으로 다시 구분할 수 있다.

엄밀히 말해서 DI에는 스코프라는 것이 있을 수 없다. DI의 기본 전제는 모든 빈이 싱글톤이라는 것이다. 왜 그럴까? DI는 하나의 빈이 생성되면 필요한 collaborator들을 즉시 주입해주어야 한다. 그렇게 한번 DI되서 초기화된 빈은 다시 다른 빈이 DI되지 않는다. DI는 일생동안 한번 뿐이다. 이는 절대 바뀔 수 없는 원칙이다. 빈이 사용되기 시작한 후에 컨테이너가 임의로 빈에 다시 DI를 해버린다는 것은 말이 되지 않는다.

DI의 원칙이 하나의 빈 오브젝트가 생성되면 동시에 의존관계 빈을 DI해버린다는 것이라고 보면 DI되는 빈의 lifecycle은 DI당하는 빈과 같을 수 밖에 없다는 것을 알 수 있다. 즉, 싱글톤 빈에 DI되는 빈은 싱글톤이라는 얘기다. 싱글톤 스코프는 엄밀히 말해서 스코프가 관리되어지는 것이 아니다. 그냥 컨텍스트와 그 일생을 같이 하는 일체나 마찬가지이다. 컨텍스트가 만들어질 때 만들어지고 종료될 때 함께 제거된다. 따라서 별도의 스코프를 가지지 않는 것과 마찬가지다. 그래서 싱글톤은 상태를 가지지 않는 것이 원칙이며 한번 DI이면 끝이다.

문제는 lifecycle이 싱글톤 보다 작은 빈이 필요한 경우가 있다는 것이다. 단지 임시로 만들어 쓸 것이면 로컬 변수로 선언하고 오브젝트를 만들서 사용하면 된다. 메소드가 종료되면 깔끔히 그 오브젝트의 수명도 다할 것이다. 그런데 이렇게 필요할 때 만들어 쓰고 버릴 오브젝트가 컨테이너의 다른 빈을 DI해서 사용해야 하는 경우가 문제이다. 자신은 필요할 때마다 독립적으로 만들어져야 하지만 자신이 필요로 하는 다른 싱글톤 오브젝트는 컨테이서에서 DI로 받고 싶은 것이다.  DI 되거나 받으려면 자신도 컨테이너가 관리하는 빈이 되어야 하는 것이 원칙이다.

그래서 이렇게 필요할 때마다 여러 번 오브젝트가 생성되지만 그 오브젝트가 필요로 하는 또 다른 빈은 DI받고 싶은 경우 이 오브젝트를 스프링의 빈으로 등록하고 scope를 prototype으로 선언한다.

문제는 앞에서 얘기한 DI의 스코프 적용 원칙이다. 주입되는 빈의 스코프는 주입당하는 빈의 스코프와 동일하다는 것 말이다. A->B 의존관계로 B가 A에 주입된다면 DI의 동작원리에 따라 B의 스코프는 A와 동일할 수 밖에 없다.

그렇다면 singleton스코프를 가지는 빈이 prototype 타입 스코프를 가지는 빈을 DI 받는 다면 과연 그 각각의 스코프가 성립이 될까? singleton->prototype 관계의 DI는 DI의 스코프 원칙에 따라 singleton->singleton이 되버린다. A가 싱글톤으로 만들어지는 딱 한번만 B를 만들어 주입 받기 때문이다. 그 뒤로는 컨테이너가 절대로 B의 새로운 인스턴스를 만들어 넣어주는 일이 없다. 따라서 prototype으로 선언해봤자 DI에서는 무용지물이다.

따라서 DI에서는 prototype scope라는 것은 아예 의미가 없다고 봐야 한다.

Prototype scope를 그 의미대로 필요한 시점에서 매번 새로운 인스턴스를 만들어야 한다면 그때는 DI가 아니라 DL을 써야 한다. 명시적으로 컨테이너에게 해당 빈에게 새로운 인스턴스를 달라고 요청해야만 한다. 그래서 ApplicationContextAware를 써서 getBean을 하든, lookup method injection을 하든, 팩토리 빈을 끼든, ObjectFactory를 사용하는 등의 DL 방식을 사용할 수 밖에 없다.

 

이런 DI원칙은 prototype 스코프 외에도 동일하게 적용된다. Request, Session, ServletContext 스코프 따위는 아무리 만들어봤자 싱글톤에서 DI하면 단 한번만 생성하고 끝이다. 역시 제대로 쓰려면 DL이 필요하다. 물론 이런 진정한 의미의 스코프를 가지는 빈들은 매번 getBean한다고 새로운 인스턴스가 돌아오지 않는다. 각 스코프가 가지는 컨텍스트 내에서는 동일한 오브젝트를, 그 밖으로 나가면 다른 인스턴스를 받을 수 있다. 의미있는 레벨의 컨텍스트를 가지기 때문에 그 안에서 공유가능한 상태 정보를 넣어 사용해도 된다. 로그인 정보를 담고 있는 Session 스코프 같은 것이 그런 용도 이다.

DI원칙을 여기에 적용해보자. 만약 Session스코프를 가진 빈이 Prototype스코프를 가진 빈을 DI한다고 해보자. 그러면 Session스코프의 범위가 더 넓으므로 Prototype빈의 스코프는 Session스코프로 확장된다. 즉 Session scope->Prototype scope는 Session->Session이나 마찬가지라는 얘기다. 이건 DI 얘기임을 혼동하면 안된다. DL방식을 이용하면 Session->Prototype도 가능하다.

 

사실 이런 DI에서의 Prototype 스코프의 특징은 최신 자바표준인 CDI(일명 WebBeans)의 pseudo-context의 대표적인 케이스인 dependent pseudo-scope와 거의 동일하다. dependent pseudo-scopee는 다른 일반적인 normal scope와 다른 방식으로 만들어지고 동작한다. 그 특징을 잘 살펴보면 스프링의 prototype빈이 DI에서 사용되는 것과 거의 비슷하다. 다음은 CDI스펙에 나오는 Dependent psuedo-scope에 대한 설명의 일부이다.

- 다른 오브젝트에 DI된 dependent 오브젝트는 여러 오브젝트가 공유 할 수 없다

- 다른 오브젝트에 DI된 dependent 오브젝트는 주입된 오브젝트의 lifecycle에 바인딩 된다.

- Depedent psuedo-scope를 가지는 Context에 get()을 요청하면 매번 새로운 인스턴스를 돌려준다.

 

Singleton 빈이 주인 스프링에서는 원칙적으로 싱글톤 보다 작은 lifecycle을 가지는 빈을 DI하는 것이 의미가 없고 DL을 사용해야 한다는 것이 DI의 원칙이자 자바언어의 기본 sematics이다.

 

그런데 싱글톤 외의 다양한 스코프를 중시하는 CDI는 물론이고, DL의 사용방법을 귀찮게 생각하는 사람들의 불만이 많은 스프링에서도 DI의 기본 원칙을 무시하는 특별한 기법을 이용하기 시작했다.

CDI용어로 하지만 client proxy invocation이고 스프링 용어로 하자면 scoped proxy이다. 두가지다 비슷한 개념이다. 기본적인 아이디어는 lookup method injection과 비슷하다. lookup(DL) 코드를 다이나믹하게 주입하는 것이다. method injection이 미리 만들어진 abstract method를 확장 구현하는 방법을 이용한다면 client proxy invocation이나 scoped proxy는 DI 구조를 그대로 유지하면서 해당 scope의 context(또는 scope object)에서 DL하는 코드를 가진 실제 DI될 오브젝트의 프록시를 주입해주는 것이다. 그래서 겉으로 보기에는 완벽한 DI코드로 보이지만 사실은 DL이 일어나서 실제 의존한 인스턴스를 스코프에 따라 만들고 proxy를 통해서 그 오브젝트에 대한 요청을 bypass해주는 것이다. 일종의 routing proxy빈이라고 봐도 좋다.

아무튼 이런 스코프 DL을 지원하는 프록시를 DI방식으로 사용할 수 있는 것은 현재 컨텍스트에 따라서 적절한 scope를 결정할 수 있는 방법이 있기 때문이다. 같은 방법을 사용한다고 해도 prototype 스코프는 적용할 수가 없다. prototype 방식의 오브젝트의 스코프는 코드가 결정할 수 있지, 컨텍스트니 스코프 따위가 결정할 수 있는 것이 아니기 때문이다.

결국 싱글톤도 그렇고, 프로토타입도 이런 관점에서는 의미있는 스코프를 가진다고 볼 수 없다. 그래서 스프링에는 싱글톤, 프로토타입, (기타)스코프 의 세가지 빈이 존재한다고 말할 수 있는 것이다.

 

문제는 이런 scoped proxy 방식은 코드만 봐서는 평범한 DI코드와 동일하게 보인다는 점이다. scoped proxy는 주어진 스코프 안에서 상태 값을 변경할 수 있다. 그래서 그냥 보기엔 싱글톤 오브젝트의 인스턴스 변수를 마구 바꾸는 끔찍한 짓을 하는 듯이 보인다. 자바코드 semantics에서는 이상한 코드가 되어버린다는 말이다. 물론 proxy들이 알아서 관련 스코프의 독립적인 인스턴스만을 구분해서 조작해주기 때문에 걱정은 없지만 말이다.

이창신 님이 올려주신 CDI에 관한 예제를 살펴보자. 이 예제는 Glassfish예제인 것으로 아는데, 코드를 보니 CDI스펙에 나오는 것과 비슷하다. request스코프를 가지는 JSF빈 대신 Servlet이 이용하는 request스코프를 가진 Credential로 바뀌었을 뿐이다. 원래 서블릿은 잘 알려진 대로 기본적인 멀티쓰레드 모드라면 싱글톤으로 만들어진다. 그래서 절대로 서블릿에 인스턴스 변수를 두고 이를 고치는 짓은 하면 안된다는 것은 자바 쌩초보자 딱지만 뗏다면 누구나다 잘 아는 기초 중의 기초이다. 그런데 이 예제에서 LoginServlet은 인스턴스 변수인 Credential의 값을 마구 바꾸는 짓을 한다. 자바코드로 보기에는 미친 짓이다. 그러나 CDI에서는 기술적으로는 아무 문제가 없다. @Inject된 Credential은 Request스코프를 가지는 client proxy이기 때문에 매 request마다 다른 인스턴스를 호출하도록 보장해주기 때문이다. 문제는 Servlet코드에서는 그런 스코프가 보이지 않는 다는 점이다. 그저 같은 서블릿 인스턴스를 멀티쓰레드 환경에서 쓰면 문제가 될만한 짓을 하는 코드로 밖에 보이지 않는다. 환경을 떠나서는 자바언의 sematics가 달라지는 대표적인 경우이다.

이런 비슷한 것을 얼마전 @Configuration의 @Bean이 붙은 메소드가 동작하는 방식에서도 본적이 있다. 분명 새로운 인스턴스를 생성하는 메소드인데, 어떤 경우는 반복 호출을 해도 매번 동일한 오브젝트가 돌아온다. 역시 proxy로 확장되는 클래스이기 때문에 표준 자바 sematics와는 다르게 동작한다. 스프링에서 빈으로 만들어져서 사용되지 않는다면 일반 자바코드로 테스트 등에서 쓰면 원래 의도한 대로 동작하지 않는 문제를 만나게 된다.

scoped proxy를 쓰는 DI는 스코프가 서로 다른 빈들을 간단히 DI해주는 것만으로도 자신의 스코프를 지키며 동작하게 할 수 있다. 물론 여기에도 심각한 문제가 있긴 하다. 스코프가 넓어지는 참조는 보통 문제가 없지만 작아지는 참조는 매우 이상한 코드를 만들어 낼 수 있다. 이 것이 요즘 내가 가장 고민하는 주제인데.. 이 내용은 좀 더 정리하고 다시 적어봐야겠다.

 

DI가 가지는 의존관계와 스코프의 한계 때문에 DL을 써야 하는 불편함을 scoped proxy니 client scope invocation이니 하는 방법으로 깔끔하게 해결하고 DI 구조를 그대로 유지하게 만든 것은 분명히 장점이 있다. 제대로 이해하기는 힘들지만 기계적으로 사용하면 복잡한 스코프를 가지는 코드를 훨씬 쉽게 만들 수 있다.  하지만 애노테이션 다 떼고, 플랫폼 환경을 제거하고 순수한 자바 코드로 보자면 분명 왜곡된 코드이다. @NormalScope에 속한 다양한 @RequestScope같은 애노테이션(CDI) 또는 설정파일의 프록시를 위한 AOP선언(스프링)과 같은 것을 사용하지 않으면 원하는 대로 동작하지 않는다. 그리고 특정 플랫폼-컨테이너에서 동작시켜야만 한다. 그 밖에서는 다르게 동작한다. 이렇게 환경에 종속성이 매우 강한 코드임에도 단지 특정 클래스를 상속을 하지 않았다고 POJO라고 부를 수 있을지.. 나는 의문이다. Proxy Oriented Java Object의 약자라면 모를까.

물론 현실적으로 이런 접근을 받아들이지 못할 이유는 없다. 자바언어의 순수성을 고집하자면 이미 Java5를 거부했어야 한다. 지금까지 등장한 자바언어의 확장기능 중에서 애노테이션만큼 자바 언어의 개발방식을 송두리채 바꿔놓은 것은 없다고 생각한다. OO적인 특징도 그 때문에 많이 바뀌었다. 애노테이션을 마구 활용하는 개발방법에서 기본 타입체계에 기대는 OO적인 개발의 특징은 많이 제거될 수 밖에 없었다. 메타프로그래밍은 확산되었고 리플렉션과 바이트코드 조작, 위빙의 천국으로 만들어버렸다. 그 충격 조차 아직 다 받아들이지 못한 지금 프록시를 이용해서 변수를 참조하는 방식으로 코드의 동작방식 마저 바꾸는 이런 변화는 사실 굉장한 패러다임의 전환을 각오하지 않고는 제대로 받아들이기 쉽지 않을지 모르겠다.

 

자바언어는 진화하고 DI도 진화한다. 나는 IoC의 방법을 기존 DL/DI 두가지에서 DL/normal DI/proxy DI 세가지로 새롭게 구분해야 한다고 생각한다.

 

참, prototype 스코프란 DI(proxy방식이든 아니든)에서는 존재하지 않는다는 것을 얘기할려고 한 것인데 이런 저런 관련된 생각을 늘어놓다보니 또 얘기가 길어졌다.

Related posts:

  1. Prototype 빈을 위한 DL 전략
  2. Dependency Injection의 Dependency란 무엇인가?
  3. DI의 본질 – 다이나믹 (타입) 언어는 Dependency Injection이 필요없는가?
  4. Spring 3.0 (41) @Deprecated SpringMVC

Facebook comments:

to “Dependecy Injection에는 Prototype Scope가 없다”

  1. levitra generiek
    Whenever you awaken every morning, as opposed to having a very hot bath or shower, make an effort to adhere to a lukewarm heat. If the h2o is quite warm, you will discover a pretty good possibility that your particular anxiety degree is going to increase. Stay away from very hot showers, if you want to feel safe.
    priligy goedkoop
    Educate your puppy correct and improper for many instances. You will require the help of the whole family to instruct this. It can immediately undo all of your effort!
    cialis generika
    To market wholesome the teeth that will last a life time, steer clear of cigarette smoking tobacco. Smoking not just discolors your teeth, in addition, it brings about an excessive build-up of plaque and tartar about the the teeth. Cigs also enhance your probability of gum illness and oral many forms of cancer. Quit smoking to make certain that there is the best teeth and gums.
    priligy kaufen

  2. Good post. I be taught one thing more difficult on totally different blogs everyday. It is going to all the time be stimulating to read content from other writers and follow just a little one thing from their store. I抎 prefer to use some with the content material on my weblog whether or not you don抰 mind. Natually I抣l give you a link in your net blog. Thanks for sharing.

  3. kamagra suisse
    To get greater results from any organic whitening strategy, give a tiny white vinegar! White vinegar is a great way to make cooking soft drink, freshly squeezed lemon juice, and other household whitening approaches far better. The white vinegar functions as a kind of primer to your tooth that will help any whitener to basin in and also have a much stronger result.
    viagra générique
    In case you are shopping for automobile insurance, check around. Compare rates and coverage choices available. Ensure you have your car or truck information and facts, your driving record if you’ve experienced incidents or seat tickets, and also the things you utilize your auto for and how numerous mls you drive. All of these are elements to discovering the right insurance policy for the right value.
    priligy kosten
    Be ready to cut your failures early on the forex market. This is one of the most essential things in order to do in order to avoid big failures. Never give in the attraction to stay in on a losing streak in the hope that you will make again your loss. You’re much very likely to just shed much more.
    cialis schweiz

  4. propecia belgique
    Marketing and advertising your enterprise implies analyzing all techniques of press, which include social media marketing, article marketing and in many cases email marketing. Given that you have to take a measure at a time, these days let’s start by discovering all we are able to about e-mail marketing and ways to generate an efficient strategy that raises your websites’ profit.
    cialis pris
    Keep the your hair away from your experience. This may stop gas relocating out of your locks in your encounter and triggering pimples difficulties. Also, if you are using hair care items like mousse, gel or hairspray and your locks touches your skin you can get flare ups. Don’t let these kinds of products to touch your face at all.
    kamagra danmark
    Once you receive a online video or two up, start churning them out. Concentration your time and effort in a campaign, where every one of your own video lessons is really a smaller sized component of a larger entire. Produce a synergy close to your total entire body of articles. If you may get a new audience with 1 video to check out a lot more, your odds of a successful phone to activity climb.
    kamagra porto

  5. Spot on with this write-up, I actually think this website wants rather more consideration. I抣l in all probability be again to read rather more, thanks for that info.

  6. First of all I would like to say wonderful blog! I had a quick question which
    I’d like to ask if you do not mind. I was curious to know how you center yourself
    and clear your thoughts prior to writing. I have had difficulty clearing
    my thoughts in getting my thoughts out. I truly do take
    pleasure in writing however it just seems like the
    first 10 to 15 minutes tend to be lost just trying to figure out how to
    begin. Any ideas or hints? Thank you!

  7. This web page is really a stroll-by for all of the info you wanted about this and didn抰 know who to ask. Glimpse right here, and also you抣l definitely uncover it.

  8. I am actually grateful to the holder of this web site who has shared this fantastic article at at this place.

  9. cialis generico
    An effective idea about acne breakouts are just to not choose at it. When you select at the zits you can make the acne even worse. If you’re going to pick at it you need to at the very least wash your hands very first in order that no germs has the chance to enter.
    viagra belgie
    If you are anxious, constantly seek out the advice of a physician. In case you are way too very proud or afraid to see your physician, you may be disregarding concerns that exist and could become worse. If you find cancer present, it might distribute and result in increased damage, which may be ignored should you seek out the advice of any health care professional you rely on.
    levitra 20
    There is no certain diet that physicians recommend for those who have bronchial asthma, but bright white sweets ought to be avoid and dark brown sugar must just be employed a little at a time. Veggie, whole milk, and whole grain meals are typical suggested, as well as fruits including citrus, berries, and melons.
    cialis generika

  10. viagra precio
    When planning on buying professional residence you should consider heading greater. The more devices from the developing, the less expensive each model is going to be. In addition to, when you have to control models it genuinely isn’t very much more difficult to deal with 50 since it is 10. Consider what you could afford and what would be the greatest consumption of your cash.
    cialis bijsluiter
    When you are anxious that your particular zits is not going to appear to be going away, create a paste by mixing up cinnamon powder and sweetie. Position the paste on your own deal with prior to get to sleep and make use of tepid water to rinse it away each day. It will not only assist your zits, but it will nurture your epidermis, too.
    kamagra suisse
    Many individuals think that a brand new shampoo or conditioner change makes their your hair look much healthier. Hair doesn’t be aware of distinction between virtually any product or service, neither can it build up a threshold. For those who have a shampoo or conditioner which has proved helpful for you personally with time, hair fails to build up a threshold on it. If you are using weighty waxes in your locks, a clarifying shampoo every single few weeks can take away any constructed-up remains.
    viagra comprar

  11. kamagra belgie
    Set up and completely conserve a alarm system in your home to acquire a discounted in your homeowner’s insurance. Furthermore the insurance policy businesses view you as a lot less risk and drop your costs, but would-be crooks will see your pc as a deterrent and choose to locate another person to rob.
    viagra günstig
    When you find yourself having your first charge card, or any greeting card for that matter, make sure you be aware of the payment routine, rate of interest, and all terms and conditions. Lots of people fail to check this out details, yet it is undoubtedly in your gain should you spend some time to browse through it.
    cialis netistä
    Receive the best earth achievable. It is possible to grow many different vegetation should you amend your earth to some very good pH degree. This could be performed by obtaining a check package. If you find that your earth is simply too acid or also soft sand, it’s a simple resolve – add a lot of natural and organic compost, and mixture it effectively in. Quickly you will get ideal dirt for planting.
    kamagra gel

  12. Can I just say what a aid to search out somebody who truly knows what theyre speaking about on the internet. You undoubtedly know easy methods to deliver a difficulty to gentle and make it important. Extra individuals need to read this and perceive this facet of the story. I cant imagine youre no more fashionable since you definitely have the gift.

  13. I am curious to find out what blog system you have been working with?
    I’m having some minor security issues with my latest site and I’d like to find
    something more secure. Do you have any solutions?

  14. viagra precio
    When choosing a domain name to your internet site, you need to never ever accept anything inconsequential just because your selected website has become used. The closer your domain address would be to the topic of your web site, the greater you may do from the search rankings. Turn on that light bulb earlier mentioned your face and judge an excellent, appropriate domain name.
    kamagra gel
    Don’t hesitate to test in relation to enjoying a excellent wine. Positive, we all have a favorite stand up-by, but that doesn’t imply something different should not be appreciated at the same time. If red can be your go-to red wine, examine the opportunity of a Pinot Grigio today or perhaps be definitely bold and try anything you’ve in no way even heard about!
    levitra acheter
    You need to produce a Vimeo route to share evaluations of your own products and also other video lessons relevant to your industry. You can create your money so your videos are posted right away on certain social media sites. This could help you save efforts and prevent you from forgetting to up-date a site.
    kamagra switzerland

  15. Heya i’m for the primary time here. I came across
    this board and I to find It truly helpful & it helped me
    out a lot. I hope to present something back
    and help others such as you aided me.

  16. viagra kokemuksia
    When you reach university, obtain a road map. You can expect to sense a bit absurd while using road map, but you do need to know which place to go, in the end. Map out your courses as well as the cafeteria to enable you to easily travel when you first commence. That could help make your very first days and nights much less frantic.
    viagra online
    As soon as your credit rating is poor it doesn’t need to be similar to a scene from Superstar Competitions in which Yoda says, “As soon as you start along the dim pathway, eternally does it master your future.” Contrarily, it is rather workable, as long as you will find the determination and at minimum some form of earnings arriving in, to help you ease your debt.
    priligy belgique
    Attempt to possess a husband and wife close friends on standby to fix unexpected emergency problems. This needs to be your day, so you should be able to have fun with this without having stressing in case the priest will probably be there by the due date. When you discovered these good friends, forget about the issues and permit them to do points to suit your needs.
    propecia erfahrungen

  17. I am usually to blogging and i actually appreciate your content. The article has actually peaks my interest. I am going to bookmark your site and preserve checking for brand spanking new information.

  18. Please let me know if you’re looking for a writer for your site.
    You have some really good posts and I feel I would be a good asset.
    If you ever want to take some of the load off, I’d love to
    write some material for your blog in exchange for a link back to mine.

    Please send me an email if interested. Thank you!

  19. Your home is valueble for me. Thanks!?

  20. Can I simply say what a reduction to find somebody who truly is aware of what theyre speaking about on the internet. You definitely know the right way to deliver a difficulty to gentle and make it important. Extra people need to learn this and understand this aspect of the story. I cant believe youre no more fashionable because you definitely have the gift.

  21. It’s the best time to make some plans for the
    future and it is time to be happy. I’ve read
    this post and if I could I wish to suggest you some interesting things or advice.
    Maybe you can write next articles referring to this article.
    I want to read even more things about it!

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