Recording/에러 기록장

[Spring Data JPA] 여러 관계가 매핑된 엔티티의 toString() 메소드 출력 오류

LEFT 2025. 2. 21. 16:33

상황

hr데이터베이스에 설계된 엔티티들을 생성하면서 많은 엔티티와 관계를 갖고 있는 Employee엔티티를 만들게되었는데 

이 Employee 엔티티를 CommandLineRunner에서 findBySalaryBetween() 메소드를 테스트할때 문제가 발생하였다.

forEach()를 통해 log.info()로 employee.toString()을 출력하였지만 제대로 출력되지 않았다.

원치않는 결과


원인 가능성

@ToString 어노테이션이 추가되었음에도 "순화참조문제 = 무한루프문제" 가능성으로

제대로 출력되지 않을 수 있음

@Entity
@Getter@Setter@NoArgsConstructor
@ToString
@Table(name = "employees")
public class Employee { ... }

@ToString 어노테이션만 붙였을때는 지속적인 에러가 발생할 가능성이 높다.


해결방법 

  • Lombok에서 @ToString 어노테이션을 추가할때 순환 참조 문제를 방지하기 위하여
@Entity
@Getter@Setter@NoArgsConstructor
@ToString(exclude = {"manager", "subordinates", "jobHistories"})
@Table(name = "employees")
public class Employee {

 

  • 여기서 이 exclude에는 Employee 엔티티의 필드들이 위치
    ➡️Java 클래스(Employee 엔티티) 내부에서 정의된 필드

  • exclude를 설정하여 제외할 {엔티티의 필드들} 을 포함하면 무한루프를 방지 가능

✅제대로 출력 완료


Employee와 관련된 엔티티들이 많을 경우 @ToString으로써 문자열을 출력하고자할때

연관된 엔티티의 필드들까지 toString() 으로 찾아가는 과정에서 제대로 찾지 못하고 주소값만 출력되는 것 같았다.

exclude 속성을 배울 수 있었고 이 속성을 통해 Lombok의 @ToString어노테이션에서 toString()에 제외할 필드들을

설정할 수 있다는 것을 알 수 있었다.