ํฌ๋งทํฐ(Formatter)
by rlaehddnd0422ํฌ๋งทํฐ
์ปจ๋ฒํฐ๋ ์ ์ถ๋ ฅ ํ์ ์ ์ ํ์ด ์์ด ๋ฒ์ฉ์ ์ผ๋ก ํ์ ์ ๋ฐ๊ฟ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ต๋๋ค.
ํฌ๋งทํฐ๋ ์ปจ๋ฒํฐ ๊ธฐ๋ฅ์์ ์กฐ๊ธ ๋ ํนํ๋ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฌธ์๋ก, ๋ฌธ์๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ ๋ Locale ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ํ์งํ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํฌ๋งทํฐ ์ธํฐํ์ด์ค
public interface Formatter<T> extends Printer<T>, Parser<T> {}
@FunctionalInterface
public interface Printer<T> {
String print(T object, Locale locale);
}
@FunctionalInterface
public interface Parser<T> {
T parse(String text, Locale locale) throws ParseException;
}
๋ฉ์๋ ์ค๋ช
- String print(T object , Locale locale) : Object๋ฅผ String์ผ๋ก ๋ณ๊ฒฝ ( + Locale ์ ๋ณด ์ฌ์ฉ ๊ฐ๋ฅ)
- T Parse(String text, Locale locale) : String์ Object๋ก ๋ณ๊ฒฝ ( + Loclae ์ ๋ณด ์ฌ์ฉ ๊ฐ๋ฅ)
์ด ํฌ๋งทํฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด print๋ฉ์๋๋ก ์ซ์(Object) 1000์ (String)"1,000"์ผ๋ก ๋ณ๊ฒฝ.
parse๋ฉ์๋๋ก 1000์ (String)"1,000"์ ์ซ์(Object) 1000์ผ๋ก ๋ณ๊ฒฝํด๋ณด๊ฒ ์ต๋๋ค.
@Slf4j
public class MyNumberFormatter implements Formatter<Number> {
// parse : String to Object with formatting
@Override
public Number parse(String text, Locale locale) throws ParseException {
log.info("text : {} , Locale : {}",text, locale);
// "1,000" -> 1000
return NumberFormat.getInstance(locale).parse(text);
}
// print : Object To String with formatting
@Override
public String print(Number object, Locale locale) {
log.info("object = {} , locale = {}", object, locale);
// 1000 -> "1,000"
return NumberFormat.getInstance(locale).format(object);
}
}
print ๋ฉ์๋ : 1000->"1,000"
- ์ซ์ ์ค๊ฐ์ ์ผํ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ NumberFormat ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- NumberFormat์ locale์ ๋ณด๋ฅผ ํตํด format ๋ฉ์๋๋ก ์ผํ๋ฅผ ์ ๊ฑฐํ๊ณ Number ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋๋ก ๊ตฌํ๋์ด์์ต๋๋ค.
parse ๋ฉ์๋ : "1,000"->1000
- ์ซ์ ์ค๊ฐ์ ์ผํ๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ NumberFormat ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- NumberFormat์ locale์ ๋ณด๋ฅผ ํตํด parse ๋ฉ์๋๋ก ์ผํ๋ฅผ ์ถ๊ฐํ๊ณ Number ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋๋ก ๊ตฌํ๋์ด์์ต๋๋ค.
ConversionService์ ํฌ๋งทํฐ ๋ฑ๋ก
์ปจ๋ฒํฐ๋ฅผ DefaultConversionService์ ๋ฑ๋กํด์ ์ฌ์ฉํ๋ค๋ฉด,
ํฌ๋งทํฐ๋ DefaultFormattingConversionService์ ๋ฑ๋กํด์ ์ฌ์ฉํฉ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๋งทํฐ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
์ปจ๋ฒํฐ์ ๋์ผํ๊ฒ WebMvcConfigurer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ addFormatters ๋ฉ์๋์ ๋ฑ๋ก
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// registry.addConverter(new StringToIntegerConverter());
// registry.addConverter(new IntegerToStringConverter());
registry.addConverter(new StringToIpPortConverter());
registry.addConverter(new IpPortToStringConverter());
registry.addFormatter(new MyNumberFormatter());
}
}
์ฌ๊ธฐ์ ์ด์ ์ ๋ง๋ค์๋ ์ปจ๋ฒํฐ๋ฅผ ์ฃผ์์ฒ๋ฆฌํ ์ด์ ๋ ์ฃผ์์ฒ๋ฆฌํ Converter๋ ์ซ์->๋ฌธ์, ๋ฌธ์->์ซ์๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋์ ๊ธฐ๋ฅ์ด ๊ฒน์นฉ๋๋ค. ๊ธฐ๋ฅ์ด ๊ฒน์น ๊ฒฝ์ฐ ์ปจ๋ฒํฐ๊ฐ ์ฐ์ ์์๊ฐ ๋ ๋์ต๋๋ค.
์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ณธ ํฌ๋งทํฐ by Annotation
์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋ ํ์์ ์ง์ ํด์ ์ฌ์ฉํ ์ ์๋ ๋งค์ฐ ์ ์ฉํ ํฌ๋งทํฐ ๋๊ฐ์ง๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
@NumberFormat: ์ซ์ ๊ด๋ จ ํ์ ์ง์ ํฌ๋งทํฐ
@DateTimeFormat: ๋ ์ง ๊ด๋ จ ํ์ ์ง์ ํฌ๋งทํฐ
์ด๋ ธํ ์ด์ ์ ํจํด์ ์ง์ ํด ์ํ๋ ํ์์ผ๋ก ํฌ๋งทํ ํ ์ ์์ต๋๋ค.
@Data
static class Form
{
@NumberFormat(pattern="###,###")
private Integer number;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;
}
@GetMapping("/formatter/edit")
public String formatterForm(Model model) {
Form form = new Form();
form.setNumber(10000);
form.setLocalDateTime(LocalDateTime.now());
model.addAttribute("form",form);
return "formatter-form";
}
ConversionSerice๋ @RequestParam , @ModelAttribute , @PathVariable , ๋ทฐ ํ ํ๋ฆฟ ๋ฑ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์ํ ์ : HttpMessageConverter(@RequestBody, @ResponseBody) ์๋ ConversionService๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
HttpMessageConverter์ JSON ๊ฒฐ๊ณผ๋ก ๋ง๋ค์ด์ง๋ ์ซ์๋ ๋ ์ง ํฌ๋งท์ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด JackSon ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์ค์ ์ ์ฐพ์๋ณด๋๋ก ํฉ์๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MultiPartFile์ ์ด์ฉํ ํ์ผ ์ ๋ก๋, ๋ค์ด๋ก๋ (0) | 2023.03.30 |
---|---|
์๋ธ๋ฆฟ์ ์ด์ฉํ HTML Form ํ์ผ ์ ๋ก๋ (0) | 2023.03.30 |
ํ์ ์ปจ๋ฒํฐ(Type Converter) (0) | 2023.03.29 |
API์์์ ์์ธ ์ฒ๋ฆฌ (0) | 2023.03.28 |
Spring - ์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ ( Exception ) (0) | 2023.03.28 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422