Skip to content

Latest commit

 

History

History
277 lines (141 loc) · 8.81 KB

TIL220401.md

File metadata and controls

277 lines (141 loc) · 8.81 KB

Daily to do list

Java


Spring


CS


알고리즘


오늘의 회고

220401 Spring MVC

———————————

타입 컨버터

쿼리스트링으로 넘어오는 10은 숫자가 아닌 문자이다.

근데 스프링이 제공하는 @RequestParam을 사용하면 스프링이 자동으로 변환해서 넣어주는 것

이와 마찬 가지로 다 문자인데.. 숫자로 자동 변경

개발자가 직접 타입 변환을 한다는 것은 진짜… 괴로운 일이다.

스프링 중간에 타입 변환기를 사용해서 타입을 변환해주었기 때문에 개발자는 편하게 해당 타입을 바로 받을 수 있다.

앞에서는 문자를 숫자로 변경하는 예시를 들었지만 반대도 가능, bool타입도 가능 다 가능.

개발자가 새로운 타입을 만들수도 있음…

컨버터 인터페이스를 만들면 된다..

——————————————

타입 컨버터 - Converter

타입 컨버터를 사용하려면..

컨버터가 굉장히 많으니 조심해서 선택해야 한다.

이렇게 직접 구현할 수 있다!

너무 당연히 반대도 가능

이렇게 IpPort와 String을 바꾸는 컨버터도 구현 가능!!

타입 컨버터를 등록하고 관리하면서 편리하게 변환 기능을 제공하는 역할을 할 무언가가 필요

————————————————————

컨버전 서비스 - ConversionService

이전에는 타입 컨버터를 하나하나 찾아서 가져옴..

그래서 스프링은 개별 컨버터들을 모아두고 그것들을 묶어서 편리하게 사용할 수 있는 기능을 제공

기능은 단순하게 컨버팅 가능한가? 확인 기능과 컨버팅 기능 2가지를 갖고 있음

이렇게 컨버전서비스에 컨버터들을 등록해주고 source와 타입을 입력하면 자동으로 변경을 해준다.

등록할떄는 컨버터를 정확히 알아야 하지만, 사용하는 입장에서는 어떠한 컨버터들이 있는지 모르게 된다.

——————————————

스프링에 Converter 적용하기

WebConfig 파일을 만들고 설정을 등록한다.

이렇게 사용하면 직접 만든 컨버터가 사용되었다.

쿼리파라미터는 문자이지만 알아서 컨버터를 찾아주고 잘 맞게 바꿔줌.

ArgumentREsolver 인 RequestParamMethodArgumentResolver에서 ConversionService를 사용해서 타입을 변환한다..

——————————————

뷰 템플릿에 컨버터 적용하기

타임리프는 렌더링 시에 컨버터를 적용해서 렌더링 하는 방법을 편리하게 지원

객체를 문자로 변환..!

이렇게 타임리프에서 괄호를 두개 {{}} 쓰면 컨버터를 활용하게 된다..!! 그래서 객체가 아닌 컨버터를 쓴 결과가 출력되게 된 것이다.

⁃	폼에 적용하기

이렇게 있는데.. th:field는 자동으로 컨버터를 적용하게 된다.

혹시나 적용하기 싫다면 th:value를 사용해야 한다.

객체를 문자로 submit을 하면 다시 문자가 또 객체로

정리, {{}} 괄호 2개를 쓰거나 폼에서 th:field 사용

———————————————————

포맷터 - Formatter

일반적인 웹 애플리케이션 환경을 생각해보면 숫자, 문자 이런 범용 기능 보다는

객체 >> 문자 >> 객체 이렇게 하는 것이 더 많다.

Locale도 사용된다.

이렇게 객체를 특정한 포맷에 맞추어 문자로 출력하거나 그 반대의 역할을 하는 것에 특화된 기능이 바로 포맷터(Formatter)이다.

Number타입은 Integer, Long과 같은 숫자 타입의 부모 클래스이다.

parse에서 문자를 숫자로 바꾸고 print에서 객체를 문자로 바꾼다.

———————————————

포맷터를 지원하는 컨버전 서비스

이렇게 컨버전 서비스에 컨버터와 포맷터 모두 등록 가능

똑같은 숫자 > 문자 > 숫자 이런것이면 우선순위가 있다.

컨버터가 포맷터보다 우선순위가 높다.

————————————

스프링이 제공하는 기본 포멧터

시간과 날짜는 변환하기 어려우니.. 스프링이 기본으로 제공한다.

오…

이걸 주석처리르 해야함…

우선 순위가 내가 지정한 컨버터가 스프링 기본 제공 포멧터보다 높기 때문에

(10000 >> 10,000 Int To String이여서 )

************** 주의

메시지 컨버터는 컨버전 서비스가 적용되지 않는다.

특히 객체 to JSON같은 것은 내부에서 Jackson같은 라이브러리가 사용하므로 라이브러리에서 지정하는 방법을 따라서 시간 날짜 등 바꿔야 한다.

——————————————————

파 일 업 로 드

가장 기본적인 방법, 폼 전송 방법

근데,,, 파일을 업로드 할며ㅕㄴ 파일은 문작 ㅏ아닌 바이너리 데이터를 전송해야 한다.

이 방법은 어렵다. 그리고 보통 폼을 전송할 때 파일만 전송하는 것이 아니다.!!

즉, 문자와 바이너리를 동시에 전송해야 한다 <<<

이런 문제를 해결하기 위해HTTP는 >> multipart/firm-data를 제공..

이 HTTP 메시지를 보면

boundary로 여러개로 구분이 되어 있다. 형식도 여러개가 된다.

파일이 파일 이름과, 컨텐츠 타입, 그리고 바이너리 정보

끝에는 —

Content-DIsposition 이라는 항목별 헤더가 추가되어 있음.

**** Part

multipart/form-data는 boundary로 나뉨.

이렇게 온다..

parts=[org.apache.catalina.core.ApplicationPart@2b524dd4, org.apache.catalina.core.ApplicationPart@2f6dcc66]

이렇게 두개가 온다..

————————————

서블릿과 파일 업로드

⁃	멀티 파트 사용 옵션

업로드 사이즈 제한 가능

파일 하나의 사이즈, 여러 파일의 합 설정 가능

spring.servlet.multipart.enalbled 끄기

멀티파트와 관련된 처리를 허용하지 않음.

멀티파는 일반적인 폼 요청보다 훨씬 복잡하다. 이 옵션을 끄면 섭르릿 컨테이너는 멀티파트와 관련된 처리를 하지 않는다.

보면 결과가 비어있다.

spring.servlet.multipart.enalbled 켜기

(기본이 true)

이 옵션을 켜면 멀티파트 데이터를 처리하라고 설정한다.

멀티파트로 들어오게 되면 일반적인 HttpServletRequest가 아닌 MultipartHttpServletRequest로 받게 된다.

파일과 관련된 처리를 더 쉽게 할 수 있다. 근데 이후 강의에서 설명할 MultipartFile이라는 것이 더 편하당…

———————————————

서블릿 파일 업로드 2

파일을 업로드하려면 실제 파일이 저장되는 경로가 필요..

이런식으로 경로 지정이 필요.

part의 헤더를 보면 content-Disposition이 3가지 정보를 담고 있어서 이걸 또 파싱할려면 번거로움이 있다. 이것을 제공하는 편의 메서들르 제공해준다.

***** 문자 >> 바이너리 >> 문자는 꼭 chartset을 꼭 정해야 함!!

이렇게 파트별로 찍어보면,

이렇게 나온다..

저장은 이렇게

멀티파트 형식은 전송 데이터를 하나하나 각 부분을 Part로 나눔.

그리고 서블릿이 제공하는 part는 멀티 파트 형식을 편리하게 읽을 수 있는 다양한 메서드를 제공.

이런 것들이 있음.

*참고

큰 용량의 파일 업로드를 테스트하면.. 로그가 너무 많이 남아서..

디버깅 옵션을 끄는 것이 좋다!

서블릿이 제공하는 Part는 편하기는 하지만, HttpServletREquest를 사용해야 하고

추가로 파일 부분만 구분하려면 여러가지 코드를 넣어야 한다.

불편…

—————————————————

스프링과 파일 업로드

스프링은 MultipartFIle이라는 인터페이스로 멂티파트를 제공해준다.

스프링은 이렇게 간단하게 가능.

⁃	@RequestParam MultipartFile file

업로드하는 HTML Form의 name에 맞추어 @RequestParam을 적용하면 된다.

추가로 @ModelAttribute에서도 MultipartFIle을 동일하게 사용할 수 있다.

————————————————

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

파일 이름을 서버에서는 겹치면 안된다. 그래서 이름을 두개로 저장함.

멀티파트 파일을 서버에 저장하는 역할을 담당.

확장자를 붙이고 싶어서 추출하는 메서드를 만듬.

이미지를 보여줄려면 file:을 붙여서 경로랑 같이 로딩

다운로드에서 itemID같은 것을 받아서 한다면, 바로 다운로드 시키는 것이 아닌 기존 보안 로직(뭐 로그인 세션있는 지 권한 있는지 그런거 확인 해서) 다운로드를 시킬 수 있다.

responseEntity에 header에 CONTENT_DISPOSITON을 해줘야지 다운로드

파일명이 꺠질수도 있으니 UTF-8로 변환도 해줌.