File download


Http response

Status + Headers + Body

> Status

  • Response의 status를 간략하게 나타내는 부분

> Headers

  • 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();
  • MessageConverter가 수행
  1. return a View
  • View Object나 View의 경로 반환
    return "/WEB-INF/views/test.jsp"
  • ViewResolver가 수행
    • View의 이름을 실제 JSP 파일의 경로로 변환하여 JSP file rendering
  1. 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 구체적 명시

HttpHeaders

  • 파일명(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 지정
      File dir = new File("D:/upload");
      File target = new File(dir, String.valueOf(attachmentNo));
    
      // data를 byte[], ByteArrayResource로 변환
      byte[] data = FileUtils.readFileToByteArray(target);
      ByteArrayResource resource = new ByteArrayResource(data);
      
      // ResponseEntity 반환 (header 설정, body에 data(byte[]) 첨부)
      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
profile
programmerD

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN