Spring #12 - PropertyEditor

업데이트:

데이터 바인딩

데이터 바인딩 추상화 : PropertyEditor

데이터 바인딩

  • 데이터 바인딩이란 프로퍼티의 값을 타겟 객체에 설정하는 기능 자체를 말한다. 즉, 사용자가 입력한 값을 애플리케이션 도메인 객체에 동적으로 할당하는 기능이다.
  • 왜 바인딩이 필요할까? 사용자가 입력한 값은 대부분 문자열이다. 이를 객체가 갖고있는 프로퍼티 타입에 맞춰서 변환해주는 기능이다. (int, long, DateTime 혹은 도메인 객체 자체 등)

PropertyEditor

  • 스프링 3.0 이전까지 DataBinder가 변환 작업시 사용하던 고전적인 방식의 인터페이스이다.

  • PropertyEditor의 구현체들은 value가 서로 다른 쓰레드에 공유가 된다. 즉, stateful이고 Thred Safe하지 않으므로, 여러 쓰레드에 공유해서 쓰면 안된다.

  • 즉, 그냥 빈으로 등록해서 쓰는 것은 위험하고 InitBinder를 이용하여 컨트롤러에서 사용할 바인더를 등록하여 사용하는 것이 권장된다.

    @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();
        }
    }
    
    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(Integer.parseInt(text)));
        }
    }
    
    @ExtendWith(SpringExtension.class)
    @WebMvcTest
    class EventControllerTest {
      
        @Autowired
        MockMvc mockMvc;
      
        @Test
        public void getTest() throws Exception {
            mockMvc.perform(get("/event/1"))
                .andExpect(status().isOk())
                .andExpect(content().string("1"));
        }
    }
    

댓글남기기