Hello, Freakin world!

[Spring Boot] PropertyEditor 에 대해서(feat. Converter, Formatter) 본문

Spring boot

[Spring Boot] PropertyEditor 에 대해서(feat. Converter, Formatter)

johnna_endure 2019. 12. 24. 16:12

용도

서버에서 웹 요청을 처리할 때, 값을 객체에 바인딩하고 싶은 경우가 있다.
예를 들어 다음과 같은 요청이 있다고 하자.

GET /user/{code}

1323323에 해당하는 값을 Code라는 객체로 싸여져 있는 형태로 바인딩한다고 하자.
이렇게 String 형식의 값을 임의의 객체의 속성에 바인딩하고 싶을 때, PropertyEditor를 사용한다.

알아야 할 필요성이 있나?

이 PropertyEditor는 쓸 일은 거의 없다. Spring 3부터 Converter나 Formatter를 이용한 더 나은 대안이 나왔고,
스프링의 웹 요청 바인딩 애너테이션 @RequestParam, @RequestBody 등도 많은 변환을 지원하기 때문에 더더욱 쓸일이 없다.

그래도 만약 필요하다면 아래 글에 PropertyEditor 부분을 읽어보도록 하자.
스프링 레퍼런스

PropertyEditor, Converter, Formatter의 기본적인 사용 패턴

PropertyEditor는 뒤의 두 가지와는 사용 방법이 약간 다르다.
우선 editor역할의 클래스는 ProperyEditorSupport 라는 클래스를 상속해야한다.
그리고 @InitBinder라는 애너테이션을 이용. WebDataBinder라는 클래스를 메서드 인수로 받아 여기에 커스텀 에디터를 등록한다.
등록시, 타겟 클래스 타입과 에디터의 인스턴스를 넘겨주면 작동한다.
자세한 예제는 이 글의 코드를 참고하자. PropertyEditor 예제

그리고 Converter와 Formatter의 사용 방법은 동일하다.
먼저 Converter와 Formatter 인터페이스를 구현하고, 이를 WebMvcConfigurer 인터페이스를 구현한 설정 빈 클래스(@Configuration)에서 addFormatters에 컨버터, 포매터 구현 인스턴스를 추가한다.

Converter 예제
Formatter 예제

참고

LocalDateTime 등 자바8에서 지원하는 시간 클래스들의 바인딩에 대해

PropertyEditor, Converter, Formatter 등에 관해 조사하기 시작한 것도 위 이슈때문이었다.
하지만 웹 요청데이터가 표준 Date 포맷(ISO)을 유지한다면 스프링은 자동으로 String을 자동으로 LocalDateTime에 바인딩해주는 걸 확인하고, 파고들기를 중단했다.

Comments