개발강의정리/Spring

[스프링 프레임워크 핵심 기술] 4-1. 데이터 바인딩 추상화-PropertyEditor

nineDeveloper 2019. 10. 6.
728x90

스프링 프레임워크 핵심 기술

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/spring-core-tech/tree/chap04-01-propertyeditor

 

freespringlecture/spring-core-tech

백기선님의 스프링 프레임워크 핵심 기술 강의 내용 정리. Contribute to freespringlecture/spring-core-tech development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/spring-framework_core/dashboard

 

스프링 프레임워크 핵심 기술 - 인프런

이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다. 초급 웹 개발 Java Spring 온라인 강의

www.inflearn.com

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

4-1. 데이터 바인딩 추상화: PropertyEditor

org.springframework.validation.DataBinder

기술적인 관점: 프로퍼티 값을 타겟 객체에 설정하는 기능
사용자 관점: 사용자 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능
해석하자면: 입력값은 대부분 “문자열”인데, 그 값을 객체가 가지고 있는 int, long, Boolean, Date 등
심지어 Event, Book 같은 도메인 타입으로도 변환해서 넣어주는 기능

PropertyEditor

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

  • 쓰레드-세이프 하지 않으므로 빈으로 등록해서 사용하면 안됨
    (상태 정보 저장 하고 있음, 따라서 싱글톤 빈으로 등록해서 쓰다가는...)

  • Object와 String 간의 변환만 할 수 있어, 사용 범위가 제한적 임
    (그래도 그런 경우가 대부분이기 때문에 잘 사용해 왔음 조심해서..)

    public class EventEditor extends PropertyEditorSupport {
    
      @Override
      public String getAsText() {
          Event event = (Event) getValue();
          return super.getAsText();
      }
    
      @Override
      public void setAsText(String text) throws IllegalArgumentException {
          //문자열을 숫자로 변환함
          setValue(new Event(Integer.parseInt(text)));
      }
    }

@InitBinder

프로퍼티 에디터를 사용하기 위해 컨트롤러에서 사용할 바인더들을 등록하는 방법(전역적으로 등록하는 방법도 있음)
DataBinder의 구현체 중에 하나인 WebDataBinder에 PropertyEditor를 등록
컨트롤러가 요청을 처리하기 전에 컨트롤러에서 정의한 DataBinder에 들어있는 PropertyEditor를 사용하게 됨

@InitBinder
public void init(WebDataBinder webDataBinder) {
    webDataBinder.registerCustomEditor(Event.class, new EventEditor());
}
728x90

댓글

💲 추천 글