AOS 팀원에게 게시글 등록 시 파일 데이터를 분리하여 요청할 수 있도록 변경해달라는 요청을 받았다.
기존에는 모든 데이터를(텍스트와 파일 정보) JSON 형식으로 전송하고 있었는데, 텍스트 데이터는 JSON 형식을 유지하면서 파일 데이터는 별도의 part로 전송하도록 수정하였다.
1. DTO 수정
기존 코드
public record PostRegisterRequestDto(
@NotBlank @JsonProperty("title") String title,
@NotBlank @JsonProperty("content") String content,
@NotNull @JsonProperty("type") ETopic type,
@Nullable @JsonProperty("imageFiles") List<MultipartFile> imageFiles){
}
수정된 코드
public record PostRegisterRequestDto(
@NotBlank @JsonProperty("title") String title,
@NotBlank @JsonProperty("content") String content,
@NotNull @JsonProperty("type") ETopic type){
}
DTO에서 imageFiles 필드를 제거했다. 텍스트 데이터만 담당하도록 변경되었다.
2. 컨트롤러 수정
기존 코드
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/posts")
public class PostController {
private final PostService postService;
// 게시글 등록
@PostMapping("/register")
public ResponseDto<PostRegisterResponseDto> registerPost(@UserId Long userId, @RequestBody PostRegisterRequestDto postRegisterRequestDto) {
Long postId = postService.registerPost(userId, postRegisterRequestDto);
return ResponseDto.ok(new PostRegisterResponseDto(postId));
}
}
수정된 코드
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/posts")
public class PostController {
private final PostService postService;
// 게시글 등록
@PostMapping("/register")
public ResponseDto<PostRegisterResponseDto> registerPost(@UserId Long userId,
@Valid @RequestPart("postRegisterRequest") PostRegisterRequestDto postRegisterRequestDto,
@RequestPart("imageFiles") List<MultipartFile> imageFiles) {
Long postId = postService.registerPost(userId, postRegisterRequestDto, imageFiles);
return ResponseDto.ok(new PostRegisterResponseDto(postId));
}
}
@RequestBody
를 @Valid @RequestPart("postRegisterRequest")
로 변경하였다. 이 변경은 multipart/form-data 요청의 특정 파트를 JSON 으로 파싱하여 DTO에 바인딩할 수 있게 해준다. @Valid
어노테이션은 DTO의 유효성 검사를 수행하기 위해 추가되었다.
새로운 파라미터 @RequestPart("imageFiles") List<MultipartFile> imageFiles
를 추가하여 파일 데이터를 별도로 받도록 수정했다.
하나의 요청에서 JSON 데이터와 파일 데이터를 분리하여 처리할 수 있게 되었다.
3. 서비스 수정
기존 코드
@Service
@RequiredArgsConstructor
public class PostService {
// ... (필드 선언 생략)
@Transactional
public Long registerPost(Long userId, PostRegisterRequestDto postRegisterRequestDto) {
User user = userRepository.findById(userId).orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_USER));
Post post = postRepository.saveAndFlush(Post.builder()
.writer(user)
.title(postRegisterRequestDto.title())
.content(postRegisterRequestDto.content())
.type(postRegisterRequestDto.type())
.build());
if (postRegisterRequestDto.imageFiles() != null && !postRegisterRequestDto.imageFiles().isEmpty()) {
uploadImages(post.getId(), postRegisterRequestDto.imageFiles());
}
return post.getId();
}
// ... (uploadImages 메소드 생략)
}
수정된 코드
@Service
@RequiredArgsConstructor
public class PostService {
// ... (필드 선언 생략)
@Transactional
public Long registerPost(Long userId, PostRegisterRequestDto postRegisterRequestDto, List<MultipartFile> imageFiles) {
User user = userRepository.findById(userId).orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_USER));
Post post = postRepository.saveAndFlush(Post.builder()
.writer(user)
.title(postRegisterRequestDto.title())
.content(postRegisterRequestDto.content())
.type(postRegisterRequestDto.type())
.build());
if (imageFiles != null && !imageFiles.isEmpty()) {
uploadImages(post.getId(), imageFiles);
}
return post.getId();
}
// ... (uploadImages 메소드 생략)
}
registerPost 메서드의 파라미터가 변경되어 PostRegisterRequestDto postRegisterRequestDto
, List<MultipartFile> imageFiles
를 별도로 받는다.
이미지 파일 처리 로직도 수정되었다. imageFiles가 null이 아니고 비어있지 않을 때 uploadImages 메서드를 호출한다.
'Projects > 청하-청년을 위한 커뮤니티 서비스' 카테고리의 다른 글
[청하] 7. 게시글 등록 기능 - 인가 권한 설정 (0) | 2024.10.07 |
---|---|
[청하] 6. 게시글 등록 기능 - @ModelAttribute를 이용한 form-data 처리 개선 (0) | 2024.10.07 |
[청하] 4. 게시글 등록 기능 구현 (feat. NCP Object Storage 파일 업로드) (1) | 2024.10.06 |
[청하] 3. GitHub Actions와 Docker를 이용한 CI/CD 코드 분석 (0) | 2024.06.22 |
[청하] 2. 데이터베이스 설계 (0) | 2024.06.21 |
댓글