Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CONFETI SERVER 2차 과제 - 피쳐 별 PR 리스트업한 이슈 #175

Closed
ch1hyun opened this issue Jan 23, 2025 · 0 comments
Closed

CONFETI SERVER 2차 과제 - 피쳐 별 PR 리스트업한 이슈 #175

ch1hyun opened this issue Jan 23, 2025 · 0 comments
Assignees
Labels

Comments

@ch1hyun
Copy link
Collaborator

ch1hyun commented Jan 23, 2025

스크린샷 2025-01-14 오후 9 50 13
공연의 설레는 시작과 끝을 confeti와 함께!

피쳐 별 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

[ 커서 기반 페이징 ]

문제상황

Image

위의 뷰에서 타임테이블에 등록되지 않은 페스티벌을

  1. 좋아요를 누른 페스티벌이 먼저 조회되도록
  2. 다음으로 ㄱㄴㄷ 순으로 조회되도록
    해야했습니다.

테이블을 조인해야 알 수 있는 좋아요 여부를 기준으로 정렬하고, 커서를 사용하기 때문에 쉽게 해결할 수 없었습니다.

해결방안

    @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") long userId,
            final @Param("cursorTitle") String cursorTitle,
            final @Param("cursorIsFavorite") boolean cursorIsFavorite,
            final PageRequest page
    );

커서에 해당하는 정보를 먼저 조회해 값을 가져와서 테이블 조인으로 해결했습니다.

@ch1hyun ch1hyun added the 📚 Assignment 과제 label Jan 23, 2025
@ch1hyun ch1hyun changed the title CONFETI SERVER 2차 과제 - 피쳐 별 PR 리스트업한 이슈 CONFETI SERVER 2차 과제 - 피쳐별 PR 리스트업한 이슈 Jan 23, 2025
@ch1hyun ch1hyun changed the title CONFETI SERVER 2차 과제 - 피쳐별 PR 리스트업한 이슈 CONFETI SERVER 2차 과제 - 피쳐 별 PR 리스트업한 이슈 Jan 23, 2025
@ch1hyun ch1hyun closed this as completed Jan 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants