org.springframework.validation.DataBinder
๊ธฐ์ ์ ์ธ ๊ด์ : ํ๋กํผํฐ ๊ฐ์ ํ์ผ ๊ฐ์ฒด์ ์ค์ ํ๋ ๊ธฐ๋ฅ
์ฌ์ฉ์ ๊ด์ : ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋์ ์ผ๋ก ๋ณํํด ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ
ํด์ํ๋ฉด : ์ ๋ ฅ๊ฐ์ ๋๋ถ๋ถ "๋ฌธ์์ด"์ธ๋ฐ, ๊ทธ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ํ๋กํผํฐ ํ์ (์ฆ, int, long, boolean, Date ๋ฑ๋ฑ ) ์ฌ์ง์ด, Event,Book ๊ฐ์ ๋๋ฉ์ธ ํ์ ์ผ๋ก๋ ๋ณํํด์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ.
PropertyEditor
- ์คํ๋ง 3.0 ์ด์ ๊น์ง DataBinder๊ฐ ๋ณํ ์์ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค
- ์ฐ๋ ๋ - ์ธ์ดํ ํ์ง ์์ (์ํ ์ ๋ณด ์ ์ฅ ํ๊ณ ์์, ๋ฐ๋ผ์ ์ฑ๊ธํค ๋น์ผ๋ก ๋ฑ๋กํด์ ์ฌ์ฉํ๋ค๊ฐ๋...)
- Object์ String ๊ฐ์ ๋ณํ๋ง ํ ์ ์์ด, ์ฌ์ฉ ๋ฒ์๊ฐ ์ ํ์ ์. (๊ทธ๋๋ ๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ฉํด์์. ์กฐ์ฌํด์...)
public class EventPropertyEditor extends PropertyEditorSupport{
@Override
public String getAsText(){
return ((Event)getValue()).getTitle();
}
@Override
public void setAsText(String text) throws IllegalArgumentException{
int id = Integer.parseInt(text);
Event event = new Event();
event.setId(id);
setValue(event);
}
}
- @RestController : @Controller + @ResponseBody ์ ์ถ์ฝํ์ผ๋ก์จ, ๋ฆฌํด๊ฐ์ ๋ทฐ๋ฆฌ์กธ๋ฒ๋ก ๋งคํํ์ง ์๊ณ ๊ทธ๋๋ก ์ถ๋ ฅํด์ค๋ค.
- @GetMapping : @RequestMapping(method = RequestMethod.GET) ์ ์ถ์ฝํ์ผ๋ก์จ, ์ ๋ ธํ ์ด์ ๋ง ๋ณด๊ณ ๋ฌด์จ ๋ฉ์๋ ์์ฒญ์ธ์ง ๋ฐ๋ก ์์๋ณผ ์ ์๋ค.
๊ณ ์ ์ ์ธ EventPropertyEditor ์ฌ์ฉ๋ฒ
public class Event {
private Integer id;
private String title;
public Event(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Event{" +
"id=" + id +
", title='" + title + '\'' +
'}';
}
}
@RestController
public class EventController {
@InitBinder//Controller์ propertyEditor๋ฅผ ๋ฑ๋กํด์ค๋ค.
public void init(WebDataBinder webDataBinder){
webDataBinder.registerCustomEditor(Event.class, new EventEditor());
}
@GetMapping("/event/{event}") //event1, event2 ์ด๋ฐ์์ผ๋ก ์์ฒญ์ด ๋ค์ด์ค๊ธฐ ๋๋ฌธ์
public String getEvent(@PathVariable Event event){//spring์ด ๋๋ฉ์ธ ํ์
์ผ๋ก ๋ณํํด์ฃผ๋ฉด @PathVariable๋ก Event๋ฅผ ๋๋ฉ์ธ์ผ๋ก ๋ฐ๋๋ค.
System.out.println(event);
return event.getId().toString();
}
}
@RunWith(SpringRunner.class)
@WebMvcTest
public class EventControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void getText() throws Exception {
mockMvc.perform(get("/event/1"))
.andExpect(status().isOk())
.andExpect(content().string("1"));
}
}
2020-07-12 15:06:44.256 WARN 6205 --- [ main] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'com.example.demospring51.Event'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.example.demospring51.Event': no matching editors or conversion strategy found]
์๋ฌ ์ฝ๋๋ฅผ ๋ณด๋ฉด, Failed to convert value of type ํ์ ๋ณํ์ ์คํจํ๋ค.
๋ง์ง๋ง์ ๋ณด๋ฉด, no matching editors or conversion strategy found -> property editor ๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
public class EventEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
Event event = (Event)getValue();
return event.getId().toString();
}
//์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ text๋ฅผ event๋ก ๋ณํํ๋๊ฒ.
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new Event(Integer.parseInt(text)));
//์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์์ด์, ์ฌ๋ฌ ์ฐ๋ ๋์์ ๊ณต์ ํด์ ์ฌ์ฉํ๋ฉด ์๋๋ค.
//(์ฆ, PropertyEditor์ ๊ตฌํ์ฒด๋ค์ ๋น์ผ๋ก ๋ฑ๋กํด์ ์ฌ์ฉํ๋ฉด ํฐ์ผ๋๋ค.)
//๊ทธ๋์ Controller์ @InitBinder๋ก ๋ฑ๋ก์ ํด์ค๋ค
}
}
EventController์ PropertyEditor๋ฅผ ๋ฑ๋กํด์ค๋ค. ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
( Controller์ ๋ฑ๋ก! )
@InitBinder//propertyEditor๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ
public void init(WebDataBinder webDataBinder){
webDataBinder.registerCustomEditor(Event.class, new EventEditor());
}
๋ฑ๋กํด์ฃผ๊ณ ๋ค์ ์คํ์ ํด์ฃผ๋ฉด?
Event{id=1, title='null'}
์ ์์ ์ผ๋ก ์คํ์ด ๋์๋ค.
์ด๋ป๊ฒ ์คํ์ด ๋๊ฒ์ธ๊ฐ?
controller๊ฐ ์ด๋ค ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ์ ์
์ด controller์์ ์ ์ํ DataBinder(WebDataBinder)์ ๋ค์ด์๋ PropertyEditor(registerCustomEditor)๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
@InitBinder//propertyEditor๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ
public void init(WebDataBinder webDataBinder){
webDataBinder.registerCustomEditor(Event.class, new EventEditor());
}
๊ทธ๋์ ์ด PropertyEditor๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์..
๋ฌธ์์ด๋ก ๋ค์ด์จ “1”์ ์ซ์๋ก ๋ณํํด์ event๊ฐ์ฒด๋ก ๋ฐ๊พธ๋ ์ผ์ด -> setAsText() ๋ฉ์๋๊ฐ ์คํ์ด ๋๊ฒ์ด๋ค.
public class EventEditor extends PropertyEditorSupport{
...
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new Event(Integer.parseInt(text)));
//text๋ฅผ Integer๋ก ๋ณํ์์ผ์ฃผ๊ณ Event ์์ฑ์์ ๋๊ฒจ์ฃผ๊ณ ์๋ค.
}
}
์ถ์ฒ: https://countryxide.tistory.com/45 [๋ฐฐ์์ ๋จ์ฃผ์]