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}}">화면



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