본문 바로가기
Spring/Spring Study

[Spring] 연관 매핑을 지양하라?

by ♡˖GYURI˖♡ 2024. 7. 4.
728x90
개인 프로젝트에서 멀티 모듈을 도전했다가 난관에 봉착했다.

A 모듈에 있는 엔티티와 B 모듈에 있는 엔티티가 연관이 필요하게 된 것이다.
급하게 멘토님께 질문을 드렸고, 연관 매핑 대신 String으로 Key값만 받아와서 저장하는 방안을 추천해주셨다.

연관 매핑을 안 해도 되는 방법이 있다는 것을 알게된 후로, 이게 자주 쓰이는 방법인지가 궁금해졌다. 
그래서 검색하던 중 '연관 매핑을 지양하라'라는 글을 보게 되어 정리해둔다.

 

 

연관매핑을 왜 사용하는지

Spring JPA에서는 @ManyToOne, @OneToMany와 같은 어노테이션을 가지고 연관관계를 확인할 수 있다. 이렇게 되면 직접 참조를 해 연관관계 객체를 바로 찾을 수 있게 되고, Join Query 없이 Join이 가능하며, 유지보수에 용이하다는 장점을가지고 있다.

 

 

 그런데 왜 지양하라는걸까?

1. @OneToMany는 DB I/O 성능 저하를 발생시킨다.

그렇기에 @OneToMany를 굳이 사용하지 않고, 식별자 값을 이용해서 간접참조하면 실제 쿼리 조회 시간을 줄일 수 있다.

따라서, 정보 저장이 아닌 관계를 정의하는 엔티티 같은 경우 연관 매핑을 맺지 않고 해당 엔티티들의 식별자를 사용하는 것이 더 빠르다.

 

2. 불필요한 n + 1 쿼리가 발생한다.

연관관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 되므로 성능 저하가 발생한다. 이를 해결하기 위한 방법으로는 EntityGraph나 Fetch Join이 있다고 한다. (이 부분은 조금 더 알아봐야 할 것 같다.)

 

3. 개발자가 인지 못하는 장애가 발생할 수 있다.

연관관계를 설정하게 되면 개발자가 인지하지 못하는 장애들이 생겨날 수 있다. 그래서 차라리 명시적인 Query를 작성하는 것이 유지보수할 때 더 명확하다고 한다.

 

 

조금 더 찾아보니 양방향 연관관계일 경우에 고민해야 할 지점들인 듯 하다. 

단방향 연관관계 매핑을 사용한다면 괜찮을 것 같다.

 

 

 

 

 


 

 

[JPA] 연관관계 매핑

Entity 연관관계를 매핑할 때 특별한 경우가 아니라면 단방향으로 설계가 권장된다는 말을 많이한다. 그런데 DB 테이블 설계시에는 조인을 고려하고 설계하다보니 기본적으로 양방향이 가능한 구

findmypiece.tistory.com

 

 

[BE-STUDY] 연관매핑을 지양하라?

저번 내용에 이어서, 현업에서는 연관관계 매핑을 싫어한다는 것을 알았다. 나돈데.. 나돈데.. 나돈데....실제로 나도 프로젝트 할 때, 연관관계해놓지 않은 엔티티가 있었는데 그 기억이 새록새

velog.io