- [JPA] 13. 단방향과 양방향 참조의 특징2024년 09월 30일
- Song hyun
- 작성자
- 2024.09.30.: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반응형'JPA' 카테고리의 다른 글
[JPA] 15. 빌드 시스템이란? (0) 2024.10.01 [JPA] 14. REST API란? (0) 2024.10.01 [JPA] 12. @Entity를 사용하여 엔티티 만들기 (0) 2024.09.30 [JPA] 11. 단방향, 양방향 매핑에 대한 이해 (0) 2024.09.30 [JPA] *Springboot Starter Project - 프로젝트 설정하기 (1) 2024.09.30 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)