
사용자가 노래 제목으로 검색했을 때 응답 값으로 앨범 이름, 앨범 커버 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 환경에서 해당 라이브러리를 활용하는 글이 별로 없어서 정리해보았습니다.
도움이 되었으면 좋겠습니다!