요즘엔 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. Pretty! This has been an extremely wonderful article. Many thanks for providing this info.

  2. This is a great tip particularly to those fresh to the blogosphere. Brief but very accurate information… Thank you for sharing this one. A must read article!

  3. This is a topic that is near to my heart… Take care! Where are your contact details though?

  4. I need to to thank you for this excellent read!! I absolutely loved every bit of it. I have got you book-marked to look at new stuff you post…

  5. Some really quality content on this web site , saved to fav.

  6. I couldn’t resist commenting. Perfectly written!

  7. Excellent write-up. I certainly appreciate this site. Thanks!

  8. Really nice design and wonderful articles , absolutely nothing else we need : D.

  9. Way cool! Some extremely valid points! I appreciate you penning this write-up and the rest of the website is really good.

  10. Excellent write-up. I definitely love this website. Continue the good work!

  11. You need to be a part of a contest for one of the most useful sites online. I will recommend this blog!

  12. Everyone loves it when folks come together and share opinions. Great website, continue the good work!

  13. Way cool! Some extremely valid points! I appreciate you writing this write-up and also the rest of the website is really good.

  14. I’m very pleased to uncover this great site. I wanted to thank you for your time due to this wonderful read!! I definitely enjoyed every part of it and I have you saved as a favorite to look at new information on your blog.

  15. That is a great tip especially to those new to the blogosphere. Short but very accurate information… Thank you for sharing this one. A must read post!

  16. Wow! This could be one particular of the most useful blogs We’ve ever arrive across on this subject. Actually Wonderful. I’m also a specialist in this topic therefore I can understand your effort.

  17. Everyone loves it when folks get together and share opinions. Great blog, stick with it!

  18. I couldn’t refrain from commenting. Very well written!

  19. Aw, this was an incredibly good post. Finding the time and actual effort to make a top notch article… but what can I say… I put things off a lot and don’t manage to get nearly anything done.

  20. I would like to thank you for the efforts you’ve put in penning this site. I really hope to see the same high-grade content from you later on as well. In fact, your creative writing abilities has motivated me to get my very own website now ;)

  21. I like it when folks come together and share ideas. Great blog, continue the good work!

  22. Having read this I thought it was really enlightening. I appreciate you taking the time and energy to put this short article together. I once again find myself spending way too much time both reading and commenting. But so what, it was still worthwhile!

  23. I could not resist commenting. Exceptionally well written!

  24. Very good information. Lucky me I discovered your website by chance (stumbleupon). I’ve book marked it for later!

  25. I’m amazed, I have to admit. Seldom do I encounter a blog that’s both educative and interesting, and let me tell you, you’ve hit the nail on the head. The issue is an issue that too few people are speaking intelligently about. Now i’m very happy that I found this during my search for something concerning this.

  26. I would like to thank you for the efforts you’ve put in writing this website. I really hope to view the same high-grade content by you later on as well. In fact, your creative writing abilities has inspired me to get my own, personal website now ;)

  27. After looking at a number of the blog posts on your web page, I honestly appreciate your technique of blogging. I saved as a favorite it to my bookmark site list and will be checking back soon. Please visit my website too and let me know your opinion.

  28. Oh my goodness! Awesome article dude! Many thanks, However I am encountering troubles with your RSS. I don’t understand why I am unable to subscribe to it. Is there anybody having similar RSS problems? Anybody who knows the answer can you kindly respond? Thanx!!

  29. bookmarked!!, I really like your site!

  30. You have made some really good points there. I checked on the internet to learn more about the issue and found most people will go along with your views on this site.

  31. I really love your site.. Great colors & theme. Did you develop this amazing site yourself? Please reply back as I’m looking to create my own personal website and would love to learn where you got this from or what the theme is called. Appreciate 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