Spring

[SpringBoot]Entity 연관관계 방향성

codi-3 2024. 8. 29. 18:42

Mysql 등 데이터 베이스에서는 테이블간 join 을 사용하면 각각의 테이블로 부터 정보를 받아올수있는 양방향 탐색을 실시할수있다. 하지만 Entity 클래스 객체들간에는 참조방향 을 정해주어야한다. 양방향 매핑은 데이터 접근의 편리하지만 객체간 상호작용이 많을경우 관계의 복잡성으로 인해 성능저하와 최적화에 무리를 줄수있다.


🔡 예제 코드 

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Food> foodList = new ArrayList<>();
}

첫 번째 코드 (양방향 관계)

  • Food 클래스:
    • Food 클래스는 User 클래스와 다대일(@ManyToOne) 관계를 가진다. user 필드를 통해 Food 객체는 자신이 속한 User 객체를 참조할 수 있다.
  • User 클래스:
    • User 클래스는 Food 클래스와 일대다(@OneToMany) 관계를 가진다. foodList 필드를 통해 User 객체는 자신이 소유한 여러 Food 객체를 참조할 수 있다.
  • 양방향 관계:
    • User와 Food 클래스는 서로를 참조하는 양방향 관계를 형성한다. User 객체는 자신의 foodList를 통해 연결된 모든 Food 객체를 알고 있고, Food 객체도 user 필드를 통해 자신이 속한 User 객체를 알고 있다.
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

두 번째 코드 (단방향 관계)

  • Food 클래스:
    • Food 클래스는 User 클래스와 동일하게 다대일(@ManyToOne) 관계를 가지며, user 필드를 통해 자신이 속한 User 객체를 참조한다.
  • User 클래스:
    • User 클래스는 단순한 엔티티로, Food 클래스와의 관계를 정의하지 않는다. 이 클래스에는 Food 객체들을 참조하는 필드가 없다.
  • 단방향 관계:
    • 이 경우, User와 Food 클래스 사이의 관계는 단방향이다. Food 객체는 자신이 속한 User 객체를 참조할 수 있지만, User 객체는 어떤 Food 객체들과 연결되어 있는지 알 수 없다. User 클래스가 Food 클래스를 참조하는 필드를 포함하지 않기 때문이다.

 

 

 

  • 첫 번째 코드는 User와 Food 사이에 양방향 관계가 설정되어 있습니다. 서로를 참조할 수 있으며, 이로 인해 User 객체는 자신이 소유한 Food 객체들을 알 수 있습니다.
  • 두 번째 코드는 User와 Food 사이에 단방향 관계가 설정되어 있습니다. Food 객체만 User 객체를 참조하며, 반대로는 참조가 없습니다.