Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[IDLE-322] 도서 저자, 번역가 반정규화 이후 추천 피드 쿼리 수정 #20

Merged
merged 3 commits into from
Mar 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package kr.mybrary.bookservice.book.domain;

import java.util.List;
import java.util.stream.Collectors;
import kr.mybrary.bookservice.book.domain.dto.BookDtoMapper;
import kr.mybrary.bookservice.book.domain.dto.request.BookCreateServiceRequest;
import kr.mybrary.bookservice.book.domain.exception.BookAlreadyExistsException;
import kr.mybrary.bookservice.book.persistence.Book;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookCategory;
import kr.mybrary.bookservice.book.persistence.bookInfo.Author;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookAuthor;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookCategory;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookTranslator;
import kr.mybrary.bookservice.book.persistence.bookInfo.Translator;
import kr.mybrary.bookservice.book.persistence.repository.AuthorRepository;
import kr.mybrary.bookservice.book.persistence.repository.BookCategoryRepository;
import kr.mybrary.bookservice.book.persistence.repository.BookRepository;
import kr.mybrary.bookservice.book.persistence.repository.TranslatorRepository;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookTranslator;
import kr.mybrary.bookservice.book.persistence.bookInfo.Translator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
Expand Down Expand Up @@ -42,22 +43,38 @@ public void create(BookCreateServiceRequest request) {
checkBookAlreadyRegistered(request);
Book book = BookDtoMapper.INSTANCE.bookCreateRequestToEntity(request);

List<BookAuthor> bookAuthors = request.getAuthors().stream()
.map(r -> getAuthor(r.getAuthorId(), r.getName()))
.map(author -> BookAuthor.builder().author(author).build())
.toList();
book.addBookAuthor(getBookAuthors(request));
book.addBookTranslator(getBookTranslators(request));
book.assignCategory(getBookCategory(request.getCategoryId(), request.getCategory()));
book.updateAuthorWithComma(joiningAuthorWithComma(request));
book.updateTranslatorWithComma(joiningTranslatorWithComma(request));

bookRepository.save(book);
log.info("New Book Saved : {}, {}", book.getTitle(), book.getIsbn13());
}

private String joiningAuthorWithComma(BookCreateServiceRequest request) {
return request.getAuthors().stream().map(BookCreateServiceRequest.Author::getName)
.collect(Collectors.joining(", "));
}

List<BookTranslator> bookTranslators = request.getTranslators().stream()
private String joiningTranslatorWithComma(BookCreateServiceRequest request) {
return request.getTranslators().stream().map(BookCreateServiceRequest.Translator::getName)
.collect(Collectors.joining(", "));
}

private List<BookTranslator> getBookTranslators(BookCreateServiceRequest request) {
return request.getTranslators().stream()
.map(r -> getTranslator(r.getTranslatorId(), r.getName()))
.map(translator -> BookTranslator.builder().translator(translator).build())
.toList();
}

book.addBookAuthor(bookAuthors);
book.addBookTranslator(bookTranslators);
book.assignCategory(getBookCategory(request.getCategoryId(), request.getCategory()));

bookRepository.save(book);
log.info("New Book Saved : {}, {}", book.getTitle(), book.getIsbn13());
private List<BookAuthor> getBookAuthors(BookCreateServiceRequest request) {
return request.getAuthors().stream()
.map(r -> getAuthor(r.getAuthorId(), r.getName()))
.map(author -> BookAuthor.builder().author(author).build())
.toList();
}

