ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 바인딩 추상화: PropertyEditor
    SPRING/스프링프레임워크 핵심개념 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"));
        }
    }
    

     

    'SPRING > 스프링프레임워크 핵심개념' 카테고리의 다른 글

    SPEL(스프링 Expresssion Language)  (0) 2021.05.23
    데이터 바인딩 추상화 : Converter와 Formatter  (0) 2021.05.23
    Validation추상화  (0) 2021.05.19
    Resource 추상화  (0) 2021.05.18
    ResourceLoader  (0) 2021.05.17
Designed by Tistory.