🚨 어떤 문제가 있었나?

Spring Boot 프로젝트에서 알람함 조회 API를 구현 중,

알람 종류 중 일부(FRIEND_REQUEST, FIRE)는 관련 유저의 userId를 응답에 포함시켜야 했다.

평소처럼 DTO에 반환형식 추가해서 userId 반환해야지~ 생각했는데…? 갑자기 스웨거에서 500 에러…. 헉

인텔리제이 커맨드창을 보니 다음과 같은 오류가 발생했다:

org.hibernate.LazyInitializationException: 
Could not initialize proxy [com.umc.hwaroak.domain.Member#4] - no session

LazyInitializationException…? 프록시 머시기..? 노 세션..?

찾아보니, sender 필드가 LAZY 로딩으로 설정되어 있었고, 세션이 이미 종료된 상태에서 프록시 객체에 접근하면서 에러가 발생한 것이다.

✅어떻게 해결했을까?

  1. fetch join으로 sender 미리 로딩시켜 놓자!!
@Query("""
    SELECT a FROM Alarm a
    LEFT JOIN FETCH a.sender
    WHERE a.receiver = :receiver
       OR (a.receiver IS NULL AND a.alarmType IN ('NOTIFICATION', 'DAILY'))
    ORDER BY a.createdAt DESC
""")
List<Alarm> findAllIncludingGlobalAlarms(@Param("receiver") Member receiver);

LEFT JOIN FETCH a.sender 를 통해 sender 필드를 미리 로딩하여 DTO 변환 시점에서 Lazy 로딩 오류가 발생하지 않도록 함.

  1. 서비스에 트랜잭션 추가
@Transactional(readOnly = true)
public List<AlarmResponseDto.InfoDto> getAllAlarmsForMember() {
    ...
}