@RequestParam, @PathVariable, @ModeAttribute에 있는 컨버터 이해하기 및 직접 구현해보기!

박경현·2023년 4월 30일
0

요새 매일 적어야겠다고 생각했지만 블로그를 많이 못적은거 같다ㅜ
그래서 이번주가 가기전에 미뤄뒀던 블로그 작성을 해보려고 한다!!

그 중 첫번째는 바로 TypeConverter와 Formatter에 관한 내용이다!

Converter란?

말 그대로 변환해주는 용도이다!

String을 int로 혹은 String을 우리가 만든 객체 등으로 변환!

차고로 url에 적히는 내용은 전부 String이 기본이다!

저 위에 Converter 인터페이스를 직접 구현해보려고 한다!

Converter 구현해보기!

url에 있는 파라미터를 내가 만든 IpPort라는 객체로 변환하는 컨버터 구현해보자!

StringToIpPortConverter 클래스
@Slf4j
public class StringToIpPortConverter implements Converter<String, IpPort> {

	@Override
    public IpPort convert (String source) {
    	log.info("convert source={}",source);
        String [] split = source.split(":");
        String ip = split[0];
        Integer port = Integer.valueOf(split[1]);
        return new IpPort(ip,port);
    }
}

간단하게 String타입의 ip와 Integer타입의 port를 필드로 갖는 IpPort객체로 변환 해주었다!!

Spring에 등록해주고 Test해보기!

Spring에 우리가 만든 컨버터들을 등록해주면 편하게 불러서 사용가능하다!
차고로 Formatting도 가능한 구현체를 사용했다!

@Test
void formattingConversionServie(){
	DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
    
    conversionService.addConverter(new StringToIpPortConverter());
    
    // 사용법
    IpPort = ipPort = conversionService.convert("127.0.0.1:8080", IpPort.class);
Assertions.assertThat(ipPort).isEqualTo(new IpPort("127.0.0.1", 8080));	
}

테스트를 위한 방식이어서 웹에 적용하는 것과는 조금 다르긴 하다!
그래도 이런 방식으로 넣어지고 작동한다를 알아두자!

Formatter란?

이건 처음에는 이해가 안 갔는데 단순히 "문자열" -> 정수가 아니라
1,000 ->1000 이나 12년10일 => 2012 - 10 처럼 원하는 형태로 포맷팅 시키는걸 의미한다!

MyNumberFormatter클래스 만들어보기! 1,000->1000 OR 1000-> 1,000으로 !!

@Slf4j
public class MyNumberFormatter implements Formatter<Number> {
	@Override
    public Number parse(String text, Locale locale) throws ParseException {
    log.info("text={}",text);
    NumberFormat format = NumberFormat.getInstance(locale);
    // 현지에 맞게 숫자 표기법 바꾸기!
    return format.parse(text);
    }
    
    @Override
    public String print(Number object, Locale locale ) {
    	return NumberFormat.getInstance(locale).format(object);
    }

}

Spring Web에 우리가 만든 컨버터와 포맷팅 등록해주기!

@Configuration
public class WebConfig implements WebMvcConfiguer {
	@Override
    public void addFormatters(FormatterRegistry registry) {
    	registry.addConverter(new StringToIpPortConverter());
        
        registry.addFormatter(new MyNumberFormatter());
    }
}

피드백 및 결론

@RequestParam 이나 @PathVariable, @ModelAttribute의 경우 내부에 컨버터가 있기 때문에 기본 타입들은 전환이 무난하게 가능했던것이다!!

우리가 만든 객체로 변환도 가능하지만 더 복잡한 변환이 있을때 컨버터가 있다는걸 인지하고 사용하자!

포맷팅은 좀 더 이해하고 어디에서 많이 사용되는지 보고 예제를 연습해야할거같다!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글