스프링 상식퀴즈 (1) http://toby.epril.com/?p=993의 답을 공개한다.

퀴즈의 답은 여러 가지가 가능한데, 간단하지는 않지만 가장 친숙한 방법을 꼽자면 "helloImpl빈에 트랜잭션을 적용하는 것"이다. HelloImpl이 DB를 사용하는 코드는 아니지만, 아무튼 helloImpl빈에 트랜잭션을 적용하고 나서 컨테이너를 띄우면 Client2가 HelloImpl빈을 찾을 수 없다는 메시지(No matching bean of type [...HelloImpl] found for dependency)와 함께 DI가 실패했다는 예외를 만나게 될 것이다.

트랜잭션 적용은 거의 모든 스프링 애플리케이션에 적용되는 가장 흔하고 평범한 작업이다. 따라서 예외가 발생한다는 것은 새로 추가한 트랜잭션 설정에 문제가 있는게 아니라 문제에 나온 세 개의 클래스 코드 속에 이미 오류가 있기 때문이다. 물론 이 오류는 정상적으로 보여서 처음에는 아무런 문제없이 동작하지만 스프링의 평범한 기능을 적용하는 데도 장애가 된다. 바로 DI의 기본 원칙을 지키지 않았기 때문이다. DI는 객체지향 프로그래밍과 설계 원칙에 기반을 두고 있다. 트랜잭션 지원기능을 포함한 모든 스프링의 모든 기술은 DI와 객체지향 설계원칙을 따르는 디자인 패턴에 바탕을 두고 있고, DI가 바르게 적용되지 않으면 동작하지 않는다. 따라서 DI의 원칙을 위배한 코드는 언젠가 문제를 일으키기 마련이다.

왜 트랜잭션을 적용하면 DI오류가 생기는지, 트랜잭션 말고 간단히 이런 에러를 발생시키는 간단한 방법은 무엇인지, 과연 문제의 코드는 어떤 원칙을 어긴 것이고, 그 것이 왜 트랜잭션 적용으로 인해 예외를 발생시키게 하는지, DI의 원칙과 무슨 관련이 있는지 등에 대해서는 각자 생각해보자.

잘 모르겠다면 올 봄에 출간 예정인 스프링 3.0 서적을 참고하기를. 특히 14장을 자세히… :)

Related posts:

  1. Spring 상식퀴즈 (1) – DI 태클하기
  2. Spring 3.0 (11) Aspects 모듈의 선택 라이브러리 분석
  3. 당신은 고난받기 위해 태어난 사람
  4. 태터툴즈를 버리고 wordpress를 쓰다
  5. 토비의 스프링 3 간략 목차
  6. Spring 3.0 (50) JUnit 4.5~4.7 겨우 지원성공 그리고 계속되는 악몽
  7. 태터툴즈 이틀 사용기
  8. Spring 3.0 (16) Jms 모듈의 선택 라이브러리 분석
  9. 둘째 하늘이 태어나다
  10. 태터툴즈 – TimeZone (2)
  11. 태터툴즈 버그? – TimeZone
  12. Spring 3.0 (14) Context Support 모듈의 선택 라이브러리 분석
  13. Spring ROO 대충대충 분석 (4) ROO의 미래와 의의
  14. 테스트 할 수 없는 것을 테스트 하기. Spring ROO와 static method mocking.
  15. 스프링이 쓰는 Dynamic Proxy는 Proxy 패턴인가 Decorator 패턴인가?

Facebook comments:

to “Spring 상식퀴즈 (1) – DI 태클하기 해답편”

  1. 전 aspectj 모드에 @Transactional 만 써온데다가
    문제에서 3개의 빈에 대한 정의를 그대로 둔다고 하셔서
    transaction은 생각도 못했습니다. @_@;
    aspectj 에 annotation-driven 사용하면 말씀하신 에러가 안 날것 같은데, 어차피
    interface로 타입정의 안하고 혹은 구현 class를 그대로 가져다 쓴적이 없어서
    저는 맞출수가 없는 문제였군요. ㅠ_ㅠ
    (가장 큰이유는 스프링에 대한 기초 상식 부족이겠죠…@_@;;; )

    근데 aspectj 모드나 proxy 모드라도 JDK Proxy가 아닌
    CGLIB 를 사용하면 (proxy-target-class=”true”)
    말씀하신 에러는 발생하지 않을것 같네요.
    Transaction 사용으로 발생하는 저 문제는 사실 JDK proxy 사용의
    제약사항 위반에 대한것이니까요. :)
    JDK proxy 로 생성된 proxy는 interface를 기반으로 해서
    생성되는데, 실제 사용할때 interface가 아닌 구현 class 타입을
    사용하면, 타입 체크할때, transaction 처리를 위해 생성한 bean (proxy) 은
    interface 타입을 통해 구현해서 interface 타입인데,
    이걸 inject 할 필드는 구현 class 타입
    즉, field ≤ bean (the field is more specific than the bean) 형태가 돼서
    이 bean을 injection 할수 없게 돼죠.

    한마디로 이거랑 비슷하단 얘기.
    String text = new Object(); // WRONG! (X)

    Object object = new String(); 은 가능해도
    String text = new Object(); 는 불가능

    String ≤ Object 이니까요.

  2. 아… 그리고 더 자세한 사항은 Toby님의 스프링 3.0 책을 참고하시기 바랍니다. :)

  3. Kevin/ @Transactional도 기본 옵션이라면 동일한 예외가 발생합니다.

    강제로 클래스 프록시를 적용하면 예외는 발생하지 않습니다. 하지만 인터페이스가 있음에도 강제로 프록시 클래스 사용해야 하는 자체가 이미 문제입니다. 프록시 AOP로 충분한 일에 AspectJ 모드를 사용해야 한다는 것도 마찬가지입니다.

    핵심은 스프링 AOP가 DI와 어떤 관계가 있는가 하는 점입니다. 왜 스프링에서 이런 경우에 평범한 디폴트 AOP를 적용하면 예외가 발생하게 되는지를 이해하는 것이 문제의 의도입니다.

  4. 넵, 그래서 저는 aspectj 모드만 쓰는데다가 interface로 타입정의 안하고 쓴적이 없어서
    생각치도 못했다고 말씀드린겁니다 :)

    기본적으로 하면 JDK proxy를 사용할텐데 저의 경우 굳이 이걸 안 쓰는 이유는
    이게 속도가 CGLIB이나 AspectJ 사용에 비해 느리고,
    저의 경우는 AOP를 스프링 사용이 아닌 AspectJ 자체로 하고 있어서
    어차피 이 라이브러리를 추가해 주기 때문에
    AspectJ 사용을 꺼릴 이유가 없는데다가,
    그게 아니라도 특별한 이유가 없는한 CGLIB을 사용하면 되기 때문입니다.
    그냥 제 취향이죠 뭐…^^;

    사실 JDK proxy를 통해서 AOP를 해본적이 없어서 이게 interface 타입의
    proxy를 생성하는걸 알아도 문제를 봤을때 금방 떠올릴수가 없었습니다. @_@;
    답변을 보고, “아! 그렇지…” 했지요. :)

    그나저나 Toby님 책에는 스프링은 물론이고 다른 유용한 정보가
    많을것으로 기대됩니다.

  5. ㅋㅋ답을 밝히셨네요.

    사실 봄싹플젝도;; 초반에 하두 추가되는게 많고 귀찮아서 Service 인터페이스를 만들지 않고 클래스만 만든 다음 컨트롤러에 주입해서 사용하고 있었거든요. 그런데 에러는 안났죠. 왜냐면.. Kevin님께서 말씀해주신대로 CGLib을 사용하도록 설정했었거든요.

    흠.. 하지만 DI 관점이나 인터페이스 기반 프로그래밍의 장점을 본다면 서비스 계층에도 인터페이스를 두는게 맞는 것 같아서 현재 개선 중입니다.

  6. 재밌는 퀴즈였었습니다^^;

  7. 언제쯤 책이 나오는지.. 정확한 책이름.. 알수 있을까요..^^ 기존 글에서 못 본거 같아서..^^

  8. kichis/ 출간일정이 결정되면 자세한 내용을 블로그를 통해서 알려드리겠습니다.

  9. [...] 상황은 딱.. 예전에 토비님 블로그에 올라왔던 상황입니다. 토비님은 그 글에 대한 해답편도 올려두셨는데.. 해답은 토스3의 14장을 보라는 내용이었습니다. 지금 이 [...]

  10. Gke1ko vktshxqijpex, [url=http://rrkxicechwzr.com/]rrkxicechwzr[/url], [link=http://pizcodozcnbr.com/]pizcodozcnbr[/link], http://lesyguggflmo.com/

  11. mbt shoes women Spring 상식퀴즈 (1) – DI 태클하기 해답편 » Toby’s Epril

  12. antishoe Spring 상식퀴즈 (1) – DI 태클하기 해답편 » Toby’s Epril

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