Spring Boot - ResourceRegion

목차

Http Range Request

서버에서 클라이언트로 HTTP 메시지 중 일부만 전송할 수 있도록 허용하는 기술

  • 대용량의 미디어 파일, 파일 전송 중 일시 정지 및 다시 시작이 가능하다
  • Client 가 Range Header 를 통해 특정 리소스의 일부를 요청하면 서버가 그 부분만 전송하는 방식으로 동작한다.
  • Server 가 Range Request 를 지원하면 Response Http Header 에 Content-Range 가 존재한다.
  • HTTP Range 요청에 대한 정상 응답 코드로는 PARTIAL_CONTENT(206) 을 반환한다.
    • Range 요청에 대한 응답 값이 Body 에 담겨져 있다.

Spring Boot - ResourceRegion

  • HttpRange 는 Range Header 정보를 담든 객체다. Request Header 로부터 정보를 얻어올 수 있다.
  • ResourceRegion 는 전달 받은 Resource 객체 로부터 Range 범위 만큼 나눠 가져오는 객체다.
@RestController
@Slf4j
public class VideoController {

@GetMapping(value = "/video")
public ResponseEntity<ResourceRegion> streamVideo(@RequestHeader HttpHeaders headers) throws IOException {

UrlResource video = new UrlResource("file:/Users/dongwoo-yang/spring-file/mysong.mp4");
ResourceRegion resourceRegion;

final long size = 1000000L;

long contentLength = video.contentLength();
Optional<HttpRange> optional = headers.getRange().stream().findFirst();
HttpRange httpRange;

if (optional.isPresent()) {
httpRange = optional.get();

long start = httpRange.getRangeStart(contentLength);
long end = httpRange.getRangeEnd(contentLength);
long rangeLength = Long.min(size, end - start + 1);

resourceRegion = new ResourceRegion(video, start, rangeLength);
} else {
long rangeLength = Long.min(size, contentLength);
resourceRegion = new ResourceRegion(video, 0, rangeLength);
}

return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
.contentType(MediaTypeFactory.getMediaType(video).orElse(MediaType.APPLICATION_OCTET_STREAM))
.body(resourceRegion);
}
}

서버에서 전송해주는 Resource Size 가 1 MB(1000000) 로 잡혀 있어 1 MB 씩 부분적으로 응답받는 것을 확인할 수 있다.

동작 방식

Range Request Header

  • Request Header 를 살펴보면 Range Header 가 존재하는 것을 확인할 수 있고
  • Range Header 값에는 Range 의 시작 값을 Server 로 보낸다.

Range Request Header

Range Response Header

  • Response Header 를 살펴 보면 Content-Range Header 가 존재하는 것을 확인할 수 있다.
  • Content-Range Header 에는 전체 Resource 크기에서 응답한 Range 정보가 담겨 있다.

Range Response Header

Share