Skip to content

Commit

Permalink
[REFACTOR] Early return 적용
Browse files Browse the repository at this point in the history
  • Loading branch information
Kim-TaeUk committed Aug 23, 2024
1 parent c9d0266 commit ded9a8d
Showing 1 changed file with 89 additions and 89 deletions.
178 changes: 89 additions & 89 deletions src/main/java/org/websoso/WSSServer/service/UserNovelService.java
Original file line number Diff line number Diff line change
Expand Up @@ -252,69 +252,69 @@ public UserNovelAndNovelsGetResponse getUserNovelsAndNovels(User visitor, Long o
Long lastUserNovelId, int size, String sortType) {
User owner = userService.getUserOrException(ownerId);

if (isProfileAccessible(visitor, ownerId, owner)) {
// TODO 성능 개선
List<UserNovel> userNovelsByUserAndSortType =
userNovelRepository.findByUserAndReadStatus(owner, readStatus);
long evaluatedUserNovelCount = userNovelsByUserAndSortType.stream()
.filter(userNovel -> userNovel.getUserNovelRating() != 0.0f)
.count();
float evaluatedUserNovelSum = (float) userNovelsByUserAndSortType
.stream()
.filter(userNovel -> userNovel.getUserNovelRating() != 0.0f)
.mapToDouble(UserNovel::getUserNovelRating)
.sum();
Float evaluatedUserNovelRating = evaluatedUserNovelCount > 0
? evaluatedUserNovelSum / evaluatedUserNovelCount
: 0;
Long userNovelCount = (long) userNovelsByUserAndSortType.size();

List<UserNovel> userNovelsByNoOffsetPagination = userNovelRepository.findUserNovelsByNoOffsetPagination(
owner, lastUserNovelId, size, readStatus, sortType);
// TODO Slice의 hasNext()로 판단하도록 수정
Boolean isLoadable = userNovelsByNoOffsetPagination.size() == size;
List<UserNovelAndNovelGetResponse> userNovelAndNovelGetResponses = userNovelsByNoOffsetPagination.stream()
.map(UserNovelAndNovelGetResponse::of)
.toList();

return UserNovelAndNovelsGetResponse.of(userNovelCount, evaluatedUserNovelRating, isLoadable,
userNovelAndNovelGetResponses);
if (isProfileInaccessible(visitor, ownerId, owner)) {
throw new CustomUserException(PRIVATE_PROFILE_STATUS, "the profile status of the user is set to private");
}

throw new CustomUserException(PRIVATE_PROFILE_STATUS, "the profile status of the user is set to private");
// TODO 성능 개선
List<UserNovel> userNovelsByUserAndSortType =
userNovelRepository.findByUserAndReadStatus(owner, readStatus);
long evaluatedUserNovelCount = userNovelsByUserAndSortType.stream()
.filter(userNovel -> userNovel.getUserNovelRating() != 0.0f)
.count();
float evaluatedUserNovelSum = (float) userNovelsByUserAndSortType
.stream()
.filter(userNovel -> userNovel.getUserNovelRating() != 0.0f)
.mapToDouble(UserNovel::getUserNovelRating)
.sum();
Float evaluatedUserNovelRating = evaluatedUserNovelCount > 0
? evaluatedUserNovelSum / evaluatedUserNovelCount
: 0;
Long userNovelCount = (long) userNovelsByUserAndSortType.size();

List<UserNovel> userNovelsByNoOffsetPagination = userNovelRepository.findUserNovelsByNoOffsetPagination(
owner, lastUserNovelId, size, readStatus, sortType);
// TODO Slice의 hasNext()로 판단하도록 수정
Boolean isLoadable = userNovelsByNoOffsetPagination.size() == size;
List<UserNovelAndNovelGetResponse> userNovelAndNovelGetResponses = userNovelsByNoOffsetPagination.stream()
.map(UserNovelAndNovelGetResponse::of)
.toList();

return UserNovelAndNovelsGetResponse.of(userNovelCount, evaluatedUserNovelRating, isLoadable,
userNovelAndNovelGetResponses);
}

@Transactional(readOnly = true)
public UserGenrePreferencesGetResponse getUserGenrePreferences(User visitor, Long ownerId) {
User owner = userService.getUserOrException(ownerId);

if (isProfileAccessible(visitor, ownerId, owner)) {
//TODO genreMap은 Genre의 변화가 없다면 매번 repository에서 가져올 필요가 없음 -> 캐싱하여 사용하도록 리팩터링
List<Genre> allGenres = genreRepository.findAll();
if (isProfileInaccessible(visitor, ownerId, owner)) {
throw new CustomUserException(PRIVATE_PROFILE_STATUS, "the profile status of the user is set to private");
}

Map<Genre, Long> myGenreCountMap = userNovelRepository.findUserNovelByUser(owner)
.stream()
.map(UserNovel::getNovel)
.map(Novel::getNovelGenres)
.flatMap(List::stream)
.map(NovelGenre::getGenre)
.collect(Collectors.groupingBy(genre -> genre, Collectors.counting()));
//TODO genreMap은 Genre의 변화가 없다면 매번 repository에서 가져올 필요가 없음 -> 캐싱하여 사용하도록 리팩터링
List<Genre> allGenres = genreRepository.findAll();

allGenres.forEach(genre -> myGenreCountMap.putIfAbsent(genre, 0L));
Map<Genre, Long> myGenreCountMap = userNovelRepository.findUserNovelByUser(owner)
.stream()
.map(UserNovel::getNovel)
.map(Novel::getNovelGenres)
.flatMap(List::stream)
.map(NovelGenre::getGenre)
.collect(Collectors.groupingBy(genre -> genre, Collectors.counting()));

List<Genre> priorityOrderByGender = getPriorityOrderByGender(owner.getGender(), allGenres);
allGenres.forEach(genre -> myGenreCountMap.putIfAbsent(genre, 0L));

List<UserGenrePreferenceGetResponse> genrePreferences = myGenreCountMap.entrySet()
.stream()
.sorted(Map.Entry.<Genre, Long>comparingByValue().reversed()
.thenComparing(entry -> priorityOrderByGender.indexOf(entry.getKey())))
.map(preferGenre -> UserGenrePreferenceGetResponse.of(preferGenre.getKey(), preferGenre.getValue()))
.toList();
List<Genre> priorityOrderByGender = getPriorityOrderByGender(owner.getGender(), allGenres);

return UserGenrePreferencesGetResponse.of(genrePreferences);
}
List<UserGenrePreferenceGetResponse> genrePreferences = myGenreCountMap.entrySet()
.stream()
.sorted(Map.Entry.<Genre, Long>comparingByValue().reversed()
.thenComparing(entry -> priorityOrderByGender.indexOf(entry.getKey())))
.map(preferGenre -> UserGenrePreferenceGetResponse.of(preferGenre.getKey(), preferGenre.getValue()))
.toList();

throw new CustomUserException(PRIVATE_PROFILE_STATUS, "the profile status of the user is set to private");
return UserGenrePreferencesGetResponse.of(genrePreferences);
}

private static boolean isOwner(User visitor, Long ownerId) {
Expand Down Expand Up @@ -342,49 +342,49 @@ public UserTasteAttractivePointPreferencesAndKeywordsGetResponse getUserAttracti
Long ownerId) {
User owner = userService.getUserOrException(ownerId);

if (isProfileAccessible(visitor, ownerId, owner)) {
List<UserNovel> ownerUserNovels = userNovelRepository.findUserNovelByUser(owner);

Map<String, Long> ownerAttractivePointCountMap = ownerUserNovels.stream()
.map(UserNovel::getUserNovelAttractivePoints)
.flatMap(List::stream)
.map(UserNovelAttractivePoint::getAttractivePoint)
.collect(Collectors.groupingBy(AttractivePoint::getAttractivePointName, Collectors.counting()));

List<String> top3OwnerAttractivePointNames = ownerAttractivePointCountMap.entrySet()
.stream()
.sorted(Entry.<String, Long>comparingByValue().reversed())
.limit(3)
.map(Entry::getKey)
.toList();

Map<String, Long> tasteAttractivePoints = ownerUserNovels.stream()
.map(UserNovel::getUserNovelKeywords)
.flatMap(List::stream)
.map(UserNovelKeyword::getKeyword)
.collect(Collectors.groupingBy(Keyword::getKeywordName, Collectors.counting()))
.entrySet()
.stream()
.sorted(Entry.<String, Long>comparingByValue().reversed())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));

List<TasteKeywordGetResponse> tasteKeywordGetResponses = tasteAttractivePoints.entrySet()
.stream()
.map(TasteKeywordGetResponse::of)
.toList();

return UserTasteAttractivePointPreferencesAndKeywordsGetResponse.of(
top3OwnerAttractivePointNames, tasteKeywordGetResponses);
if (isProfileInaccessible(visitor, ownerId, owner)) {
throw new CustomUserException(PRIVATE_PROFILE_STATUS, "the profile status of the user is set to private");
}

throw new CustomUserException(PRIVATE_PROFILE_STATUS, "the profile status of the user is set to private");
List<UserNovel> ownerUserNovels = userNovelRepository.findUserNovelByUser(owner);

Map<String, Long> ownerAttractivePointCountMap = ownerUserNovels.stream()
.map(UserNovel::getUserNovelAttractivePoints)
.flatMap(List::stream)
.map(UserNovelAttractivePoint::getAttractivePoint)
.collect(Collectors.groupingBy(AttractivePoint::getAttractivePointName, Collectors.counting()));

List<String> top3OwnerAttractivePointNames = ownerAttractivePointCountMap.entrySet()
.stream()
.sorted(Entry.<String, Long>comparingByValue().reversed())
.limit(3)
.map(Entry::getKey)
.toList();

Map<String, Long> tasteAttractivePoints = ownerUserNovels.stream()
.map(UserNovel::getUserNovelKeywords)
.flatMap(List::stream)
.map(UserNovelKeyword::getKeyword)
.collect(Collectors.groupingBy(Keyword::getKeywordName, Collectors.counting()))
.entrySet()
.stream()
.sorted(Entry.<String, Long>comparingByValue().reversed())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));

List<TasteKeywordGetResponse> tasteKeywordGetResponses = tasteAttractivePoints.entrySet()
.stream()
.map(TasteKeywordGetResponse::of)
.toList();

return UserTasteAttractivePointPreferencesAndKeywordsGetResponse.of(
top3OwnerAttractivePointNames, tasteKeywordGetResponses);
}

private static boolean isProfileAccessible(User visitor, Long ownerId, User owner) {
return owner.getIsProfilePublic() || isOwner(visitor, ownerId);
private static boolean isProfileInaccessible(User visitor, Long ownerId, User owner) {
return !owner.getIsProfilePublic() && !isOwner(visitor, ownerId);
}
}

0 comments on commit ded9a8d

Please sign in to comment.