본문 바로가기

Develop/Spring

Spring DataBinding

728x90

Data Binding

사용자나 외부 서버의 요청 데이터를 특정 도메인 객체에 저장해서 우리 프로그램의 Request에 담아주는 것을 뜻 합니다.

 

Converter<S, T> Interface

S(Source) 라는 타입을 받아서 T(Target) 이라는 타입으로 변환해주는 Interface 입니다.

인터페이스의 모양은 아래와 같습니다.

 

package org.springframework.core.convert.converter;

public interface Converter<S, T> {
    T convert(S source);
}

 

파라미터에 JSON 형식 문자열이 담겨오는 경우 해당 문자열을 곧바로 특정 DTO에 담고 싶을 때 사용합니다.

//  요청
GET /user-info
x-auth-user : {"id":123, "name":"Paul"}

Header에 x-auth-user라는 값이 있을 때 이를 바로 특정 DTO에 담고 싶을 때

// 유저 객체
public class XAuthUser {
    private int id;
    private String name;
    
    // the usual getters and setters...
}

위처럼 헤더에 담긴 JSON 형식의 문자열을 XAuthUser에 바로 담고 싶은 경우 아래와 같이 Converter를 Bean으로 등록하면 됩니다.

@Component
public class XAuthUserConverter implements Converter<String, XAuthUser> {
    @Override
    public XAuthUser convert(String source) {
        return objectMapper.readValue(source, XAuthUser.class);
    }
}

이와 비슷하게 PathParameter나 기타 특수한 경우의 데이터를 특정 객체에 담고 싶은 경우

  • Converter를 만들어서 Spring에 Bean으로 등록
  • 스프링 내에 ConversionService라는 내장된 서비스에서 Converter 구현체 Bean들을 Converter 리스트에 등록
  • 외부 데이터가 들어오고 Source Class Type -> Target Class Type이 Converter에 등록된 형식과
    일치하게 되면 해당 Converter가 동작하는 원리

Formatter

일반적인 객체 변환은 String형과 특정 객체간의 변환이 대부분이기 때문에

위의 Converter보다는 Formatter가 더 많이 사용됩니다.

 

Formatter는 특정 객체와 String 간의 변환을 담당합니다.

아래 샘플 코드는 Date <-> String 간의 변환을 수행하는 Formatter 입니다.

  • print: API 요청에 대한 응답을 줄 때 Date 형식으로 된 데이터를 특정 Local에 맞춘 String으로 변환
  • parse: API 요청을 받아올 때 String으로 된 "2022-11-16 16:49:00"와 같은 특정 날짜 형식의 데이터를 Date로 변환하도록 합니다.
package org.springframework.format.datetime;

@Component
public final class DateFormatter implements Formatter<Date> {
    public String print(Date date, Locale locale) {
        return getDateFormat(locale).format(date);
     }
     
     public Date parse(String formatted, Locale locale) throws ParseException {
         return getDateFormat(locale).parse(formatted);
     }
     
     // getDateFormat 등 일부 구현은 핵심에 집중하기 위해 생략
 }

Formatter도 Converter와 마찬가지로 Spring Bean으로 등록하면 자동으로 ConversionService에 등록 시켜주기 때문에
필요(요청/응답 시 해당 데이터 타입이 존재하는 경우)에 따라 자동으로 동작하게 됩니다.

 

'Develop > Spring' 카테고리의 다른 글

(작성 중) Spring web.xml  (0) 2022.11.16
Spring SpEL  (0) 2022.11.16
Spring Validation  (0) 2022.11.16
Spring AOP  (0) 2022.11.16
Spring Resource  (0) 2022.11.16