2020-11-30 TIL
멀티파트
acid test
- html, css 문법을 웹브라우저가 얼마나 지원하는지 확인하는 테스트
- https://www.acidtests.org/
GET / POST
- GET
- 주소창에 주소를 넣고 보냈을 때
- 링크를 눌렀을 때
- 입력폼의 타입이 get인 상태에서 값을 넣고 전송을 눌렀을 때(form은 기본적으로 get 요청을 보낸다. post 요청을 보내고 싶을때는 form의 메서드를 post로 지정해 줘야 한다.)
- 전부 쿼리 스트링을 보낸다.
- POST
- 입력폼의 method가 post라고 지정한다.]
- post 요청은 주소에 쿼리 스트링이 붙지 않는다.
- 데이터를 서버에 보낼 때
- 리퀘스트 라인은 post
- 주소
- 헤더
- 빈줄
- 메세지 바디 <- 데이터는 메세지 바디를 통해서 보낸다.
- 데이터를 서버에 보낼 때
- 서버에서 데이터를 꺼낼때는 전부 getParameter(“변수명”)으로 꺼낸다.
- 리턴값은 무조건 String이다
- 숫자를 문자로 받았을 때 다시 숫자로 바꾸고 싶은 때는 Integer를 사용한다.
파일 업로드 - common file upload

