작년에 이어 File, Dto 동시 요청 2탄입니다.
이전 글에서는 단일 File과 Dto를 동시에 요청받았습니다.
이번 글에서는 File과 Dto의 List를 Postman을 이용하여 요청하는 것을 다루려고 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Entity
@Data
@NoArgsConstructor
public class User {
@Id
String userId;
String password;
String profileImageUrl;
public User(UserSignUpReq userSignUpReq) {
this.userId = userSignUpReq.getUserId();
this.password = userSignUpReq.getPassword();
}
}
|
cs |
User Entity입니다.
테스트 용도이니 간단하게만 작성해줍니다.
1
2
3
4
5
|
@Data
public class UserSignUpReq {
String userId;
String password;
}
|
cs |
RequestDto 또한 간단하게 해줍니다.
1
2
3
4
5
6
7
8
9
10
|
@PostMapping("/signup")
public ResponseEntity<List<UserGetRes>> signUpUser(
@RequestPart(value = "multipartFileList") List<MultipartFile> multipartFileList,
@RequestPart(value = "userSignUpReqList") List<UserSignUpReq> userSignUpReqList) {
return new ResponseEntity<>(
userService.loginUser(
multipartFileList,
userSignUpReqList.stream().map(userSignUpReq -> new User(userSignUpReq)).collect(Collectors.toList())),
HttpStatus.OK);
}
|
cs |
그 다음 요청을 받을 Conrtoller입니다.
어노테이션은 @RequestPart로 이전과 같으며, 요청을 정상적으로 받았는지 확인하기 위해 List<ResDto>를 리턴합니다.
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
31
32
33
34
35
36
37
38
39
|
@Override
public List<UserGetRes> loginUser(List<MultipartFile> multipartFileList, List<User> userList) {
try {
String separ = File.separator;
String today = new SimpleDateFormat("yyMMdd").format(new Date());
File file = new File("");
String rootPath = file.getAbsolutePath().split("src")[0];
String savePath = rootPath + separ + "profileImage" + separ + today;
if (!new File(savePath).exists()) {
try {
new File(savePath).mkdirs();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
int len = multipartFileList.size();
for (int i = 0; i < len; i++) {
// multipartFileList와 userList의 길이가 무조건 같고, 순서가 일치하다고 가정한다.
MultipartFile multipartFile = multipartFileList.get(i);
String originFileName = multipartFile.getOriginalFilename();
String saveFileName = UUID.randomUUID().toString() + originFileName.substring(originFileName.lastIndexOf("."));
String filePath = savePath + separ + saveFileName;
multipartFile.transferTo(new File(filePath));
userList.get(i).setProfileImageUrl(filePath);
}
return userRepository.saveAll(userList).stream().map(user -> UserGetRes.of(user)).collect(Collectors.toList());
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
|
cs |
받은 요청을 처리할 Service입니다.
File과 User List의 길이와 순서가 같다고 가정하고 구현한 코드입니다.
중요한건 "File과 User의 List를 같이 받는 것" 입니다.
파일을 지정한 경로에 저장한 후 DB에 추가하는 로직이며, 이전 글에 List만 추가되었습니다.
우선 단일 File, Dto 요청 시에는 Body -> form-data에서 File 업로드 및 Dto는 json 방식으로 작성하면 된다고 하였습니다.
아 맞다 contentType 추가해야하는데
Dto 쪽에는 contentType을 application/json으로 맞춰줘야 합니다.
List를 추가한다고 해서 크게 달라질건 없었습니다.
File은 같은 value로 원하는 수만큼 추가하면 되고,
Dto는 똑같이 json 방식으로 작성해주고, List가 되었으니 대괄호 "[]" 만 추가하면 되겠습니다. (중괄호 "{}" 아닙니다!)
이제 Send를 누르면 데이터가 잘 들어가는 것을 확인할 수 있습니다.
확인해야할 부분은
Postman에서 입력할 KEY와 @RequestPart의 value로 지정한 값이 일치해야 한다는 것
같은 KEY로 파일을 등록하면 List가 된다는 것
Dto는 form-data에서 json 방식으로 등록해야 하며, List는 대괄호를 추가해야 한다는 것
Dto의 contentType을 application/json으로 맞춰야 한다는 것
정도가 되겠습니다.
'Spring' 카테고리의 다른 글
SpringBoot OAuth 적용 [Kakao - 1] (0) | 2022.10.14 |
---|---|
JPA order by rand() limit (0) | 2022.10.13 |
@IdClass를 이용하여 복합 키를 복합 키로 갖는 Entity 구현 (0) | 2022.04.13 |
Postman을 이용한 File, Dto 동시 Post요청 (8) | 2021.08.15 |
Pagenation이후 sort 문제 (0) | 2021.08.14 |