org.springframework.validation.DataBinder
기술적인 관점 : 프로퍼티 값을 타겟 객체에 설정하는 기능
사용자 관점 : 사용자 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능
입력값은 대부분 "문자열"인데, 그 값을 객체가 가지고 있는 int, long, Boolean, Date 등 심지어 Event, Block 같은 도메인 타입으로도 변환해서 넣어주는 기능
PropertyEditor
- 스프링 3.0 이전까지 DataBinder가 변환 작업 사용하던 인터페이스
- 쓰레드-세이프 하지 않음(상태 정보 저장 하고 있음, 따라서 싱글톤 빈으로 등록해서 쓰면... gg)
- Object와 String간의 변환만 할 수 있어, 사용 범위가 제한적 임
고전적인 데이터 바인딩 방법
Event (도메인 클래스)
@Getter
@Setter
@ToString
public class Event {
private Integer id;
private String title;
public Event(Integer id){
this.id = id;
}
}
EventController (Controller 클래스)
@RestController
public class EventController {
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event){
System.out.println(event);
return event.getId().toString();
}
}
/event/1 로 요청을 받으면, 우리는 Controller에서 id가 1인 Event 도메인 클래스를 받고 싶은 상황이다.
테스트를 해보자.
@RunWith(SpringRunner.class)
@WebMvcTest
public class EventControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void getTest() throws Exception {
mockMvc.perform(get("/event/1"))
.andExpect(status().isOk())
.andExpect(content().string("1"));
}
}
이 테스트 코드를 실행시키면, String type을 Event type으로 변환하지 못했다는 에러메시지가 출력되면서 테스트에 실패하게 된다.
이제 PropertyEditor를 만들어 이 테스트코드가 정상동작하게 만들어보자.
EventEditor (PropertyEditor를 구현한 클래스를 생성하자!)
@Component
public class EventEditor extends PropertyEditorSupport {
// PropertyEditor 인터페이스를 구현할 수도 있지만,
// 구현해야하는 메서드가 너무 많기 때문에 PropertyEditorSupport 상속해서 사용
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new Event(Integer.parseInt(text)));
}
}
EventController (PropertyEditor를 사용할 수 있게 Controller를 수정하자)
@RestController
public class EventController {
@InitBinder
public void init(WebDataBinder webDataBinder){
webDataBinder.registerCustomEditor(Event.class, new EventEditor());
}
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event){
System.out.println(event);
return event.getId().toString();
}
}
이렇게 수정 후 테스트코드를 실행시키면 정상적으로 동작하는 것을 볼 수 있다.
하지만 PropertyEditor는 쓰레드-세이프 하지 않고, 구현방법도 매우 불편하기 때문에 스프링 3.0 부터는 데이터바인딩관련 인터페이스들이 추가되었다.
2020/03/26 - [프로그래밍 노트/SPRING] - [Spring] 데이터바인딩 - Converter와 Formatter
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] SpEL(스프링 Expression Language) (0) | 2020.03.29 |
---|---|
[Spring] 데이터바인딩 - Converter와 Formatter (0) | 2020.03.26 |
[Spring] Validation 추상화 (0) | 2020.03.24 |
[Spring] ResourceLoader, Resource 추상화 (0) | 2020.03.22 |
[Spring] MessageSource (0) | 2020.03.16 |