인프런 커뮤니티 질문&답변

Ahrisan님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

다음으로

JPA프로젝트 진행중 질문있습니다.

작성

·

384

0

강의를 듣고 Chatting 프로그램을 개발해보고 있습니다.
 
메시지를 주고받는 프로그램을 어느정도 개발했는데,

채팅방에 입장시, 해당 채팅방에 메시지를 load 해주는 API를 만드는중 오류가 발생하여 질문드립니다.
 
loadchat메서드를 호출하면 JPA의 em.createQuery를 통해 제가 원하는 데이터가 추출되는것은 확인 했습니다. (해당 채팅방의 메세지들)

근데 서비스를 호출하여 반환되는 List를 모델에 넣어주면, 페이지 랜더링 자체가 안되며, room -> roommember 무한재귀 오류가 발생합니다.

예상하기엔 양방향 참조 문제 같은데... 이것저것 해봐도 잘안되더라구 제가궁금한것은

호출되는 쿼리는 Chat과 Room 객체를 조회하는데 왜RoomMember 객체가 오류에 포함되어 있는지 모르겠습니다.

전체코드
https://github.com/jin0kim326/pingpong


public List<Chat> findChatsByRoomId(Long roomId) {
return em.createQuery("select c from Chat c join c.room r where r.id = c.room.id and r.id = :roomId", Chat.class)
.setParameter("roomId", roomId)
.getResultList();
}

// 채팅방 입장 화면
@GetMapping("/room/{roomId}")
public String roomDetail(Model model,
@PathVariable Long roomId,
@Login Member loginMember) {

List<Chat> chatList = chatService.loadChat(roomId);
Room room = roomService.findRoom(roomId);
model.addAttribute("loginMember", loginMember.getName());
model.addAttribute("loginMemberId", loginMember.getId());
model.addAttribute("room", room);

model.addAttribute("chatList", chatList); // 여기서 에러
return "chats/room";
}

답변 3

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 김진영님

활용2편에서 해당 부분을 어떻게 해결하는지 자세히 설명드립니다.

해당 강의를 참고해주세요^^

감사합니다.

0

Ahrisan님의 프로필 이미지
Ahrisan
질문자

@JsonManagedReference, @JsonManagedRefernece 어노테이션 해결법보다,

엔티티 대신 DTO를 반환하라는 정보가 많아 가지고 해보고있습니다.

 

Service단에서 DTO를 반환해서 -> Controller에 넘겨주고 그걸로 화면(model)에 담아주면 되는걸로 이해하고 있는데 맞나요?..

 

이게 맞으면 ... 이방법으로는 해결이 안되네요

제가 잘못 접근하고 있는부분이있나여?

- Service


public
List<ChatDto> loadChat (Long roomId) {
List<Chat> chatEntities = chatRepository.findChatsByRoomId(roomId);
List<ChatDto> chatList = ChatsMapper.INSTANCE.toDoList(chatEntities);
return chatList;
}
da

 

- Controller 

// 채팅방 입장 화면
@GetMapping("/room/{roomId}")
public String roomDetail(Model model,
@PathVariable Long roomId,
@Login Member loginMember) {
List<ChatDto> chatList = chatService.loadChat(roomId);
model.addAttribute("chatList", chatList);
return "chats/room";
}


code:https://github.com/jin0kim326/pingpong

 

 

0

안녕하세요. 김진영님, 공식 서포터즈 OMG입니다.

 

- Chat class의 @ToString을 제거하고 시도해주세요.

안될 경우 아래의 링크에서와 같이

@JsonManagedReference, @JsonManagedReference 를 사용

혹은 엔티티 대신 DTO를 반환하여 확인해주세요.

 

[Spring Boot] JPA - 순환 참조 해결하기 (velog.io)

JPA 양방향 Entity 무한재귀 문제해결 (thxwelchs.github.io)

 

양방향 연관관계 순환참조 관련하여 JPA 활용2편을  참고해주세요.



감사합니다.

Ahrisan님의 프로필 이미지

작성한 질문수

질문하기