• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

양방향 관계 설정 시, @Data 어노테이션 관련 사용 질문 있습니다.

18.10.22 00:59 작성 조회수 350

0

우선 아래 질문 드렸는데 굉장히 빠른 답변 감사드립니다 ^^

한 가지 더 질문이 있습니다.

양방향 관계 설정 예제를 따라해보다가 @OneToMany 조건으로 사용되는 Account 객체에 getter/setter 메서드를 별도로 설정하지 않고 Lombok의 @Data 어노테이션을 사용하였습니다.

이때, Convenient Method를 선생님과 동일하게 입력을 하니 아래와 같이 StackOverflowError가 발생이 됩니다.

java.lang.StackOverflowError: null<p>    at java.util.HashMap$KeyIterator.<init>(HashMap.java:1451) ~[na:1.8.0_31]
 at java.util.HashMap$KeySet.iterator(HashMap.java:912) ~[na:1.8.0_31]
 at java.util.HashSet.iterator(HashSet.java:172) ~[na:1.8.0_31]
 at java.util.AbstractSet.hashCode(AbstractSet.java:122) ~[na:1.8.0_31]

그래서 아래와 같이 Optional 조건이라고 하신 객체 설정 부분을 주석 처리를 하니 에러가 발생이 안되고 정상 처리 됩니다.

public void addStudy(Study study) {
        // this.getStudies().add(study);
        study.setOwner(this);
    }

JPA 사용시 @Data 어노테이션 사용 관련 주의해야될 사항이 있는 것인가요?

감사합니다

답변 1

답변을 작성해보세요.

3

아주 좋은 질문입니다. @Entity에 @Data를 쓰시면 StackOverFlow를 보기 쉽상입니다. 이유인 즉슨, @Data가 기본으로 생성해주는 toString이나 hashCode 그리고 equals에서 "모든 프로퍼티"를 사용해서 값을 구하는데, 그 때 양방향 관계 때문에 무한 루프가 생길 수 있습니다. A->B->A->B 이런식으로요. 그래서 보통 @Entity위에는 @Data를 사용하는 것은 권장하고 싶지 않습니다.

롬복 애노테이션 설정 중에 @EqualsAndHashCode와 @ToString인가, 이 두 애노테이션에 보면 어떤 프로퍼값을 사용해서 그 메소드들을 구현할지 정해줄 수 있습니다. 저는 거기에보통 of="id" 라는 설정을 사용해서 id 값만 가지고 만들도록 설정해서 사용합니다.

좋은 질문 감사합니다. (마침 운좋게 제가 접속해 있을 때 질문이 올라왔네요.)