데이터 바인딩 추상화 : PropertyEditor
- 📚 Spring/Spring 개념
- 2020. 9. 14. 15:17
Data binding 추상화
데이터 바인딩은 데이터 동적 변환이다.
입력한 값을 도메인 모델에 맞춰 자동으로 변환 후 할당하는 것을 말한다.
예시로 사용자가 문자열 "2020-01-16"을 넘겼는데 날짜 타입인 Date 로 변환하고 User 클래스를 생성하여 registerDate 라는 이름을 가진 필드에 넣어주는 것이다.
사용자 관점 : 사용자 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능
해석하면 : 입력값은 대부분 문자열인데, 그 값을 객체가 가지고 있는 int, long Date 등 심지어 Event, Book 같은 도메인 타입으로 변환해서 넣어주는 기능
| PropertyEditor
- propertyEditor 는 Spring이 데이터 바인딩을 위해 지원하는 인터페이스 중 하나이다.
- 이 구현체를 사용할 때 아래의 단점에 주의하는 것이 좋다.
- Thread unsafe 한 구조이다.(빈으로 등록해서 사용하면 안된다!)
- 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"));
}
}
'📚 Spring > Spring 개념' 카테고리의 다른 글
SpEL(스프링 Expression Language) (0) | 2020.10.05 |
---|---|
데이터 바인딩 추상화 : Converter와 Formatter (0) | 2020.10.05 |
Resource 추상화 (0) | 2020.09.14 |
IoC Container - ResourceLoader (0) | 2020.09.11 |
IoC Container - ApplicationEventPublisher (0) | 2020.09.11 |