JPA 무한참조 문제

kishinoa·2025년 8월 26일

📋 문제 상황: JPA 양방향 매핑과 순환 참조

JPA에서 Hotel, Room, RoomImage와 같이 서로를 참조하는 엔티티를 양방향으로 설계하고, 이를 JSON으로 직렬화할 때 전형적인 문제가 발생합니다.

Hotel 엔티티는 List<'Room'>을 가지고,
Room 엔티티는 Hotel 엔티티와 List<'RoomImage'>를 가집니다.
RoomImage 엔티티는 다시 Room 엔티티를 참조합니다.

이러한 관계에서 Hotel 객체를 조회하면, JPA는 연관된 Room 목록을 가져오고, 각 Room은 다시 Hotel을 참조하며, 이 Hotel은 다시 Room 목록을 가져오는 과정이 무한 반복됩니다.
이 순환 참조는 JSON 변환 과정에서 스택 오버플로우(StackOverflowError)를 유발합니다. 특히 Hotel → Room → RoomImage → Room → Hotel로 이어지는 복잡한 순환 고리가 문제의 핵심이었습니다.

💡 해결책: DTO를 활용한 객체 분리

이 문제를 해결하는 가장 보편적이고 모범적인 방법은 엔티티(Entity)와 DTO(Data Transfer Object)를 분리하여 순환 참조를 끊어내는 것입니다.
엔티티는 DB와 직접 매핑되는 순수한 데이터 모델로 남겨두고, API 응답에 필요한 데이터만 담는 DTO를 별도로 설계합니다.

✅ 결론

JPA 양방향 연관 관계에서 발생하는 무한 참조 문제는 단순히 @JsonIgnore와 같은 어노테이션을 사용하는 것보다, 엔티티와 DTO를 명확하게 분리하는 것으로 구조적인 해결이 가능합니다.
이 방법은 JSON 직렬화 오류를 해결할 뿐만 아니라, API 응답의 효율성을 높이고 클라이언트-서버 간의 계약을 명확히 하는 모범적인 설계 패턴이기도 합니다.

profile
안녕하세요

0개의 댓글