[스프링] Data Binding

정태규·2023년 3월 17일
0

spring

목록 보기
4/14

Data Binding

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

converter

Converter<S,T>Interface를 사용하는데

S(source)라는 타입을 받아서 T(target)이라는 타입으로 변환해서 리턴해주는 인터페이스이다.

인터페이스 모양은 다음과 같다.

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

어떤 경우에 사용할까?

예를 들어, 파라미터에 json 형식 문자열이 담겨오는 경우 해당 문자열을 특정 dto에 담고 싶을때 사용한다.

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

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

@GetMapping("/user-info")
public UserInfoResponse getUserInfo{
	@RequestHeader("x-auth-user") XAuthUser xAuthUser{
    	
        // get User Info logic here...
    }
}

위 헤더에 담긴 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나 기타 특수한 경우의 데이터를 특정 객체에 담고 싶은경우

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

Formatter

특정 객체를 String으로 변환.

public final class DateFormatter implements Formatter<Date>{
	public String print(Date date,Locale locale){
    	return getDataFormat(locale).format(date);
    }
    
    public Date parse(String formatted,Locale locale) throws ParseException{
    	return getDataFormat(locale).parse(formatted);
    }
    //getDateFormat 등 일부 구현은 생략...
}

print: API 요청에 대한 응답을 줄때, Date형식으로 된 데이터를 특정 locale에 맞춘 String으로 변환

parse: API 요청을 받아올 때, String으로 된 "2021-01-01 13:15:00" 같은 날짜 형식의 데이터를 Date로 변환하도록 함

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

0개의 댓글