From 0a90f700f31f7bed817553a52a16dd640c94855e Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Sun, 12 Jan 2025 18:43:08 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor:=20CascadeType=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/staccato/moment/domain/Moment.java | 17 +++----- .../staccato/moment/domain/MomentImages.java | 43 +++++++++++++++---- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/backend/src/main/java/com/staccato/moment/domain/Moment.java b/backend/src/main/java/com/staccato/moment/domain/Moment.java index 2c179598c..a98d286e2 100644 --- a/backend/src/main/java/com/staccato/moment/domain/Moment.java +++ b/backend/src/main/java/com/staccato/moment/domain/Moment.java @@ -71,17 +71,12 @@ private void validateIsWithinMemoryDuration(LocalDateTime visitedAt, Memory memo } } - public void update(String title, MomentImages newMomentImages) { - this.title = title; - this.momentImages.update(newMomentImages, this); - } - - public void update(Moment updatedMoment) { - this.visitedAt = updatedMoment.getVisitedAt(); - this.title = updatedMoment.getTitle(); - this.spot = updatedMoment.getSpot(); - this.momentImages.update(updatedMoment.momentImages, this); - this.memory = updatedMoment.getMemory(); + public void update(Moment newMoment) { + this.visitedAt = newMoment.getVisitedAt(); + this.title = newMoment.getTitle(); + this.spot = newMoment.getSpot(); + this.momentImages.update(newMoment.momentImages, this); + this.memory = newMoment.getMemory(); } public String getThumbnailUrl() { diff --git a/backend/src/main/java/com/staccato/moment/domain/MomentImages.java b/backend/src/main/java/com/staccato/moment/domain/MomentImages.java index d7410220d..ccd4074a4 100644 --- a/backend/src/main/java/com/staccato/moment/domain/MomentImages.java +++ b/backend/src/main/java/com/staccato/moment/domain/MomentImages.java @@ -15,7 +15,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class MomentImages { private static final int MAX_COUNT = 5; - @OneToMany(mappedBy = "moment", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "moment", cascade = CascadeType.PERSIST) private List images = new ArrayList<>(); public MomentImages(List addedImages) { @@ -38,16 +38,43 @@ protected void addAll(MomentImages newMomentImages, Moment moment) { }); } - protected void update(MomentImages momentImages, Moment moment) { - removeExistsImages(new ArrayList<>(images)); - addAll(momentImages, moment); + public boolean isNotEmpty() { + return !images.isEmpty(); } - private void removeExistsImages(List originalImages) { - originalImages.forEach(this.images::remove); + protected void update(MomentImages newMomentImages, Moment moment) { + removeExistImages(newMomentImages); + saveNewImages(newMomentImages, moment); } - public boolean isNotEmpty() { - return !images.isEmpty(); + private void removeExistImages(MomentImages newMomentImages) { + List momentImages = findImagesNotPresentIn(newMomentImages); + images.removeAll(momentImages); + } + + private void saveNewImages(MomentImages newMomentImages, Moment moment) { + List momentImages = newMomentImages.findImagesNotPresentIn(this); + momentImages.forEach(image -> { + this.images.add(image); + image.belongTo(moment); + }); + } + + public List findRemovalImageIds(MomentImages newMomentImages) { + List momentImages = findImagesNotPresentIn(newMomentImages); + return momentImages.stream() + .map(MomentImage::getId) + .toList(); + } + + private List findImagesNotPresentIn(MomentImages targetMomentImages) { + return images.stream() + .filter(image -> !targetMomentImages.contains(image)) + .toList(); + } + + private boolean contains(MomentImage momentImage) { + return this.images.stream() + .anyMatch(image -> image.getImageUrl().equals(momentImage.getImageUrl())); } } From ee72d70e9ca1480f53d37bbaaf09c49346ed5765 Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Sun, 12 Jan 2025 18:43:50 +0900 Subject: [PATCH 2/7] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EB=8F=99=20=EC=82=AD=EC=A0=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memory/service/MemoryService.java | 2 +- .../repository/MomentImageRepository.java | 8 +++-- .../moment/service/MomentService.java | 27 ++++++++++------- .../repository/MomentImageRepositoryTest.java | 29 ++++++++++++++++--- .../moment/service/MomentServiceTest.java | 15 ++++++++-- 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/com/staccato/memory/service/MemoryService.java b/backend/src/main/java/com/staccato/memory/service/MemoryService.java index 4b42423dd..6371fff8a 100644 --- a/backend/src/main/java/com/staccato/memory/service/MemoryService.java +++ b/backend/src/main/java/com/staccato/memory/service/MemoryService.java @@ -128,7 +128,7 @@ private void deleteAllRelatedMemory(long memoryId) { .stream() .map(Moment::getId) .toList(); - momentImageRepository.deleteAllByMomentIdInBatch(momentIds); + momentImageRepository.deleteAllByMomentIdInBulk(momentIds); commentRepository.deleteAllByMomentIdInBatch(momentIds); momentRepository.deleteAllByMemoryIdInBatch(memoryId); memoryMemberRepository.deleteAllByMemoryIdInBatch(memoryId); diff --git a/backend/src/main/java/com/staccato/moment/repository/MomentImageRepository.java b/backend/src/main/java/com/staccato/moment/repository/MomentImageRepository.java index 85b62a773..fd163a996 100644 --- a/backend/src/main/java/com/staccato/moment/repository/MomentImageRepository.java +++ b/backend/src/main/java/com/staccato/moment/repository/MomentImageRepository.java @@ -1,7 +1,6 @@ package com.staccato.moment.repository; import java.util.List; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -9,9 +8,12 @@ import com.staccato.moment.domain.MomentImage; public interface MomentImageRepository extends JpaRepository { - Optional findFirstByMomentId(long momentId); @Modifying @Query("DELETE FROM MomentImage mi WHERE mi.moment.id In :momentIds") - void deleteAllByMomentIdInBatch(@Param("momentIds") List momentIds); + void deleteAllByMomentIdInBulk(@Param("momentIds") List momentIds); + + @Modifying + @Query("DELETE FROM MomentImage mi WHERE mi.id In :ids") + void deleteAllByIdInBulk(@Param("ids") List ids); } diff --git a/backend/src/main/java/com/staccato/moment/service/MomentService.java b/backend/src/main/java/com/staccato/moment/service/MomentService.java index 074c65fba..7fe565a70 100644 --- a/backend/src/main/java/com/staccato/moment/service/MomentService.java +++ b/backend/src/main/java/com/staccato/moment/service/MomentService.java @@ -12,6 +12,7 @@ import com.staccato.memory.repository.MemoryRepository; import com.staccato.moment.domain.Feeling; import com.staccato.moment.domain.Moment; +import com.staccato.moment.domain.MomentImages; import com.staccato.moment.repository.MomentImageRepository; import com.staccato.moment.repository.MomentRepository; import com.staccato.moment.service.dto.request.FeelingRequest; @@ -43,11 +44,6 @@ public MomentIdResponse createMoment(MomentRequest momentRequest, Member member) return new MomentIdResponse(moment.getId()); } - private Memory getMemoryById(long memoryId) { - return memoryRepository.findById(memoryId) - .orElseThrow(() -> new StaccatoException("요청하신 추억을 찾을 수 없어요.")); - } - public MomentLocationResponses readAllMoment(Member member) { return new MomentLocationResponses(momentRepository.findAllByMemory_MemoryMembers_Member(member) .stream() @@ -72,13 +68,17 @@ public void updateMomentById( Memory targetMemory = getMemoryById(momentRequest.memoryId()); validateMemoryOwner(targetMemory, member); - Moment updatedMoment = momentRequest.toMoment(targetMemory); - moment.update(updatedMoment); + Moment newMoment = momentRequest.toMoment(targetMemory); + MomentImages oringMomentImages = moment.getMomentImages(); + List removalImageIds = oringMomentImages.findRemovalImageIds(newMoment.getMomentImages()); + momentImageRepository.deleteAllByIdInBulk(removalImageIds); + + moment.update(newMoment); } - private Moment getMomentById(long momentId) { - return momentRepository.findById(momentId) - .orElseThrow(() -> new StaccatoException("요청하신 스타카토를 찾을 수 없어요.")); + private Memory getMemoryById(long memoryId) { + return memoryRepository.findById(memoryId) + .orElseThrow(() -> new StaccatoException("요청하신 추억을 찾을 수 없어요.")); } @Transactional @@ -86,7 +86,7 @@ public void deleteMomentById(long momentId, Member member) { momentRepository.findById(momentId).ifPresent(moment -> { validateMemoryOwner(moment.getMemory(), member); commentRepository.deleteAllByMomentIdInBatch(List.of(momentId)); - momentImageRepository.deleteAllByMomentIdInBatch(List.of(momentId)); + momentImageRepository.deleteAllByMomentIdInBulk(List.of(momentId)); momentRepository.deleteById(momentId); }); } @@ -99,6 +99,11 @@ public void updateMomentFeelingById(long momentId, Member member, FeelingRequest moment.changeFeeling(feeling); } + private Moment getMomentById(long momentId) { + return momentRepository.findById(momentId) + .orElseThrow(() -> new StaccatoException("요청하신 스타카토를 찾을 수 없어요.")); + } + private void validateMemoryOwner(Memory memory, Member member) { if (memory.isNotOwnedBy(member)) { throw new ForbiddenException(); diff --git a/backend/src/test/java/com/staccato/moment/repository/MomentImageRepositoryTest.java b/backend/src/test/java/com/staccato/moment/repository/MomentImageRepositoryTest.java index 793c52f3d..a4bcfb15d 100644 --- a/backend/src/test/java/com/staccato/moment/repository/MomentImageRepositoryTest.java +++ b/backend/src/test/java/com/staccato/moment/repository/MomentImageRepositoryTest.java @@ -14,6 +14,7 @@ import com.staccato.memory.domain.Memory; import com.staccato.memory.repository.MemoryRepository; import com.staccato.moment.domain.Moment; +import com.staccato.moment.domain.MomentImage; import com.staccato.moment.domain.MomentImages; import static org.assertj.core.api.Assertions.assertThat; @@ -30,9 +31,9 @@ class MomentImageRepositoryTest { @PersistenceContext private EntityManager em; - @DisplayName("특정 스타카토의 id 여러개를 가지고 있는 모든 스타카토 이미지들을 삭제한다.") + @DisplayName("특정 스타카토의 id 여러개를 가지고 있는 모든 스타카토 이미지들을 벌크 삭제한다.") @Test - void deleteAllByMomentIdInBatch() { + void deleteAllByMomentIdInBulk() { // given Memory memory = memoryRepository.save(MemoryFixture.create(LocalDate.of(2023, 12, 31), LocalDate.of(2024, 1, 10))); Moment moment1 = momentRepository.save(MomentFixture @@ -41,8 +42,7 @@ void deleteAllByMomentIdInBatch() { .createWithImages(memory, LocalDateTime.of(2023, 12, 31, 22, 20), new MomentImages(List.of("url1", "url2")))); // when - momentImageRepository.deleteAllByMomentIdInBatch(List.of(moment1.getId(), moment2.getId())); - em.flush(); + momentImageRepository.deleteAllByMomentIdInBulk(List.of(moment1.getId(), moment2.getId())); em.clear(); // then @@ -54,4 +54,25 @@ void deleteAllByMomentIdInBatch() { .isNotEmpty()).isFalse() ); } + + @DisplayName("특정 스타카토 이미지들을 벌크 삭제한다.") + @Test + void deleteAllByIdInBulk() { + // given + Memory memory = memoryRepository.save(MemoryFixture.create(LocalDate.of(2023, 12, 31), LocalDate.of(2024, 1, 10))); + MomentImages momentImages = new MomentImages(List.of("url1", "url2", "url3")); + Moment moment = momentRepository.save(MomentFixture.createWithImages(memory, LocalDateTime.of(2023, 12, 31, 22, 20), momentImages)); + + List imageIds = moment.getMomentImages() + .getImages() + .stream() + .map(MomentImage::getId) + .toList(); + + // when + momentImageRepository.deleteAllByIdInBulk(imageIds); + + // then + assertThat(momentImageRepository.findAll()).isEmpty(); + } } diff --git a/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java b/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java index 12d1f1493..a620d4a84 100644 --- a/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java +++ b/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java @@ -23,6 +23,7 @@ import com.staccato.memory.repository.MemoryRepository; import com.staccato.moment.domain.Feeling; import com.staccato.moment.domain.Moment; +import com.staccato.moment.domain.MomentImage; import com.staccato.moment.domain.MomentImages; import com.staccato.moment.repository.MomentImageRepository; import com.staccato.moment.repository.MomentRepository; @@ -78,7 +79,8 @@ void createMomentWithMomentImages() { // then assertAll( () -> assertThat(momentRepository.findById(momentId)).isNotEmpty(), - () -> assertThat(momentImageRepository.findFirstByMomentId(momentId)).isNotEmpty() + () -> assertThat(momentImageRepository.findAll().size()).isEqualTo(1), + () -> assertThat(momentImageRepository.findAll().get(0).getMoment().getId()).isEqualTo(momentId) ); } @@ -185,12 +187,19 @@ void updateMomentById() { Moment moment = saveMomentWithImages(memory); // when - MomentRequest momentRequest = new MomentRequest("newStaccatoTitle", "placeName", "newAddress", BigDecimal.ONE, BigDecimal.ONE, LocalDateTime.now(), memory2.getId(), List.of("https://existExample.com.jpg", "https://existExample2.com.jpg")); + MomentRequest momentRequest = new MomentRequest("newStaccatoTitle", "placeName", "newAddress", BigDecimal.ONE, BigDecimal.ONE, LocalDateTime.now(), memory2.getId(), List.of("https://existExample.com.jpg", "https://newExample.com.jpg")); momentService.updateMomentById(moment.getId(), momentRequest, member); // then Moment foundedMoment = momentRepository.findById(moment.getId()).get(); - assertThat(foundedMoment.getTitle()).isEqualTo("newStaccatoTitle"); + List images = momentImageRepository.findAll(); + assertAll( + () -> assertThat(foundedMoment.getTitle()).isEqualTo("newStaccatoTitle"), + () -> assertThat(foundedMoment.getMemory().getId()).isEqualTo(memory2.getId()), + () -> assertThat(images.size()).isEqualTo(2), + () -> assertThat(images.get(0).getImageUrl()).isEqualTo("https://existExample.com.jpg"), + () -> assertThat(images.get(1).getImageUrl()).isEqualTo("https://newExample.com.jpg") + ); } @DisplayName("본인 것이 아닌 스타카토를 수정하려고 하면 예외가 발생한다.") From 7c66f2d879b429e1d7020e51b1210bad9b3e51d6 Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Sun, 12 Jan 2025 19:46:58 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor:=20Batch=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20Bulk=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/staccato/comment/repository/CommentRepository.java | 2 +- .../staccato/memory/repository/MemoryMemberRepository.java | 2 +- .../java/com/staccato/memory/service/MemoryService.java | 6 +++--- .../com/staccato/moment/repository/MomentRepository.java | 2 +- .../java/com/staccato/moment/service/MomentService.java | 2 +- .../staccato/comment/repository/CommentRepositoryTest.java | 4 ++-- .../memory/repository/MemoryMemberRepositoryTest.java | 4 ++-- .../staccato/moment/repository/MomentRepositoryTest.java | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/com/staccato/comment/repository/CommentRepository.java b/backend/src/main/java/com/staccato/comment/repository/CommentRepository.java index a128142c1..ebfaf0247 100644 --- a/backend/src/main/java/com/staccato/comment/repository/CommentRepository.java +++ b/backend/src/main/java/com/staccato/comment/repository/CommentRepository.java @@ -12,5 +12,5 @@ public interface CommentRepository extends JpaRepository { @Modifying @Query("DELETE FROM Comment c WHERE c.moment.id IN :momentIds") - void deleteAllByMomentIdInBatch(@Param("momentIds") List momentIds); + void deleteAllByMomentIdInBulk(@Param("momentIds") List momentIds); } diff --git a/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java b/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java index 03da35f58..dd82554e9 100644 --- a/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java +++ b/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java @@ -25,5 +25,5 @@ public interface MemoryMemberRepository extends JpaRepository { @Modifying @Query("DELETE FROM Moment m WHERE m.memory.id = :memoryId") - void deleteAllByMemoryIdInBatch(@Param("memoryId") Long memoryId); + void deleteAllByMemoryIdInBulk(@Param("memoryId") Long memoryId); } diff --git a/backend/src/main/java/com/staccato/moment/service/MomentService.java b/backend/src/main/java/com/staccato/moment/service/MomentService.java index 7fe565a70..cebbcdacb 100644 --- a/backend/src/main/java/com/staccato/moment/service/MomentService.java +++ b/backend/src/main/java/com/staccato/moment/service/MomentService.java @@ -85,7 +85,7 @@ private Memory getMemoryById(long memoryId) { public void deleteMomentById(long momentId, Member member) { momentRepository.findById(momentId).ifPresent(moment -> { validateMemoryOwner(moment.getMemory(), member); - commentRepository.deleteAllByMomentIdInBatch(List.of(momentId)); + commentRepository.deleteAllByMomentIdInBulk(List.of(momentId)); momentImageRepository.deleteAllByMomentIdInBulk(List.of(momentId)); momentRepository.deleteById(momentId); }); diff --git a/backend/src/test/java/com/staccato/comment/repository/CommentRepositoryTest.java b/backend/src/test/java/com/staccato/comment/repository/CommentRepositoryTest.java index 13d81face..412b39f21 100644 --- a/backend/src/test/java/com/staccato/comment/repository/CommentRepositoryTest.java +++ b/backend/src/test/java/com/staccato/comment/repository/CommentRepositoryTest.java @@ -35,7 +35,7 @@ class CommentRepositoryTest { @DisplayName("특정 스타카토의 id를 여러개를 가지고 있는 모든 댓글들을 삭제한다.") @Test - void deleteAllByMomentIdInBatch() { + void deleteAllByMomentIdInBulk() { // given Member member = memberRepository.save(MemberFixture.create()); Memory memory = memoryRepository.save(MemoryFixture.create(null, null)); @@ -47,7 +47,7 @@ void deleteAllByMomentIdInBatch() { momentRepository.save(moment2); // when - commentRepository.deleteAllByMomentIdInBatch(List.of(moment1.getId(), moment2.getId())); + commentRepository.deleteAllByMomentIdInBulk(List.of(moment1.getId(), moment2.getId())); em.flush(); em.clear(); diff --git a/backend/src/test/java/com/staccato/memory/repository/MemoryMemberRepositoryTest.java b/backend/src/test/java/com/staccato/memory/repository/MemoryMemberRepositoryTest.java index 56dbd5d88..138e826f1 100644 --- a/backend/src/test/java/com/staccato/memory/repository/MemoryMemberRepositoryTest.java +++ b/backend/src/test/java/com/staccato/memory/repository/MemoryMemberRepositoryTest.java @@ -82,7 +82,7 @@ void findAllByMemberIdAndDateWhenNull() { @DisplayName("특정 추억의 id를 가지고 있는 모든 MemoryMember를 삭제한다.") @Test - void deleteAllByMemoryIdInBatch() { + void deleteAllByMemoryIdInBulk() { // given Member member = memberRepository.save(MemberFixture.create()); Member member2 = memberRepository.save(MemberFixture.create("hotea")); @@ -91,7 +91,7 @@ void deleteAllByMemoryIdInBatch() { MemoryMember memoryMember2 = memoryMemberRepository.save(new MemoryMember(member2, memory)); // when - memoryMemberRepository.deleteAllByMemoryIdInBatch(memory.getId()); + memoryMemberRepository.deleteAllByMemoryIdInBulk(memory.getId()); entityManager.flush(); entityManager.clear(); diff --git a/backend/src/test/java/com/staccato/moment/repository/MomentRepositoryTest.java b/backend/src/test/java/com/staccato/moment/repository/MomentRepositoryTest.java index 9fe9f9c65..d9c8312b9 100644 --- a/backend/src/test/java/com/staccato/moment/repository/MomentRepositoryTest.java +++ b/backend/src/test/java/com/staccato/moment/repository/MomentRepositoryTest.java @@ -70,7 +70,7 @@ void findAllByMemory_MemoryMembers_Member() { @DisplayName("특정 추억의 id를 가진 모든 스타카토를 삭제한다.") @Test - void deleteAllByMemoryIdInBatch() { + void deleteAllByMemoryIdInBulk() { // given Member member = memberRepository.save(MemberFixture.create()); Memory memory = memoryRepository.save(MemoryFixture.create(LocalDate.of(2023, 12, 31), LocalDate.of(2024, 1, 10))); @@ -81,7 +81,7 @@ void deleteAllByMemoryIdInBatch() { Moment moment2 = momentRepository.save(MomentFixture.create(memory, LocalDateTime.of(2024, 1, 1, 22, 21))); // when - momentRepository.deleteAllByMemoryIdInBatch(memory.getId()); + momentRepository.deleteAllByMemoryIdInBulk(memory.getId()); entityManager.flush(); entityManager.clear(); From 8a8c33def22cb17475b6665e0ed2c7790c00b378 Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Sat, 1 Feb 2025 08:15:33 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20URL=20=EB=8F=99=EB=93=B1?= =?UTF-8?q?=EC=84=B1=20=EB=B9=84=EA=B5=90=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/staccato/moment/domain/MomentImage.java | 5 ++++- .../main/java/com/staccato/moment/domain/MomentImages.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/staccato/moment/domain/MomentImage.java b/backend/src/main/java/com/staccato/moment/domain/MomentImage.java index 35486b35e..c960e5774 100644 --- a/backend/src/main/java/com/staccato/moment/domain/MomentImage.java +++ b/backend/src/main/java/com/staccato/moment/domain/MomentImage.java @@ -9,7 +9,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; - import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -36,4 +35,8 @@ public MomentImage(@Nonnull String imageUrl) { protected void belongTo(Moment moment) { this.moment = moment; } + + protected boolean isSame(MomentImage momentImage) { + return imageUrl.equals(momentImage.imageUrl); + } } diff --git a/backend/src/main/java/com/staccato/moment/domain/MomentImages.java b/backend/src/main/java/com/staccato/moment/domain/MomentImages.java index ccd4074a4..9069b33f2 100644 --- a/backend/src/main/java/com/staccato/moment/domain/MomentImages.java +++ b/backend/src/main/java/com/staccato/moment/domain/MomentImages.java @@ -75,6 +75,6 @@ private List findImagesNotPresentIn(MomentImages targetMomentImages private boolean contains(MomentImage momentImage) { return this.images.stream() - .anyMatch(image -> image.getImageUrl().equals(momentImage.getImageUrl())); + .anyMatch(image -> image.isSame(momentImage)); } } From b47133a4a8252c5e39d7c334bde9d55baa6acb4c Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Sat, 1 Feb 2025 08:41:44 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/staccato/moment/service/MomentService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/staccato/moment/service/MomentService.java b/backend/src/main/java/com/staccato/moment/service/MomentService.java index cebbcdacb..1c1ed98c3 100644 --- a/backend/src/main/java/com/staccato/moment/service/MomentService.java +++ b/backend/src/main/java/com/staccato/moment/service/MomentService.java @@ -69,8 +69,8 @@ public void updateMomentById( validateMemoryOwner(targetMemory, member); Moment newMoment = momentRequest.toMoment(targetMemory); - MomentImages oringMomentImages = moment.getMomentImages(); - List removalImageIds = oringMomentImages.findRemovalImageIds(newMoment.getMomentImages()); + MomentImages originMomentImages = moment.getMomentImages(); + List removalImageIds = originMomentImages.findRemovalImageIds(newMoment.getMomentImages()); momentImageRepository.deleteAllByIdInBulk(removalImageIds); moment.update(newMoment); From 8820b1a2596c6864597308293e1b4d6ce71d385b Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Sat, 1 Feb 2025 09:13:46 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=9E=AC=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../staccato/moment/domain/MomentImages.java | 19 ++++++----------- .../moment/service/MomentService.java | 12 +++++++++-- .../moment/domain/MomentImagesTest.java | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/staccato/moment/domain/MomentImages.java b/backend/src/main/java/com/staccato/moment/domain/MomentImages.java index 9069b33f2..0521b62e9 100644 --- a/backend/src/main/java/com/staccato/moment/domain/MomentImages.java +++ b/backend/src/main/java/com/staccato/moment/domain/MomentImages.java @@ -42,6 +42,12 @@ public boolean isNotEmpty() { return !images.isEmpty(); } + public List findImagesNotPresentIn(MomentImages targetMomentImages) { + return images.stream() + .filter(image -> !targetMomentImages.contains(image)) + .toList(); + } + protected void update(MomentImages newMomentImages, Moment moment) { removeExistImages(newMomentImages); saveNewImages(newMomentImages, moment); @@ -60,19 +66,6 @@ private void saveNewImages(MomentImages newMomentImages, Moment moment) { }); } - public List findRemovalImageIds(MomentImages newMomentImages) { - List momentImages = findImagesNotPresentIn(newMomentImages); - return momentImages.stream() - .map(MomentImage::getId) - .toList(); - } - - private List findImagesNotPresentIn(MomentImages targetMomentImages) { - return images.stream() - .filter(image -> !targetMomentImages.contains(image)) - .toList(); - } - private boolean contains(MomentImage momentImage) { return this.images.stream() .anyMatch(image -> image.isSame(momentImage)); diff --git a/backend/src/main/java/com/staccato/moment/service/MomentService.java b/backend/src/main/java/com/staccato/moment/service/MomentService.java index 1c1ed98c3..f1d08224a 100644 --- a/backend/src/main/java/com/staccato/moment/service/MomentService.java +++ b/backend/src/main/java/com/staccato/moment/service/MomentService.java @@ -12,6 +12,7 @@ import com.staccato.memory.repository.MemoryRepository; import com.staccato.moment.domain.Feeling; import com.staccato.moment.domain.Moment; +import com.staccato.moment.domain.MomentImage; import com.staccato.moment.domain.MomentImages; import com.staccato.moment.repository.MomentImageRepository; import com.staccato.moment.repository.MomentRepository; @@ -70,12 +71,19 @@ public void updateMomentById( Moment newMoment = momentRequest.toMoment(targetMemory); MomentImages originMomentImages = moment.getMomentImages(); - List removalImageIds = originMomentImages.findRemovalImageIds(newMoment.getMomentImages()); - momentImageRepository.deleteAllByIdInBulk(removalImageIds); + List images = originMomentImages.findImagesNotPresentIn(newMoment.getMomentImages()); + removeImages(images); moment.update(newMoment); } + private void removeImages(List images) { + List ids = images.stream() + .map(MomentImage::getId) + .toList(); + momentImageRepository.deleteAllByIdInBulk(ids); + } + private Memory getMemoryById(long memoryId) { return memoryRepository.findById(memoryId) .orElseThrow(() -> new StaccatoException("요청하신 추억을 찾을 수 없어요.")); diff --git a/backend/src/test/java/com/staccato/moment/domain/MomentImagesTest.java b/backend/src/test/java/com/staccato/moment/domain/MomentImagesTest.java index d93a9ed35..d43669aea 100644 --- a/backend/src/test/java/com/staccato/moment/domain/MomentImagesTest.java +++ b/backend/src/test/java/com/staccato/moment/domain/MomentImagesTest.java @@ -69,4 +69,25 @@ void update() { () -> assertThat(images.size()).isEqualTo(2) ); } + + @DisplayName("포함되지 않는 사진들을 선별할 수 있다.") + @Test + void findImagesNotPresentIn() { + // given + MomentImages existingImages = new MomentImages(List.of("picture1", "picture3")); + MomentImages newImages = new MomentImages(List.of("picture1", "picture4")); + + // when + List remainingExistingImages = existingImages.findImagesNotPresentIn(newImages); + List remainingNewImages = newImages.findImagesNotPresentIn(existingImages); + + // then + assertAll( + + () -> assertThat(remainingExistingImages.size()).isEqualTo(1), + () -> assertThat(remainingNewImages.size()).isEqualTo(1), + () -> assertThat(remainingExistingImages.get(0).getImageUrl()).isEqualTo("picture3"), + () -> assertThat(remainingNewImages.get(0).getImageUrl()).isEqualTo("picture4") + ); + } } From f7d10ce437d07cfc85cfc6805760be08e4bf4725 Mon Sep 17 00:00:00 2001 From: yoonjuho Date: Wed, 5 Feb 2025 18:48:59 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20test=20import=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/staccato/moment/service/MomentServiceTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java b/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java index d8dce9b64..eee954d2c 100644 --- a/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java +++ b/backend/src/test/java/com/staccato/moment/service/MomentServiceTest.java @@ -1,5 +1,6 @@ package com.staccato.moment.service; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List;