You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
저희 CONFETI 서비스는 Spotify Open API 를 사용해 아티스트 정보를 가져오기로 결정했습니다. 외부에서 아티스트 정보를 가져오기 위해 Spotify API 에서 제공하는 문자열 타입의 아티스트 아이디를 데이터베이스에 저장했습니다.
아티스트 아이디를 가지고 있는 엔티티를 조회한 후 아티스트 정보를 가져오려면 객체 안에 어떤 아티스트 아이디가 존재하는지, 수집된 아티스트 아이디로 조회한 뒤 아티스트 정보를 같은 아티스트 아이디를 가진 객체에 주입할지 해결해야 했습니다.
저는 Spotify Open API에서 제공하는 API를 사용하기 위해 요청 값을 형식화하고, 응답받은 값을 가공해 어플리케이션에 전달해줄 SpotifyAPIHandler 파일을 작성했습니다.
또한, 객체 안에 어떤 아티스트 아이디가 존재하고, SpotifyAPIHandler 를 사용해 조회한 아티스트 정보를 적절한 위치에 주입하기 위해 ArtistResolver 파일을 작성했습니다.
ArtistResolver는 리플렉션을 사용해 Object 타입으로 추상화된 변수의 필드 값을 순회하며 아티스트 아이디가 존재할 수 없는 레퍼런스 타입(String, Integer, Long, 등) 을 제외하고 재귀적으로 순회하도록 구현했습니다. 이때, 아티스트 객체의 아티스트 아이디가 조회에 사용했던 아이디와 일치하는 경우 조회된 정보를 객체의 SET 메서드로 주입했습니다.
그리고 이미 탐색한 객체를 탐색하지 않기 위해 Trace Mapper 변수를 두어 재귀 호출마다 확인했습니다.
이러한 방식의 문제점은 모든 객체 그래프를 탐색한다는 점이었습니다. 어떤 객체 안에 아티스트 아이디 정보가 있을지 모르고, 트랜잭션 내부에서 실행되는 함수이기 때문에 사용하지 않는 변수라도 아티스트 정보 조회를 위해서 데이터베이스에 쿼리를 질의해야했습니다. 객체 그래프를 탐색하는 과정에서 사용하지 않는 훨씬 많은 아티스트를 조회하는 문제가 발생했습니다.
해결방안
앱잼이라는 짧은 기간 안에 ArtistResolver를 더이상 추상화할 수 없다고 생각해 아티스트 정보를 사용하는 객체가 탐색하는 그래프 경로를 미리 결정해놓는 방식을 선택했습니다. 각 타입과 아티스트 아이디 수집 방법을 Map 변수에 등록했습니다.
그 결과 artistResolver.load(Object) 를 사용해 자동으로 정보를 조회했습니다.
[ 공연 정보(콘서트, 페스티벌)을 아티스트 아이디 기준으로 조회하기 위한 뷰 테이블 생성 ]
테이블을 조인해야 알 수 있는 좋아요 여부를 기준으로 정렬하고, 커서를 사용하기 때문에 쉽게 해결할 수 없었습니다.
해결방안
@Query(value =
"SELECT f" +
" FROM Festival f" +
" LEFT JOIN FestivalFavorite ff" +
" ON f.id = ff.festival.id AND ff.user.id = :userId" +
" WHERE f.festivalEndAt >= CURRENT_DATE AND f.id NOT IN (" +
" SELECT tf.festival.id" +
" FROM TimetableFestival tf" +
" INNER JOIN tf.user u" +
" WHERE u.id = :userId" +
" ) AND " +
" (" +
" (" +
" ((:cursorIsFavorite = true AND ff.id IS NOT NULL) OR (:cursorIsFavorite = false AND ff.id IS NULL)) AND (:cursorTitle <= f.festivalTitle)" +
" ) OR (" +
" :cursorIsFavorite = true AND ff.id IS NULL" +
" ) " +
" )" +
" ORDER BY CASE WHEN ff.id IS NULL THEN 0 ELSE 1 END DESC"
)
List<Festival> findFestivalsUsingCursor(
final@Param("userId") longuserId,
final@Param("cursorTitle") StringcursorTitle,
final@Param("cursorIsFavorite") booleancursorIsFavorite,
finalPageRequestpage
);
커서에 해당하는 정보를 먼저 조회해 값을 가져와서 테이블 조인으로 해결했습니다.
The text was updated successfully, but these errors were encountered:
피쳐 별 PR 리스트업한 이슈
[ 내 정보 확인 ]
[ 사용자 맞춤형 페스티벌 추천 ]
[ 내가 선호하는 아티스트의 공연 정보, 내가 선호하는 공연의 티켓팅 예매 정보 제공 ]
[ Spotify API를 활용한 아티스트 검색, 해당 아티스트의 예정 공연 정보 가져오기 ]
[ 타임테이블 - 페스티벌 검색 및 추가 삭제, 페스티벌 날짜 선택 후 내가 관람할 페스티벌 선택 및 편집 ]
[ 선호하는 아티스트 리스트, 선호하는 공연 리스트 조회 ]
트러블 슈팅된 이슈
[ SpotifyAPIHandler, ArtistResolver ] (Spotify API에서 정보를 자동으로 가져오는 모듈)
문제상황
저희 CONFETI 서비스는 Spotify Open API 를 사용해 아티스트 정보를 가져오기로 결정했습니다. 외부에서 아티스트 정보를 가져오기 위해 Spotify API 에서 제공하는 문자열 타입의 아티스트 아이디를 데이터베이스에 저장했습니다.
아티스트 아이디를 가지고 있는 엔티티를 조회한 후 아티스트 정보를 가져오려면 객체 안에 어떤 아티스트 아이디가 존재하는지, 수집된 아티스트 아이디로 조회한 뒤 아티스트 정보를 같은 아티스트 아이디를 가진 객체에 주입할지 해결해야 했습니다.
저는 Spotify Open API에서 제공하는 API를 사용하기 위해 요청 값을 형식화하고, 응답받은 값을 가공해 어플리케이션에 전달해줄 SpotifyAPIHandler 파일을 작성했습니다.
또한, 객체 안에 어떤 아티스트 아이디가 존재하고, SpotifyAPIHandler 를 사용해 조회한 아티스트 정보를 적절한 위치에 주입하기 위해 ArtistResolver 파일을 작성했습니다.
ArtistResolver는 리플렉션을 사용해 Object 타입으로 추상화된 변수의 필드 값을 순회하며 아티스트 아이디가 존재할 수 없는 레퍼런스 타입(String, Integer, Long, 등) 을 제외하고 재귀적으로 순회하도록 구현했습니다. 이때, 아티스트 객체의 아티스트 아이디가 조회에 사용했던 아이디와 일치하는 경우 조회된 정보를 객체의 SET 메서드로 주입했습니다.
그리고 이미 탐색한 객체를 탐색하지 않기 위해 Trace Mapper 변수를 두어 재귀 호출마다 확인했습니다.
이러한 방식의 문제점은 모든 객체 그래프를 탐색한다는 점이었습니다. 어떤 객체 안에 아티스트 아이디 정보가 있을지 모르고, 트랜잭션 내부에서 실행되는 함수이기 때문에 사용하지 않는 변수라도 아티스트 정보 조회를 위해서 데이터베이스에 쿼리를 질의해야했습니다. 객체 그래프를 탐색하는 과정에서 사용하지 않는 훨씬 많은 아티스트를 조회하는 문제가 발생했습니다.
해결방안
앱잼이라는 짧은 기간 안에 ArtistResolver를 더이상 추상화할 수 없다고 생각해 아티스트 정보를 사용하는 객체가 탐색하는 그래프 경로를 미리 결정해놓는 방식을 선택했습니다. 각 타입과 아티스트 아이디 수집 방법을 Map 변수에 등록했습니다.
그 결과
artistResolver.load(Object)
를 사용해 자동으로 정보를 조회했습니다.[ 공연 정보(콘서트, 페스티벌)을 아티스트 아이디 기준으로 조회하기 위한 뷰 테이블 생성 ]
문제상황 및 해결방안
#182
[ 커서 기반 페이징 ]
문제상황
위의 뷰에서 타임테이블에 등록되지 않은 페스티벌을
해야했습니다.
테이블을 조인해야 알 수 있는 좋아요 여부를 기준으로 정렬하고, 커서를 사용하기 때문에 쉽게 해결할 수 없었습니다.
해결방안
커서에 해당하는 정보를 먼저 조회해 값을 가져와서 테이블 조인으로 해결했습니다.
The text was updated successfully, but these errors were encountered: