지난 M2에 추가된 내용 중에 field default라는 것이 있다. 1.x대부터 있던 field marker의 기능을 좀 더 확장한 것이다. Field marker는 원래 checkbox에 대한 처리를 위해서 SpringMVC에 도입되었다. SpringMVC는 모델 오브젝트에 폼의 필드를 자동 바인딩 해주는 기능이 있다. 잘 쓰이지는 않지만 이전에 OHM(Object-HTML-Mapping)이라는 용어도 있다. HTML 폼의 정보를 자바의 오브젝트 모델에 매핑시켜준다는 개념이다. 물론 반대로도 가능하고. 여기에 property editor라는 JavaBean의 기법을 도입해서 폼의 단순 스트링을 자바의 다양한 타입으로 매핑해주게 할 수 있다. 한번 매핑을 위한 바인딩 세팅이 되면 폼과 모델 오브젝트의 값의 상호변환을 스프링에서 다 알아서 처리해주기 때문에 매우 유용하다. 매핑은 1:1일 필요도 없다. 폼에서는 1,2,3,4,5라고 넘어온 필드 값을 어레이나 리스트에 매핑할 수도 있고, 자주 쓰는 매핑 방법에는 폼에서 넘어오는 아이디 값을 가지고 그 값을 키로 가지는 오브젝트 전체로 매핑하거나, 그 반대의 작업을 하는 것도 가능하다.

이렇게 property editor와 스프링MVC의 바인딩이 매우 편리하지만 HTML(HTTP라고 해야 하나)의 이상한 체크박스 처리 방식 때문에 이 자동바인딩에는 한가지 치명적인 문제가 있다. 그것은 uncheck된 체크박스일 경우 아예 파라메터 자체가 전달되지 않기 때문이다. 스프링MVC가 모델에 있는 많은 필드를 항상 갱신하는 것은 아니다. 폼에서 전달된 필드가 있을 경우만 그 값을 매핑에 의해서 갱신한다. 문제는 원래 checked상태인 필드를 가진 모델 오브젝트가 폼으로 전달되었다가, unchecked상태가 될 경우 파라메터가 submit시에 전달되지 않으므로 스프링은 이 파라메터에 대한 바인딩을 하지 않는다. 따라서 기존에 checked(아마도 true)상태인 모델 오브젝트의 필드값은 변경되지 않는다.

이런 문제를 해결하기 위해서 스프링은 field marker라는 개념을 도입했다. 체크박스와 같이 폼에서 값이 넘어가지 않는 경우를 위해서 원래 필드명에 필드마커(디폴트는 "_" 이다)를 붙여서 폼에 hidden 필드로 넣어주면, 이 파라마터가 넘어오는 것을 보고 원래 필드가 폼에 존재했다고 인식하고 그에 대응되는 파라메터가 없을 경우, 즉 unchecked 상태일때 해당 필드의 값을 reset 해준다.

이러면 스프링MVC의 바인딩 메커니즘을 그대로 유지한채로 체크박스를 사용할 수 있다. 체크박스가 아니더라도, 폼에서 다이나믹하게 파라메터가 추가, 삭제 되는 경우에도 적용 가능하다.

 

문제는 이 필드 마커를 이용한 방법은 항상 false나 null과 같은 빈 값이 들어가게 되어있다는 것이다. 이에 대해서 http://jira.springframework.org/browse/SPR-2733 를 통해서 좀 더 복잡한 경우를 위한 기능개선 아이디어가 제기 되었고, 이것이 M2에서 반영이 되었다.

추가된 기능은 field default 라고 하는데, 기존의 field marker가 단지 리셋을 해주는 용도로 쓰였다면 새로운 field default는 파라메터가 전달되지 않았을 경우 임의의 값으로 세팅하는 것이 가능하다. 이때 사용되는 기본 prefix는 "!”이다. 체크박스에 매핑되는 필드 이름이 isAdmin이라면 field default를 세팅하는 파라메터를 !isAdmin이라고 하고, unchecked시에 설정할 값을 넣어주면 된다. Boolean 타입이외의 필드에 적용할 때 편리하다.

 

이 때 주의할 점은 이 prefix들, "_"나 “!”로 시작하는 파라메터는 사용하지 말아야 한다는 것이다. 그경우 필드마커로 인식이 되서, _이 붙지 않으면서 전달되지 않는 파라메터에 대해서 원치 않는 리셋이 일어날 수 있기 때문이다.

 

3년전쯤에 겁도 없이 스프링MVC 소스를 분석하던 어떤 블로거가 이 field marker에 대해서 제대로 이해를 못하고 있는 것을 보고 거기에 댓글로 설명을 달아주기 시작한게 인연이 되서… 지금까지 시달리고 있다. 그러고 보니 이 필드 마커에 대한 얘기를 참 오랜만에 적어본다.

Related posts:

  1. [토스3] 스프링 3.0.4 <mvc:default-servlet-handler/>를 이용해서 UrlRewriteFilter없이 깔끔한 URL을 만들기
  2. Maven의 default directory layout 변경하기
  3. Spring 3.0 (35) Spring 3.0 Reference Document 공개
  4. Spring 3.0 @MVC 메소드에서 자동으로 리턴 모델에 추가되는 것들
  5. Spring 3.0 (38) Spring Reference 업데이트
  6. Spring 3.0 (8) Core 모듈의 선택 라이브러리 분석
  7. Spring 3.0 (60) 클래스패스 리소스를 지정할 때 주의사항과 팁
  8. Spring 3.0 (6) – R561 Portlet 2.0 API, @CookieValue
  9. Spring 3.0 (56) @Bean 사용의 주의사항
  10. Spring Expressions(SpEL)를 이용한 Mockito Argument Matcher 만들기
  11. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (2)
  12. Spring 3.0 타입변환/바인딩 기술 – 어떤 것이 우선일까?
  13. Spring 3.0 (2) R-518 스프링의 새 모듈 OXM(Object/XML Mapping)
  14. Sprint 3.0 Spring @MVC -모델의 일생
  15. Spring 3.0 (47) PropertyEditor vs ConversionService

Facebook comments:

to “Spring 3.0 (36) Field Marker와 Field Default”

  1. although web-sites we backlink to below are considerably not connected to ours, we feel they may be basically worth a go as a result of, so possess a look

  2. Every once in a whilst we choose blogs that we read. Listed beneath are the most up-to-date web-sites that we select

  3. I’m very pleased to find this web site. I need to to thank you for your time just for this fantastic read!! I definitely really liked every bit of it and I have you bookmarked to check out new information in your site.

  4. one of our guests lately suggested the following website

  5. here are some links to websites that we link to because we think they’re really worth visiting

  6. Very delightfully article . I couldn’t agree more on the information provided.

    What do you reflect on around my plot ? emperor size bed sheets

  7. We are a group of volunteers and starting a new scheme in our community. Your web site provided us with valuable info to work on. You have done a formidable job and our whole community will be thankful to you.

  8. the time to read or stop by the content or websites we’ve linked to beneath the

  9. I’ve recently started a website, the information you offer on this site has helped me greatly. Thank you for all of your time & work. “Yield not to evils, but attack all the more boldly.” by Virgil.

  10. Having read this I thought it was extremely enlightening. I appreciate you finding the time and energy to put this content together. I once again find myself spending a lot of time both reading and commenting. But so what, it was still worth it.

  11. Thanks for ones marvelous posting! I actually enjoyed reading it, you could be a
    great author.I will remember to bookmark your blog and will come
    back in the future. I want to encourage you continue your great posts, have a nice evening!

  12. Altogether delightfully article . I couldn’t agree more on the report provided.

    What do you improvise about my locate ? lapland northern lights

  13. Here are a number of the internet sites we advise for our visitors

  14. Great post and right to the point. I don’t know if this is actually the best place to ask but do you people have any thoughts on where to employ some professional writers? Thx :)

  15. Youre so cool! I dont suppose Ive read something like this before. So good to search out any person with some unique thoughts on this subject. realy thanks for starting this up. this web site is one thing that’s wanted on the web, somebody with a little originality. helpful job for bringing something new to the internet!

  16. Here are a number of the web pages we advocate for our visitors

  17. we prefer to honor many other online websites on the internet, even when they arent linked to us, by linking to them. Beneath are some webpages really worth checking out

  18. You are a very clever individual!

  19. I just wanted to write down a small comment in order to appreciate you for those pleasant secrets you are posting at this website. My time-consuming internet investigation has at the end of the day been honored with sensible facts to exchange with my friends and family. I would tell you that most of us website visitors are definitely blessed to live in a useful place with so many awesome people with beneficial basics. I feel really grateful to have come across your webpages and look forward to really more amazing moments reading here. Thank you once again for a lot of things.

  20. Wonderful story, reckoned we could combine some unrelated data, nonetheless genuinely really worth taking a look, whoa did 1 find out about Mid East has got far more problerms as well

  21. I must thank you for the efforts you’ve put in penning this website. I am hoping to see the same high-grade blog posts from you later on as well. In truth, your creative writing abilities has encouraged me to get my own site now ;)

  22. Wow! This could be one particular of the most beneficial blogs We have ever arrive across on this subject. Basically Magnificent. I’m also an expert in this topic so I can understand your effort.

  23. Normally I do not read article on blogs, however I wish to say that this write-up very compelled me to try and do it! Your writing taste has been amazed me. Thanks, quite nice post.

  24. Oh my goodness! an amazing article dude. Thanks However I am experiencing issue with ur rss . Don’t know why Unable to subscribe to it. Is there anyone getting similar rss downside? Anybody who knows kindly respond. Thnkx

  25. just beneath, are several entirely not connected web pages to ours, however, they’re surely really worth going over

  26. that could be the finish of this report. Right here youll uncover some sites that we believe you will enjoy, just click the links over

  27. always a major fan of linking to bloggers that I love but really don’t get a lot of link like from

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