2025년 8월 19일 화요일(59일차)

Jeonghoon·2025년 8월 19일

jeonghoon's Study

목록 보기
61/128

🌐 HTTP 및 파일 업로드/다운로드 복습 정리

📖 [ HTTP 개요 ]

항목설명
HTTPHyperText Transfer Protocol : 문자 이동 통신 규약
특징1) 무상태 프로토콜 (저장 기능 없음)
2) 독립적이며, 이전 통신과 연관 없음
3) TCP/IP 기반으로 동작 (IP 사용)

📍 주소 체계

항목예시설명
기본 구조http://ip번호:port번호/자원경로?쿼리스트링기본적인 HTTP 주소 체계
URLhttps://nid.naver.com/user2/join/agree네트워크 상의 자료 위치를 표시
URIhttps://nid.naver.com/user2/join/agree?lang=ko_KRURL + 쿼리스트링 포함

🧾 [ HTTP Header ]

항목설명
HTTP Method통신 요청을 분류하는 규칙 → GET, POST, PUT, DELETE
HTTP Content-Type데이터의 타입/정보를 명시하여 수신자가 인식할 수 있도록 함
HTTP Body실제 데이터가 담겨 전송되는 부분
HTTP Host요청을 받는 서버의 도메인 주소

📦 Content-Type 종류

Content-Type설명
text/htmlHTML 문서 (JSP 포함)
text/plain일반 텍스트 (String 반환)
application/jsonJSON 데이터 (REST API 주 데이터)
application/x-www-form-urlencodedHTML <form> 기본 데이터 전송 형식
multipart/form-data첨부파일 업로드용 대용량 데이터

🚀 [ HTTP 데이터 전송 방식 ]

방식설명사용 어노테이션
쿼리스트링 (GET, POST, PUT, DELETE)URL 뒤 ? 이후 매개변수 전달, 경로 노출로 보안 취약@RequestParam
Body (POST, PUT)fetch 옵션에 데이터를 포함, 경로 비노출로 보안 유리@RequestBody
form 마크업 (POST)<form> 데이터를 전송@ModelAttribute (생략 가능)

🔢 [ HTTP 응답 코드 ]

코드설명
1XX요청을 받고 진행 중
2XX요청 성공 및 응답 완료
200요청 성공 + 응답 데이터 존재
201저장 성공 + 응답 데이터 존재
204저장 성공 + 응답 데이터 없음
3XX요청 완료 위해 추가 조치 필요
4XX클라이언트 오류 (데이터, 매핑 문제 등)
400잘못된 요청 (쿼리, body, mapping 오류)
401인증 필요
403권한 거부
404요청 자원이 존재하지 않음
409리소스 중복
5XX서버 오류
500예기치 못한 서버 오류

⚙️ [.properties 설정]

설정 항목기본값설명
spring.servlet.multipart.max-file-size1MB업로드 파일의 최대 용량
spring.servlet.multipart.max-request-size10MB업로드 요청의 최대 용량
예시 설정10MB, 100MB 등으로 변경 가능

📁 [ 파일 업로드 관련 ]

항목설명
프로젝트 경로 확인System.getProperty("user.dir")
업로드 폴더 위치build/resources/main/static/upload/
파일명 중복 방지파일명 앞/뒤에 식별 가능한 문자열 추가
파일 업로드 인터페이스MultipartFile 지원

🧩 MultipartFile 주요 메소드

메소드설명
.getOriginalFilename()업로드된 파일명 반환
.transferTo(File 객체)지정한 경로로 업로드 파일 이동 (일반 예외 발생 가능)

📂 [ File 클래스 ]

메소드설명
.exists()지정한 경로 존재 여부 확인
.mkdirs()지정한 경로에 폴더 생성
.delete()지정한 경로의 파일 삭제

📤 [ HttpServletResponse ]

항목설명
클래스 설명다운로드 요청 사용자의 응답 객체 생성
브라우저별 다운로드 형식 지정java HttpServletResponse response;
URL은 한글을 지원하지 않으므로 인코딩 필요response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(oldFilename, "UTF-8"));

💾 [ 파일 입출력 스트림 ]

클래스메소드설명
FileInputStream.read(바이트배열)파일을 읽어와 바이트 배열에 저장
.close()스트림 닫기 (대용량 권장)
ServletOutputStream.write(바이트배열)바이트 배열을 사용자에게 출력
.close()스트림 닫기

💡 스트림이란? 바이트가 흐르는 통신 경로를 의미한다.


🧠 [ 기타 참고 사항 ]

항목설명
Statement.RETURN_GENERATED_KEYS자동 생성된 PK값 반환
ResultSet rs = ps.getGeneratedKeys()생성된 키값을 ResultSet으로 받음
Dto 설계 팁테이블 외 부가 정보(업로드/다운로드/합계 등)를 포함하면 유용
await 주의사항비동기 함수 안에서 await 사용 시, 호출하는 함수도 await 필요

🧩 JS 예시

// 특정 회원의 포인트 합계 가져오기
let point = await memberPoint();

// 이 메소드를 호출하는 함수도 await로 대기해야 함

0개의 댓글