스프링 347

85. 서블릿으로 실제 서버에 파일 업로드

먼저, 파일을 업로드 하려면 실제 파일이 저장될 경로가 필요하다. application.properties에 지정해주면 된다. file.dir=G:/spring/files/ 폴더의 맨 끝에 / 해야 한다. 그리고 아마 폴더 자동생성 아닐 듯 @Slf4j @Controller @RequestMapping("/servlet/v2") public class ServletUploadControllerV2 { @Value("${file.dir}") private String fileDir; @GetMapping("/upload") public String newFile(){ return "upload-form"; } @PostMapping("/upload") public String saveFileV2(HttpS..

84. 파일 업로드

일반적으로 html Form의 post 방식으로 데이터를 전송하면, applicaation/x-www-form-urlencoded 방식으로 전송이 된다. form 태그에 별도의 enctype 옵션이 없다면 자동으로 저 타입을 요청의 헤더 Content-Type: application/x-www-form-urlencoded 하고 추가한다. 그리고, 메시지 바디에 key1=value1&key2=value2..... 형태로 전송된다. 하지만, 이러 한 문자가 아니라 파일이라면, 파일은 바이너리 데이터를 전송해야 한다. 이 방식으로 파일을 전송하기는 어렵다. 또한, 폼 전송 시 파일을 전송 해도, 보통 파일만 보내지 않는다. 뭐 예를들어 회원이라면 회원 이미지(파일), 닉네임 등등... 위와 같은 이유 때문에,..

83. 스프링이 제공하는 기본 포맷터

많은 기본 포맷터들을 제공해주고, 또 아예 등록되면서 시작되는 것 들도 있다. 근데, 사실 객체마다 특정 포맷으로 맞추는 것은 사실 굉장히 번거로운 일이다. 그래서, 스프링은 애노테이션으로써 포맷팅의 옵션을 지정할 수 있도록 지원을 해 준다. @NumberFormat : 숫자 관련 포맷 @DateTimeFormat : 날짜 관련 포맷 @Data static class Form{ @NumberFormat(pattern = "###,###") private Integer number; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime localDateTime; } 이렇게 대상의 필드에 써 주면 된다. 아마 숫자는 양옆으로 자릿수? ..

82. 포맷터 웹 어플리케이션(스프링, 컨버전서비스)에 등록

간단하다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new IpPortToStringConverter()); registry.addConverter(new StringIpPortConverter()); registry.addFormatter(new MyNumberFormatter()); } } 이렇게 등록하면 된다. 참고로, 우선순위는 포맷터보다 컨버터가 먼저이다. ${number}: ${{number}}: ${ipPort}: ${{ipPort}}: 이걸 호출 해 보면,..

81. 포맷터 스프링(컨버전서비스)에 등록

원래 컨버전 서비스에는 컨버터만 등록할 수 있고 포맷터를 등록할 수는 없다. 하지만, 그 컨버전서비스 인터페이스를 상속받은 클래스 중에는 포맷터를 지원하는 컨버전 서비스가 있다. 거기에 등록하면 된다. DefaultFormattingConversionService는 컨버전서비스에 포맷팅을 등록할 수 있고, 거기에 기본적인 기능과 정보가 추가되어 있다. public class FormattingConversionServiceTest { @Test public void formattingConversionService(){ DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); convers..

80. 포맷터

컨버터는 타입에 제한이 없다. 근데 웹으로써 생각해봤을 때, 대부분의 컨버팅이 필요한 상황은 문자 객체 혹은 타입 이다. 거기에서 그칠 뿐 아니라, 1000 -> "1,000"이라던지, 아니면 날짜 포맷에 맞춘다던지. 그래서, 포맷터 라는 게 있다. 이거는 객체 문자, 타입 문자 등 문자에 특화된 인터페이스이다. 게다가 Locale, 현지화와 연동하여 사용할 수도 있게끔 지원해 준다. 실제 포맷터 인터페이스는 public interface Formatter extends Printer, Parser { } 이렇게 생겼다. Printer는 객체 -> 문자인 인터페이스이고, Parse는 문자 -> 객체인 인터페이스이다. 각자 들어가서 보면 @FunctionalInterface public interface ..

79. 컨버터를 뷰 템플릿에 적용

스프링의 컨버전 서비스에 컨버터들을 등록하여 잘 사용이 되는 것을 확인 하였다. 근데, 또 반대로 뷰 템플릿에 보여줄 때는 객체나 이런 것 들을 문자로써 보여줘야 한다. 물론 이게 자동으로 된다. @Controller public class ConverterController { @GetMapping("/converter-view") public String converterView(Model model){ model.addAttribute("ipPort", new IpPort("127.0.0.0", 8080)); return "converter-view"; } } 컨트롤러의 모델에 IpPort 객체를 담고, 그 모델을 converter-view.html로 가져가는 것이다. ${ipPort}: ${{ip..

78. 컨버전서비스 실제 사용

저번시간에 컨버터를 컨버전서비스에 등록하는 것 까지 해봤는데, 그래도 쓸 때는 우리가 직접 컨버전서비스를 생성해서 사용해서 불편했다. 무슨 말이냐 하면, 스프링에 등록하면 @RequestParam 이런 곳에도 자동으로 적용되어 우리가 등록한 컨버트 로직을 수행한다. 등록하는 방법은 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToIntegerConverter()); registry.addConverter(new IntegerToStringConverter(..

77. 컨버전 서비스

우리가 정의한 컨버터를 직접 호출해서 썼다. 하지만 일일히 이렇게 호출해서 쓰면 굳이 스프링의 컨버터를 상속받아 사용한 의미가 없다. 이런 컨버터들을 모아서 관리해주는 것이 바로 컨버전 서비스이다. 이것도 어댑터 패턴이다. public interface ConversionService { boolean canConvert(@Nullable Class sourceType, Class targetType); boolean canConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType); @Nullable T convert(@Nullable Object source, Class targetType); @Nullable Object conve..

76. 스프링 타입컨버터

스프링은 컨버터 인터페이스를 제공해 준다. 되게 간단하다. public class StringToIntegerConverter implements Converter { @Override public Integer convert(String source) { return Integer.valueOf(source); } } Converter 이렇게 해서, convert라는 메소드를 @override 하면 된다. 그 안에 작업해서 return 해 버리면 된다. 예를들어, String 타입으로 들어온 것을 우리가 만든 IpPort 객체로 Convert 한다고 하면, @Getter @EqualsAndHashCode public class IpPort { private String ip; private int po..