본문 바로가기
Spring Framework/Spring

Data Binding

by 도쿠니 2022. 6. 7.

Data Binding

  • 사용자나 외부 서버의 요청 데이터를 특정 도메인 객체에 저장해서 우리 프로그램의 Request에 담아주는 것을 뜻함
  • 요청 데이터를 편하게 내가 원하는 객체로 바꿔주는 역할이라고 보면 될 듯

주로 사용하는 방식

Converter<S,T> 인터페이스

  • S 타입을 받아서 T 타입으로 변환해주는 인터페이스
package org.springframework.core.convert.converter;

public interface Converter<S, T> {
		T convert(S source);
}
  • 웹MVC할 때 요청 데이터를 내가 원하는 객체로 변환할 때 사용한다.
  • 작성한 Converter는 빈 등록 해주어야 한다.
  • 예시
// 요청
GET /user-info
x-auth-user : {"id":123, "name":"Paul"}

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

// 이 예시에서는 요청이 들어오면 요청헤더에서 x-auth-user를 가져와서 XAuthUser 객체로 바꿔준다.
@GetMapping("/user-info")
public UserInfoResponse getUserInfo(@RequestHeader("x-auth-user") XAuthUser xAuthUser){
	// get User Info logic here...
}

// 컨버터 작성
@Component
public class XAuthUserConverter implements Converter<String, XAuthUser> {
		
		// 이 로직에서 바꾸려는 객체로 만들고 반환해주면 된다.
		@Override
		public XAuthUser convert(String source) {
				return objectMapper.readValue(source, XAuthUser.class);
		}
}
  • 위의 예시는 String → XAuthUser 단방향 변환인데 아래 코드처럼 사용하면 양방향도 가능하다.
public class UserConverter {

    @Component
    public static class StringToUserConverter implements Converter<String, User> {
        @Override
        public User convert(String s) {
            return new User(Integer.parseInt(s));
        }
    }

    public static class UserToStringConverter implements Converter<User, String> {
        @Override
        public String convert(User event) {
            return String.valueOf(event.getId());
        }
    }
}

Formatter 인터페이스

  • 특정 객체와 String 간의 변환을 담당 (양방향 변환)
  • 예시
package org.springframework.format.datetime;

@Component
public final class DateFormatter implements Formatter<Date> {

		// API 요청에 대한 응답 시에 Date형식의 데이터를 특정 locale에 맞춘 String으로 변환
		public String print(Date date, Locale locale) {
				return getDateFormat(locale).format(date);
		}

		// API 요청을 받아올 때, String으로 된 날짜 형식의 데이터를 Date로 변환
		public Date parse(String formatted, Locale locale) throws ParseException {
				return getDateFormat(locale).parse(formatted);
		}

		// getDateFormat 등 일부 구현은 핵심에 집중하기 위해 생략...
}

주의사항

  • Converter나 Formatter를 사용하려면 아래와 같이 WebMvcConfigurer를 구현한 설정파일에 등록해주거나
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
				registry.addConverter(new UserConverter().UserToStringConverter());
        registry.addFormatter(new UserFormatter());
    }
}
  • Converter 나 Formatter 클래스에 @Component를 붙여 빈으로 등록 해야한다.

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

스프링 MVC - 전체 구조  (0) 2022.06.08
Spring Validation  (0) 2022.06.07
Spring AOP(관점 지향 프로그래밍)  (0) 2022.06.07
DI 정리  (0) 2022.06.06
Spring Framework 소개  (0) 2022.06.05

댓글