원인은?
프로젝트에서 채팅방 목록을 조회할 때 발생하는 순환 참조 문제를 해결하기 위해 코드를 개선하였다. 기존에는 ChatRoom 엔티티를 그대로 반환하거나 참조하는 과정에서 @ManyToOne 또는 @OneToMany와 같은 양방향 관계로 인해 순환 참조가 발생할 수 있었으나, 이로 인해, 직렬화 과정에서 무한 루프에 빠지는 문제가 있었다.
어떻게 해결했나?
이를 해결하기 위해 DTO(Data Transfer Object)를 활용하여 필요한 필드만 가져오도록 하였다.
ChatDto.ChatRoomDto라는 DTO를 정의하여 채팅방 조회 시 필요한 최소한의 필드(chatRoomId, createdAt)만 반환하도록 하고,
ChatRoom 엔티티의 조회 메서드를 변경하여 ChatRoomDto로 변환 후 반환하도록 하였다.
특정 채팅방 조회 (getChatRoom): chatRoomRepository를 통해 chatRoomId로 특정 채팅방을 조회하고, 존재하지 않을 경우 예외를 발생시킵니다. 이후 ChatRoomDto 객체로 변환하여 필요한 정보만을 담아 반환.
모든 채팅방 목록 조회 (getChatRooms): chatRoomRepository의 findAll 메서드를 호출하여 모든 채팅방을 가져온 뒤, 스트림 API와 map을 사용하여 각 ChatRoom 엔티티를 ChatRoomDto로 변환하고, 이를 리스트로 수집하여 반환.
이와 같은 방식으로 순환 참조 문제를 해결할 수 있었으며, 채팅방 목록 조회 시 발생하던 무한 루프 문제를 방지할 수 있었습니다.
'Spring > Spring 트러블 슈팅' 카테고리의 다른 글
Could not write JSON (0) | 2024.09.05 |
---|---|
Spring Port 8080 is already in use (0) | 2024.08.15 |