1. DataBinding

2. 고전적인 DataBinding

1. DataBinding

프로퍼티 값을 타겟 객체에 설정하는 기능임.

사용자가 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능.

사용자가 입력하는 입력값은 대부분 '문자열'인데, 그 값을 객체가 가지고 있는

int, long, boolean, Data 등 심지어 Event, Book 같은 도메인 타입으로도 변화해서 넣어주는 기능임.

2. 고전적인 DataBinding

2-1) class Event

Untitled

2-2) class EventController

Untitled

→ 간단한 Controller를 사용하는데 Controller가 들어오면 /event/{event}에서 /event/1과 같이

→ 이벤트의 아이디를 입력할 거임. 입력한 숫자를 event 타입으로 변환해서 스프링이 받아야 하고,

→ 받은 이벤트 타입, 즉 도메인 타입을 가지고 코딩을 하는 것이다.

2-3) EventControllerTest

Untitled

→ mockMvc로 “/event/1”이라고 .perform(get()) 요청을 보낸다.

→ 이 때 status가 “isOk”이고 content가 “1”이 출력되기를 바란다.

→ Controller의 return 값을 살펴보면 id 값을 리턴했기 때문에, 요청을 보냈을 때

→ 아무 문제 없이 결과가 1이 나와야한다. 하지만, 테스트를 돌려보면 알겠지만 실패하게 된다.

2-4) Console

Untitled

→ 왜냐하면 숫자 1을 이벤트 타입으로 변환할 수 없기 때문이다.

→ 실패한 에러코드에도 타입을 변환할 수 없었기 때문이라고 나와있다.

→ 이것을 해결하기 위해서 PropertyEditor를 사용할 수 있다.

2-5) EventEditor로 오류 해결하기

2-5)-1. class EventEditor

Untitled

→ PropertyEditor의 특징 중에 값을 가지고 있다고 했었는데

→ 여기서 getValue와 setValue에서 공유하고 있는 Value가 바로 그 값이다.

→ 이 값이 서로 다른 쓰레드에게 공유가 된다.

→ 즉, stateful하기 때문에 Thread-Safe 하지 않은 것이다.

→ 따라서 빈으로 등록해서 쓰면 안된다는 것이다.

2-5)-2. class EventController

빈으로 등록해서 사용할 수 없기 때문에 @InitBinder

Untitled

→ WebDataBinder라는 곳에 Event.class 타입을 처리할 PropertyEditor를 등록할 수 있음.

→ Controller에서 요청을 처리하기 전 DataBinder에 들어있는 PropertyEditor를 사용하게 되고

→ 문자열로 들어온 값이 event 객체로 바뀌게 됨.

2-5)-3. EventControllerTest의 Console

Untitled