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

1. Converter
@ModelAttribute, @RequestParam, @PathVariable 사용하면, 여러 타입으로 데이터를 받을 수 있다.
이때 데이터의 타입을 변경하기위해 사용되는 것이 Converter 인터페이스를 구현한 여러 구현체 들이다.
스프링은 ConversionService 인터페이스를 통해 여러 Converter 들을 등록하고 적절한 Converter를 사용한다.
인터페이스 분리원칙(ISP) 잘 지켜지고 있는 것이다.
사용자정의 타입으로 타입 형변환을 지원하는 컨버터를 만들어보자


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


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 객체의 필드마다 애너테이션으로 각각 다른 포맷을 적용할 수 있다.
'프로그래밍 > Spring' 카테고리의 다른 글
| [Spring] 트랜잭션과 스프링 (0) | 2024.02.28 |
|---|---|
| [Spring] 파일업로드 (0) | 2024.02.22 |
| [Spring] 스프링 API 예외처리 (0) | 2024.02.20 |
| [Spring] 스프링 예외처리와 오류페이지 (0) | 2024.02.17 |
| [Spring] 서블릿 필터와 스프링 인터셉터 (0) | 2024.02.15 |
