스프링에는 두 가지 대표적인 TypeConverter가 존재한다.

하나는 SpringMVC가 HttpRequest를 커맨드(모델)로 전환할 때 사용하는 (Web)DataBinder이고, 다른 하나는 스프링의 빈의 프로퍼티 설정을 위해서 사용하는 BeanWrapper이다. 두가지 모두 TypeConverter 인터페이스를 구현하고 있다.

두 경우 모두 타입전환이 필요로 하는 이유는 텍스트 포맷으로 존재하는 XML설정이나 HTTP 파라미터를 임의의 오브젝트로 전환해야 하기 때문이다.

스프링이 이 타입변환을 위해서 사용하는 방법은 JavaBeans의 PropertyEditor이다. 각각 PropertyEditorRegistry가 되어서 기본타입을 포함해서 Class, Resource 나 콜렉션 같은 복잡한 타입도 간단하게 변환이 가능하도록 만들고 있다. 또한 새로운 Editor를 추가하는 것도 어려운 일이 아니다. SpringMVC를 마스터하기 위해서(@MVC도 마찬가지이다) 중요한 것이 이 PropertyEditor와 DataBinder 메카니즘이다.

이 PropertyEditor는 한가지 큰 약점이 있다. 그것은 쓰레드쎄이프하지 않다는 것이다. 아주 잠깐이지만 인스턴스 변수 안에 value를 저장해 두고 그것을 다시 읽어오도록 되어있다. 원래 GUI툴에서 프로퍼티 뷰와 실제 오브젝트의 프로퍼티의 값을 전환하기 위해서 설계한 것이기 때문에 구지 쓰레드쎄이프하게 만들어지지 않은 것이다.

따라서 모든 PropertyEditor는 순차적으로 사용되는 것이 보장되지 않는다면 반드시 쓰레드마다 새 인스턴스를 만들어서 써야 한다. initBinder 등에서 에디터를 등록할 때 new로 새로운 인스턴스를 만드는 것이 필수다.

문제는 M2O관계에서 아이디-엔티티 변환을 시도하는 경우다. 폼에는 레퍼런스 아이디가 넘어가고 돌아오면 그 아이디에 해당하는 실제 오브젝트를 DB(또는 캐쉬)에서 가져오는 것이다. 이 방법의 문제점은 DAO등을 PropertyEditor가 DI 받아야 하므로 빈으로 등록해야 한다는 점이다. 문제는 싱글톤 빈으로 등록되면 멀티쓰레드에서 문제가 발생할 수 밖에 없다. 그래서 프로토타입 빈으로 등록하고 이를 메소드 주입 등의 방법을 이용해서 매번 새 인스턴스를 가져오게 만들어야 한다.

이를 지키지 않고 싱글톤으로 그냥 썼을 때는 치명적인 버그를 심을 수 있다. 대부분 잘 되다가 사용자가 급격히 늘어나면 갑자기 엉뚱한 데이터가 들어가거나 나오는 일이 생길 수 있다.

 

하지만 PropertyEditor가 쓰레드쎄이프하지 않다는 것을 모르는 스프링 개발자들이 적지 않다. 자바의 java.text.Format 클래스들이 쓰레드쎄이프 하지 않다는 것을 모르는 것과 비슷하다.

 

그래서 스프링은 3.0에서 PropertyEditor를 대체할 수 있는 새로운 타입변환 방식을 도입했다. 바로 ConversionService이다. 이 ConversionService는 쓰레드 쎄이프한 임의의 타입변환을 지원한다. 따라서 PropertyEditor처럼 싱글톤으로 등록하고 사용하는 것에 대한 제한이 없다.

이 컨버전 서비스는 ConfigurablePropertyAccessor에 지원메소드가 추가되었다. 이제 BeanWrapper는 ConversionService를 PropertyEditor와 함께 사용할 수 있다. PropertyEditor를 완전히 대체할 것인지, 일단은 보조적으로 사용하게 하고 차차 전환할 것인지는 확실치 않다. 아마도 후자가 아닐까 싶다.

지난 몇주간 키쓰 도날드가 열심히 이 ConversionService를 코어에 추가하는 작업을 해왔다. 이제 95학번 유겐 횔러가 이를 스프링 전체에 적용하는 작업을 진행할 것이다.  01~03년 사이에 개발되었던 pre-1.0에 존재했던 오래된 스프링의 기본 메카니즘에 대대적인 개선이 일어나는 것을 보는 것은 즐거운 일이다.

Related posts:

  1. Spring 3.0 (51) @Rule 지원성공 그리고 Formatter, ConversionService의 전면 등장
  2. Spring 3.0 타입변환/바인딩 기술 – 어떤 것이 우선일까?
  3. Spring 3.0.1 mvc:annotation-driven 이 몰래 하는 짓
  4. Spring 3.0 (7) Spring 3.0 Dependency Matrix
  5. Spring 3.0 (26) Spring Expression Language와 @Value
  6. Spring 3.0 (35) Spring 3.0 Reference Document 공개
  7. Spring 3.0 (53) Spring Dependency Matrix 업데이트
  8. Spring 3.0 (42) Spring Dependency Matrix 업데이트
  9. 유쾌한 이슈처리 재촉 메일
  10. Spring 3.0 (44) Spring 3.0과 JEE6
  11. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  12. Spring 3.0 (38) Spring Reference 업데이트
  13. Spring 3.0 (50) JUnit 4.5~4.7 겨우 지원성공 그리고 계속되는 악몽
  14. Spring 3.0 (34) R-941 스프링의 Maven 지원정책은?
  15. Spring 3.0 (43) Spring 3.0 RC2 추가

Facebook comments:

to “Spring 3.0 (47) PropertyEditor vs ConversionService”

  1. Hey there. I discovered your web site by means of Google even as searching for a related matter, your site came up. It seems to be good. I have bookmarked it in my google bookmarks to visit then.

  2. Hiya, I’m really glad I have found this information. Today bloggers publish only about gossip and net stuff and this is really irritating. A good site with exciting content, this is what I need. Thank you for making this web-site, and I’ll be visiting again. Do you do newsletters by email?

  3. Hiya, I’m really glad I’ve found this information. Today bloggers publish just about gossip and internet stuff and this is actually annoying. A good web site with exciting content, this is what I need. Thank you for making this web-site, and I’ll be visiting again. Do you do newsletters by email?

  4. Awesome write-up. I’m a regular visitor of your web site and appreciate you taking the time to maintain the excellent site. I will be a regular visitor for a long time.

  5. Hey there. I discovered your site by the use of Google at the same time as searching for a comparable matter, your website came up. It seems great. I’ve bookmarked it in my google bookmarks to come back then.

  6. Awesome write-up. I’m a regular visitor of your web site and appreciate you taking the time to maintain the excellent site. I will be a regular visitor for a really long time.

  7. Hello there. I discovered your web site via Google whilst looking for a similar subject, your website got here up. It seems great. I have bookmarked it in my google bookmarks to visit then.

  8. Awesome write-up. I am a normal visitor of your web site and appreciate you taking the time to maintain the nice site. I’ll be a regular visitor for a long time.

  9. Awesome post. I am a normal visitor of your blog and appreciate you taking the time to maintain the excellent site. I will be a frequent visitor for a long time.

  10. Awesome post. I’m a normal visitor of your website and appreciate you taking the time to maintain the excellent site. I will be a frequent visitor for a really long time.

  11. Hiya, I’m really glad I have found this information. Nowadays bloggers publish just about gossip and web stuff and this is actually annoying. A good site with interesting content, that’s what I need. Thanks for making this web site, and I’ll be visiting again. Do you do newsletters by email?

  12. Hiya, I’m really glad I have found this information. Nowadays bloggers publish just about gossip and web stuff and this is really annoying. A good blog with exciting content, that’s what I need. Thanks for making this web-site, and I’ll be visiting again. Do you do newsletters by email?

  13. Awesome write-up. I’m a normal visitor of your web site and appreciate you taking the time to maintain the nice site. I will be a regular visitor for a long time.

  14. Hello there. I found your site via Google whilst looking for a similar matter, your web site came up. It looks good. I’ve bookmarked it in my google bookmarks to visit then.

  15. Hiya, I am really glad I have found this info. Today bloggers publish only about gossip and internet stuff and this is actually irritating. A good site with interesting content, that is what I need. Thanks for making this web site, and I’ll be visiting again. Do you do newsletters by email?

  16. Hiya, I’m really glad I have found this info. Today bloggers publish just about gossip and net stuff and this is really annoying. A good site with exciting content, this is what I need. Thanks for making this site, and I’ll be visiting again. Do you do newsletters by email?

  17. Hello there. I discovered your website by means of Google whilst searching for a similar subject, your website came up. It appears good. I’ve bookmarked it in my google bookmarks to come back then.

  18. Awesome write-up. I am a normal visitor of your blog and appreciate you taking the time to maintain the nice site. I will be a frequent visitor for a really long time.

  19. Hi there. I found your blog by way of Google even as looking for a similar topic, your website got here up. It appears to be great. I have bookmarked it in my google bookmarks to visit then.

  20. Hi there. I discovered your site by way of Google at the same time as searching for a similar matter, your website got here up. It looks great. I’ve bookmarked it in my google bookmarks to visit then.

  21. Awesome write-up. I’m a normal visitor of your website and appreciate you taking the time to maintain the excellent site. I will be a regular visitor for a long time.

  22. Hello there. I discovered your web site by way of Google at the same time as searching for a comparable matter, your website got here up. It seems great. I have bookmarked it in my google bookmarks to come back then.

  23. Hello there. I found your website by the use of Google at the same time as searching for a related matter, your web site got here up. It appears good. I’ve bookmarked it in my google bookmarks to come back then.

  24. Hi there. I discovered your web site via Google at the same time as looking for a comparable matter, your web site got here up. It seems to be great. I have bookmarked it in my google bookmarks to visit then.

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