JPA
[JPA] 13. 단방향과 양방향 참조의 특징
Song hyun
2024. 9. 30. 12:38
728x90
반응형
[JPA] 13. 단방향과 양방향 참조의 특징
1. 단방향 참조
(1) 장점
- 구현이 단순하다. - 한쪽에서만 참조하기 때문에 설계가 단순하며, 필요하지 않은 방향으로의 참조를 구현할 필요가 없어 코드가 단순해진다!
- 성능 최적화 - 불필요한 참조를 하지 않으므로 메모리 사용을 줄일 수 있고, 필요없는 객체를 로드하지 않아도 된다. // 특히 지연 로딩과 결합시 성능이 최적화된다!
- 메모리 절약 - 단방향으로만 참조할 경우, 반대 방향으로의 객체를 유지할 필요가 없기 떄문에 메모리 사용을 줄일 수 있다.
(2) 단점
- 양방향 탐색 불가 - 한 쪽에서만 참조하기 때문에, 참조되지 않는 방향에서는 해당 객체를 참조하거나 조회할 수 없다.
- 관계 복잡성 증가 - 반대쪽에서 객체를 참조해야 할 때, 별도의 쿼리를 작성해야 한다. => 코드 복잡성 증가!
2. 양방형 참조
(1) 장점
- 양방향 탐색 가능 - 양방향 참조를 통해 모두 서로를 참조할 수 있다. 관계 탐색이 용이해진다.
- 더 직관적인 객체 탐색 - 양쪽에서 데이터를 쉽게 탐색할 수 있기 때문에, 개발자가 두 엔티티 간의 관계를 더 쉽게 관리하고 탐색할 수 있다.
- 단순한 쿼리 - 데이터베이스에서 한 쪽을 조회할 때, 반대쪽 객체도 쉽게 접근할 수 있다. 이를 통해 추가 쿼리 작성이 줄어들 수도 있다.
(2) 단점
- 설계의 복잡성 증가 - 어느 엔티티가 연관관계의 주인인지를 명확히 설정해야 한다. 이로 인해 설게가 복잡해질 수 있다.
- 메모리 사용 증가 - 양방향으로 참조를 유지하기 때문에 두 엔티티가 서로를 참조할 경우, 메모리 사용량이 늘어날 수 있다.
- 순환 참조의 위험 - 양쪽에서 서로를 참조하면서 순환 참조가 발생할 수 있다. 이는 직렬화나 JSON 변환에서 무한 루프를 일으킬 수 있다. 이런 문제를 해결하기 위해 @JsonIgnore와 같은 어노테이션을 사용해야 할 때도 있다.
3. 시나리오 코드 : 게시글과 댓글의 관계
-하나의 게시글에는 여러 댓글이 달릴 수 있다. 하지만 한 댓글은 하나의 게시글만을 가지고 있다.
-즉 댓글이 게시글의 FK를 가지고 있는 상태. 게시글(=Post)는 연관관계의 주인이 된다!
*아래는 참조시 mappedby 속성이 없어 중간 테이블이 생긴 모습.
package com.example.demo.model;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity(name = "tb_post")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
// 하나의 게시글에는 여러개의 댓글이 달린다.
@OneToMany
private List<Comment> comment;
}
package com.example.demo.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity(name = "tb_comment")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Comment {
@Id // PK 지정
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String text;
// 여러개의 댓글은 하나의 게시글에 속한다.
// = Many To One
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
}
728x90
반응형