Spring Boot에서 Spotify 라이브러리 활용하기 (2) - 검색

나굴이·2023년 4월 8일

spotify-api

목록 보기
2/2
post-thumbnail

배경

사용자가 노래 제목으로 검색했을 때 응답 값으로 앨범 이름, 앨범 커버 URL, 아티스트 이름, 노래 제목이 필요한 상황입니다.
클라이언트에서 GET 요청 시 Controller에서는 @PathVariable로 keyword값을 받습니다.

검색 과정

SpotifyApi spotifyApi = new SpotifyApi.Builder()
            .setAccessToken(SpotifyConfig.accessToken()) //accessToken()은 앞선 포스팅 참고
            .build();
SearchTracksRequest searchTrackRequest = spotifyApi.searchTracks(keyword)
                    .limit(10)
                    .build();

spotifyApi의 searchTracks()에 controller로부터 넘어온 keyword 변수를 넣어줍니다.

Returns:
A Track paging.

해당 메소드는 Paging<Track>을 반환합니다.

Paging<Track> searchResult = searchTrackRequest.execute();
System.out.println("result: " + searchResult);

searchResult값을 출력해보겠습니다.

...,
items=
	[Track(name=Running Up That Hill (A Deal With God),
    	artists=
        	[ArtistSimplified(name=Kate Bush, externalUrls=ExternalUrl(externalUrls={spotify=https://open.spotify.com/artist/1aSxMhuvixZ8h9dK9jIDwL}), href=https://api.spotify.com/v1/artists/1aSxMhuvixZ8h9dK9jIDwL, id=1aSxMhuvixZ8h9dK9jIDwL
            , ...

원하는 정보가 어떤 객체 안에 담겨 있는지 확인해 봅니다.

노래 제목은 Track에 존재합니다.
앨범 이름, 앨범 커버 url은 Track -> AlbumSimplified에 존재합니다.
아티스트 이름은 AlbumSimplified -> ArtistSimplified에 존재합니다.

Track[] tracks = searchResult.getItems();

searchResult에서 Item을 가져옵니다.

for (Track track : tracks) {
	//노래 제목
    String title = track.getName();
    
    AlbumSimplified album = track.getAlbum();
    ArtistSimplified[] artists = album.getArtists();
    
    //아티스트 이름
    String artistName = artists[0].getName();

    //앨범 커버 url
    Image[] images = album.getImages();
    String imageUrl = (images.length > 0) ? images[0].getUrl() : "NO_IMAGE";

	//앨범 이름
    String albumName = album.getName();
}

각 변수를 출력해보면 각 트랙별로 데이터가 담겨 있습니다.

응답

추출해온 데이터를 JSON형식으로 응답하기 위해 ResponseDto를 생성하였습니다.

SearchResponseDto

@Builder
@Getter
public class SearchResponseDto {
    private String artistName;
    private String title;
    private String albumName;
    private String imageUrl;
}

service 로직에서 dto를 생성하는 방법은 다양하겠지만 저는 mapper클래스를 만들어 생성하도록 하겠습니다.

Mapper

public SearchResponseDto toSearchDto(String artistName, String title, String albumName, String imageUrl) {
    return SearchResponseDto.builder()
            .artistName(artistName)
            .title(title)
            .albumName(albumName)
            .imageUrl(imageUrl)
            .build();
}

각 변수를 매개변수로 받아 SearchResponseDto로 build()해줍니다.

Service

List <SearchResponseDto> searchResponseDtoList = new ArrayList<>();

SearchResponseDto를 담을 List를 생성해주고

for (Track track : tracks) {
    String title = track.getName();
    ...
    searchResponseDtoList.add(mapper.toSearchDto(artistName, title, albumName, imageUrl));
}

forEach문에서 list에 add해주고, 이 리스트를 반환합니다.


포스트맨으로 테스트 시 각 트랙이 Json형식으로 응답되는 것을 확인할 수 있습니다.

전체 코드

SpotifyApi spotifyApi = new SpotifyApi.Builder()
        .setAccessToken(SpotifyConfig.accessToken())
        .build();


public List<SearchResponseDto> search(String keyword) {
    List <SearchResponseDto> searchResponseDtoList = new ArrayList<>();

    try {
        SearchTracksRequest searchTrackRequest = spotifyApi.searchTracks(keyword)
                .limit(10)
                .build();

        Paging<Track> searchResult = searchTrackRequest.execute();
        Track[] tracks = searchResult.getItems();

        for (Track track : tracks) {
            String title = track.getName();

            AlbumSimplified album = track.getAlbum();
            ArtistSimplified[] artists = album.getArtists();
            String artistName = artists[0].getName();


            Image[] images = album.getImages();
            String imageUrl = (images.length > 0) ? images[0].getUrl() : "NO_IMAGE";

            String albumName = album.getName();

            searchResponseDtoList.add(mapper.toSearchDto(artistName, title, albumName, imageUrl));
        }

    } catch (IOException | SpotifyWebApiException | ParseException e) {
        System.out.println("Error: " + e.getMessage());
    }
    return searchResponseDtoList;
}

boot 환경에서 해당 라이브러리를 활용하는 글이 별로 없어서 정리해보았습니다.
도움이 되었으면 좋겠습니다!

0개의 댓글