team-forAdhd / forAdhd-server

For ADHD 서버
1 stars 2 forks source link

게시글 탭 보완 및 수정 #42

Open newoceanwave opened 1 month ago

newoceanwave commented 1 month ago

💻 구현 내용

  1. 대댓글 기능 구현
  2. serviceimpl의 트랜잭션 수정
  3. 중복되는 코드 수정 (comment)
  4. 레포지토리 네이밍 변경
  5. 삭제 메서드 쿼리 직접 작성하여 구현
  6. commentserviceimpl -> save 호출 불필요
  7. 대댓글 반환 시 dto 및 관련 코드 (commentcontroller) 수정
  8. pageable 객체 그대로 반환하지 않도록
  9. 게시글 관련 테스트 다시 작성
  10. commentrepository 메서드 이름 변경

🔎 구현 내용 상세

✔️ TODO

📝 메모 사항

jkde7721 commented 1 month ago

@newoceanwave 이미 확인하셨을 수도 있지만, 디스코드 기획 채널에 댓글 삭제 관련해서 세진님이 코멘트 남겨주신 것 있습니다.

게시글에 누군가 댓글을 달았는데 삭제하면 그냥 깔끔하게 없어지고 대댓글 사이에 삭제하면 (삭제)라고 뜨면 될거 같아요.

해당 부분 구현 안되어 있다면 반영해주세요

jkde7721 commented 1 month ago
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class User extends BaseTimeEntity {

    //...

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
    private UserProfile userProfile;

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
    private UserPrivacy userPrivacy;
    //...
}
@Mapper(componentModel = "spring")
public interface MedicineReviewMapper {
    @Mapping(source = "user.userProfile.nickname", target = "nickname")
    @Mapping(source = "user.userProfile.profileImage", target = "profileImage")
    @Mapping(source = "user.userPrivacy.ageRange", target = "ageRange")
    @Mapping(source = "user.userPrivacy.gender", target = "gender")
    @Mapping(target = "averageGrade", expression = "java(review.getMedicine().calculateAverageGrade())")
    MedicineReviewResponse toResponseDto(MedicineReview review);
}

User 엔티티 쪽에 UserProfile, UserPrivacy 엔티티에 대한 매핑을 추가하셨더라고요. 제가 유저 탈퇴 로직쪽 구현하다가 발견한건데, 양방향 @OneToOne 매핑, 특히 연관관계의 주인이 아닌 쪽 엔티티를 조회할 때 LAZY 로딩이 동작하지 않습니다. (이 경우 연관관계의 주인은 UserProfile, UserPrivacy) 따라서 userRepository.findById(userId);User 엔티티 조회 시 연관 엔티티인 UserProfile, UserPrivacy가 EAGER 로딩되고 있습니다.

[Hibernate] 
    select
        u1_0.user_id,
        u1_0.created_at,
        u1_0.deleted,
        u1_0.deleted_at,
        u1_0.email,
        u1_0.is_verified_email,
        u1_0.last_modified_at,
        u1_0.role 
    from
        user u1_0 
    where
        u1_0.user_id=?

[Hibernate] 
    select
        up1_0.user_privacy_id,
        up1_0.age_range,
        up1_0.birth,
        up1_0.created_at,
        up1_0.gender,
        up1_0.last_modified_at,
        up1_0.name,
        up1_0.user_id 
    from
        user_privacy up1_0 
    where
        up1_0.user_id=?

[Hibernate] 
    select
        up1_0.user_profile_id,
        up1_0.created_at,
        up1_0.for_adhd_type,
        up1_0.last_modified_at,
        up1_0.nickname,
        up1_0.profile_image,
        up1_0.user_id 
    from
        user_profile up1_0 
    where
        up1_0.user_id=?

위와 같이 User 엔티티 조회 시 select 쿼리 3개 발생 해당 연관관계를 사용하는 코드가 MedicineReviewMapper.toResponseDto 메소드에서 뿐인데 혹시 해당 연관관계 모두 제거해주실 수 있나요?

해당 글 참고하시면 좋을 것 같아요.