Constructor Injection, Setter Injection에 대해서 이야기를 해보자.
우리는 spring에서 DI를 할때 대부분 setter injection을 선호하거나 습관적으로 사용을 한다.

spring개발자들이 setter를 더 선호하기도 하고, 객체생성의 편리성을 위해서 가능한 setter를 많이 사용을 하고 있다. 그리고, 생성자에 dependency가 늘어가면 클래스가 보기 싫은 경우도 해당이 될 것이다. 2~4개정도는 괜찮아 보이나 더 늘어나면, 생성자가 못 생겨진다...:)

사실 생성자가 못 생겨지는 문제는 setter로 해결을 할 것이 아니라, 너무 많은 책임이나 dependency를 가지고 있기때문에 클래스를 쪼개는 것이 맞을 것이다. 부가적으로 생성자를 이쁘게 만들기 위해서 책임을 나누다가 보면 테스트가 쉬워진다.

일반적으로 setter로 dependency를 하다가 NullPointerException을 만나는 일이 많았을 것이다. spring context가 올라갈 때 미리 체크가 되면 수정하면 되는데, 런타임시에 발생하는 널에러는 골치가 아프다. 빠르게 찾아낼 수도 있지만, 다양한 상황이 겹쳐서 디버깅을 하기가 쉽지 않은 경우도 있다. 

특정 클래스를 위해서 반드시 DI해야할 dependency라면, 생성자로 injection하는 것이 좋겠다. spring annotation @Required의 효용성에 적은 것 처럼 @Required를 통해서 하는 방법도 있지만, 컨테이너 종속성이 생기게 된다. 이것 또한 POJO를 벗어나는 일이 아닐까 생각을 해본다. 어쩔수 없는 경우의 대안이라고 생각을 해야 한다. 남발을 하지 말자는 이야기이다.

널일 경우 체크를 해서 실행만 하지 않아도 되는 메소드라면, 반드시 코드상에 if문을 넣어주자. 이런 경우는 setter injection으로 하는 경우도 있겠다.

setter + @required = constructor injection

완전히 같다고 이야기를 할수 없지만, 대부분의 경우 비슷하다고 얘기할 수 있다.

@Required annotation설정도 유용한 것은 분명하지만,
가능한 컨테이너 종속성을 피하면서, 확실하게 의존성을 넣어줘야 한다면 constructor injection을 사용하자! 생성자 injection은 해악이 아니다.

참고글 :
http://javacan.madvirus.net/main/content/read.tle?contentId=120#sectionTitleListA
영회님 감사!

좀더 디테일하게 선택의 기준이 될만 내용이 실린 조만간 로드존스의 글을 업데이트하겠습니다.
P.132 ~ 135




Posted by ologist

블로그 이미지
ologist

공지사항

Yesterday191
Today136
Total34,708

달력

 « |  » 2012.02
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

최근에 받은 트랙백

글 보관함