본문 바로가기

개발/Spring

데이터 바인딩 추상화 Converter와 Formatter

반응형

1. Converter
 - S 타입을 T 타입으로 변환할 수 있는 매우 일반적인 변환기.
 - 상태 정보 없다 / stateless / 스레프 세이프하다 >> 빈으로 등록하여 사용가능 
 - 빈으로 등록할 때는 ConverterRegister에 등록해서 사용한다.

- Converter 소스

package com.bpkim.demospring51;

import org.springframework.core.convert.converter.Converter;

public class EventConverter {
    public static class StringToEventConverter implements Converter<String, Event>{
        @Override
        public Event convert(String s) {
            return new Event(Integer.parseInt(s));
        }
    }

    public static class EventToStringConverter implements Converter<Event, String>{
        @Override
        public String convert(Event event) {
            return event.getId().toString();
        }
    }
}


Spring MVC 를 쓴다면 WebConfig implements WebMvcConfigurer 만들어서 등록 

package com.bpkim.demospring51;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new EventConverter.StringToEventConverter());
    }
}

 

2. Formatter
 - 웹에 특화된 인터페이스
 - PropertyEditor 대체제
 - Object와 String 간의 변환을 담당한다.
 - 문자열을 Locale에 따라 다국화하는 기능도 제공한다. (optional)
 - FormatterRegistry에 등록해서 사용한다.

- Formatter 소스
 : 빈으로 등록하여 사용도 가능

package com.bpkim.demospring51;

import org.springframework.format.Formatter;

import java.util.Locale;

public class EventFormatter implements Formatter<Event> {
    
    @Override
    public Event parse(String s, Locale locale) {
        return new Event(Integer.parseInt(s));
    }

    @Override
    public String print(Event event, Locale locale) {
        return event.getId().toString();
    }
}

Spring MVC 를 쓴다면 WebConfig implements WebMvcConfigurer 만들어서 등록

package com.bpkim.demospring51;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new EventFormatter());
    }
}

 

>> ConversionService에 Converter와 Formatter가 등록되게 되고 ConversionService를 통해서 변환 작업이 이뤄진다.

ConversionService 
 - 실제 변환 작업이 이 인터페이스를 통해 스레드 세이프 하게 사용 할 수 있다.
 - 스프링 MVC, 빈(value) 설정, SpEL에서 사용한다.
 - DefaultFormattingConversionService
       - FormatterRegistry 기능 , ConversionService 기능을 모두 사용할 수 있다.
       - 여러 기본 컨버터와 포메터 등록을 해준다.

상속관계

FormatterRegistry 가 Converter을 상속하기 때문에 FormatterRegistry으로 Formatter을 등록 할수있음
 위에 소스 참고

** 스프링 부트 일때
 - 웹 애플리케이션인 경우 DefaultFormattingConversionService를 상속하여 만든 WebConversionService를 빈으로 등록해준다.
 - Formatter와 Converter 빈을 찾아서 자동 등록해준다.
   >>> WebConfig 자바 파일 안만들고 Formatter, Converter를 빈 등록하여 사용 가능하다.

*** 주로 웹과 관련된 프로젝트이기 때문에 formatter 을 추천!

- Formatter 빈 등록

package com.bpkim.demospring51;

import org.springframework.format.Formatter;
import org.springframework.stereotype.Component;

import java.util.Locale;

@Component
public class EventFormatter implements Formatter<Event> {

    @Override
    public Event parse(String s, Locale locale) {
        return new Event(Integer.parseInt(s));
    }

    @Override
    public String print(Event event, Locale locale) {
        return event.getId().toString();
    }
}

- Converter 빈 등록

package com.bpkim.demospring51;

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

public class EventConverter {

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

    @Component
    public static class EventToStringConverter implements Converter<Event, String>{
        @Override
        public String convert(Event event) {
            return event.getId().toString();
        }
    }
}

 

- 등록되어 있는 converter를 모두 보기 

package com.bpkim.demospring51;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ConversionService conversionService;

    @Override
    public void run(ApplicationArguments args) throws Exception{
        // converter 출력
        System.out.println(conversionService);

        System.out.println(conversionService.getClass().toString());

    }
}


- 만든 converter도 확인이 가능하다.

반응형

'개발 > Spring' 카테고리의 다른 글

스프링 AOP - 개념  (0) 2021.04.27
SpEL(스프링 Expression Language)  (0) 2021.04.23
데이터 바인딩 추상화: PropertyEditor  (0) 2021.04.22
Validation 추상화  (0) 2021.04.22
Resource 추상화  (0) 2021.04.22