diff --git a/src/main/java/com/example/log4u/domain/diary/controller/DiaryController.java b/src/main/java/com/example/log4u/domain/diary/controller/DiaryController.java index 9cb281de..c117b200 100644 --- a/src/main/java/com/example/log4u/domain/diary/controller/DiaryController.java +++ b/src/main/java/com/example/log4u/domain/diary/controller/DiaryController.java @@ -18,7 +18,7 @@ import com.example.log4u.domain.diary.SortType; import com.example.log4u.domain.diary.dto.DiaryRequestDto; import com.example.log4u.domain.diary.dto.DiaryResponseDto; -import com.example.log4u.domain.diary.service.DiaryService; +import com.example.log4u.domain.diary.facade.DiaryFacade; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -30,7 +30,7 @@ @Slf4j public class DiaryController { - private final DiaryService diaryService; + private final DiaryFacade diaryFacade; @GetMapping("/users/{userId}") public ResponseEntity> getDiariesByUserId( @@ -39,7 +39,7 @@ public ResponseEntity> getDiariesByUserId( @RequestParam(required = false) Long cursorId, @RequestParam(defaultValue = "12") int size ) { - PageResponse response = diaryService.getDiariesByCursor(customOAuth2User.getUserId(), + PageResponse response = diaryFacade.getDiariesByCursor(customOAuth2User.getUserId(), targetUserId, cursorId, size); return ResponseEntity.ok(response); @@ -50,7 +50,7 @@ public ResponseEntity createDiary( @AuthenticationPrincipal CustomOAuth2User customOAuth2User, @Valid @RequestBody DiaryRequestDto request ) { - diaryService.saveDiary(customOAuth2User.getUserId(), request); + diaryFacade.createDiary(customOAuth2User.getUserId(), request); return ResponseEntity.status(HttpStatus.CREATED).build(); } @@ -63,7 +63,7 @@ public ResponseEntity> searchDiaries( @RequestParam(defaultValue = "6") int size ) { return ResponseEntity.ok( - diaryService.searchDiariesByCursor(keyword, sort, cursorId, size) + diaryFacade.searchDiariesByCursor(keyword, sort, cursorId, size) ); } @@ -72,7 +72,7 @@ public ResponseEntity getDiary( @AuthenticationPrincipal CustomOAuth2User customOAuth2User, @PathVariable Long diaryId ) { - DiaryResponseDto diary = diaryService.getDiary(customOAuth2User.getUserId(), diaryId); + DiaryResponseDto diary = diaryFacade.getDiary(customOAuth2User.getUserId(), diaryId); return ResponseEntity.ok(diary); } @@ -82,16 +82,16 @@ public ResponseEntity modifyDiary( @PathVariable Long diaryId, @Valid @RequestBody DiaryRequestDto request ) { - diaryService.updateDiary(customOAuth2User.getUserId(), diaryId, request); + diaryFacade.updateDiary(customOAuth2User.getUserId(), diaryId, request); return ResponseEntity.ok().build(); } @DeleteMapping("/{diaryId}") - public ResponseEntity deleteDiary( + public ResponseEntity deleteDiary( @AuthenticationPrincipal CustomOAuth2User customOAuth2User, @PathVariable Long diaryId ) { - diaryService.deleteDiary(customOAuth2User.getUserId(), diaryId); + diaryFacade.deleteDiary(customOAuth2User.getUserId(), diaryId); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } } diff --git a/src/main/java/com/example/log4u/domain/diary/facade/DiaryFacade.java b/src/main/java/com/example/log4u/domain/diary/facade/DiaryFacade.java new file mode 100644 index 00000000..01a2ab4d --- /dev/null +++ b/src/main/java/com/example/log4u/domain/diary/facade/DiaryFacade.java @@ -0,0 +1,127 @@ +package com.example.log4u.domain.diary.facade; + +import java.util.List; + +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Component; + +import com.example.log4u.common.dto.PageResponse; +import com.example.log4u.domain.diary.SortType; +import com.example.log4u.domain.diary.dto.DiaryRequestDto; +import com.example.log4u.domain.diary.dto.DiaryResponseDto; +import com.example.log4u.domain.diary.entity.Diary; +import com.example.log4u.domain.diary.service.DiaryService; +import com.example.log4u.domain.like.service.LikeService; +import com.example.log4u.domain.map.service.MapService; +import com.example.log4u.domain.media.entity.Media; +import com.example.log4u.domain.media.service.MediaService; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class DiaryFacade { + + private final DiaryService diaryService; + private final MediaService mediaService; + private final MapService mapService; + private final LikeService likeService; + + /** + * 다이어리 생성 use case + *
  • 호출 과정
+ * 1. mediaService: 섬네일 이미지 url 생성
+ * 2. diaryService: 다이어리 생성
+ * 2. mediaService: 해당 다이어리의 이미지 저장
+ * 3. mapService: 해당 구역 카운트 증가 + * */ + public void createDiary(Long userId, DiaryRequestDto request) { + String thumbnailUrl = mediaService.extractThumbnailUrl(request.mediaList()); + Diary diary = diaryService.saveDiary(userId, request, thumbnailUrl); + mediaService.saveMedia(diary.getDiaryId(), request.mediaList()); + mapService.increaseRegionDiaryCount(request.location().latitude(), request.location().longitude()); + } + + /** + * 다이어리 삭제 use case + *
  • 호출 과정
+ * 1. diaryService: 다이어리 검증 + * 2. mediaService: 해당 다이어리 이미지 삭제
+ * 3. diaryService: 다이어리 삭제
+ * */ + public void deleteDiary(Long userId, Long diaryId) { + Diary diary = diaryService.getDiaryAfterValidateOwnership(userId, diaryId); + mediaService.deleteMediaByDiaryId(diaryId); + diaryService.deleteDiary(diary); + } + + /** + * 다이어리 수정 use case + *
  • 호출 과정
+ * 1. diaryService: 다이어리 검증
+ * 2. mediaService: 해당 다이어리 이미지 삭제
+ * 3. diaryService: 다이어리 수정 + * */ + public void updateDiary(Long userId, Long diaryId, DiaryRequestDto request) { + Diary diary = diaryService.getDiaryAfterValidateOwnership(userId, diaryId); + if (request.mediaList() != null) { + mediaService.updateMediaByDiaryId(diary.getDiaryId(), request.mediaList()); + } + String newThumbnailUrl = mediaService.extractThumbnailUrl(request.mediaList()); + diaryService.updateDiary(diary, request, newThumbnailUrl); + } + + /** + * 다이어리 단건 조회 use case + *
  • 호출 과정
+ * 1. diaryService: 공개 범위 검증 후 다이어리 조회
+ * 2. likeService: 좋아요 기록 조회
+ * 3. mediaService: 해당 다이어리의 이미지 조회
+ * 4. 모든 정보 조합 후 dto 변환 해 반환 + * */ + public DiaryResponseDto getDiary(Long userId, Long diaryId) { + Diary diary = diaryService.getDiaryAfterValidateAccess(userId, diaryId); + boolean isLiked = likeService.isLiked(userId, diaryId); + List media = mediaService.getMediaByDiaryId(diary.getDiaryId()); + return DiaryResponseDto.of(diary, media, isLiked); + } + + /** + * 다이어리 목록 조회 By UserId use case + *
  • 호출 과정
+ * 1. diaryService : DiaryResponseDto Slice 객체 조회
+ * 2. nextCursor 정보 생성
+ * 3. PageResponse 조합 후 반환 + * */ + public PageResponse getDiariesByCursor( + Long userId, + Long targetUserId, + Long cursorId, + int size + ) { + Slice dtoSlice = diaryService.getDiaryResponseDtoSlice(userId, targetUserId, cursorId, size); + // 다음 커서 ID 계산 + Long nextCursor = !dtoSlice.isEmpty() ? dtoSlice.getContent().getLast().diaryId() : null; + return PageResponse.of(dtoSlice, nextCursor); + } + + /** + * 다이어리 검색 목록 조회 By Cursor use case + *
  • 호출 과정
+ * 1. diaryService : DiaryResponseDto Slice 객체 조회
+ * 2. nextCursor 정보 생성
+ * 3. PageResponse 조합 후 반환
+ * */ + public PageResponse searchDiariesByCursor( + String keyword, + SortType sort, + Long cursorId, + int size + ) { + Slice dtoSlice = diaryService.searchDiariesByCursor(keyword, sort, cursorId, size); + // 다음 커서 ID 계산 + Long nextCursor = !dtoSlice.isEmpty() ? dtoSlice.getContent().getLast().diaryId() : null; + return PageResponse.of(dtoSlice, nextCursor); + } + +} diff --git a/src/main/java/com/example/log4u/domain/diary/service/DiaryService.java b/src/main/java/com/example/log4u/domain/diary/service/DiaryService.java index 145fa97b..b8c2aff0 100644 --- a/src/main/java/com/example/log4u/domain/diary/service/DiaryService.java +++ b/src/main/java/com/example/log4u/domain/diary/service/DiaryService.java @@ -22,7 +22,6 @@ import com.example.log4u.domain.diary.repository.DiaryRepository; import com.example.log4u.domain.follow.repository.FollowRepository; import com.example.log4u.domain.like.repository.LikeRepository; -import com.example.log4u.domain.map.service.MapService; import com.example.log4u.domain.media.entity.Media; import com.example.log4u.domain.media.service.MediaService; @@ -37,23 +36,17 @@ public class DiaryService { private final DiaryRepository diaryRepository; private final FollowRepository followRepository; private final MediaService mediaService; - private final MapService mapService; private final LikeRepository likeRepository; // 다이어리 생성 @Transactional - public void saveDiary(Long userId, DiaryRequestDto request) { - String thumbnailUrl = mediaService.extractThumbnailUrl(request.mediaList()); - Diary diary = diaryRepository.save( - DiaryRequestDto.toEntity(userId, request, thumbnailUrl) - ); - mediaService.saveMedia(diary.getDiaryId(), request.mediaList()); - mapService.increaseRegionDiaryCount(request.location().latitude(), request.location().longitude()); + public Diary saveDiary(Long userId, DiaryRequestDto request, String thumbnailUrl) { + return diaryRepository.save(DiaryRequestDto.toEntity(userId, request, thumbnailUrl)); } // 다이어리 검색 @Transactional(readOnly = true) - public PageResponse searchDiariesByCursor( + public Slice searchDiariesByCursor( String keyword, SortType sort, Long cursorId, @@ -66,17 +59,12 @@ public PageResponse searchDiariesByCursor( cursorId != null ? cursorId : Long.MAX_VALUE, PageRequest.of(0, size) ); - - Slice dtoSlice = mapToDtoSlice(diaries); - - // 다음 커서 ID 계산 - Long nextCursor = !dtoSlice.isEmpty() ? dtoSlice.getContent().getLast().diaryId() : null; - - return PageResponse.of(dtoSlice, nextCursor); + return mapToDtoSlice(diaries); } // 다이어리 상세 조회 @Transactional(readOnly = true) + @Deprecated(since = "파사드 패턴 도입으로 인해 불필요해짐", forRemoval = false) public DiaryResponseDto getDiary(Long userId, Long diaryId) { Diary diary = findDiaryOrThrow(diaryId); @@ -89,43 +77,27 @@ public DiaryResponseDto getDiary(Long userId, Long diaryId) { // 다이어리 목록 (프로필 페이지) @Transactional(readOnly = true) - public PageResponse getDiariesByCursor(Long userId, Long targetUserId, Long cursorId, int size) { + public Slice getDiaryResponseDtoSlice(Long userId, Long targetUserId, Long cursorId, int size) { List visibilities = determineAccessibleVisibilities(userId, targetUserId); - Slice diaries = diaryRepository.findByUserIdAndVisibilityInAndCursorId( targetUserId, visibilities, cursorId != null ? cursorId : Long.MAX_VALUE, PageRequest.of(0, size) ); - - Slice dtoSlice = mapToDtoSlice(diaries); - - Long nextCursor = !dtoSlice.isEmpty() ? dtoSlice.getContent().getLast().diaryId() : null; - - return PageResponse.of(dtoSlice, nextCursor); + return mapToDtoSlice(diaries); } // 다이어리 수정 @Transactional - public void updateDiary(Long userId, Long diaryId, DiaryRequestDto request) { - Diary diary = findDiaryOrThrow(diaryId); - validateOwner(diary, userId); - - if (request.mediaList() != null) { - mediaService.updateMediaByDiaryId(diary.getDiaryId(), request.mediaList()); - } - - String newThumbnailUrl = mediaService.extractThumbnailUrl(request.mediaList()); + public void updateDiary(Diary diary, DiaryRequestDto request, String newThumbnailUrl) { diary.update(request, newThumbnailUrl); + diaryRepository.save(diary); } // 다이어리 삭제 @Transactional - public void deleteDiary(Long userId, Long diaryId) { - Diary diary = findDiaryOrThrow(diaryId); - validateOwner(diary, userId); - mediaService.deleteMediaByDiaryId(diaryId); + public void deleteDiary(Diary diary) { diaryRepository.delete(diary); } @@ -173,7 +145,7 @@ private void validateOwner(Diary diary, Long userId) { } } - // 다이어리 목록 조회 시 권한 체크 + // 다이어리 목록 조회 시 권한 체크(공개 정책) private List determineAccessibleVisibilities(Long userId, Long targetUserId) { if (userId.equals(targetUserId)) { return List.of(VisibilityType.PUBLIC, VisibilityType.PRIVATE, VisibilityType.FOLLOWER); @@ -186,6 +158,20 @@ private List determineAccessibleVisibilities(Long userId, Long t return List.of(VisibilityType.PUBLIC); } + // 파사드 패턴에서 사용할 검증 로직(소유 검증) + public Diary getDiaryAfterValidateOwnership(Long diaryId, Long userId) { + Diary diary = findDiaryOrThrow(diaryId); + validateOwner(diary, userId); + return diary; + } + + // 파사드 패턴에서 사용할 검증 로직(공개 범위 검증) + public Diary getDiaryAfterValidateAccess(Long diaryId, Long userId) { + Diary diary = findDiaryOrThrow(diaryId); + validateDiaryAccess(diary, userId); + return diary; + } + // 다이어리 상세 조회 시 권한 체크 private void validateDiaryAccess(Diary diary, Long userId) { if (diary.getVisibility() == VisibilityType.PRIVATE) { diff --git a/src/main/java/com/example/log4u/domain/like/service/LikeService.java b/src/main/java/com/example/log4u/domain/like/service/LikeService.java index 4f368cb7..873aef2a 100644 --- a/src/main/java/com/example/log4u/domain/like/service/LikeService.java +++ b/src/main/java/com/example/log4u/domain/like/service/LikeService.java @@ -1,7 +1,5 @@ package com.example.log4u.domain.like.service; -import java.util.Optional; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -52,4 +50,9 @@ private void validateDuplicateLike(Long userId, Long diaryId) { throw new DuplicateLikeException(); } } + + // 파사드 패턴에서 사용할 함수 + public boolean isLiked(Long userId, Long diaryId) { + return likeRepository.existsByUserIdAndDiaryId(userId, diaryId); + } } diff --git a/src/test/java/com/example/log4u/domain/diary/service/DiaryServiceTest.java b/src/test/java/com/example/log4u/domain/diary/service/DiaryServiceTest.java index 25882dc0..56a5fafb 100644 --- a/src/test/java/com/example/log4u/domain/diary/service/DiaryServiceTest.java +++ b/src/test/java/com/example/log4u/domain/diary/service/DiaryServiceTest.java @@ -1,12 +1,11 @@ package com.example.log4u.domain.diary.service; import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.BDDMockito.*; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import org.junit.jupiter.api.DisplayName; @@ -19,7 +18,6 @@ import org.springframework.data.domain.Slice; import org.springframework.data.domain.SliceImpl; -import com.example.log4u.common.dto.PageResponse; import com.example.log4u.domain.diary.SortType; import com.example.log4u.domain.diary.VisibilityType; import com.example.log4u.domain.diary.dto.DiaryRequestDto; @@ -30,56 +28,50 @@ import com.example.log4u.domain.diary.repository.DiaryRepository; import com.example.log4u.domain.follow.repository.FollowRepository; import com.example.log4u.domain.like.repository.LikeRepository; -import com.example.log4u.domain.map.service.MapService; import com.example.log4u.domain.media.entity.Media; import com.example.log4u.domain.media.service.MediaService; import com.example.log4u.fixture.DiaryFixture; import com.example.log4u.fixture.MediaFixture; @ExtendWith(MockitoExtension.class) -public class DiaryServiceTest { +class DiaryServiceTest { @Mock private DiaryRepository diaryRepository; - @Mock - private LikeRepository likeRepository; - @Mock private FollowRepository followRepository; @Mock private MediaService mediaService; - @InjectMocks - private DiaryService diaryService; - @Mock - private MapService mapService; - - private static final int CURSOR_PAGE_SIZE = 12; + private LikeRepository likeRepository; - private static final int SEARCH_PAGE_SIZE = 6; + @InjectMocks + private DiaryService diaryService; @Test - @DisplayName("다이어리 생성 성공") - void saveDiary() { + @DisplayName("다이어리 생성 - 성공") + void saveDiary_success() { // given Long userId = 1L; - DiaryRequestDto request = DiaryFixture.createDiaryRequestDtoFixture(); + String thumbnailUrl = "https://example.com/thumb.jpg"; - String thumbnailUrl = "https://example.com/image1.jpg"; - Diary diary = DiaryFixture.createPublicDiaryFixture(1L, userId); + DiaryRequestDto request = DiaryFixture.createDiaryRequestDtoFixture(); - given(mediaService.extractThumbnailUrl(request.mediaList())).willReturn(thumbnailUrl); - given(diaryRepository.save(any(Diary.class))).willReturn(diary); + given(diaryRepository.save(any(Diary.class))).willAnswer(invocation -> invocation.getArgument(0)); // when - diaryService.saveDiary(userId, request); + Diary result = diaryService.saveDiary(userId, request, thumbnailUrl); // then - verify(mediaService).saveMedia(eq(diary.getDiaryId()), eq(request.mediaList())); - verify(mapService).increaseRegionDiaryCount(request.location().latitude(), request.location().longitude()); + assertThat(result.getUserId()).isEqualTo(userId); + assertThat(result.getTitle()).isEqualTo(request.title()); + assertThat(result.getContent()).isEqualTo(request.content()); + assertThat(result.getThumbnailUrl()).isEqualTo(thumbnailUrl); + + verify(diaryRepository).save(any(Diary.class)); } @Test @@ -98,40 +90,24 @@ void searchDiaries() { eq(keyword), eq(List.of(VisibilityType.PUBLIC)), eq(sort), - eq(Long.MAX_VALUE), + anyLong(), any(PageRequest.class) )).willReturn(diarySlice); - Map> mediaMap = new HashMap<>(); - for (Diary diary : diaries) { - mediaMap.put(diary.getDiaryId(), List.of( - MediaFixture.createMediaFixture(diary.getDiaryId() * 10, diary.getDiaryId()) - )); - } - - given(mediaService.getMediaMapByDiaryIds(anyList())).willReturn(mediaMap); - // when - PageResponse result = diaryService.searchDiariesByCursor(keyword, sort, cursorId, size); + Slice result = diaryService.searchDiariesByCursor(keyword, sort, cursorId, size); // then - assertThat(result.list()).hasSize(3); - assertThat(result.pageInfo().hasNext()).isFalse(); - - assertThat(result.list()).allSatisfy(diary -> { - assertThat(diary.title().contains(keyword) || diary.content().contains(keyword)) - .as("다이어리 제목 또는 내용에 키워드 '%s'가 포함되어야 합니다.", keyword) - .isTrue(); - }); - - DiaryResponseDto firstDiary = result.list().get(0); - assertThat(firstDiary.diaryId()).isEqualTo(diaries.get(0).getDiaryId()); - assertThat(firstDiary.title()).isEqualTo(diaries.get(0).getTitle()); - assertThat(firstDiary.content()).isEqualTo(diaries.get(0).getContent()); - assertThat(firstDiary.userId()).isEqualTo(diaries.get(0).getUserId()); - assertThat(firstDiary.visibility()).isEqualTo(diaries.get(0).getVisibility().name()); - assertThat(firstDiary.weatherInfo()).isEqualTo(diaries.get(0).getWeatherInfo().name()); - assertThat(firstDiary.mediaList()).hasSize(1); + assertEquals(6, result.getSize()); + assertFalse(result.hasNext()); + + verify(diaryRepository).searchDiariesByCursor( + eq(keyword), + eq(List.of(VisibilityType.PUBLIC)), + eq(sort), + anyLong(), + any(PageRequest.class) + ); } @Test @@ -247,71 +223,62 @@ void getDiariesByCursor() { int size = 12; List diaries = DiaryFixture.createDiariesWithIdsFixture(3); - Slice diarySlice = new SliceImpl<>(diaries, PageRequest.of(0, CURSOR_PAGE_SIZE), false); + Slice diarySlice = new SliceImpl<>(diaries, PageRequest.of(0, size), true); + // mocking + given(followRepository.existsByInitiatorIdAndTargetId(userId, targetUserId)).willReturn(true); given(diaryRepository.findByUserIdAndVisibilityInAndCursorId( eq(targetUserId), - eq(List.of(VisibilityType.PUBLIC)), + anyList(), eq(cursorId), any(PageRequest.class) )).willReturn(diarySlice); - Map> mediaMap = new HashMap<>(); - for (Diary diary : diaries) { - mediaMap.put(diary.getDiaryId(), List.of( - MediaFixture.createMediaFixture(diary.getDiaryId() * 10, diary.getDiaryId()) - )); - } - - given(mediaService.getMediaMapByDiaryIds(anyList())).willReturn(mediaMap); - // when - PageResponse result = diaryService.getDiariesByCursor(userId, targetUserId, cursorId, size); + Slice result = diaryService.getDiaryResponseDtoSlice(userId, targetUserId, cursorId, size); // then - assertThat(result.list()).hasSize(3); - assertThat(result.pageInfo().hasNext()).isFalse(); + assertThat(result).hasSize(3); + assertThat(result.hasNext()).isTrue(); + verify(diaryRepository).findByUserIdAndVisibilityInAndCursorId( + eq(targetUserId), + anyList(), + eq(cursorId), + any(PageRequest.class) + ); } @Test @DisplayName("다이어리 수정 성공") void updateDiary() { // given - Long userId = 1L; - Long diaryId = 1L; + Diary diary = mock(Diary.class); DiaryRequestDto request = DiaryFixture.createPublicDiaryRequestDtoFixture(); - Diary diary = DiaryFixture.createPublicDiaryFixture(diaryId, userId); String newThumbnailUrl = "https://example.com/public.jpg"; - given(diaryRepository.findById(diaryId)).willReturn(Optional.of(diary)); - given(mediaService.extractThumbnailUrl(request.mediaList())).willReturn(newThumbnailUrl); - // when - diaryService.updateDiary(userId, diaryId, request); + diaryService.updateDiary(diary, request, newThumbnailUrl); // then - verify(mediaService).updateMediaByDiaryId(eq(diaryId), eq(request.mediaList())); - assertThat(diary.getTitle()).isEqualTo(request.title()); - assertThat(diary.getContent()).isEqualTo(request.content()); - assertThat(diary.getThumbnailUrl()).isEqualTo(newThumbnailUrl); + verify(diary).update(request, newThumbnailUrl); // update 메서드 호출 확인 + verify(diaryRepository).save(diary); // save 호출 확인 } @Test - @DisplayName("다이어리 수정 실패 - 작성자가 아닌 경우") + @DisplayName("다이어리 수정 실패(검증 로직 실패) - 작성자가 아닌 경우") void updateDiary_notOwner() { // given Long userId = 1L; Long authorId = 2L; Long diaryId = 1L; - DiaryRequestDto request = DiaryFixture.createPublicDiaryRequestDtoFixture(); Diary diary = DiaryFixture.createPublicDiaryFixture(diaryId, authorId); given(diaryRepository.findById(diaryId)).willReturn(Optional.of(diary)); // when & then - assertThatThrownBy(() -> diaryService.updateDiary(userId, diaryId, request)) + assertThatThrownBy(() -> diaryService.getDiaryAfterValidateOwnership(diaryId, userId)) .isInstanceOf(OwnerAccessDeniedException.class); } @@ -324,18 +291,15 @@ void deleteDiary() { Diary diary = DiaryFixture.createPublicDiaryFixture(diaryId, userId); - given(diaryRepository.findById(diaryId)).willReturn(Optional.of(diary)); - // when - diaryService.deleteDiary(userId, diaryId); + diaryService.deleteDiary(diary); // then - verify(mediaService).deleteMediaByDiaryId(diaryId); verify(diaryRepository).delete(diary); } @Test - @DisplayName("다이어리 삭제 실패 - 작성자가 아닌 경우") + @DisplayName("다이어리 삭제전 소유자 검증 - 작성자가 아닌 경우") void deleteDiary_notOwner() { // given Long userId = 1L; @@ -346,8 +310,8 @@ void deleteDiary_notOwner() { given(diaryRepository.findById(diaryId)).willReturn(Optional.of(diary)); - // when & then - assertThatThrownBy(() -> diaryService.deleteDiary(userId, diaryId)) + // when & then (서비스 검증로직) + assertThatThrownBy(() -> diaryService.getDiaryAfterValidateOwnership(userId, diaryId)) .isInstanceOf(OwnerAccessDeniedException.class); }