[Spring] 데이터 바인딩 추상화 : PropertyEditor
2022. 10. 28. 18:58ㆍJAVA/Spring
1. 데이터 바인딩(Data Binding)이란 무엇인가?
- 기술적인 관점 : 프로퍼티 값을 타겟 객체에 설정하는 기능
- 사용자 관점 : 사용자 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능
- 입력값은 대부분 문자열인데, 그 값을 객체가 가지고 있는 int, long, Boolean, Date 등 심지어 Event, Book 같은 도메인 타입으로도 변환해서 넣어주는 기능
PropertyEditor
- 스프링 3.0 이전까지 DataBinder가 변환 작업 사용하던 인터페이스
- 쓰레드-세이프하지 않음
- 상태 정보 저장을 하고 있음, 따라서 싱글톤 빈으로 등록해서 쓰면 정보가 불일치될 수 있음
- Object와 String 간의 변환만 할 수 있어, 사용범위가 제한적임
public class EventEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
Event event = (Event) getValue();
return event.getId().toString();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new Event(Long.parseLong(text)));
}
}
2. PropertyEditor를 이용한 데이터 바인딩 실습
1. Event 도메인 클래스 정의
@Getter
@Setter
@ToString
public class Event {
private Long id;
private String title;
}
2. EventController 클래스 정의
@RestController
public class EventController {
@InitBinder
public void init(WebDataBinder webDataBinder){
webDataBinder.registerCustomEditor(EventEditor.class, new EventEditor());
}
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event){
System.out.println(event);
return event.getId().toString();
}
}
- @PathVariable : URL 경로에 변수를 넣어주는 기능
- URL 정의 부분에 넣고자 하는 변수 정의 {event}
- 메서드 파라미터에 넣고자 하는 파라미터 정의 @PathVariable Event event
- PathVariable 어노테이션이 적용된 동일한 이름을 갖는 파라미터에 적용됨
3. PropertyEditorSupport 클래스의 메서드를 재정의하는 EventEditor 클래스 정의
// 쓰레드 안전하지 않기 때문에 빈으로 등록하면 안됨
public class EventEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
Event event = (Event) getValue();
return event.getId().toString();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new Event(Long.parseLong(text)));
}
}
4. 테스트 코드 작성
@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"));
}
}
Event(id=1, title=null)
위와같은 커스텀 에디터를 정의하여 데이터 바인딩을 수행하는 것은 매우 번거로운 일입니다. Spring 3.0 이후부터는 데이터 바인딩과 관련된 기능들이 추가되어있습니다.
References
source code : https://github.com/yonghwankim-dev/spring_study/tree/master/spring_property-editor/src/main/java/kr/yh
[인프런] 스프링 프레임워크 핵심 기술
'JAVA > Spring' 카테고리의 다른 글
[Spring] Spring Expression Language (0) | 2022.10.30 |
---|---|
[Spring] 데이터 바인딩 추상화 : Converter와 Formatter (0) | 2022.10.30 |
[Spring] Validation 추상화 (0) | 2022.10.28 |
[Springboot] 24. Externalized Configuration #2 @ConfigurationProperties (0) | 2022.10.28 |
[Springboot] 24. Externalized Configuration (0) | 2022.10.14 |