[Spring] 데이터 바인딩 추상화 : PropertyEditor

2022. 10. 28. 18:58JAVA/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
[인프런] 스프링 프레임워크 핵심 기술