File download
Http response
Status + Headers + Body
> Status
- Response의 status를 간략하게 나타내는 부분
- Response를 해석하는데 필요한 정보 (Key:Value)
종류
- Content-Desposition(파일명)
- Content-Length(파일 크기)
- Content-Type(파일 유형)
- Content-Encoding(파일 encoding)
- 인증키
- etc
> Body
- Response의 실제 내용물
- 전송방식이 POST 방식일 때만 존재
- 용량 무제한
Controller
> @ResponseBody
- response data를 client로 전송할 때, JSON형식으로 response Object를 반환하고, MessageConverter가 해당 객체를 JSON|XML 문자열로 변환하여 response body로 전송
@ResponseBody
+ RESTful Web service +
- REpresentational State Transfer(표현상태전이) 원리에 따라 구현된 web service
- Resource를 URI(Untiform Resource Identifier)로 표현하고, HTTP Method(GET, POST, PUL, DELETE 등)를 사용하여 해당 자원에 대한 행위(조회, 생성, 수정, 삭제 등)를 표현
- 특징
- Resource 중심
모든 resource는 고유한 URI를 갖고 있으며, 이를 통해 자원 표현
- Message 중심
client와 server간의 통신은 HTTP message를 통해 이루어짐
- Self-descriptive(자체 표현)
message만으로도 resource에 대한 정보 충분히 전달
- Stateless(상태)
client와 server간의 통신은 state 유지 X, 따라서 client의 모든 request는 server에 완전한 정보를 포함
- Cacheable(캐시 가능)
client는 response를 cache할 수 있어야 하며, server는 cacheable한 응답을 전송
- Layered System(계층 구조)
client는 server와 직접 통신하거나, 다른 중간 server를 통해 통신
- JSON, XML 등 다양한 data 형식을 지원하여 data 교환의 효율성을 높일 수 있다.
- 현재 web service 분야에서 가장 보편적인 architecture 중 하나
+ controller 반환 형태 +
1. @responseBody
return "안녕하세요";
return ResponseEntity.ok().build();
- return a View
- View Object나 View의 경로 반환
return "/WEB-INF/views/test.jsp"
- ViewResolver가 수행
- View의 이름을 실제 JSP 파일의 경로로 변환하여 JSP file rendering
- redirect
- redirect할 대상 URL 반환
return "redirect:test";
- DispatcherServlet이 수행
- 해당 요청을 완전히 새로운 요청으로 처리
- browser에게 새로운 URL로 재요청하도록 응답
> ResponseEntity
public ResponseEntity<ByteArrayResource\> download(){
return ResponseEntity.ok().header().body();
}
- file의 header와 body를 설정해서 반환
HttpStatus
.ok()
응답 성공, 200
.notFound()
응답 실패, 404
.status()
status 구체적 명시
- 파일명(Content-Desposition)
- 파일 크기(Content-Length)
- 파일 유형(Content-Type)
- 파일 인코딩(Content-Encoding)
HttpBody
- response에 header만 있고 body는 없을 경우 ResponseEntity로 반환하기 위해 .build() 추가
return ResponseEntity.notFound().build();
return ResponseEntity.status(404).build();
- Spring web 통신에서의 resource
- Web application에서 사용되는 자원을 추상화하는 interface
- Web application 내부나 외부의 자원을 효율적으로 읽고 쓸 수 있음
- Resource는 file system, class path, URL, servlet context 등의 다양한 위치에서 자원을 읽고 쓸 수 있음
ByteArrayResource
- Spring Framework에서 제공하는 resource type 중 하나
- byte[]에 저장된 data를 resource 형태로 표현
- ResponseEntity class를 사용하여 ByteArrayResource 객체를 반환하면, ByteArrayResource에 저장된 byte[]을 HTTP response로 사용하여, file이나 database에 저장하지 않고도 client에게 바로 전송
> File download method
-
attachmentNo(PK) 입력받아 DB 조회
-
없으면 사용자에게 404 notFound 반환, 종료
-
있으면
- file 지정
- data를 byte[](Apache commons IO library 사용)로 변환
- byte[]를 ByteArrayResource로 변환
-
header 설정, body에 file data() 첨부, ReponseEntity 반환, spring이 나머지 처리
File dir = new File("D:/upload");
File target = new File(dir, String.valueOf(attachmentNo));
byte[] data = FileUtils.readFileToByteArray(target);
ByteArrayResource resource = new ByteArrayResource(data);
return ResponseEntity.ok().header().body(data);
resources/static
- static resource (정적 리소스)
- mapping url:
/**
URL
- Uniform Resource Locator
- 인터넷에서 웹 페이지, 이미지, 비디오 등 resource의 위치 가리키는 문자열
TABLE JOIN
- 어떻게 하면 기존 테이블과 이미지를 같이 조회할 수 있는가?
정규화
데이터가 나뉘어 있음
> INNER JOIN(내부 조인)
- 연결된 DATA만 출력
- matching되는 data만 조회
> OUTER JOIN(외부 조인)
- 특정 TABLE은 전부 조회(연결되지 않은 DATA도 조회)
- 기준(방향)이 필요
- 학원별 강의장 수
OUTER JOIN은 특정 TABLE을 기준으로 하여 연관된 데이터를 합쳐 조회
기준 테이블이 어느 위치에 있느냐에 따라 방향 결정
A ← B 면 A left outer join B
A → B 면 A right outer join B
A ↔ B 면 A full outer join B