diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostImageMapper.java b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostImageMapper.java index e2c366c..d795d9c 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostImageMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostImageMapper.java @@ -35,4 +35,16 @@ default List toEntityList(List uploadedUrls, Post post) { .collect(Collectors.toList()); } + // List → List 변환 + default List toImageUrls(List postImages) { + if (postImages == null || postImages.isEmpty()) { + return Collections.emptyList(); + } + + return postImages.stream() + .filter(img -> img.getDeletedAt() == null) + .map(PostImage::getImageUrl) + .collect(Collectors.toList()); + } + } diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java index 00b01dd..6d5d86d 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java @@ -10,7 +10,7 @@ import java.util.Objects; import java.util.stream.Collectors; -@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = PostImageMapper.class) public interface PostMapper { // ✅ 게시글 목록용 DTO 변환 @@ -34,30 +34,13 @@ public interface PostMapper { @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) void updatePostFromDto(PostUpdateRequestDto updateDto, @MappingTarget Post post); - // ✅ 게시글 상세 보기용 DTO (imageUrls 수동으로 처리) - // 상세용 DTO (default 메서드 내부에 userId 수동 추가) - default PostDetailResponseDto toPostDetailDto(Post post) { - return PostDetailResponseDto.builder() - .postId(post.getId()) - .userId(post.getUser().getId()) // 🔥 추가 - .nickName(post.getUser().getNickname()) - .title(post.getTitle()) - .content(post.getDisplayContent()) - .createdAt(post.getCreatedAt()) - .postType(post.getPostType().getKoreanName()) - .recommendCnt(post.getRecommendCnt()) - .viewCnt(post.getViewCnt()) - .urlTitle(post.getUrlTitle()) - .urlPath(post.getUrlPath()) - .tags(post.getTags()) - .imageUrls( - post.getPostImages().stream() - .filter(img -> img.getDeletedAt() == null) - .map(PostImage::getImageUrl) - .collect(Collectors.toList()) - ) - .recommended(false) - .build(); - } + @Mapping(source = "id", target = "postId") + @Mapping(source = "user.id", target = "userId") + @Mapping(source = "user.nickname", target = "nickName") + @Mapping(target = "content", expression = "java(post.getDisplayContent())") + @Mapping(source = "postType.koreanName", target = "postType") + @Mapping(target = "recommended", constant = "false") + @Mapping(source = "postImages", target = "imageUrls") + PostDetailResponseDto toPostDetailDto(Post post); } diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java b/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java index 7fa4b4e..5fc0c8e 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java @@ -141,7 +141,7 @@ public PostDetailResponseDto createPost(PostCreateRequestDto requestDto, Long us List postImages = processPostImages(requestDto.getImages(), savedPost); if (!postImages.isEmpty()) { postImageRepository.saveAll(postImages); - savedPost.setPostImages(postImages); // ✅ 이 줄이 핵심 + savedPost.setPostImages(postImages); } } @@ -149,7 +149,7 @@ public PostDetailResponseDto createPost(PostCreateRequestDto requestDto, Long us userPointService.addPointForAction(userId, PointActionType.POST_CREATION); log.info("사용자 {}에게 게시글 작성 포인트가 부여되었습니다.", userId); - return postMapper.toPostDetailDto(savedPost); // ✅ Mapper가 imageUrls 포함해서 반환 + return postMapper.toPostDetailDto(savedPost); } @@ -177,21 +177,29 @@ public PostDetailResponseDto updatePost(Long postId, PostUpdateRequestDto update // 이미지 업데이트 처리 if (updateDto.getImages() != null && !updateDto.getImages().isEmpty()) { - // 기존 이미지 soft delete 처리 - List existingImages = postImageRepository.findByPostAndDeletedAtIsNull(post); - for (PostImage image : existingImages) { - image.softDelete(); - } - postImageRepository.saveAll(existingImages); + updatePostImages(post, updateDto.getImages()); + } - // 새 이미지 추가 - List newImages = processPostImages(updateDto.getImages(), post); - if (!newImages.isEmpty()) { - postImageRepository.saveAll(newImages); - } + // 업데이트 후 최신 상태로 다시 조회 + Post updatedPost = postRepository.findByIdAndDeletedAtIsNull(postId) + .orElseThrow(() -> new EntityNotFoundException("게시글을 찾을 수 없습니다")); + + return postMapper.toPostDetailDto(updatedPost); + } + + private void updatePostImages(Post post, List newImages) { + // 기존 이미지 soft delete 처리 + List existingImages = postImageRepository.findByPostAndDeletedAtIsNull(post); + for (PostImage image : existingImages) { + image.softDelete(); } + postImageRepository.saveAll(existingImages); - return postMapper.toPostDetailDto(post); + // 새 이미지 추가 + List newPostImages = processPostImages(newImages, post); + if (!newPostImages.isEmpty()) { + postImageRepository.saveAll(newPostImages); + } } /** diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html deleted file mode 100644 index e69de29..0000000