티스토리 뷰

이미지 또는 파일을 리턴하고 싶을 때가 있다.


예를 들어 사용자가 http://도메인/api/images/1 같은 경로로 요청을 보냈을 때 이미지를 리턴하도록 만들어보자.

@ResponseBody

@ResponseBody 어노테이션을 사용함으로써 HTTP response body에 데이터를 그대로 담아서 전송할 수 있다. 이 어노테이션이 없다면 Spring은 View resolver를 통해 view 파일을 찾으려 할 것이다.

직렬화된(byte[]) 이미지나 파일을 리턴하기 위해 @ResponseBody 어노테이션을 Request Mapping 할 메소드에 붙이도록 하자.

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

@GetMapping의 produces 속성 설정

byte array로 파일이나 이미지를 리턴하면, 브라우저는 이것이 파일인지 이미지인지 알수가 없다. GetMapping의 produces 속성을 설정하면 브라우저가 응답이 어떤 내용인지 인식할 수 있다. png 이미지를 내보내고 싶다면 아래처럼 메서드를 작성하면 된다.

@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);
}

IOUtils.toByteArray 메서드는 apache의 API이며 스트림의 내용을 직렬화한 뒤 반환한다. 


만약 JSON 데이터를 다루기 위해 Jackson 라이브러리를 사용한다면, produces 속성을 설정하지 않아도 List, Map 등의 컬렉션을 자동으로 JSON 문자열로 바꾸어 응답으로 내보낸다.

결과

위처럼 REST API로 이미지를 리턴하도록 만든 URL에 요청하여 아래 그림 1과 같은 결과가 나온다면 성공한 것이다.

[그림 1] 이미지 리턴



참고

http://www.baeldung.com/spring-controller-return-image-file

'프로그래밍 > Web' 카테고리의 다른 글

Maven 프로젝트 나눠서 관리하기  (0) 2019.03.05
Spring Error Page  (0) 2018.08.09
Spring REST API 이미지 또는 파일을 리턴하기  (4) 2018.08.09
Spring controller에서 webapp 폴더 경로 찾기  (0) 2018.08.02
Spring MVC와 Dispatcher Servlet  (0) 2018.07.19
Spring JDBC  (0) 2018.07.19
댓글
  • 프로필사진 갓해머 produces = MediaType.IMAGE_JPEG_VALUE
    혹시 이거 쓸려면 종속성을 추가해야하나요? 406에러가 뜨네요
    2020.02.18 04:26
  • 프로필사진 궁금 감사합니다. 그런데 여러개 이미지가 담긴 list나 배열은 어떻게 어떻게 view에서 이미지로 바로 볼수있나요? 2020.10.25 22:35
  • 프로필사진 국윤창 본문의 내용은 이미지 하나의 데이터를 body로 내려주고 그걸 브라우저에서 보여주는것이라 여러개의 이미지를 한번에 보여주는건 안됩니다.
    한번에 이미지 리스트를 바디로 내려주고 싶다면 다운로드 방식으로 구현하시는게 좋을 것 같습니다.
    2020.10.25 22:54 신고
  • 프로필사진 국윤창 아니면 연관된 이미지의 url 리스트를 내려주는것도 좋은 방법일 것 같네요~ 2020.10.25 22:55 신고
댓글쓰기 폼