요즘엔 3.0의 확장된 IoC/DI기능을 테스트하는 코드를 자주 만들어보는데, DI는 테스트하기가 매우 불편하다.

테스트 하나 당 빈 클래스 두 개 이상(DI하려면 최소 두개는 있어야 하니깐) XML 설정 하나가 필요하기 때문이다. 애노테이션 옵션 하나 바꿔도 다시 새로운 클래스 만들고 XML 만들고 하는 것이 몹시 귀찮다. XML없이 스캔을 해서 쓰는 방법도 있지만 다른 클래스를 로딩 안하게 패키지를 따로 만들어서 클래스를 넣어야 하니 XML 제거하는 것 이상의 불편이 있다.

대충 수백가지 조합이 나올 수 있는 3.0의 DI 방식들을 일일히 그렇게 만들어서 테스트 하자니 몹시 귀찮아하던 차에 테스트 클래스 안에 빈을 스태틱 클래스로 정의해서 사용하는 방법을 생각해보았다. 아무래도 클래스가 한 파일에만 모여있어도 관리하기 쉽다는 장점이 있으니까. 테스트 메소드 앞 뒤에 빈으로 쓸 스태틱 메소드를 선언해두면 한 눈에 보기도 좋고, 학습테스트 만들 때는 그만이다.

스태틱 클래스를 쓰면 클래스 파일 갯수는 줄어들지만 여전히 XML이 필요하다. 게다가 해당 클래스의 스태틱 클래스만 골라서 스캔할 수 없다. 이래 저래 번거롭다고 생각했는데..

 

그런데 오늘 아침 반짝 아이디어가!

AnnotationConfigApplicationContext는 빈 등록으로 두 가지 방식을 지원한다. 하나는 패키지를 넣어서 스캔하는 것과 하나는 @Configuration이 달린 자바콘픽 빈 클래스를 직접 제공하는 것. @Configuration은 그 자체가 하나의 XML파일이나 마찬가지니까 직접 클래스를 넣는 것도 지원해준다.

그런데 스프링은 @Configuration이 달린 클래스는 @Bean이 달린 메소드만 이용해서 빈을 등록하는 것이 아니라, 설정이 담긴 클래스 그 자신도 빈으로 등록한다. 사실은 AnnotationConfigApplicationContext가 해주는 일은 @Configuration 클래스를 넣으면 그냥 그걸 빈으로 등록하는게 전부다. 나머지는 빈 후처리기로 동작하는 각종 Annotation~PostProcessor들에서 등록된 빈을 살펴보고 @Configuration이 달려있는 빈이 있으면 그 메소드를 참조해서 추가로 더 빈을 등록해주는 것이다.

그런데 이 동작방식에 따르면 AnnotationConfigApplicationContext에 스캐닝용 패키지가 아닌 클래스를 직접 넣을 때, 그것이 굳이 @Configuration이 달린 것인지 검사하지 않는다. 물론 JavaDoc에는 @Configuration용이라고 명시하긴 했지만 그걸 무시하고 그냥 그 자체로 빈으로 등록하고 싶은 클래스를 넣어도 안될게 없다.

그래서 XML 없이, 빈 스캐닝도 없이 그냥 직접 등록하고 싶은 클래스를 ACAC에 넣어버린다면 스태틱 클래스를 바로 이용할 수 있다.

그래서 만들어본 초간단 DIJ(JSR-330) @Inject 테스트.

public class InjectTest {
    @Test
    public void inject() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(Hello.class, Printer.class);
        Hello hello = ac.getBean(Hello.class);
        assertThat(hello.printer, is(notNullValue()));
    }

    static class Hello {
        @Inject Printer printer;
    }

    static class Printer {
    }
}

애노테이션을 이용한 DI의 각종 옵션에 대한 테스트 용으로 편리하게 쓸 수 있을 듯.

스태틱 클래스가 자동등록될 때 빈의 이름은 top level class 이름이 추가된다. 따라서 위의 InjectTest$Hello 클래스는 "injectTest.Hello”라는 이름의 빈으로 등록된다.

이름을 직접 지정하고 싶으면 @Component를 이용하거나 DIJ의 @Named를 써도 된다.

@Named(“hello”)

static class Hello { .. }

 

XML에서 스태틱 클래스를 쓸 때는 class=”InjectTest$Hello” 처럼 쓴다. 근데 이 설명이 나와있는 스프링 레퍼런스 문서는 이 것을 inner class라고 표현했는데 틀린 용어다. 자바에서 inner class란 member class 또는 nested class 중에서 static이 아닌 것들만 말한다. 따라서 Inner class 처럼 독자적으로 인스턴스를 만들 수 없는 것들은 스프링의 빈이 될 수 없다. 다들 알아서 이해는 하겠지만… static member class라고 정정해야 할 듯 하다.

