woowacourse-teams / 2024-devel-up

나 혼자만 레벨업? 다 같이 데벨업!
https://www.devel-up.co.kr
16 stars 5 forks source link

디스커션 목록 조회 기능 구현 (issue #439) #441

Closed lilychoibb closed 1 week ago

lilychoibb commented 1 week ago

구현 요약

전체 디스커션 목록 조회 기능 구현 디스커션 commentCount 는 로빈이 작업중이라서 일단 하드코딩해서 값 넣어놨습니당

아래 쿼리는 미션 제목(mission)과 해시태그 이름(hashTag)에 따라 필터링된 Discussion 목록을 가져옵니다. 사용자가 /discussions 로 들어와 필터를 걸지 않았을 경우 default 인 'all' 로 모든 디스커션 리스트를 반환합니다.

@Query("""
            SELECT d
            FROM Discussion d
            JOIN FETCH d.mission m
            JOIN FETCH d.discussionHashTags.hashTags dhts
            JOIN FETCH dhts.hashTag ht
            WHERE
                (LOWER(:mission) = 'all' OR m.title = :mission)
                AND
                (LOWER(:hashTag) = 'all' OR EXISTS (
                    SELECT 1
                    FROM DiscussionHashTag dht
                    JOIN dht.hashTag sht
                    WHERE dht.discussion.id = d.id
                    AND sht.name = :hashTag
                ))
            """)
    List<Discussion> findByMissionAndHashTagName(
            @Param("mission") String mission,
            @Param("hashTag") String hashTagName
    );

추가적으로 테스트 코드의 createDiscussion() 을 하는 과정에서 테스트 메서드에 @Transactional 을 걸지 않을 경우 아래 에러가 발생합니다. 아직 정확한 원인 파악이 되지않아 임시로 걸어두었습니다.

스크린샷 2024-09-09 오후 6 32 30

연관 이슈

참고

코드 리뷰에 RCA 룰을 적용할 시 참고해주세요.

헤더 설명
R (Request Changes) 적극적으로 반영을 고려해주세요
C (Comment) 웬만하면 반영해주세요
A (Approve) 반영해도 좋고, 넘어가도 좋습니다. 사소한 의견입니다.
lilychoibb commented 1 week ago

@alstn113 @le2sky 말씀주신 수정사항 반영했어요! 확인부탁드립니다 🤗😋

@Minjoo522 @robinjoon PR description 에 테스트 코드 에러와 관련해서 임시로 조치한 @Transaction 에 대해서 적어두었어요. 참고부탁드립니다 :)

robinjoon commented 1 week ago

@alstn113 @le2sky 말씀주신 수정사항 반영했어요! 확인부탁드립니다 🤗😋

@Minjoo522 @robinjoon PR description 에 테스트 코드 에러와 관련해서 임시로 조치한 @Transaction 에 대해서 적어두었어요. 참고부탁드립니다 :)

슬랙 대화에서 언급한 것 처럼, 표면적인 예외의 원인은 HashTag 객체가 이미 영속화 된 적이 있는 상태에서 영속성 컨텍스트가 종료되어 준영속 상태가 되고, 준영속 상태의 객체가 cascade 옵션에 의해 또 영속화가 시도되서 발생하는 예외에요. 트랜잭션을 걸면 영속성 컨텍스트가 테스트 메서드가 수행되는 동안 종료되지 않아, HashTag가 준영속 상태가 되지 않아서 문제가 발생하지 않는 것이구요.