3.5.1 Formatter SPI

필드 포맷팅 로직을 구현하는 FormatterSPI는 간단하고 강력하게 작성됩니다. 다음 목록은 Formatter인터페이스 정의를 보여줍니다.

package org.springframework.format;

public interface Formatter<T> extends Printer<T>, Parser<T> {
}

FormatterPrinterParser빌딩 블록 인터페이스에서 확장됩니다. 다음 목록은 이 두 인터페이스의 정의를 보여줍니다.

public interface Printer<T> {

    String print(T fieldValue, Locale locale);
}
import java.text.ParseException;

public interface Parser<T> {

    T parse(String clientValue, Locale locale) throws ParseException;
}

자신의 Formatter를 만들려면, 앞에서 설명한 Formatter인터페이스를 구현하십시오. T를 포맷 화 하려는 객체의 타입으로 매개 변수 화 하십시오. (예: java.util.Date) print()작업을 구현하여 T의 인스턴스를 프린트하여 클라이언트 로컬에 표시합니다. parse()작업을 구현하여 클라이언트 로컬에서 반환된 포맷 화된 표현으로부터 T의 인스턴스를 Parsing 하십시오. Parsing 작업이 실패하면 Formatter는 ParseException또는 IllegalArgumentException을 던져야 합니다. Formatter구현이 thread-safe인 지 확인하십시오.

print() 메소드에서 format을 적용하여 출력하는 로직을 구현하고, parse() 메소드에는 format이 적용된 String 값을 분석해서 객체 인스턴스로 변환하는 로직을 구현하면 된다. 위의 인터페이스 정의에서 볼 수 있듯이, Locale 정보도 함께 넘겨주기 때문에 Localization 적용도 쉽게 처리할 수 있다.

format서브 패키지는 편의상 여러 가지 Formatter구현을 제공합니다. number패키지는 java.text.NumberFormat을 사용하는 Number 객체를 포맷 화 하기 위해 NumberStyleFormatter, CurrencyStyleFormatterPercentStyleFormatter를 제공합니다. datetime패키지는 java.text.DateFormat으로 java.util.Date 객체를 포맷 화하는 DateFormatter를 제공합니다. datetime.joda패키지는 Joda-Time library를 기반으로 포괄적인 datetime 포맷팅 지원을 제공합니다.

다음의 DateFormatterFormatter구현의 예 입니다.

package org.springframework.format.datetime;

public final class DateFormatter implements Formatter<Date> {

    private String pattern;

    public DateFormatter(String pattern) {
        this.pattern = pattern;
    }

    public String print(Date date, Locale locale) {
        if (date == null) {
            return "";
        }
        return getDateFormat(locale).format(date);
    }

    public Date parse(String formatted, Locale locale) throws ParseException {
        if (formatted.length() == 0) {
            return null;
        }
        return getDateFormat(locale).parse(formatted);
    }

    protected DateFormat getDateFormat(Locale locale) {
        DateFormat dateFormat = new SimpleDateFormat(this.pattern, locale);
        dateFormat.setLenient(false);
        return dateFormat;
    }
}

스프링 팀은 커뮤니티 중심의 Formatter기여를 환영합니다. 기여하려면 GitHub Issues를 참조하십시오.

Last updated