Non-String DataBinding 테스트하기

참조 : Spring MVC

객체가 속성으로 String 타입이 아닌 속성을 가지고 있을 때 데이터 바인딩을 하려면 별도의 조취가 취해져야 합니다. request에 담고 있는 데이터는 모두 문자열이기 때문에 이전 글에서 살펴보았던 간단한 DataBinding일 경우에는 정말 간단하게 바인딩을 할 수 있었습니다. 하지만 이번 경우에는 PropertyEditor의 도움을 받아서 역시 간단하게 문자열을 특정 타입으로 변환하여 바인딩 해줍니다.

다음의 표는 ServletRequestDataBinder가 기본으로 사용하는 PropertyEditor들 입니다.
사용자 삽입 이미지따라서 위 표의 Result에 있는 타입들은 별도의 PropertyEditor를 바인더에 등록하지 않더라도 알아서 문자열을 해당 타입으로 변환하여 바인딩해줍니다.

간단한 클래스 작성
[#M_ more.. | less.. | public class DefaultPropertyClass {

    private int intProperty;
    private Integer integerProperty;
    private Class classProperty;
    private URL urlProperty;
    private String[] strings = new String[10];

    public Class getClassProperty() {
        return classProperty;
    }

    public void setClassProperty(Class classProperty) {
        this.classProperty = classProperty;
    }

    public Integer getIntegerProperty() {
        return integerProperty;
    }

    public void setIntegerProperty(Integer integerProperty) {
        this.integerProperty = integerProperty;
    }

    public int getIntProperty() {
        return intProperty;
    }

    public void setIntProperty(int intProperty) {
        this.intProperty = intProperty;
    }

    public URL getUrlProperty() {
        return urlProperty;
    }

    public void setUrlProperty(URL urlProperty) {
        this.urlProperty = urlProperty;
    }

    public String[] getStrings() {
        return strings;
    }

    public void setStrings(String[] strings) {
        this.strings = strings;
    }
}_M#]
테스트 클래스 작성
[#M_ more.. | less.. | public class DefaultPropertyClassTest {

    private DefaultPropertyClass propertyClass;

    private MockHttpServletRequest request;

    private ServletRequestDataBinder binder;

    @Before
    public void setUp() {
        propertyClass = new DefaultPropertyClass();
        request = new MockHttpServletRequest();
        binder = new ServletRequestDataBinder(propertyClass);
    }

    @Test
    public void testBinding() throws MalformedURLException {

        request.addParameter(“intProperty”, “34”);
        request.addParameter(“integerProperty”, “200”);
        request.addParameter(“classProperty”, “java.lang.String”);
        request.addParameter(“urlProperty”, “http://www.example.com/”);
        request.addParameter(“strings[1]”, “a, b, c”);
        binder.bind(request);
        assertEquals(34, propertyClass.getIntProperty());
        assertEquals(new Integer(200), propertyClass.getIntegerProperty());
        assertEquals(String.class, propertyClass.getClassProperty());
        assertEquals(new URL(“http://www.example.com/”), propertyClass.getUrlProperty());
        assertEquals(“a, b, c”, propertyClass.getStrings()[1]);

    }
}_M#]

간단한 DataBinding 테스트하기

화면에서 입력되는 값을 객체의 프로퍼티로 세팅해주는 역할을 데이터 바인딩이라고 합니다. 그리고 Spring MVC에서는 ServletRequestDataBindier와 PropertiEditor를 사용하여 폼에서 입력 된 값을 바인딩합니다.

가장 간단한 경우가 String 타입의 속성만을 가지고 있는 객체로 바인딩하는 것입니다.

먼저 String 타입을 가지고 있는 커맨드 객체를 만듭니다. 모델 객체를 커맨드 객체로 사용할 것이라면 굳이 만들 필요는 없습니다.

public class Message {

    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

이 때 JavaBeans 스펙에 맞게 getter와 setter가 정의되어 있어야 합니다.

다음 ServletRequestDataBinder를 사용하여 테스트를 작성 합니다.

public class MessageTest {

    private Message message;
    private ServletRequestDataBinder binder;
    private MockHttpServletRequest request;

    @Before
    public void setUp() {
        message = new Message();
        binder = new ServletRequestDataBinder(message, “message”);
        request = new MockHttpServletRequest();
    }

    @Test
    public void testBinding() {
        String title = “새로운 메시지 제목”;
        request.addParameter(“title”, title);

        binder.bind(request);

        assertEquals(title, message.getTitle());
    }
}

JUnit 테스트를 실행하여 결과를 확인할 수 있습니다.
사용자 삽입 이미지
BaseCommandController 컨트롤러의 하위 클래스들은 모두 위에서 사용한 bind 메소드를 사용하며 Binder객체를 생성할 때 사용한 Command 객체의 이름은 바인딩 할 때 에러가 발생하면 그 에러를 기록할 Errors 객체에서 사용하게 됩니다. 아무런 이름도 주지 않으면 기본값으로 taget 이라는 이름을 가집니다.

    @Test
    public void testCommandName() {
        binder = new ServletRequestDataBinder(message);
        assertEquals(“target”, binder.getObjectName());
    }