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 객체를 참조하며, 반대로는 참조가 없습니다.
'Spring' 카테고리의 다른 글
[SpringBoot]Api Response (0) | 2024.09.06 |
---|---|
[SpringBoot] ArgumentResolver 사용하여 jwt 정보 가져오기 (0) | 2024.09.04 |
[SpringBoot] NaverOpen API 사용 (0) | 2024.08.29 |
[SpringBoot]환경변수 application.properties (0) | 2024.08.28 |
[SpringBoot]Jpa Auth Filter (0) | 2024.08.26 |