1. 개요

정적 파일을 클라이언트에 제공하는 것은 다양한 방법으로 수행할 수 있으며 Spring Controller를 사용하는 것이 반드시 사용 가능한 최상의 옵션은 아닙니다.

그러나 때때로 컨트롤러 경로가 필요하며 이 빠른 사용방법(예제)에서 집중적으로 다룰 내용입니다.

2. 메이븐 의존성

먼저 pom.xml 에 의존성을 추가해야 합니다 .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

그게 우리가 여기서 해야 할 전부입니다. 버전 정보는 Maven Central 로 이동하십시오 .

3. @ResponseBody 사용

첫 번째 간단한 솔루션 은 컨트롤러 메서드에서 @ResponseBody 어노테이션을 사용하여 메서드에서 반환된 개체가 HTTP Response body에 직접 마샬링되어야 함을 나타내는 것입니다 .

@GetMapping("/get-text")
public @ResponseBody String getText() {
    return "Hello world";
}

이 메서드는 보다 일반적인 MVC 애플리케이션과 같이 이름이 Hello world 인 보기를 반환하는 대신 Hello world 문자열 만 반환합니다 .

@ResponseBody를 사용하면 처리하고 출력 스트림으로 마샬링할 수 있는 해당 HTTP 메시지 변환기가 있는 한 거의 모든 미디어 유형을 반환할 수 있습니다.

4. 이미지 반환을 위해 생성 사용

바이트 배열을 반환하면 이미지나 파일과 같은 거의 모든 것을 반환할 수 있습니다.

@GetMapping(value = "/image")
public @ResponseBody byte[] getImage() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

반환된 바이트 배열이 이미지임을 정의하지 않았기 때문에 클라이언트는 이를 이미지로 처리할 수 없습니다. 실제로 브라우저는 단순히 이미지의 실제 바이트를 표시할 가능성이 높습니다.

반환된 바이트 배열이 이미지에 해당하는지 정의하기 위해 @GetMapping 어노테이션 의 생성 특성을 반환된 개체의 MIME 유형으로 정확하게 설정할 수 있습니다.

@GetMapping(
  value = "/get-image-with-media-type",
  produces = MediaType.IMAGE_JPEG_VALUE
)
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

여기에서 생성은 MediaType.IMAGE_JPEG_VALUE 로 설정되어 반환된 개체가 JPEG 이미지로 처리되어야 함을 나타냅니다.

이제 브라우저는 Response body을 이미지로 인식하고 적절하게 표시합니다.

5. 원시 데이터 반환을 위해 생성 사용

반환하려는 개체의 유형에 따라 매개 변수 생성을 다양한 값(전체 List은 여기에서 찾을 수 있음)으로 설정할 수 있습니다.

원시 파일을 반환하려면 APPLICATION_OCTET_STREAM_VALUE를 사용하면 됩니다 .

@GetMapping(
  value = "/get-file",
  produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
)
public @ResponseBody byte[] getFile() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/data.txt");
    return IOUtils.toByteArray(in);
}

6. contentType을 동적으로 설정

이제 응답의 콘텐츠 유형을 동적으로 설정하는 방법을 설명하겠습니다. 이 경우 상수를 예상하기 때문에 produce 매개변수를 사용할 수 없습니다 . 대신 ResponseEntitycontentType을 직접 설정해야 합니다 .

@GetMapping("/get-image-dynamic-type")
@ResponseBody
public ResponseEntity<InputStreamResource> getImageDynamicType(@RequestParam("jpg") boolean jpg) {
    MediaType contentType = jpg ? MediaType.IMAGE_JPEG : MediaType.IMAGE_PNG;
    InputStream in = jpg ?
      getClass().getResourceAsStream("/com/baeldung/produceimage/image.jpg") :
      getClass().getResourceAsStream("/com/baeldung/produceimage/image.png");
    return ResponseEntity.ok()
      .contentType(contentType)
      .body(new InputStreamResource(in));
}

쿼리 매개변수에 따라 반환된 이미지의 콘텐츠 유형을 설정합니다.

7. 결론

이 짧은 기사에서 우리는 Spring Controller에서 이미지 또는 파일을 반환하는 간단한 문제에 대해 논의했습니다.

항상 그렇듯이 예제 코드는 Github에서 찾을 수 있습니다 .

res – REST with Spring (eBook) (everywhere)