FireDrago

[Spring] 스프링 타입 컨버터와 포매터 본문

프로그래밍/Spring

[Spring] 스프링 타입 컨버터와 포매터

화이용 2024. 2. 21. 16:42

 

1. Converter

@ModelAttribute, @RequestParam, @PathVariable 사용하면, 여러 타입으로 데이터를 받을 수 있다.

이때 데이터의 타입을 변경하기위해 사용되는 것이 Converter 인터페이스를 구현한 여러 구현체 들이다.

스프링은 ConversionService 인터페이스를 통해 여러 Converter 들을 등록하고 적절한 Converter를 사용한다.

인터페이스 분리원칙(ISP) 잘 지켜지고 있는 것이다.

 

사용자정의 타입으로 타입 형변환을 지원하는 컨버터를 만들어보자

 

먼저 IpPort 타입을 정의하고, 문자열로 입력된 데이터를 @RequestParam IpPort  타입으로 받고자 한다.

String <---> IpPort 서로 변환 가능하도록 두개의 Converter를 만든다

 

Converter 인터페이스를 상속받아, convert 메서드를 사용하여 형변환을 정의한다.

@Configuration 애너테이션을 사용한 설정 클래스에서 WebMvcConfigurer 의 addFormatters 메서드를 사용하여 

Converter를 등록해준다. 형변환 Converter가 로그를 통해 실행되었음을 알수있고, 형변환이 잘 이루어졌다.

 

 

<뷰 템플릿에서 컨버터 적용하기>

 

타임리프는 ${{...}} 를 사용하여 자동으로 ConversionService를 사용해서 변환된 결과를 출력해준다.

 

IpPort 객체를 Model에 그대로 담아 전달 한 경우, ${ipPort} 는 IpPort.toString( )이 실행되지만,

${{ipPort}} 는 ConversionService를 통해 Converter가 호출된 것을 알 수 있다.

 

 

또한 IpPort 가 멤버변수로 정의되어 있는 Form 객체가

전달된 경우 th:object="${form}" 

th:field="*{ipPort} 를 통해 th:field 역ConversionService를 사용할 수 있음을 알 수 있다.

 

또한 PostMapping 으로 폼입력에서 데이터를 받아오는 경우에도 @ModelAttribute 는 Form 객체로 값을 받아 올 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

2. Formatter

 객체를 특정한 포멧에 맞추어 문자로 출력하거나 또는 그 반대의 역할을 하는 것에 특화된 기능이 바로 포맷터
( Formatter )이다. 포맷터는 컨버터의 특별한 버전으로 이해하면 된다.

 - Converter는 범용 (객체 -> 객체)

 - Formatter는 문자에 특화(객체 문자, 문자 객체) + 현지화(Locale)

 

 

Formatter 인터페이스를 구현한다. parse() 를 사용해서 문자를 숫자로 변환한다. 

참고로 Number 타입은 Integer , Long 과 같은 숫자 타입의 부모클래스이다.
print() 를 사용해서 객체를 문자로 변환한다.

 

 

Converter와 비슷한 방법으로 등록한다. 컨버전 서비스에는 컨버터만 등록할 수 있고, 포매터를 등록할 수 는 없다

그래서 포메터를 지원하는 컨버전 서비스에 등록한다. 내부에서 '어댑터 패턴'을 통해 포매터가 컨버터 처럼 동작

하도록 지원한다. FormattingConversionService 는 포맷터를 지원하는 컨버전 서비스이다.
DefaultFormattingConversionService 는 FormattingConversionService 에 기본적인 통화, 숫자 관
련 몇가지 기본 포맷터를 추가해서 제공한다.

 

<스프링이 제공하는 기본 포매터>

포맷터는 기본 형식이 지정되어 있기 때문에, 객체의 각 필드마다 다른 형식으로 포맷을 지정하기는 어렵다.
스프링은 이런 문제를 해결하기 위해 애노테이션 기반으로 원하는 형식을 지정해서 사용할 수 있는 매우 유용한 포맷터
두 가지를 기본으로 제공한다

 

@NumberFormat : 숫자관련 형식 지정 포매터  (NumberFormatAnnotationFormatterFactory)

@DateTimeFormat : 날짜 관련 형식 지정 포매터 (Jsr310DateTimeFormatAnnotationFormatterFactory)

 

 

Form 객체의 필드마다 애너테이션으로 각각 다른 포맷을 적용할 수 있다.