분류 전체보기 1341

Ch01. 예제 만들기 - 프로젝트 생성

Controller @RestController : @Controller + @ResponseBody @GetMapping : @RequestMapping + METHOD = GET Service @Service : 컴포넌트 스캔 대상, 스프링 빈으로 자동 등록 repository @Repository : 컴포넌트 스캔 대상, 스프링 빈으로 자동 등록 Sleep : 상품 저장하는 데 걸리는 시간 1000 ms 예외가 발생하는 상황도 계산하기 위해 ex 파라미터가 넘어오면 IllegalStateException 발생

Ch11. 파일 업로드 - 예제로 구현하는 파일 업로드, 다운로드

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

Ch11. 파일 업로드 - 스프링과 파일 업로드

스프링이 지원하는 파일 업로드 @Slf4j @Controller @RequestMapping("/spring") public class SpringUploadController { @Value("${file.dir}") private String fileDir; @GetMapping("/upload") public String newFile(){ return "upload-form"; } @PostMapping("/upload") public String saveFile( @RequestParam String itemName, @RequestParam MultipartFile file, HttpServletRequest request ) throws IOException { log.info("reques..

Ch11. 파일 업로드 - 서블릿과 파일 업로드

Controller 제작 @Slf4j @Controller @RequestMapping("/servlet/v1") public class ServletUploadControllerV1 { @GetMapping("/upload") public String newFile(){ return "upload-form"; } @PostMapping("/upload") public String saveFileV1(HttpServletRequest request) throws ServletException, IOException { log.info("request={}", request); String itemName = request.getParameter("itemName"); log.info("itemName={..

Ch11. 파일 업로드 - 파일 업로드 소개

HTML 폼 전송 방식 application/x-www-form-urlencoded multipart/form-data application/x-www-form-urlencoded HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법 Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지 헤더에 아래 내용을 추가한다. Content-Type: application/x-www-form-urlencoded 그리고 폼에 입력한 전송할 항목을 HTTP Body에 문자로 username=kim&age=20와 같이 & 로 구분해서 전송한다. 파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야 한다. 문자를 전송하는 이 방식으로 파일을 전송하기는 어렵다. 그리고 ..

Ch10. 스프링 타입 컨버터 소개 - 포맷터를 지원하는 컨버전 서비스

컨버전 서비스에는 컨버터만 등록할 수 있고, 포맷터를 등록할 수는 없다. 그런데 생각해보면 포맷터는 객체 -> 문자, 문자 -> 객체로 변환하는 특별한 컨버터일 뿐이다. 포맷터를 지원하는 컨버전 서비스를 사용하면 컨버전 서비스에 포맷터를 추가할 수 있다. 내부에서 어댑터 패턴을 사용해서 Formatter 가 Converter처럼 동작하도록 지원한다 FormattingConversionService는 포맷터를 지원하는 컨버전 서비스이다. DefaultFormattingConversionService 는 FormattingConversionService에 기본적인 통화, 숫자 관련 몇 가지 기본 포맷터를 추가해서 제공한다. public class FormattingConversionServiceTest { ..

Ch10. 스프링 타입 컨버터 소개 - 포맷터(Formatter)

Converter는 입력과 출력 타입에 제한이 없는, 범용 타입 변환 기능을 제공한다. 이번에는 일반적인 웹 애플리케이션 환경을 생각해보자. Boolean 타입을 숫자로 바꾸는 것 같은 범용 기능보다는 개발자 입장에서는 문자를 다른 타입으로 변환하거나, 다른 타입을 문자로 변환하는 상황이 대부분이다. 웹 애플리케이션에서 객체를 문자로, 문자를 객체로 변환하는 예 화면에 숫자를 출력해야 하는데, Integer -> String 출력 시점에 숫자 1000 -> 문자 "1,000" 이렇게 1000 단위에 쉼표를 넣어서 출력하거나, 또는 "1,000"라는 문자를 1000이라는 숫자로 변경해야 한다. 날짜 객체를 문자인 "2021-01-01 10:50:11" 와 같이 출력하거나 또는 그 반대의 상황 Locale ..

Ch10. 스프링 타입 컨버터 소개 - 뷰 템플릿에 컨버터 적용하기

타임리프는 렌더링 시에 컨버터를 적용해서 렌더링 하는 방법을 편리하게 지원한다 이전까지는 문자를 객체로 변환했다면, 이번에는 그 반대로 객체를 문자로 변환하는 작업을 확인할 수 있다. ConverterController @GetMapping("/converter-view") public String converterView(Model model){ model.addAttribute("number", 10000); model.addAttribute("ipPort", new IpPort("127.0.0.1", 8080)); return "converter-view"; } model에 숫자 10000, IPPort 객체를 넣어서 뷰 탬플릿에 전달 ${number}: ${{number}}: ${ipPort}: ..

Ch10. 스프링 타입 컨버터 소개 - 스프링에 Converter 적용하기

@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()); } } 스프링은 내부에서 ConversionService를 제공한다. 우리는 Web..

Ch10. 스프링 타입 컨버터 소개 - 컨버전 서비스(ConversionService)

이렇게 타입 컨버터를 하나하나 직접 찾아서 타입 변환에 사용하는 것은 매우 불편하다. 그래서 스프링은 개별 컨버터를 모아 두고 그것들을 묶어서 편리하게 사용할 수 있는 기능을 제공하는데, 이것이 바로 컨버전 서비스( ConversionService )이다 public class ConversionServiceTest { @Test public void conversionService(){ //등록 DefaultConversionService conversionService = new DefaultConversionService(); //ConversionService를 구현한 구현체 conversionService.addConverter(new StringToIntegerConverter()); conv..