- 상대 경로(“s3”)를 준다. / 절대 경로(“/eomcs-java-seb/ex04/s3”)
- 웹 브라우저에서 바라보는 루트는 무조건 서버 루트이다.
- 웹 브라우저에게 쓰라고 알려주는 루트 역시 무조건 서버 루트이다.
- /eomcs-java-ser/ex04/s3
- 서블릿에서 바라보는 루트는 컨텍스트(웹 어플리케이션) 루트이다.
- 서블릿 컨테이너에게 알려주는 루트는 컨텍스트 루트이다.
- /ex04/s3
- get 요청으로 보냈을 때
- file을 업로드 한다면 file 자체가 서버에 가야 하는데 file 이름만 보내게 된다.
- post 요청으로 보냈을 때
- 일반적인 post 요청 역시 file을 업로드 할 수 없다.
- 웹 브라우저에서 파일을 보낼때는 자동으로 서버에 파일을 보낼 수 없다.
- 해킹의 가능성이 있기 때문에
- 예) 액티브X
- 무조건 사용자가 승인을 한 파일만 서버에 보낼 수 있다.
- 서버에 파일을 보내는 게 아니라 메세지 바디를 통해 이름만 보낸다.
- 일반 포스트가 아니라 mulipart/form-data 형식으로 보내야 파일이 서버에 업로드 된다.
- Enctype-“multipart/form-data” method=”post”
- Boundary WebkitformBoundary < 파일 구분자
- 오리지날 파일 명도 서버에 보내고 바이너리 데이터 역시 서버에 보낸다.
- 서블릿에서 멀티파트로 보내진 데이터를 처리하지 못하기 때문에 getParameter로 바이너리 데이터를 꺼낼 수 없다.
- apache에서 라이브러리를 만들어서 배포
- ‘commons-fileupload’
- apache에서 라이브러리를 만들어서 배포
- 서블릿에서 멀티파트로 보내진 데이터를 처리하지 못하기 때문에 getParameter로 바이너리 데이터를 꺼낼 수 없다.
- 해킹의 가능성이 있기 때문에
commons fileupload
- Multipart 형식으로 보낸 첨부 파일 데이터를 읽는 방법
- Content-type 헤더에 지정한 구분자를 사용하여 각 파트를 분리한 다음 데이터를 읽는다.
- 기존에 제공하는 getParameter()로는 멀티파트 형식으로 전송된 데이터를 읽을 수 없다.
- 방법?
- 외부 라이브러리를 사용한다.
- Apache.org 사이트에서 제공하는 멀티파트 데이터 분석기를 사용한다.
- Servlet 3.0부터는 서블릿에서 제공하는 기능을 이용한다.
- 실무에서는 commons-fileupload 방식도 많이 사용한다.
- 방법?
- 멀티 파트 형식의 데이터를 처리할때는 인코딩 설정이 적용되지 않는다.
- getParameter()도 적용되지 않는다.
- Common-fileupload 문서에 따라 코딩한다.
- 멀티파트 데이터를 분석하여 fileItem 객체에 담아줄 공장을 준비한다.
- 공장 객체를 사용하여 클라이언트가 보낸 데이터를 처리할 객체 준비한다.
- 파트의 데이터가 일반 데이터라면 클라이언트가 보낸 파라미터 이름과 파라미터의 값을 꺼낼 때 인코딩을 지정해서 맵에 저장한다.
- 만약 데이터가 파일아라면
- 임의의 파일 이름으로 저장하도록 UUID.randomUUID를 사용하고
- 클라이언트가 보낸 파라미터 이름
- 파라미터의 값. 값 꺼낼 때 인코딩을 지정해야 한다.
서버나 DBMS를 공유?
- DBMS를 공유한다면 Storage를 만들어서 업로드 한 파일 역시 공유해야 한다.
- 실무에서 서버가 여러개일때
- 같은 스토리지와 DBMS를 바라본다.
- 실무에서 서버가 여러개일때
업로드 파일을 다르게 저장하고 싶을 때
- Upload/board, upload/member 이런 식으로 나눠서 저장하면 된다.
파일 업로드 - Servlet 3.0
- 멀티파트 형식의 데이터를 처리할 서블릿으로 선언하라.
- 애노테이션으로 설정하기
같은 이름으로 여러 개의 데이터 보내기
- 체크박스의 이름을 다르게 할 수 있다.
- 체크를 하면 값이 넘어가고 체크를 하지 않으면 값이 넘어가지 않는다.
- 실무 : 체크 박스의 이름은 같게 만들고 value를 다르게 한다.
- 체크 박스를 같은 이름으로 하면 여러개 넘어오는 것을 구분해야 한다.
- 서블릿에서 getParameter로 꺼내지 않고 getParameterValues로 값을 리턴받는다.
- value를 pk로 하면 된다.
빈 값과 null
- type이 text라면 value를 넣지 않더라도 빈 값이 String으로 넘어간다.
- type이 check인 경우에는 체크하지 않으면 값이 넘어가지 않는다.
썸네일
- 사진을 여려개 출력할 때 사진 파일의 크기가 크면 다운로드 받을 때 시간이 걸릴수도 있다.
- 원본 이미지를 바로 받는것이 아니라 리스트를 출력할 때 별도 파일을 생성해서 썸네일 이미지를 올려서 그것을 출력한다.
- 썸네일 이미지를 출력할 때는 썸네일 이미지 링크를 추가하고 원본이 필요한 곳에서는 원본 링크가 출력되도록 한다.
- 썸네일을 만드는 라이브러리는 따로 있다.
- 원본 파일을 가져와서 출력할 때 크기를 줄이는 것은 하지 않도록 한다.
- 썸네일의 기준은 높이로 맞춰야 한다. (너비는 달라도 된다.)
HTTP 프로토콜 다루기 - HttpServletRequest와 GET/POST
-
HTTP 프로토콜로 통신을 하는 서블릿 컨테이너는
service() 메서드를 호출할 때
ServletRequest의 파라미터 값으로 HttpServletRequest를 만들어 전달한다.
ServletResponse의 파라미터 값으로 HttpServletResponse를 만들어 전달한다.
따라서 service() 메서드의 파라미터 값은 원래
HttpServletRequest와 HttpServletResponse이다.
이들 객체에는 HTTP 프로토콜을 다루는 메서드가 추가되어 있다.
따라서 HTTP 프로토콜을 다루고 싶다면 파라미터 값을
원래의 타입으로 변환하라
filter
- 서버가 생성되면 필터는 자동적으로 객체를 생성한다.
- 서블릿은 요청을 받았을 때 객체를 생성한다.
- 웹 브라우저에서 필터를 실행할 방법은 없다.
- 그냥 서블릿을 실행해야 한다.
- 필터가 사용할 값을 web.xml에 설정할 수 있고 그 설정된 값을 사용하려면 filterConfig를 사용하면 된다.
- 애노테이션으로도 설정할 수 있다.
@WebFilter(
value="/ex05/*", // <- url pattern
initParams={
@WebInitParam(name="encoding", value="UTF-8"),
@WebInitParam(name="aaa", value="nono")
})
public class Filter02 implements Filter {
FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 필터의 DD 설정으로 지정한 파라미터 값 가져오기
System.out.printf("ex06.Filter02 : encoding=%s\n",
filterConfig.getInitParameter("encoding"));
// web.xml에 설정된 파라미터 값
//
System.out.printf("ex06.Filter02 : aaa=%s\n",
filterConfig.getInitParameter("aaa"));
chain.doFilter(request, response);
}
}
- 필터는 순서대로 실행되지 않는다.
html = static
- 한 번 작성하면 변경이 불가능하다.
- 변경되는 정보에 대해서는 서블릿에서 담당한다.