본문 바로가기
IT 공부/자바와 웹 애플리케이션

[스프링] - Formatter 개념 정리

by exdus3156 2024. 1. 6.

1. 파라미터 자동 수집과 포매터

스프링 웹 MVC의 장점 중 하나는 쓸데 없는 코드를 줄일 수 있다는 점이다. 쿼리 스트링 등으로 전달되는 파라미터를 자동으로 캐치하고 형 변환을 통해 인자로 바로 전달할 수 있다는 점도 엄청난 장점이다.

이전에는 HttpServletRequest에서 getParameter()를 통해 일일이 문자열 데이터를 받아 형변환을 했지만, 스프링에서는 그런 코드는 생략된다.

하지만 생략되는 만큼 문제가 발생하는 법! 특히 HTTP 요청의 쿼리 스트링이나 body에 포함되는 데이터는 기본적으로는 문자열이다. 문자열을 자동으로 String, int, long, boolean으로 형변환하는 데는 아주 크게 무리는 없지만, 문자열을 원하는 객체 타입으로 바꾸려면 개발자가 설정을 해줘야 한다. 단순히 setter를 통해 기본 데이터를 저장하는 객체가 아니라 LocalDate 처럼 아예 문자열의 정보를 다른 객체로 매핑하는 것 말이다.

이를 위해 Formatter 인터페이스가 사용될 수 있다.

 

 

2. Formatter 기본 사용법

parse는 보통 HTTP 요청 메시지로 파라미터가 들어올 때 변환에 사용된다. HTTP 메시지는 기본적으로 문자열로 파싱된다. 그 인자가 text로 들어온다. Locale은 지역 정보인데, 문자열 파싱 시 지역 정보를 활용할 때 응용될 수 있다.

print는 파라미터와는 별개의 기술이다. 이것은 view 탬플릿, 즉 JSP 등에서 특정 객체를 문자열로 표현할 때 사용된다. Formatter의 본질이 Conversion Service이기 때문에 parse 뿐만 아니라 반대 방향으로의 문자열 변환도 지원해야 하는 것이다.

그리고 Formatter는 어노테이션이 아니라 스프링 빈 설정(servlet-context.xml)으로 등록해야 한다.

 

 

3. servlet-context.xml 설정 설명

먼저 <mvc:annotation-driven>의 conversion-service에 아래에 생성한 빈을 등록한다. 이렇게 해야 하는 이유는, 현재 스프링 웹 mvc를 어노테이션 기반으로 코딩하기 때문이다. 실제로 Formatter를 @Controller, @RequestParam 등에서 사용하고 있다.

밑에서는 conversionService 빈을 생성하고 있다. 복잡하게도 FormattingConversionServiceFactoryBean을 통해 생성하고 있는 모습이다. <mvc:annotation-driven>의 conversion-service에 등록될 수 있는 이유는 Factory 객체가 팩토리이면서도 ConversionService 인터페이스를 구현하고 있기 때문이다.

왜 굳이 Formatter를 바로 등록하거나, ConversionService를 바로 생성하거나 하지 않고 귀찮게 팩토리 객체를 거치는 것일까?

아직 나도 완벽하게 알지는 못하지만 구글링해서 공부한 바에 따르면, 일단 이름도 긴 저 팩토리 객체는 말 그대로 ConversionService 객체를 생성해주는 팩토리 객체다. 즉, 변환과 관련된 모든 서비스를 총괄하는 객체다. 따라서 Formatter 말고도 다양한 옵션들을 사용자에게 제공해준다.

그래서 각종 옵션과 관련된 객체들의 생성 과정이 상당히 복잡해질 수 있다. 팩토리 패턴이 사용되는 이유는 무엇을 생성할지, 그리고 어떻게 생성할지를 쉽게 사용할 수 있도록 캡슐화해준다는 것이다. 사용자는 formatter, converter 같은 인터페이스들을 구현하고 이를 팩토리에 등록(setter)만 하면 되는 것이다. 그러면 팩토리가 알아서 ConversionService를 생성해준다. 굳이 ConversionService 객체 자체의 생성에 관여하지 않는다.