데이터 바인딩 추상화 : PropertyEditor

Data binding 추상화

데이터 바인딩은 데이터 동적 변환이다.
입력한 값을 도메인 모델에 맞춰 자동으로 변환 후 할당하는 것을 말한다.

예시로 사용자가 문자열 "2020-01-16"을 넘겼는데 날짜 타입인 Date 로 변환하고 User 클래스를 생성하여 registerDate 라는 이름을 가진 필드에 넣어주는 것이다.

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

해석하면 : 입력값은 대부분 문자열인데, 그 값을 객체가 가지고 있는 int, long Date 등 심지어 Event, Book 같은 도메인 타입으로 변환해서 넣어주는 기능

| PropertyEditor

  • propertyEditor 는 Spring이 데이터 바인딩을 위해 지원하는 인터페이스 중 하나이다.
  • 이 구현체를 사용할 때 아래의 단점에 주의하는 것이 좋다.
    1. Thread unsafe 한 구조이다.(빈으로 등록해서 사용하면 안된다!)
    2. String, Object로만 변환이 가능하다.
  • 그러나 이런 방법은 편리하지 않고 위험해서 사용하지 않는다.

 

package org.kyhslam;

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

    @Override
    public String toString() {
        return "Event{" +
                "id=" + id +
                ", title='" + title + '\'' +
                '}';
    }
}
package org.kyhslam;


import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@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();
    }
}
package org.kyhslam;

import java.beans.PropertyEditorSupport;

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

 

테스트

실행해보면 성공!

package org.kyhslam;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@WebMvcTest
public class EventControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void getTest() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/event/1"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("1"));
    }


}

 

댓글

Designed by JB FACTORY