Skip to content

Commit

Permalink
feat: #44 플레이리스트 제목 검색 기능 성능 개선
Browse files Browse the repository at this point in the history
  • Loading branch information
dgh06175 committed Sep 26, 2024
1 parent d5ac4ca commit 3f27c9f
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@

public interface PlaylistRepository extends JpaRepository<Playlist, Long> {
Page<Playlist> findAllByMember(Member member, Pageable pageable);
Page<Playlist> findAllByMemberAndTitleContaining(Member member, String title, Pageable pageable);
Page<Playlist> findAllByMemberAndTitleContainingIgnoreCase(Member member, String title, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.cabin.plat.domain.playlist.service;

import com.cabin.plat.domain.member.entity.Member;
import com.cabin.plat.domain.member.repository.MemberRepository;
import com.cabin.plat.domain.playlist.dto.PlaylistRequest;
import com.cabin.plat.domain.playlist.dto.PlaylistRequest.PlaylistOrders;
import com.cabin.plat.domain.playlist.dto.PlaylistRequest.TrackId;
Expand Down Expand Up @@ -35,7 +34,6 @@ public class PlaylistServiceImpl implements PlaylistService {

private final TrackService trackService;
private final PlaylistRepository playlistRepository;
private final MemberRepository memberRepository;
private final TrackRepository trackRepository;
private final PlaylistTrackRepository playlistTrackRepository;
private final PlaylistMapper playlistMapper;
Expand Down Expand Up @@ -68,23 +66,30 @@ public PlaylistResponse.Playlists getPlaylists(Member member, int page, int size
// TODO: 효율 개선
List<Playlist> playlists = playlistRepository.findAllByMember(member, pageable).getContent();
List<PlaylistResponse.Playlists.PlaylistInfo> playlistInfos = playlists.stream().map(playlist -> {
// TODO: playlist.getPlaylistTracks 를 가져오기
List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);
List<PlaylistTrack> playlistTracks = findPlaylistTracksInPlaylist(playlist);
return playlistMapper.toPlaylistInfo(playlist, playlistTracks);
}).toList();
return playlistMapper.toPlaylists(playlistInfos);
}

@Override
public PlaylistResponse.Playlists getSearchedPlaylists(Member member, String title, int page, int size) {
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createdAt"));
Pageable pageable = PageRequest.of(page, size, Sort.by(sorts));
String refinedTitle = title.trim() // 앞뒤 공백 제거
.replaceAll("\\s+", " ") // 다중 공백을 하나로 변환
.toLowerCase();

if (refinedTitle.isEmpty() || refinedTitle.isBlank()) {
return playlistMapper.toPlaylists(Collections.emptyList());
}

Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());

List<Playlist> playlists = playlistRepository.
findAllByMemberAndTitleContainingIgnoreCase(member, refinedTitle, pageable).getContent();

List<Playlist> playlists = playlistRepository.findAllByMemberAndTitleContaining(member, title, pageable).getContent();
// TODO: 효율 개선
List<PlaylistResponse.Playlists.PlaylistInfo> playlistInfos = playlists.stream().map(playlist -> {
// TODO: playlist.getPlaylistTracks 를 가져오기
List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);
List<PlaylistTrack> playlistTracks = findPlaylistTracksInPlaylist(playlist);
return playlistMapper.toPlaylistInfo(playlist, playlistTracks);
}).toList();
return playlistMapper.toPlaylists(playlistInfos);
Expand All @@ -101,8 +106,9 @@ public PlaylistResponse.PlayListId deletePlaylist(Member member, Long playlistId
@Override
public PlaylistResponse.PlaylistDetail getPlaylistDetail(Member member, Long playlistId) {
Playlist playlist = findPlaylistById(playlistId);
// TODO: playlist.getPlaylistTracks 를 가져오기
List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);

List<PlaylistTrack> playlistTracks = findPlaylistTracksInPlaylist(
playlist);
List<PlaylistResponse.TrackDetailOrder> trackDetailOrders = playlistTracks.stream()
.map(playlistTrack -> {
TrackResponse.TrackDetail trackDetail = trackService.getTrackById(member, playlistTrack.getTrack().getId());
Expand Down Expand Up @@ -130,8 +136,8 @@ public PlaylistResponse.PlayListId addTrackToPlaylist(Member member, Long playli
Playlist playlist = findPlaylistByIdWithValidation(playlistId, member);
Track track = findTrackById(trackId.getTrackId());

// TODO: playlist.getPlaylistTracks 로 가져오기 (현재는 playlistTrackRepository.findAllByPlaylistIs(playlist) 로 대체)
List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);
List<PlaylistTrack> playlistTracks = findPlaylistTracksInPlaylist(
playlist);

validateTrackDuplicateInPlaylist(trackId, playlistTracks);

Expand All @@ -151,7 +157,8 @@ public PlayListId updateTrackOrders(Member member, Long playlistId, PlaylistOrde
Playlist playlist = findPlaylistByIdWithValidation(playlistId, member);

// 기존 플레이리스트의 모든 트랙
List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);
List<PlaylistTrack> playlistTracks = findPlaylistTracksInPlaylist(
playlist);

// 플레이리스트의 업데이트할 트랙 순서 정보
Map<Long, Integer> trackOrderMap = playlistOrders.getTracks().stream()
Expand All @@ -175,7 +182,8 @@ public PlayListId deleteTrackFromPlaylist(Member member, Long playlistId, Long t
Playlist playlist = findPlaylistByIdWithValidation(playlistId, member);
Track track = findTrackById(trackId);

List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);
List<PlaylistTrack> playlistTracks = findPlaylistTracksInPlaylist(
playlist);
PlaylistTrack playlistTrack = findPlaylistTrackByTrack(playlistTracks, track);
playlistTrack.delete();

Expand All @@ -186,6 +194,11 @@ public PlayListId deleteTrackFromPlaylist(Member member, Long playlistId, Long t
return playlistMapper.toPlaylistId(playlistId);
}

private List<PlaylistTrack> findPlaylistTracksInPlaylist(Playlist playlist) {
// TODO: playlist.getPlaylistTracks 를 가져오기
return playlistTrackRepository.findAllByPlaylistIs(playlist);
}

private static void validateTrackDuplicateInPlaylist(TrackId trackId, List<PlaylistTrack> playlistTracks) {
if (playlistTracks.stream().anyMatch(playlistTrack -> playlistTrack.getTrack().getId().equals(trackId.getTrackId()))) {
throw new RestApiException(PlaylistErrorCode.PLAYLIST_TRACK_DUPLICATE);
Expand Down

0 comments on commit 3f27c9f

Please sign in to comment.