Related posts:

  1. 스프링 3.1 (4) Static @Bean 메소드
  2. 테스트 할 수 없는 것을 테스트 하기. Spring ROO와 static method mocking.
  3. 테스트 코드에서 static import를 편하게 넣는 방법
  4. Spring 2.0의 XML확장기능 (1)
  5. Spring 2.0의 XML확장기능 (2)
  6. Spring 2.0 XML확장기능 (3)
  7. Spring 3.0 (56) @Bean 사용의 주의사항
  8. 스프링 3.1 (6) web.xml의 활성 프로파일 설정
  9. Maven settings.xml의 비밀번호 암호화
  10. Spring 3.0 (54) 드디어 등장한 ConfigurationClassApplicationContext
  11. Spring 3.0 (33) JavaConfig의 통합과 변신. 메타-빈(meta-bean) 개념의 등장.
  12. [토스3] 테스트를 위한 필드 주입 유틸
  13. Inside Spring (6) 애노테이션 설정 지원 스프링 웹 테스트용 DispatcherServlet 만들기
  14. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (1)
  15. Spring Expressions(SpEL)를 이용한 Mockito Argument Matcher 만들기

Facebook comments:

to “Spring 3.0 (58) Static Class를 XML없이 빈으로 등록하기”

  1. Greetings! Very useful advice within this article! It is the little changes that produce the largest changes. Many thanks for sharing!

  2. Useful info. Many thanks. provigil lawsuit

  3. Thanks a lot, Loads of postings!
    fluconazole 100 mg

  4. I really like it when people come together and share thoughts. Great blog, stick with it!

  5. I like looking through a post that can make men and women think. Also, thank you for permitting me to comment.

  6. This is nicely expressed! . metformin bnf

  7. I’m amazed, I have to admit. Seldom do I encounter a blog that’s both equally educative and interesting, and let me tell you, you have hit the nail on the head. The problem is something too few men and women are speaking intelligently about. I’m very happy that I came across this in my hunt for something concerning this.

  8. Thanks! A good amount of info!
    cialis generic

  9. After looking at a number of the blog posts on your web page, I really appreciate your way of writing a blog. I added it to my bookmark site list and will be checking back in the near future. Please visit my website as well and let me know your opinion.

  10. Appreciate it. An abundance of forum posts.
    tamsulosina

  11. I was very happy to find this website. I want to to thank you for your time for this wonderful read!! I definitely liked every part of it and i also have you bookmarked to check out new stuff on your website.

  12. This is a topic that is close to my heart… Take care! Exactly where can I find the contact details for questions?

  13. Cheers! Numerous advice!

    walgreens cbd oil canadian drugs

  14. Wonderful postings. With thanks! augmentin duo

  15. You actually reported it perfectly!
    lady viagra cialis online 1000mg cbd oil

  16. Very good information. Lucky me I recently found your site by chance (stumbleupon). I’ve saved as a favorite for later.

  17. Amazing a good deal of terrific knowledge! Canada Prescriptions Propecia

  18. Way cool! Some extremely valid points! I appreciate you writing this article and the rest of the website is very good.

  19. I and also my friends have been going through the best tips and hints located on your web blog then then came up with a terrible feeling I never expressed respect to the website owner for those strategies. Those men had been totally excited to read through all of them and have unquestionably been having fun with them. Appreciation for being very thoughtful and for selecting these kinds of terrific resources most people are really desperate to learn about. My personal honest regret for not expressing gratitude to you sooner.

  20. Viagra Dosis Efectos http://buycialisuss.com – Cialis Viagra A Basso Prezzo Buy Cialis Buy Female Viagra In Australia

  21. I blog quite often and I seriously thank you for your information. The article has truly peaked my interest. I’m going to bookmark your website and keep checking for new information about once a week. I opted in for your Feed as well.

  22. An outstanding share! I have just forwarded this onto a colleague who was conducting a little homework on this. And he actually ordered me breakfast due to the fact that I stumbled upon it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanx for spending some time to discuss this subject here on your web site.

  23. Prevacid Discount Prices http://cialisjh.com – cialis generic 365 Pills Viagra Cialis Cialis En Mujeres

  24. Many thanks! Useful stuff! cbd superbugs

  25. Hmm is anyone else encountering problems with the pictures on this
    blog loading? I’m trying to figure out if its a problem on my end or if it’s the blog.
    Any feedback would be greatly appreciated.

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