private void checkBookAlreadyRegistered(BookCreateServiceRequest request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public interface BookDtoMapper {
@Mapping(target = "starRating", constant = "0")
@Mapping(target = "reviewCount", constant = "0")
@Mapping(target = "recommendationFeedCount", constant = "0")
@Mapping(target = "authors", constant = "")
@Mapping(target = "translators", constant = "")
@Mapping(target = "aladinStarRating", source = "starRating")
@Mapping(target = "aladinReviewCount", source = "reviewCount")
Book bookCreateRequestToEntity(BookCreateServiceRequest request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookAuthor;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookCategory;
import kr.mybrary.bookservice.book.persistence.bookInfo.BookTranslator;
Expand All @@ -19,10 +22,6 @@
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import lombok.NoArgsConstructor;

@Entity
Expand Down Expand Up @@ -77,6 +76,9 @@ public class Book extends BaseEntity {
private Double aladinStarRating;
private Integer aladinReviewCount;

private String authors;
private String translators;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private BookCategory bookCategory;

Expand Down Expand Up @@ -164,4 +166,12 @@ public void updateWhenDeleteReview(Double originStarRating) {
this.reviewCount--;
this.starRating -= originStarRating;
}

public void updateAuthorWithComma(String authors) {
this.authors = authors;
}

public void updateTranslatorWithComma(String translators) {
this.translators = translators;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class RecommendationFeedOfUserViewModel {

private String content;
private List<RecommendationTargetOfUserModel> recommendationTargets;
private List<RecommendationFeedOfUserBookAuthorModel> bookAuthors;
private String bookAuthors;

private Long recommendationFeedId;
private Long myBookId;
Expand All @@ -30,10 +30,6 @@ public void setRecommendationTargets(List<RecommendationTargetOfUserModel> recom
this.recommendationTargets = recommendationTargetOfUserModels;
}

public void setBookAuthors(List<RecommendationFeedOfUserBookAuthorModel> bookAuthors) {
this.bookAuthors = bookAuthors;
}

@Getter
@Builder
@NoArgsConstructor
Expand All @@ -44,16 +40,4 @@ public static class RecommendationTargetOfUserModel {
private Long targetId;
private String targetName;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public static class RecommendationFeedOfUserBookAuthorModel {

private Long authorId;
private Integer aid;
private String name;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class RecommendationFeedViewAllModel {

private String content;
private List<RecommendationTargetModel> recommendationTargets;
private List<BookAuthorModel> bookAuthors;
private String bookAuthors;

private String userId;

Expand All @@ -33,10 +33,6 @@ public void setRecommendationTargets(List<RecommendationTargetModel> recommendat
this.recommendationTargets = recommendationTargetModels;
}

public void setBookAuthors(List<BookAuthorModel> bookAuthorModels) {
this.bookAuthors = bookAuthorModels;
}

public void setInterested(boolean interested) {
this.interested = interested;
}
Expand All @@ -51,16 +47,4 @@ public static class RecommendationTargetModel {
private Long targetId;
private String targetName;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public static class BookAuthorModel {

private Long authorId;
private Integer aid;
private String name;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
import static com.querydsl.core.types.dsl.Expressions.set;
import static kr.mybrary.bookservice.book.persistence.QBook.book;
import static kr.mybrary.bookservice.book.persistence.QBookInterest.bookInterest;
import static kr.mybrary.bookservice.book.persistence.bookInfo.QAuthor.author;
import static kr.mybrary.bookservice.book.persistence.bookInfo.QBookAuthor.bookAuthor;
import static kr.mybrary.bookservice.mybook.persistence.QMyBook.myBook;
import static kr.mybrary.bookservice.recommend.persistence.QRecommendationFeed.recommendationFeed;
import static kr.mybrary.bookservice.recommend.persistence.QRecommendationTarget.recommendationTarget;
Expand All @@ -22,10 +20,8 @@
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfBookViewModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfBookViewModel.RecommendationTargetOfBookModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfUserViewModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfUserViewModel.RecommendationFeedOfUserBookAuthorModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfUserViewModel.RecommendationTargetOfUserModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedViewAllModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedViewAllModel.BookAuthorModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedViewAllModel.RecommendationTargetModel;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
Expand All @@ -48,7 +44,8 @@ public List<RecommendationFeedViewAllModel> getRecommendationFeedViewAll(Long re
book.isbn13.as("isbn13"),
book.thumbnailUrl.as("thumbnailUrl"),
book.holderCount.as("holderCount"),
book.interestCount.as("interestCount")
book.interestCount.as("interestCount"),
book.authors.as("bookAuthors")
))
.from(recommendationFeed)
.where(ltRecommendationFeedId(recommendationFeedId))
Expand All @@ -62,10 +59,6 @@ public List<RecommendationFeedViewAllModel> getRecommendationFeedViewAll(Long re
.map(RecommendationFeedViewAllModel::getRecommendationFeedId)
.toList();

List<Long> bookIds = models.stream()
.map(RecommendationFeedViewAllModel::getBookId)
.toList();

Map<Long, List<RecommendationTargetModel>> recommendationTargetModelMap = queryFactory
.select(
fields(RecommendationTargetModel.class,
Expand All @@ -80,30 +73,12 @@ public List<RecommendationFeedViewAllModel> getRecommendationFeedViewAll(Long re
recommendationTarget.targetName.as("targetName")
))));

Map<Long, List<BookAuthorModel>> bookAuthorModelMap = queryFactory
.select(
fields(BookAuthorModel.class,
author.id.as("authorId"),
author.aid.as("aid"),
author.name.as("name")
)
).from(bookAuthor)
.join(bookAuthor.author, author).on(bookAuthor.author.id.eq(author.id))
.where(bookAuthor.book.id.in(bookIds))
.transform(groupBy(bookAuthor.book.id)
.as(list(fields(BookAuthorModel.class,
author.id.as("authorId"),
author.aid.as("aid"),
author.name.as("name")
))));

Set<Long> interestedBookIdSet = queryFactory.select(book.id).from(bookInterest)
.where(bookInterest.userId.eq(userId))
.transform(groupBy(book.id).as(set(book.id))).keySet();

models.forEach(model -> {
model.setRecommendationTargets(recommendationTargetModelMap.getOrDefault(model.getRecommendationFeedId(), List.of()));
model.setBookAuthors(bookAuthorModelMap.getOrDefault(model.getBookId(), List.of()));
model.setInterested(interestedBookIdSet.contains(model.getBookId()));
});

Expand Down Expand Up @@ -137,7 +112,8 @@ public List<RecommendationFeedOfUserViewModel> getRecommendationFeedViewOfUserMo
book.id.as("bookId"),
book.title.as("title"),
book.isbn13.as("isbn13"),
book.thumbnailUrl.as("thumbnailUrl")
book.thumbnailUrl.as("thumbnailUrl"),
book.authors.as("bookAuthors")
))
.from(recommendationFeed)
.where(recommendationFeed.userId.eq(userId))
Expand All @@ -150,10 +126,6 @@ public List<RecommendationFeedOfUserViewModel> getRecommendationFeedViewOfUserMo
.map(RecommendationFeedOfUserViewModel::getRecommendationFeedId)
.toList();

List<Long> bookIds = models.stream()
.map(RecommendationFeedOfUserViewModel::getBookId)
.toList();

Map<Long, List<RecommendationTargetOfUserModel>> recommendationTargetModelMap = queryFactory
.select(
fields(RecommendationTargetOfUserModel.class,
Expand All @@ -168,26 +140,8 @@ public List<RecommendationFeedOfUserViewModel> getRecommendationFeedViewOfUserMo
recommendationTarget.targetName.as("targetName")
))));

Map<Long, List<RecommendationFeedOfUserBookAuthorModel>> bookAuthorModelMap = queryFactory
.select(
fields(RecommendationFeedOfUserBookAuthorModel.class,
author.id.as("authorId"),
author.aid.as("aid"),
author.name.as("name")
)
).from(bookAuthor)
.join(bookAuthor.author, author).on(bookAuthor.author.id.eq(author.id))
.where(bookAuthor.book.id.in(bookIds))
.transform(groupBy(bookAuthor.book.id)
.as(list(fields(RecommendationFeedOfUserBookAuthorModel.class,
author.id.as("authorId"),
author.aid.as("aid"),
author.name.as("name")
))));

models.forEach(model -> {
model.setRecommendationTargets(recommendationTargetModelMap.getOrDefault(model.getRecommendationFeedId(), List.of()));
model.setBookAuthors(bookAuthorModelMap.getOrDefault(model.getBookId(), List.of()));
});

return models;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package kr.mybrary.bookservice.recommend.presentation.dto.response;

import java.util.Arrays;
import java.util.List;
import kr.mybrary.bookservice.global.util.DateUtils;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfUserViewModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfUserViewModel.RecommendationFeedOfUserBookAuthorModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedOfUserViewModel.RecommendationTargetOfUserModel;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -28,8 +28,7 @@ public static RecommendationFeedOfUserViewResponse of(List<RecommendationFeedOfU
.createdAt(DateUtils.toDotFormatYYYYMMDD(recommendationFeed.getCreatedAt()))
.recommendationTargetNames(recommendationFeed.getRecommendationTargets().stream()
.map(RecommendationTargetOfUserModel::getTargetName).toList())
.authors(recommendationFeed.getBookAuthors().stream().map(
RecommendationFeedOfUserBookAuthorModel::getName).toList())
.authors(getAuthorList(recommendationFeed))
.build()).toList()).build();
}

Expand All @@ -49,4 +48,13 @@ public static class RecommendationFeedElement {
private List<String> recommendationTargetNames;
private List<String> authors;
}

private static List<String> getAuthorList(RecommendationFeedOfUserViewModel recommendationFeed) {
if (recommendationFeed.getBookAuthors() == null) {
return List.of();
}

return Arrays.stream(recommendationFeed.getBookAuthors().split(", "))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package kr.mybrary.bookservice.recommend.presentation.dto.response;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import kr.mybrary.bookservice.client.user.dto.response.UserInfoServiceResponse.UserInfo;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedViewAllModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedViewAllModel.BookAuthorModel;
import kr.mybrary.bookservice.recommend.persistence.model.RecommendationFeedViewAllModel.RecommendationTargetModel;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -59,9 +59,7 @@ public static RecommendationFeedViewAllResponse of(List<RecommendationFeedViewAl
.title(recommendationFeed.getTitle())
.thumbnailUrl(recommendationFeed.getThumbnailUrl())
.isbn13(recommendationFeed.getIsbn13())
.authors(recommendationFeed.getBookAuthors().stream()
.map(BookAuthorModel::getName)
.toList())
.authors(getAuthorList(recommendationFeed))
.holderCount(recommendationFeed.getHolderCount())
.interestCount(recommendationFeed.getInterestCount())
.interested(recommendationFeed.getInterested())
Expand All @@ -71,4 +69,13 @@ public static RecommendationFeedViewAllResponse of(List<RecommendationFeedViewAl
.lastRecommendationFeedId(lastRecommendationFeedId)
.build();
}

private static List<String> getAuthorList(RecommendationFeedViewAllModel recommendationFeed) {
if (recommendationFeed.getBookAuthors() == null) {
return List.of();
}

return Arrays.stream(recommendationFeed.getBookAuthors().split(", "))
.toList();
}
}
Loading
Loading