From 50084bb4605f793260df221e2d8f7ef24bec39a8 Mon Sep 17 00:00:00 2001 From: firefox1234123 Date: Sun, 4 Aug 2024 22:43:36 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20moodId=20List=EB=A1=9C=20=EB=B0=9B?= =?UTF-8?q?=EA=B8=B0,=20=EB=B6=84=EC=9C=84=EA=B8=B0=EB=B3=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=88=98=EC=A0=95#3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mood/domain/Mood.java | 4 +-- .../post/api/dto/PostController.java | 6 ++-- .../post/api/dto/request/PostSaveReqDto.java | 4 ++- .../api/dto/request/PostUpdateReqDto.java | 4 ++- .../post/api/dto/response/PostInfoResDto.java | 5 +-- .../post/application/PostService.java | 33 ++++++++++--------- .../post/domain/Post.java | 22 +++++++++---- .../domain/repository/PostRepository.java | 7 ++++ 8 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/main/java/net/skhu/likelion12thteam03be/mood/domain/Mood.java b/src/main/java/net/skhu/likelion12thteam03be/mood/domain/Mood.java index d7e9be7..9dbfb69 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/mood/domain/Mood.java +++ b/src/main/java/net/skhu/likelion12thteam03be/mood/domain/Mood.java @@ -24,8 +24,8 @@ public class Mood { private String name; @JsonIgnore - @OneToMany(mappedBy = "mood", cascade = CascadeType.ALL, orphanRemoval = true) - private List postList = new ArrayList<>(); + @ManyToMany(mappedBy = "moods", cascade = CascadeType.ALL) + private List posts = new ArrayList<>(); @Builder public Mood(String name) { diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/PostController.java b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/PostController.java index 1dd0c8f..a2bfa10 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/PostController.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/PostController.java @@ -5,6 +5,7 @@ import net.skhu.likelion12thteam03be.post.api.dto.response.PostInfoResDto; import net.skhu.likelion12thteam03be.post.api.dto.response.PostListResDto; import net.skhu.likelion12thteam03be.post.application.PostService; +import net.skhu.likelion12thteam03be.post.domain.Post; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -13,6 +14,7 @@ import java.io.IOException; import java.security.Principal; +import java.util.List; @RestController @RequestMapping("/posts") @@ -63,8 +65,8 @@ public ResponseEntity postFindByCategoryId(@PathVariable("catego // 글 분위기별 조회 @GetMapping("/moods/{moodId}") - public ResponseEntity postFindByMoodId(@PathVariable("moodId") Long moodId) { - PostListResDto postListResDto = postService.postFindByMoodId(moodId); + public ResponseEntity postFindByMoodId(@PathVariable("moodId") List moodIds) { + PostListResDto postListResDto = postService.postFindByMoodIds(moodIds); return new ResponseEntity<>(postListResDto, HttpStatus.OK); } diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostSaveReqDto.java b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostSaveReqDto.java index 51dd5bd..f1fe4be 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostSaveReqDto.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostSaveReqDto.java @@ -1,5 +1,7 @@ package net.skhu.likelion12thteam03be.post.api.dto.request; +import java.util.List; + public record PostSaveReqDto( String title, String content, @@ -7,6 +9,6 @@ public record PostSaveReqDto( Integer time, Integer price, Long categoryId, - Long moodId + List moodIds ) { } diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostUpdateReqDto.java b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostUpdateReqDto.java index 5c095ad..cdcee4d 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostUpdateReqDto.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/request/PostUpdateReqDto.java @@ -1,5 +1,7 @@ package net.skhu.likelion12thteam03be.post.api.dto.request; +import java.util.List; + public record PostUpdateReqDto( String title, String content, @@ -7,6 +9,6 @@ public record PostUpdateReqDto( Integer time, Integer price, Long categoryId, - Long moodId + List moodIds ) { } diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/response/PostInfoResDto.java b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/response/PostInfoResDto.java index 5653d68..ca2fca0 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/response/PostInfoResDto.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/api/dto/response/PostInfoResDto.java @@ -7,6 +7,7 @@ import net.skhu.likelion12thteam03be.post.domain.Post; import java.time.LocalDateTime; +import java.util.List; @Builder public record PostInfoResDto( @@ -17,7 +18,7 @@ public record PostInfoResDto( Integer time, Integer price, Category category, - Mood mood, + List moods, LocalDateTime createDate, LocalDateTime modifiedDate ) { @@ -29,7 +30,7 @@ public static PostInfoResDto from(Post post) { .time(post.getTime()) .price(post.getPrice()) .category(post.getCategory()) - .mood(post.getMood()) + .moods(post.getMoods()) .imgUrl(post.getImgUrl()) .createDate(post.getCreateDate()) .modifiedDate(post.getModifiedDate()) diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/application/PostService.java b/src/main/java/net/skhu/likelion12thteam03be/post/application/PostService.java index f7ff20b..5ef41eb 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/application/PostService.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/application/PostService.java @@ -23,8 +23,10 @@ import java.io.IOException; import java.security.Principal; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service @Transactional(readOnly = false) @@ -43,7 +45,7 @@ public void postSave(PostSaveReqDto postSaveReqDto, @RequestPart(required = fals String loginId = principal.getName(); User user = userRepository.findByLoginId(loginId) - .orElseThrow(() -> new IllegalArgumentException("User not found with id = " + loginId)); + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다. loginId = " + loginId)); Location location = locationRepository.findById(postSaveReqDto.locationId()) .orElseThrow(() -> new IllegalArgumentException("해당 위치가 존재하지 않습니다. locationId = " + postSaveReqDto.locationId())); @@ -51,8 +53,7 @@ public void postSave(PostSaveReqDto postSaveReqDto, @RequestPart(required = fals Category category = categoryRepository.findById(postSaveReqDto.categoryId()) .orElseThrow(() -> new IllegalArgumentException("해당 카테고리가 존재하지 않습니다. categoryId = " + postSaveReqDto.categoryId())); - Mood mood = moodRepository.findById(postSaveReqDto.moodId()) - .orElseThrow(() -> new IllegalArgumentException("해당 분위기가 존재하지 않습니다. moodId = " + postSaveReqDto.moodId())); + List moods = moodRepository.findAllById(postSaveReqDto.moodIds()); Post post = Post.builder() .title(postSaveReqDto.title()) @@ -61,7 +62,7 @@ public void postSave(PostSaveReqDto postSaveReqDto, @RequestPart(required = fals .time(postSaveReqDto.time()) .price(postSaveReqDto.price()) .category(category) - .mood(mood) + .moods(moods) .imgUrl(imgUrl) .user(user) .build(); @@ -115,15 +116,18 @@ public PostListResDto postFindByCategoryId(Long categoryId) { } // 글 분위기별 조회 - public PostListResDto postFindByMoodId(Long moodId) { - Optional posts = Optional.ofNullable(postRepository.findById(moodId).orElseThrow( - () -> new IllegalArgumentException("해당 분위기의 글을 찾을 수 없습니다. moodId = " + moodId) - )); + public PostListResDto postFindByMoodIds(List moodIds) { + List postInfoResDtoList = new ArrayList<>(); - List postInfoResDtoList = posts.stream() - .map(PostInfoResDto::from) - .toList(); + for (Long moodId : moodIds) { + List posts = postRepository.findByMoodId(moodId); + + List collectPostInfoResDtoList = posts.stream() + .map(PostInfoResDto::from) + .collect(Collectors.toList()); + postInfoResDtoList.addAll(collectPostInfoResDtoList); + } return PostListResDto.from(postInfoResDtoList); } @@ -162,12 +166,11 @@ public void postUpdate(Long postId, PostUpdateReqDto postUpdateReqDto, Multipart Category category = categoryRepository.findById(postUpdateReqDto.categoryId()) .orElseThrow(() -> new IllegalArgumentException("해당 카테고리가 존재하지 않습니다. categoryId = " + postUpdateReqDto.categoryId())); - Mood mood = moodRepository.findById(postUpdateReqDto.moodId()) - .orElseThrow(() -> new IllegalArgumentException("해당 분위기가 존재하지 않습니다. moodId = " + postUpdateReqDto.moodId())); + List moods = moodRepository.findAllById(postUpdateReqDto.moodIds()); String imgUrl = s3Service.upload(multipartFile, "post"); - post.update(location, category, postUpdateReqDto, mood, imgUrl); + post.update(location, category, postUpdateReqDto, moods, imgUrl); postRepository.save(post); } @@ -190,7 +193,7 @@ public void postDelete(Long postId, Principal principal) throws IOException { try { s3Service.delete(url, "post"); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("이미지 삭제 중 오류 발 생", e); + throw new IllegalArgumentException("이미지 삭제 중 오류 발생", e); } postRepository.delete(post); }, diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/domain/Post.java b/src/main/java/net/skhu/likelion12thteam03be/post/domain/Post.java index 6f4915c..d9b1c02 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/domain/Post.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/domain/Post.java @@ -11,6 +11,8 @@ import net.skhu.likelion12thteam03be.post.api.dto.request.PostUpdateReqDto; import net.skhu.likelion12thteam03be.user.domain.User; +import java.util.List; + @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -35,9 +37,15 @@ public class Post extends Time { @JoinColumn(name = "categoryId") private Category category; - @ManyToOne - @JoinColumn(name = "moodId") - private Mood mood; // 감정 키워드 + /*@ManyToOne + @JoinColumn(name = "moodId")*/ + @ManyToMany + @JoinTable( + name = "post_moods", + joinColumns = @JoinColumn(name = "post_id"), + inverseJoinColumns = @JoinColumn(name = "mood_id") + ) + private List moods; // 분위기 키워드 private String imgUrl; // 사진 @@ -46,26 +54,26 @@ public class Post extends Time { private User user; @Builder - public Post(String title, String content, Location location, Integer time, Integer price, Category category, Mood mood, String imgUrl, User user) { + public Post(String title, String content, Location location, Integer time, Integer price, Category category, List moods, String imgUrl, User user) { this.title = title; this.content = content; this.location = location; this.time = time; this.price = price; this.category = category; - this.mood = mood; + this.moods = moods; this.imgUrl = imgUrl; this.user = user; } - public void update(Location location, Category category, PostUpdateReqDto postUpdateReqDto, Mood mood, String imgUrl) { + public void update(Location location, Category category, PostUpdateReqDto postUpdateReqDto, List moods, String imgUrl) { this.title = postUpdateReqDto.title(); this.content = postUpdateReqDto.content(); this.location = location; this.time = postUpdateReqDto.time(); this.price = postUpdateReqDto.price(); this.category = category; - this.mood = mood; + this.moods = moods; this.imgUrl = imgUrl; } } diff --git a/src/main/java/net/skhu/likelion12thteam03be/post/domain/repository/PostRepository.java b/src/main/java/net/skhu/likelion12thteam03be/post/domain/repository/PostRepository.java index d1f7f9c..436f446 100644 --- a/src/main/java/net/skhu/likelion12thteam03be/post/domain/repository/PostRepository.java +++ b/src/main/java/net/skhu/likelion12thteam03be/post/domain/repository/PostRepository.java @@ -2,8 +2,15 @@ import net.skhu.likelion12thteam03be.post.domain.Post; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + + @Repository public interface PostRepository extends JpaRepository { + @Query("select p from Post p join fetch p.moods m where m.moodId = :moodId ") + List findByMoodId(Long moodId); }