본문 바로가기
trouble shooting/spring

java.lang.StackOverflowError: null

by 일상코더 2022. 11. 12.

스프링으로 실전 프로젝트를 개발하던 중 해당 오류가 나왔다. 해당 오류는 JAVA에 Json 타입 변환 과정 중 일어난 오류이다. 이는 테이블과 테이블이 연관 관계에 있으며 이를 mode.addAttribute 메소드를 통해 데이터를 Front로 보낼때 Json으로 변환 과정중에 무한으로 참조가 순환되어 일어나는 오류로 간단히 해결할 수 있다.

 

문제

@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Theme {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
//    @Column(name = "theme_id")
    public Long id;

	@JsonIgnore
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "company_id")
    private Company company;

}

 

@Builder
@Entity
@NoArgsConstructor
@Getter
@AllArgsConstructor
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
//    @Column(name = "company_id")
    private Long id;

    @Column
    private String workHour;

    @OneToMany(mappedBy = "company", fetch = EAGER)
    private List<Theme> themeList = new ArrayList<>();
 }

 

아마 JPA 순환 반복이 Theme에서 일어난 듯 하다. Theme에는 하위 연관 관계가 당연히 추가로 있으며 이 때문에 참조에 참조를 반복하다가 JSON이 오류가 난 듯 싶다. Spring은 Front로 데이터를 보낼 때 Json으로 보내야하는 상황이면 Jackson을 통해 Json 형태로 변환하는데 순환구조일 경우 에러가 떠버린다.

 

위의 코드처럼 해당 연관관계 매핑 부분에 @JsonIgnore을 붙여주면 순환 참조 관계를 막을 수 있다

댓글