Open newoceanwave opened 1 month ago
@newoceanwave 이미 확인하셨을 수도 있지만, 디스코드 기획 채널에 댓글 삭제 관련해서 세진님이 코멘트 남겨주신 것 있습니다.
게시글에 누군가 댓글을 달았는데 삭제하면 그냥 깔끔하게 없어지고 대댓글 사이에 삭제하면 (삭제)라고 뜨면 될거 같아요.
해당 부분 구현 안되어 있다면 반영해주세요
@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
메소드에서 뿐인데 혹시 해당 연관관계 모두 제거해주실 수 있나요?
해당 글 참고하시면 좋을 것 같아요.
@OneToOne
관계에서는 지연로딩 적용에 문제가 없다@OneToOne
관계에서는 FetchType을 Lazy로 설정하더라도 Eager로 동작하는 경우가 있다.@OneToOne
양방향 연관 관계에서 연관 관계의 주인이 아닌 쪽 엔티티를 조회할 때, Lazy로 동작할 수 없다.
💻 구현 내용
🔎 구현 내용 상세
✔️ TODO
📝 메모 사항