1. DataBinding
프로퍼티 값을 타겟 객체에 설정하는 기능임.
사용자가 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능.
사용자가 입력하는 입력값은 대부분 '문자열'인데, 그 값을 객체가 가지고 있는
int, long, boolean, Data 등 심지어 Event, Book 같은 도메인 타입으로도 변화해서 넣어주는 기능임.
2. 고전적인 DataBinding
2-1) class Event
2-2) class EventController
→ 간단한 Controller를 사용하는데 Controller가 들어오면 /event/{event}에서 /event/1과 같이
→ 이벤트의 아이디를 입력할 거임. 입력한 숫자를 event 타입으로 변환해서 스프링이 받아야 하고,
→ 받은 이벤트 타입, 즉 도메인 타입을 가지고 코딩을 하는 것이다.
2-3) EventControllerTest
→ mockMvc로 “/event/1”이라고 .perform(get())
요청을 보낸다.
→ 이 때 status가 “isOk”이고 content가 “1”이 출력되기를 바란다.
→ Controller의 return 값을 살펴보면 id 값을 리턴했기 때문에, 요청을 보냈을 때
→ 아무 문제 없이 결과가 1이 나와야한다. 하지만, 테스트를 돌려보면 알겠지만 실패하게 된다.
2-4) Console
→ 왜냐하면 숫자 1을 이벤트 타입으로 변환할 수 없기 때문이다.
→ 실패한 에러코드에도 타입을 변환할 수 없었기 때문이라고 나와있다.
→ 이것을 해결하기 위해서 PropertyEditor를 사용할 수 있다.
2-5) EventEditor로 오류 해결하기
2-5)-1. class EventEditor
→ PropertyEditor의 특징 중에 값을 가지고 있다고 했었는데
→ 여기서 getValue와 setValue에서 공유하고 있는 Value가 바로 그 값이다.
→ 이 값이 서로 다른 쓰레드에게 공유가 된다.
→ 즉, stateful하기 때문에 Thread-Safe 하지 않은 것이다.
→ 따라서 빈으로 등록해서 쓰면 안된다는 것이다.
2-5)-2. class EventController
빈으로 등록해서 사용할 수 없기 때문에 @InitBinder
→ WebDataBinder라는 곳에 Event.class 타입을 처리할 PropertyEditor를 등록할 수 있음.
→ Controller에서 요청을 처리하기 전 DataBinder에 들어있는 PropertyEditor를 사용하게 되고
→ 문자열로 들어온 값이 event 객체로 바뀌게 됨.
2-5)-3. EventControllerTest의 Console