[스트링부트]Multipart 파일 전송

gov's avatar
Dec 05, 2024
[스트링부트]Multipart 파일 전송
💡
HTTP 요청을 여러 부분으로 나누어 데이터를 전송하는 방식. 파일과 텍스트 데이터를 함께 보내고 싶을 때 사용. 각 파트는 어떤 데이터 인지를 알려주는 정보를 포함.

multipart/form-data 웹에 파일을 업로드나 여러 종류의 데이터를 함께 전송할 때 사용하는 데이터 포맷. HTML <form> 태그의 enctype 속성에서 multipart/form-data를 지정해 사용.

스트링부트 적용 코드

1. Entity 정의

  • 파일 정보와 사용자 정보를 저장할 엔티티 생성.
@Entity @Table(name = "upload_tb") public class Upload { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; // id는 필수 private String username; private String profileUrl; @Builder public Upload(Integer id, String username, String profileUrl) { this.id = id; this.username = username; this.profileUrl = profileUrl; } }

2. HTML Form 작성

  • multipart/form-data를 설정하여 파일과 텍스트 데이터를 전송. name 속성은 폼 데이터 서버 전송시, 데이터를 식별하는 키(key).
<form action="/v1/upload" method="post" enctype="multipart/form-data"> <input type="text" name="username"> <br> <input type="file" name="img"> <br> <button type="submit">전송</button> </form>

3. DTO 생성

  • 파일 전송 시 데이터를 매핑하기 위한 DTO 생성.
@Data public static class V1DTO { private String username; private MultipartFile img; public Upload toEntity(String profileUrl) { return Upload.builder() .username(username) .profileUrl(profileUrl) .build(); } }

4. Service 구현

  • 파일 저장과 DB 저장 로직을 처리.
  • UUID을 활용하여 동일한 이름의 파일 업로드 충돌 방지.
@Transactional public void v1사진저장(UploadRequest.V1DTO v1DTO) { String imgName = UUID.randomUUID() + "_" + v1DTO.getImg().getOriginalFilename(); String profileUrl = "images/" + imgName; String dbUrl = "/upload/" + imgName; try { Path path = Paths.get(profileUrl); Files.write(path, v1DTO.getImg().getBytes()); uploadRepository.save(v1DTO.toEntity(dbUrl)); } catch (IOException e) { throw new RuntimeException(e.getMessage()); } } public Upload v1사진보기() { return uploadRepository.findById(1); } }

5. 리소스 매핑 설정

  • 저장된 파일을 외부 접근 가능하게 리소스 핸들러 등록.
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/upload/**") .addResourceLocations("file:" + "./images/") .setCachePeriod(3600); } }

6. 사진 확인 HTML

  • 업로드된 사진 정보를 표시.
<h1>{{model.username}}</h1> <img src="{{model.profileUrl}}">
 

화면

notion image
notion image
notion image
 

사용 기능

1. UUID (Universally Unique Identifier)

  • 분산 시스템에서 고유한 식별자 생성에 사용
  • 특징
      1. 128비트로 구성된 식별자
        1. f47ac10b-58cc-4372-a567-0e02b2c3d479
      1. 충돌 가능성 낮음: 동일한 UUID가 생성될 가능성은 매우 낮아, 파일 이름, 데이터베이스 키 등 고유성이 중요한 곳에 사용
      1. 자체 생성 가능: 네트워크 연결 없이 로컬에 생성 가능
  • 사용방식
    • String imgName = UUID.randomUUID() + "_" + v1DTO.getImg().getOriginalFilename();
    • UUID.randomUUID()
      • 새로 고유한 UUID를 생성. 항상 새로운 값이 반환되며, 충돌할 가능성은 거의 없음.
    • getOriginalFilename()
      • 업로드된 파일의 원래 이름을 가져와서 UUID와 결합한 고유한 파일 이름을 만듬
 
Share article

goho