12.데이터바인딩 추상화

데이터바인딩 추상화

데이터 바인딩 :어떤 프로퍼티의 값을 타겟 객체에 설정하는것.
즉 사용자가 입력한 값을 어플리케이션 객체 도메인에 동적으로 입력하는것
쉽게말하자면 입력값은 문자열인데 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의 구현체는 쓰레드세이프하지 않다. 즉 여러 스레드에서 공유해서 쓰면 안된다. 즉 빈으로 등록해서 쓰면 안된다.

Share