Spring

@OneToOne에서 순환참조해결 -DTO사용

MDanderson 2023. 4. 19. 01:34

순환 참조 문제를 해결하지 않고 양방향 @OneToOne 관계를 사용하는 경우가 있습니다. 그 예시는 DTO(Data Transfer Object)를 사용하는 경우입니다.

DTO를 사용하여 엔티티를 JSON으로 변환하고, 순환 참조가 발생하지 않도록 엔티티 간 관계를 정의할 수 있습니다. 예를 들어, 아래는 양방향 @OneToOne 관계를 가진 Person과 Address 엔티티와 이에 대응하는 DTO 클래스입니다.

 

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToOne(mappedBy = "person")
    private Address address;
}

@Entity
public class Address {
    @Id
    @GeneratedValue
    private Long id;

    private String street;

    @OneToOne
    @JoinColumn(name = "person_id")
    private Person person;
}

public class PersonDTO {
    private Long id;
    private String name;
    private AddressDTO address;
}

public class AddressDTO {
    private Long id;
    private String street;
}

이렇게 PersonDTO와 AddressDTO 클래스를 사용하면, 엔티티간의 관계가 순환 참조를 발생시키지 않습니다. 이 경우에는 양방향 @OneToOne 관계를 사용하면서 별도의 어노테이션을 사용하지 않았습니다. 이 방식을 사용하려면 엔티티를 DTO 객체로 변환하는 로직이 필요합니다.