[Java] JPA에서 toString StackOverflowError 발생

minhye kim·2024년 7월 19일

Java

목록 보기
5/11

프로젝트 진행중 아래와 같은 오류가 발생했습니다.

java code

Member.class

@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
@NamedQuery(
        name="Member.findByUsername",
        query="select m from Member m where m.username = :username")
@NamedEntityGraph(name = "Member.all", attributeNodes =
@NamedAttributeNode("team"))
public class Member extends BaseEntity {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private  Long id;
    private String username;
    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;
    
        @Override
    public String toString() {
        return "Member{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                ", team=" + team +
                '}';
    }

Team.class

@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "name"})
public class Team extends BaseEntity {

    @Id
    @GeneratedValue
    @Column(name = "team_id")
    private Long id;
    private String name;

    @BatchSize(size = 13)
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

    public Team(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "Team{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", members=" + members +
                '}';
    }
}

다대일 양방향 관계로 설정을 하고, 각각의 Entity에서 자동 생성으로 toString()을 생성했습니다.
이런 경우, 순환 참조가 되며 무한 루프에 빠지게 됩니다.
", members=" + members +
", team=" + team +

해결 방법

toString을 자동 생성하더라도, 이후에 양방향 관계에 있는 경우 참조값이 객체인 경우 삭제합니다.


Reference
https://velog.io/@bbbbooo/JPA-%EC%88%9C%ED%99%98-%EC%B0%B8%EC%A1%B0-%EC%8B%9C-StackOverFlow-java.lang.StackOverflowError

profile
안녕하세요. 블로그를 시작하게 되었습니다! 앞으로 유용한 정보와 좋은 내용을 많이 공유할게요:)

0개의 댓글