SPRING/스프링프레임워크 핵심개념

데이터 바인딩 추상화: PropertyEditor

JUMP개발자 2021. 5. 19. 20:24

Property의 값을 Target 객체 설정하는 기능을 데이터 바인딩이라고 한다.

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

EX:) 입력값은 String인데, 입력값을 int, long, Boolean, Date 등 또는 Event, Book 같은 도메인 타입으로 변환해서 넣음.

 

PropertyEditor

- 스프링 3.0 이전까지 DataBinder가 변환 작업 사용하던 인터페이스

- 쓰레드-세이프 하지 않음. (싱글톤 빈으로 등록해서 사용 X)

- Object와 String 간의 변환만 가능하기 때문에 사용 범위가 제한적임.

- PropertyEditor를 implements하여 직접 Editor를 구현할 수도 있지만, PropertyEditorsupport를 사용하면 원하는 메서드만 사용이 가능하다.

public class Event {

    private Integer id;
    private String title;

    public Event(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
@RestController
public class EventController {

    @InitBinder
    public void init(WebDataBinder webDataBinder) {
        webDataBinder.registerCustomEditor(Event.class, new EventEditor());
        // Event Class를 처리하는 DataBinder
    }

    @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)));
    }
}

- 아래 테스트 케이스를 통해 테스트가 가능하다.

@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"));
    }
}