데이터바인딩 추상화
데이터 바인딩 :어떤 프로퍼티의 값을 타겟 객체에 설정하는것.
즉 사용자가 입력한 값을 어플리케이션 객체 도메인에 동적으로 입력하는것
쉽게말하자면 입력값은 문자열인데 int,long, boolean, Book, Event 등과 같은 이벤트 타입으로변환해서 넣어주는 기능
고전적인 방식
1 2 3 4 5 6 7 8 9 10 11 12
| public class Event{ private Integer id; private String title;
public Evnet(Integer id) { this.id = id; }
getter, setter
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @RestController public class EventController {
@GetMapping("/event/{event}") public String getEvent(@PathVariable Event event) { print(event); return event.getId().toString(); }
@InitBinder public void init(WebDataBinder webDataBinder) { webDataBinder.registerCustomEditor(Event.class, new EventEditor()); }
}
|
지금 상태에서 돌리면 문자열을 Evnet로 변환할 수 없다는 에러가 발생할것이다. 이를 해결하기 위해 아래를 추가
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class EventEditor extends PropertyEditorSupport { @Override public String getAsText() { Event event = (Event)getValue(); return event.getId().toString(); }
@Override public void setAsText(String text) throws ...{ setValue(new Event(Integer.parseInt(text))); } }
|
PropertyEditor의 구현체는 쓰레드세이프하지 않다. 즉 여러 스레드에서 공유해서 쓰면 안된다. 즉 빈으로 등록해서 쓰면 안된다.