스프링/4. 스프링 MVC-2 87

87. 파일 업로드, 다운로드 구현

요구사항 상품관리 - 상품이름 - 첨부파일 하나 - 이미지 파일 여러개 첨부파일을 업로드 다운로드 할 수 있어야 한다. 업로드 한 이미지를 웹 브라우저에서 확인할 수 있다. @Data public class Item { private Long id; private String itemName; private UploadFile attachFile; private List imageFiles; } 먼저 Item을 구현했다. 그 다음 간이로 저장해보기 위해 @Repository public class ItemRepository { private final Map store = new HashMap(); private long sequence = 0L; public Item save(Item item){ it..

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(..