From f43b145c9feec7eaf58986123b31d1fe37fdaff9 Mon Sep 17 00:00:00 2001 From: yeonjae02 <0yeonjae2@naver.com> Date: Sat, 3 Aug 2024 03:36:16 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=98=A4=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 - SearchHistoryResponseDtoV2 에서 serachTime -> searchTime으로 수정 - 함수별 기능 주석 추가 + 필요한 경우 로직 설명 주석 추가 - dto 목적에 대한 주석 추가 --- .../community_board/dto/PostDetailDto.java | 2 +- .../community_board/dto/PostRequestDto.java | 2 +- .../community_board/dto/PostResponseDto.java | 2 +- .../community_board/dto/PostUpdateDto.java | 2 +- .../repository/ImageRepository.java | 3 + .../community_board/service/PostService.java | 165 ++++++++++++++++-- .../api/SearchHistoryControllerV2.java | 1 - .../domain/history2/dto/PlaceDtoV2.java | 2 +- .../dto/SearchHistoryRequestDtoV2.java | 2 +- .../dto/SearchHistoryResponseDtoV2.java | 4 +- .../repository/SearchHistoryRepositoryV2.java | 1 + .../service/SearchHistoryServiceV2.java | 16 +- 12 files changed, 172 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostDetailDto.java b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostDetailDto.java index 5eb13c6..677f8d6 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostDetailDto.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostDetailDto.java @@ -10,7 +10,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class PostDetailDto { +public class PostDetailDto { // 게시글 상세 조회에 사용하는 DTO private String nickname; private String profileImagerUrl; private String title; diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostRequestDto.java b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostRequestDto.java index 7a18fcf..64dc7a8 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostRequestDto.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostRequestDto.java @@ -11,7 +11,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class PostRequestDto { +public class PostRequestDto { // 게시글 작성 시 사용하는 DTO private Long memberId; @NotBlank(message = "제목은 비워둘 수 없습니다.") diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostResponseDto.java b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostResponseDto.java index e922669..2baeb7d 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostResponseDto.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostResponseDto.java @@ -14,7 +14,7 @@ @Getter @Setter @AllArgsConstructor @NoArgsConstructor -public class PostResponseDto { +public class PostResponseDto { // 게시글 정보를 게시글 전체 리스트 상태에서 보기 위해 사용하는 DTO private Long postId; private String firstImageUrl; private String title; diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostUpdateDto.java b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostUpdateDto.java index cf1fa06..50fe09f 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostUpdateDto.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/dto/PostUpdateDto.java @@ -11,7 +11,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class PostUpdateDto { +public class PostUpdateDto { // 게시글 수정 시 사용하는 DTO @Size(max=100, message="제목은 최대 100자까지 가능합니다.") private String title; diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/repository/ImageRepository.java b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/repository/ImageRepository.java index ba7de4f..1061763 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/repository/ImageRepository.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/repository/ImageRepository.java @@ -13,12 +13,15 @@ public interface ImageRepository extends JpaRepository { Optional findByMemberIdAndPostIsNull(Long memberId); // 회원의 프로필 이미지를 찾는 경우 + // 게시글에서 해당 이미지가 포함된 개수를 반환합니다. @Query("SELECT COUNT(i) FROM Image i WHERE i.imageUrl = :imageUrl AND i.post.id = :postId") Long countByImageUrlAndPostId(@Param("imageUrl") String imageUrl, @Param("postId") Long postId); + // 해당 게시글에서의 이미지 순서 번호를 반환합니다. @Query("SELECT i.order FROM Image i WHERE i.imageUrl = :imageUrl AND i.post.id = :postId") Integer findOrderByImageUrlAndPostId(@Param("imageUrl") String imageUrl, @Param("postId") Long postId); + // 게시글 수정 시 삭제할 이미지 url을 이용하여 DB에서 삭제합니다. @Modifying @Query("DELETE FROM Image i WHERE i.imageUrl = :imageUrl AND i.post.id = :postId") void deleteImageByImageUrlAndPostId(@Param("imageUrl") String imageUrl, @Param("postId") Long postId); diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/service/PostService.java b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/service/PostService.java index 7a9833a..3350603 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/community_board/service/PostService.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/community_board/service/PostService.java @@ -34,6 +34,13 @@ public class PostService { private final MemberService memberService; private final PostHashtagRepository postHashtagsRepository; + /** + * 특정 게시글을 상세조회 합니다. + * + * @param postId 게시글 번호 + * @param read_member 게시글을 보는 사람 정보 + * @return 게시글 상세정보 데이터 + */ @Transactional(readOnly = true) public PostDetailDto getPostById(Long postId, Member read_member) { Post post = postRepository.findById(postId).orElseThrow(EntityNotFoundException::new); @@ -41,7 +48,7 @@ public PostDetailDto getPostById(Long postId, Member read_member) { MemberProfileResponseDto memberProfileResponseDto = memberService.getMemberProfile(memberEmail); - List images = post.getImages().stream() + List images = post.getImages().stream() // 이미지가 순서대로 나오게 합니다. .sorted(Comparator.comparingInt(Image::getOrder)) // order 값에 따라 정렬 .map(Image::getImageUrl) // 이미지 URL 추출 .toList(); // 리스트로 변환 @@ -52,8 +59,8 @@ public PostDetailDto getPostById(Long postId, Member read_member) { int likeCnt = likesRepository.countByPostIdAndIsLiked(postId); - Boolean likes = false; - if (read_member != null) { + boolean likes = false; // 게시글을 보는 사람이 로그인하지 않은 상태라면 좋아요는 누르지 않은 상태로 반환합니다. + if (read_member != null) { // 게시글을 보는 사람이 로그인된 상태라면 좋아요 여부를 확인해 반환합니다. likes = likesRepository.isMemberLikesPostByEmail(post.getId(), read_member.getEmail()); } @@ -70,19 +77,31 @@ public PostDetailDto getPostById(Long postId, Member read_member) { ); } + /** + * 해당 게시글이 존재하는지 확인합니다. + * + * @param postId 게시글 번호 + * @return 게시글의 존재 여부에 따라 true or false를 반환합니다. + */ @Transactional(readOnly = true) public Boolean isPostExist(Long postId){ return postRepository.existsById(postId); } + /** + * 모든 게시글을 가져옵니다. + * + * @param member 게시글을 보는 사람 정보 + * @return 게시글 리스트에 보일 게시글 정보 리스트 + */ @Transactional(readOnly = true) public List getAllPosts(Member member) { List posts = postRepository.findAllPostWithImagesAndPostHashtags(); return posts.stream() .map(post -> { - PostResponseDto postDto = new PostResponseDto(post); - if (member != null) { + PostResponseDto postDto = new PostResponseDto(post); // postDto의 likes는 false로 초기화되어 있습니다. + if (member != null) { // 로그인된 사용자에 대해 사용자가 해당 게시글에 좋아요를 눌렀는지 확인합니다. postDto.setLikes(likesRepository.isMemberLikesPostByEmail(post.getId(), member.getEmail())); } @@ -91,14 +110,21 @@ public List getAllPosts(Member member) { .collect(Collectors.toList()); } + /** + * 좋아요를 누르거나 취소합니다 + * + * @param memberEmail 로그인된 사용자 정보 + * @param postId 게시글 번호 + * @return 최종적으로 변화된 상태를 true or false로 반환합니다. + */ @Transactional public Boolean changeLikes(String memberEmail, Long postId) { boolean existingLike = likesRepository.isMemberLikesPostByEmail(postId, memberEmail); - if (existingLike) { + if (existingLike) { // 좋아요를 누른 상태라면 DB에서 해당 데이터를 삭제하여 좋아요를 취소합니다. likesRepository.deleteByMemberEmailAndPostId(memberEmail, postId); return false; - } else { + } else { // 좋아요를 누르지 않은 상태라면 DB에 해당 데이터를 추가하여 좋아요를 표시합니다. Member member = memberService.getMemberByEmail(memberEmail); Optional post = postRepository.findById(postId); if (member != null && post.isPresent()) { @@ -110,13 +136,20 @@ public Boolean changeLikes(String memberEmail, Long postId) { throw new IllegalArgumentException("좋아요 상태를 변경하는 중 오류가 발생하였습니다."); } + /** + * 게시글을 생성합니다. + * + * @param postRequestDto 게시글 데이터 (제목, 본문, 해시태그) + * @param member 사용자 + * @param postImages 업로드한 이미지 + */ @Transactional public void createPost(PostRequestDto postRequestDto, Member member, List postImages) { postRequestDto.validatePostHashtags(); LocalDateTime time = LocalDateTime.now(); - List postHashtags = new ArrayList<>(); - List images = new ArrayList<>(); + List postHashtags = new ArrayList<>(); // 원활한 연관관계 설정을 위해 미리 빈 리스트 생성 + List images = new ArrayList<>(); // 원활한 연관관계 설정을 위해 미리 빈 리스트 생성 Post post = Post.builder() .member(member) @@ -128,8 +161,8 @@ public void createPost(PostRequestDto postRequestDto, Member member, List addImages(Post post, Member member, List postImages) { - List images = new ArrayList<>(); + List images = new ArrayList<>(); // 게시글에 추가된 이미지를 저장할 리스트 if (!postImages.isEmpty()) { try { - int cnt = 1; + int cnt = 1; // 이미지 순서를 지정해 이미지를 추가한 순서대로 옯바르게 보일 수 있도록 합니다. for (MultipartFile postImage : postImages) { if (postImage.isEmpty()) { log.error("게시글 이미지 업로드 실패"); @@ -165,6 +206,13 @@ public List addImages(Post post, Member member, List post return images; } + /** + * 게시글 생성 및 수정 시 해시태그를 확인하고 저장합니다. + * + * @param post 게시글 + * @param hashtags 수정될 해시태그 리스트 + * @return 성공적으로 추가/변경될 수 있는 해시태그 리스트 + */ @Transactional public List addHashtags(Post post, List hashtags) { List postHashtags = new ArrayList<>(); @@ -178,13 +226,20 @@ public List addHashtags(Post post, List hashtags) { return postHashtags; } + + /** + * 사용자가 작성한 게시글을 전부 최신순부터 반환합니다. + * + * @param member 사용자 + * @return 게시글 리스트에 보일 게시글 데이터 리스트 + */ @Transactional(readOnly = true) public List getMyAllPosts(Member member) { List posts = postRepository.findByMemberIdOrderByCreateDateDesc(member.getId()); return posts.stream() .map(post -> { PostResponseDto postDto = new PostResponseDto(post); - if (member != null) { + if (member != null) { // 일반적인 접근에서는 NULL 이 될 수 없지만, 기타 경로로 호출될 경우를 고려합니다. postDto.setLikes(likesRepository.isMemberLikesPostByEmail(post.getId(), member.getEmail())); } return postDto; @@ -192,6 +247,13 @@ public List getMyAllPosts(Member member) { .collect(Collectors.toList()); } + /** + * 게시글을 삭제합니다. + * + * @param member 사용자 + * @param postId 게시글 번호 + * @throws AccessDeniedException 타인의 글을 삭제하려고 할 떄 권한 에러를 반환합니다. + */ @Transactional public void deletePost(Member member, Long postId) throws AccessDeniedException { Optional post = postRepository.findById(postId); // 해당 멤버가 게시글 작성자인지 확인힙니다. @@ -204,6 +266,13 @@ public void deletePost(Member member, Long postId) throws AccessDeniedException throw new AccessDeniedException("해당 게시글을 삭제할 권한이 없습니다. 본인이 작성한 글만 삭제할 수 있습니다."); } + /** + * 해시태그를 이용하여 게시글을 검색하고 결과를 반환합니다. + * + * @param member 사용자 + * @param purposes 해시태그 리스트 + * @return 게시글 리스트에 보일 게시글 데이터 리스트 + */ @Transactional(readOnly = true) public List getPostByPurpose(Member member, List purposes) { if (purposes.isEmpty()) { @@ -226,12 +295,18 @@ public List getPostByPurpose(Member member, List purposes .collect(Collectors.toList()); } + /** + * 검색어를 이용한 게시글 검색 결과를 반환합니다. + * @param member 사용자 + * @param query 검색어 (문장) + * @return 게시글 리스트에 보일 게시글 데이터 리스트 + */ @Transactional(readOnly = true) public List getPostByQuery(Member member, String query) { if (query.isEmpty() || query.isBlank()) { throw new IllegalArgumentException("검색어를 입력해주세요."); } - String[] words = query.split("\\s+"); + String[] words = query.split("\\s+"); // 문자열일 경우 공백을 기준으로 파싱합니다. Set resultSet = wordsToPosts(words); @@ -252,8 +327,14 @@ public List getPostByQuery(Member member, String query) { return postResponseDtos; } + /** + * 검색어를 이용해 검색한 결과를 반환합니다. + * + * @param words 단어 리스트 + * @return 검색 결과로 조회된 게시글 리스트 + */ private Set wordsToPosts(String[] words) { - Set resultSet = new LinkedHashSet<>(); // 순서 보장을 위해 LinkedHashSet 사용 + Set resultSet = new LinkedHashSet<>(); // 게시글 최신순 순서 보장을 위해 LinkedHashSet 사용 for (String word : words) { List posts = postRepository.findAllPostByQuery(word); @@ -263,6 +344,28 @@ private Set wordsToPosts(String[] words) { return resultSet; } + /** + * 게시글을 수정합니다. + * + * @param postId 게시글 번호 + * @param postUpdateDto 수정할 게시글 데이터 (제목, 본문, 해시태그, 삭제할 이미지 url) + * @param member 사용자 + * @param postImages 추가할 이미지 파일 리스트 + * @throws AccessDeniedException 타인의 글을 수정하려 시도 시 권한 에러를 반환합니다. + * 해당 함수는 다음과 같이 작동합니다. + * 1. 해시태그 변경 시도 + * 해시태그 리스트가 유효한 데이터로 들어올 경우에는 최종적으로 선택된 해시태그 2개의 정보가 포함되어 있어야 합니다. + * 해시태그 검증 수행 후 해시태그를 업데이트합니다. + * 2. 이미지 변경 시도 [이미지 개수 조건은 컨트롤러 계층에서 미리 처리] + * 이미지가 변경되는 경우에는 이미지 추가 혹은 삭제가 이루어집니다 (추가와 삭제가 모두 발생할 수도 있습니다.) + * 2.1 먼저 삭제할 이미지 url 리스트에 비어 있지 않을 경우 삭제를 시도합니다. + * 이를 위해 이미지 DB 에서 url 과 게시글 아이디를 이용해 조회하고 결과가 유효할 경우 이미지 DB와 S3에서 이미지를 삭제합니다. + * 삭제가 완료되면 기존 이미지 리스트에서도 자동으로 삭제됩니다. + * 2.2. 추가할 이미지가 존재할 경우 + * 게시글 수정용 이미지 추가 함수를 호출해 이미지를 저장합니다. + * 성공적으로 이미지가 저장되었을 경우 기존 이미지 리스트에 추가합니다. + * 3. 최종적인 변경 사항을 POST 에 대입힙니다. + */ @Transactional public void updatePost(Long postId, PostUpdateDto postUpdateDto, Member member, List postImages) throws AccessDeniedException { @@ -318,6 +421,15 @@ public void updatePost(Long postId, PostUpdateDto postUpdateDto, Member member, } } + /** + * 게시글 수정 시에만 사용되는 이미지 추가 함수 + * + * @param post 게시글 + * @param member 사용자 + * @param postImages 추가할 이미지 + * @param deleteId 추가할 이미지가 대입될 이미지 순서 리스트 + * @return 추가된 이미지 리스트 + */ @Transactional protected List addForUpdateImages(Post post, Member member, List postImages, List deleteId) { List images = new ArrayList<>(); @@ -356,7 +468,12 @@ protected List addForUpdateImages(Post post, Member member, List images) { // 이미지 리스트를 order 값에 따라 오름차순으로 정렬 @@ -367,10 +484,13 @@ protected void updateImageOrders(List images) { image.setOrder(order++); } - // 이미지의 order 값을 데이터베이스에 반영 - imageRepository.saveAll(images); + imageRepository.saveAll(images); // 이미지의 order 값을 데이터베이스에 반영 } + /** + * 게시글 삭제 시 해당 게시글에 존재하는 모든 이미지를 DB 와 S3 에서 모두 삭제합니다. + * @param images 삭제할 이미지 리스트 + */ @Transactional protected void deleteImages(List images) { for (Image image : images) { @@ -379,6 +499,13 @@ protected void deleteImages(List images) { imageRepository.deleteAll(images); } + /** + * 게시글 수정 시 삭제할 이미지를 처리하는 함수 + * + * @param images 삭제할 이미지의 URL 리스트 + * @param postId 게시글 번호 + * @return 삭제된 이미지들의 순서 리스트 + */ @Transactional protected List deleteImagesWithUrl(List images, Long postId) { List deleteImageIdx = new ArrayList<>(); diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/history2/api/SearchHistoryControllerV2.java b/src/main/java/com/solucitation/midpoint_backend/domain/history2/api/SearchHistoryControllerV2.java index ce54cc1..1ca022b 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/history2/api/SearchHistoryControllerV2.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/history2/api/SearchHistoryControllerV2.java @@ -76,7 +76,6 @@ public ResponseEntity saveHistory(Authentication authentication, } } - // 데이터 저장 searchHistoryService.save(neighborhood, memberEmail, searchHistoryRequestDtos); return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message", "장소를 저장하였습니다.")); diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/PlaceDtoV2.java b/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/PlaceDtoV2.java index ea76e1e..9daf359 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/PlaceDtoV2.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/PlaceDtoV2.java @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class PlaceDtoV2 { +public class PlaceDtoV2 { // 장소 정보 DTO @NotBlank(message = "장소ID가 누락되었습니다.") private String placeId; // 장소의 고유 ID diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryRequestDtoV2.java b/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryRequestDtoV2.java index 61ce773..677bc50 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryRequestDtoV2.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryRequestDtoV2.java @@ -11,7 +11,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class SearchHistoryRequestDtoV2 { +public class SearchHistoryRequestDtoV2 { // 검색 기록 저장 시 사용하는 DTO @NotBlank private String neighborhood; diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryResponseDtoV2.java b/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryResponseDtoV2.java index af54737..67d535d 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryResponseDtoV2.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/history2/dto/SearchHistoryResponseDtoV2.java @@ -11,8 +11,8 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class SearchHistoryResponseDtoV2 { +public class SearchHistoryResponseDtoV2 { // 검색 기록 리스트 시 사용하는 DTO private String neighborhood; - private LocalDateTime serachTime; + private LocalDateTime searchTime; private List places = new ArrayList<>(); } \ No newline at end of file diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/history2/repository/SearchHistoryRepositoryV2.java b/src/main/java/com/solucitation/midpoint_backend/domain/history2/repository/SearchHistoryRepositoryV2.java index 0d86d35..48c5e4a 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/history2/repository/SearchHistoryRepositoryV2.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/history2/repository/SearchHistoryRepositoryV2.java @@ -9,5 +9,6 @@ @Repository public interface SearchHistoryRepositoryV2 extends JpaRepository { + // 멤버가 저장한 검색 기록을 최신순부터 가져옵니다. List findByMemberOrderBySearchDateDesc(Member member); } \ No newline at end of file diff --git a/src/main/java/com/solucitation/midpoint_backend/domain/history2/service/SearchHistoryServiceV2.java b/src/main/java/com/solucitation/midpoint_backend/domain/history2/service/SearchHistoryServiceV2.java index dfffb17..cbec1fd 100644 --- a/src/main/java/com/solucitation/midpoint_backend/domain/history2/service/SearchHistoryServiceV2.java +++ b/src/main/java/com/solucitation/midpoint_backend/domain/history2/service/SearchHistoryServiceV2.java @@ -27,6 +27,13 @@ public class SearchHistoryServiceV2 { private final SearchHistoryRepositoryV2 searchHistoryRepository; private final MemberService memberService; + /** + * 검색 기록을 저장합니다. + * + * @param neighborhood 동 정보 + * @param memberEmail 사용자 정보 + * @param placeDtos 장소 정보 리스트 + */ @Transactional public void save(String neighborhood, String memberEmail, List placeDtos) { Member member = memberService.getMemberByEmail(memberEmail); @@ -38,7 +45,7 @@ public void save(String neighborhood, String memberEmail, List place for (PlaceDtoV2 dto : placeDtos) { String imageUrl = dto.getImageUrl(); - if (imageUrl == null || imageUrl.trim().isEmpty()) { // 이미지 url이 없거나 공백 + if (imageUrl == null || imageUrl.trim().isEmpty()) { // 해당 장소의 이미지가 존재하지 않을 경우 기본 이미지를 저장합니다. imageUrl = defaultImageUrl; } @@ -47,13 +54,18 @@ public void save(String neighborhood, String memberEmail, List place .placeId(dto.getPlaceId()) .address(dto.getPlaceAddress()) .imageUrl(imageUrl) - .searchHistory(searchHistory) // searchHistory 필드 설정 + .searchHistory(searchHistory) /// 연관관계 설정 .build(); searchHistory.getPlaceList().add(placeInfo); } searchHistoryRepository.save(searchHistory); } + /** + * 사용자가 저장한 검색 기록을 전부 최신순부터 반환합니다. + * @param member 사용자 + * @return 검색 기록 정보 리스트 + */ @Transactional(readOnly = true) public List getHistory(Member member) { List histories = searchHistoryRepository.findByMemberOrderBySearchDateDesc(member);