티스토리 뷰

반응형

 영화 api를 구현하면서 영화의 정보와 함께 영화 포스터 이미지를 저장했다. 파일 업로드를 구현하고 저장하고 테스트한 것을 기록한다.

 

MultipartFile

 HTTP에서 클라이언트가 파일과 데이터를 HTTP 서버로 보내기 위해서는 멀티파트 요청을 사용한다.

 스프링에는 멀티파트 요청을 처리하기 위한 MultipartFile 인터페이스가 존재한다. 멀티파트 요청에서 수신된 업로드 파일의 표현이고 파일 내용은 메모리 혹은 일시적으로 디스크에 저장된다. 임시 저장소이기 때문에 요청이 끝나면 파일 내용이 지워진다. 따라서 파일 내용을 다른 저장소에 저장을해야 한다.  이 MultipartFile 인터페이스를 사용해서 파일 업로드를 처리하면 된다.

 

Controller

public record RequestCreateMovie(
	@NotBlank String name,
	@NotNull LimitAge limitAge,
	@NotNull Genre genre,
	@NotNull Integer runningTime,
	@NotNull MultipartFile poster
) {
}

 요청 데이터를 받기 위한 dto이다. 영화 정보를 저장할 때 영화의 이름(name), 나이(limitAge), 장르(genre), 러닝타임(runningTime), 포스터 이미지(poster) 이미지를 받아온다. 해당 dto를 컨트롤러의 파라미터에 넣어주면 요청시 자동적으로 데이터를 받아온다.

 

controller 코드

 여기서 주의할 점은 dto 앞에 @ModelAttribute 어노테이션을 붙여주어야 한다. 그럼 요청시 자연스럽게 데이터가 바인딩된다.

 

poster에서 파일을 저장하는 코드

 MultipartFile은 임시적으로 저장되어 요청이 끝나면 데이터가 사라지기 때문에 파일을 저장하는 코드가 필요하다. posterPath는 파일이 저장될 위치와 파일명과 파일의 확장자가 합쳐진 경로이다. 이 경로를 인자로 File 인스턴스를 생성한다. 

 getInputStream 메서드를 사용해서 InputStream을 가져온 다음 InputStream에서 바이트를 읽고 byte 버퍼에 저장한다. 그리고 OutputStream을 생성하여 버퍼 내용을 파일에 쓰면 된다.

 포스터가 저장되는 경로는 [현재 프로젝트의 경로] + [지정한 경로]가 된다.

 

PostMan으로 전송하기

 포스트맨으로 파일을 전송할 수 있다. 여기서 헤맸기 때문에 이미지를 통해서 자세하게 기록하겠다.

 

Text/File 중 File을 선택

 PostMan으로 파일을 보내기 위해서는 key 항목을 file로 선택을 해주어야 한다. key의 이름 위에 마우스를 가져가면 key 이름의 오른쪽에 Text/File을 선택할 수 있는 메뉴가나온다. 여기서 File을 선택하면 파일을 업로드할 수 있게 변경된다.

 

File 항목 선택 후

 File 항목을 선택하면 VALUE에 Select Files 버튼이 나타난다. 이 버튼을 누르고 파일을 업로드하면 된다.

 

테스트

 MultipartFile는 인터페이스이기 때문에 MultipartFile로 직접 테스트를 위한 구현체를 만들수는 없다. 테스트를 위한 구현체를 만들기 위해서는 MockMultipartFile 클래스를 사용한다.

 

MockMultipartFile을 사용하는 방법

 MockMultipartFile 인스턴스를 생성할 때 content 내용을 입력해야 한다. content는 byte 배열이기 때문에 getBytes를 사용해서 바이트 배열을 만들면 된다.

 

파일 전송 완료

 파일이 전송 완료된 것을 확인할 수 있다.

 

참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함