JSP 파일 업로드
💡학습 목표💡
외부 라이브러리 없이 서블릿이 제공하는 자바 스펙으로 파일 업로드를 구현해 봅시다.
- HTTP 메세지에서 이진 데이터와 텍스트 형태를 알고 있는가?
- multipart/form-data MIME TYPE에 대해서 알아 보자.
- 스트림을 알고 있는가?
1. HTTP 메세지에서 이진 데이터와 텍스트 형태를 알고 있는가?
텍스트 기반 (MIME TYPE - text/plain )
이진데이터 (MIME TYPE - application/octet-stream )
application/octet-stream 타입으로 지정된 경우, 본문 데이터는 그대로 전송 됩니다. 이 MIME 타입은 바이너리 데이터를 나타내며, 서버가 이를 특별한 인코딩이나 디코딩 없이 원시 데이터로 취급하게 합니다.
💡집중 !💡
HTTP 통신에서는 데이터가 기본적으로 바이트 단위로 전송됩니다. 컴퓨터에서 모든 데이터는 결국 이진수로 표현되며, HTTP 통신에서도 마찬가지로 1과 0으로 이루어진 바이트 단위의 데이터로 전송됩니다. 그런데 왜 통신에 있어 데이터가 문자 단위로 전송 된다고도 이야기를 할까?
처음 학습하는 학생들에게 쉽게 이해할 수 있도록 하기 위함 입니다. 예를 들어, HTML 문서나 JSON 같은 텍스트 형식의 데이터는 문자 단위로 이해할 수 있기 때문에, 이를 문자 단위로 전송한다고 설명하는 것이 쉽게 이해하는 데 도움이 주기 위함 입니다.
하지만 조금 더 자세히 말하자면, 이 문자들은 결국 특정 인코딩(예: UTF-8)을 통해 바이트로 변환되어 전송됩니다.
2. multipart/form-data MIME TYPE에 대해서 알아 보자.
multipart/form-data는 주로 웹 애플리케이션에서 파일 업로드와 같은 복합적인 데이터 전송에 사용되는 형식입니다.
텍스트 데이터와 바이너리 데이터
- 텍스트 데이터: 텍스트 데이터는 일반적으로 문자로 이루어져 있으며, 전송 과정에서 특별한 변환 없이 텍스트 형식 그대로 전송됩니다. 텍스트 필드의 내용은 UTF-8과 같은 문자 인코딩을 통해 바이트 시퀀스로 변환되어 전송됩니다.
- 바이너리 데이터: 바이너리 데이터는 이미지, 오디오 파일, 비디오 파일 등과 같은 파일 형식으로 주로 나타납니다. 이 데이터는 원래의 바이너리 형식 그대로 전송됩니다.
multipart/form-data 형식의 특징은 데이터를 여러 부분(파트)으로 나누어 전송할 수 있다는 점입니다. 각 파트는 자체적으로 여러개의 (헤더와 바디)를 가지고 있으며, 이 파트들이 조합되어 전체 요청 본문을 구성합니다.
- Boundary (경계 문자열): 각 파트는 고유한 경계 문자열로 구분됩니다. 이 문자열은 요청 본문의 시작과 끝을 나타냅니다.
- Part Header (부분 헤더): 각 파트는 데이터에 대한 설명을 담고 있는 헤더를 포함할 수 있습니다. 예를 들어, 파일의 이름, 필드 이름, 데이터의 유형(Content-Type) 등을 포함할 수 있습니다.
- Part Body (부분 본문): 여기에는 실제 데이터가 들어갑니다. 예를 들어, 텍스트 필드의 내용이나 업로드된 파일의 내용이 포함됩니다.
시나리오 코드 (새 프로젝트 생성 - jsp_file_upload_ex)
index.jsp
FileUploadController.class
이미지 뿌리기
ImageListController.class
list.jsp