# JPA 연관관계의 필요성
RDB와 Java사이에는 패러다임의 차이가 존재합니다.
- 관계의 표현 - 객체는 상속, 구성, 집합 / RDB는 일대일, 일대다, 다대다
- 데이터의 표현 - 객체는 상태와 행동을 가짐 / RDB는 ROW와 COLUMN으로 구성
- 데이터의 지속성 - 객체는 메모리에 일시적으로 존재 / RDB는 디스크에 저장하고 검색
이러한 차이점 때문에 DB를 설계하고 Java에서 DB 데이터들을 객체로서 효율적으로 관리하기가 쉽지 않습니다. 이에 대한 해결책으로 JPA(ORM)가 개발되었고 이는 객체와 테이블 간의 매핑을 훨씬 쉽게 해줍니다. 그렇다면 JPA를 활용해서 어떻게 연관관계를 매핑하는지 알아보도록 하겠습니다.
# JPA 연관관계
0. 배경 지식
- DB는 FK 하나로 양쪽 테이블 JOIN이 가능하지만 객체는 참조용 필드가 있는 객체만 다른 객체를 참조하는 것이 가능합니다.
- 단방향 관계 2개를 맺을때는 연관관계의 주인을 지정해야합니다. 주인은 레코드 CRUD가 가능하지만 주인이 아니면 조회만 가능합니다.
1. 일대일
1. 주 테이블에서 외래키를 갖는경우
단방향 - @OneToOne, @JoinColumn
양방향 - @OneToOne, @JoinColumn / @OneToOne(mappedBy="")
객체지향 측면 편리, jpa 매핑 편리
2. 대상 테이블에 외래키를 갖는 경우
단방향 - 허용 X
양방향 - @OneToOne(mappedBy="") / @OneToOne, @JoinColumn
db 측면 편리, 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩, 일대다 관계로 변경할때 구조를 유지 가능
2. 다대일
단방향 - @ManyToOne, @JoinColumn
양방향 - @ManyToOne, @JoinColumn / @OneToMany(mappedBy = "")
3. 일대다
다대일과 똑같은거 아닌가?
rdb에서는 대부분 관점의 차이로 같은 뜻으로 통하지만 jpa에서는 다대일은 n에 연관관계 주인을 둔것이고 일대다는 1에 주인을 둔것입니다. (실무에선 사용 금지)
1. 단방향 - @OneToMany, @JoinColumn(name = "TEAM_ID")
문제는 매핑한 객체가 관리하는 FK가 다른 테이블에 있다는 점입니다. 이로 인해 INSERT SQL에 UPDATE SQL를 추가로 발생시킵니다. 이를 해결할수는 있지만 권장되지 않기 때문에 일대다 단방향 보다는 다대일 양방향 매핑을 권장합니다.
2. 양방향 - 일대다 양방향 매핑에서 @OneToMany는 연관관계의 주인이 될 수 없습니다. 왜냐하면 일대다 관계에서는 항상 다 쪽에 FK가 존재하기 때문입니다. 이런 이유로 @ManyToOne에는 mappedBy 속성이 없습니다.
4. 다대다
실무 사용 금지
자기도 모르는 복잡한 조인의 쿼리(Query)가 발생하는 경우가 생기게 됩니다.
다대다를 일대다, 다대일로 풀어서 만드는 것(중간 테이블을 Entity로 만드는 것)이 그나마 해결책이라 할 수 있습니다.
결론 - 일대다 단방향, 양방향, 다대다은 웬만하면 쓰지마라
# References
https://ttl-blog.tistory.com/129#hELLO
https://jeong-pro.tistory.com/231
chatgpt
'Back-end > IBAS-spring-project' 카테고리의 다른 글
Blue/Green 배포 (Nginx + github actions) without Docker (0) | 2024.06.17 |
---|---|
무중단 배포 전략 (Continuous Deployment) (1) | 2024.06.14 |
프로세스, 그리고 Docker와 VM (0) | 2023.08.06 |
RESTful API (0) | 2023.07.27 |
효율적인 RDB 설계 방법 (0) | 2023.07.03 |