요즘엔 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. that could be the finish of this write-up. Here you will come across some web-sites that we consider you will enjoy, just click the links over

  2. Major thanks for this useful article. Really looking forward to read more from you. Could you please read my blog?. Have a good day.

  3. Wow, awesome blog layout! How long have you been blogging for? you make blogging look easy. read my blog post here.

  4. I really like your blog.. very nice colors & theme. Did you design this website yourself or did you hire someone to do it for you? Plz answer back as I’m looking to construct my own blog and would like to find out where u got this from. cheers|

  5. Thanks for every one of your efforts on this web page. My mother loves going through investigations and it’s simple to grasp why. Most of us notice all regarding the dynamic method you provide rewarding tricks by means of the blog and as well as encourage response from other ones on this situation while our daughter is actually discovering a lot of things. Take advantage of the rest of the new year. You are carrying out a very good job.

  6. here are some links to web sites that we link to due to the fact we consider they’re worth visiting

  7. The info mentioned within the report are some of the best obtainable

  8. Here are some of the web sites we suggest for our visitors

  9. Valuable write ups. Thank you. generic viagra 100mg

  10. When I originally left a comment I seem to have clicked the -Notify me when new comments are added- checkbox and now each time a comment is added I get four emails with the same comment. There has to be a means you are able to remove me from that service? Cheers.

  11. Pretty! This has been an extremely wonderful post. Thank you for providing these details.|

  12. Spot on with this write-up, I absolutely believe this web site needs a lot more attention. I’ll probably be back again to see more, thanks for the info!|

  13. below you will come across the link to some web pages that we consider it is best to visit

  14. Pretty! This has been an incredibly wonderful post. Many thanks for providing these details.

  15. Everything is very open with a really clear description of the challenges. It was really informative. Your website is extremely helpful. Thanks for sharing!

  16. very few websites that transpire to be comprehensive beneath, from our point of view are undoubtedly very well 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