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

soohee·2023년 3월 12일
1

BE-STUDY

목록 보기
2/7
post-thumbnail

😮 연관 매핑을 지양하라?

저번 내용에 이어서, 현업에서는 연관관계 매핑을 싫어한다는 것을 알았다.

나돈데.. 나돈데.. 나돈데....

실제로 나도 프로젝트 할 때, 연관관계해놓지 않은 엔티티가 있었는데 그 기억이 새록새록났다.
나도 싫어하지만, 이유를 알고 싫어해야하니까 좀 더 자세히 찾아보기로 했다. 그러기 위해선 그 전에 왜 썼는지부터 되짚어 보았다.

📕 우리는 왜 연관매핑을 썼나?

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

😒 개발하기 편한데 쓰지 않는다고..?

그럼 문득 이런 의문이 든다. "개발하기 편한데 쓰지 않는다고?"
이유는 다음과 같다.

  1. @OneToMany는 DB I/O성능 저하가 발생한다.
    그래서 @OneToMany를 굳이 쓰지 않고, 식별자 값을 이용해서 간접참조하면 실제 쿼리 조회 시간을 줄일 수 있다.
    따라서, 정보를 저장하기 보다 관계를 정의하는 엔티티 같은 경우 연관 매핑을 맺지 않고 해당 엔티티들의 식별자를 사용하는 것이 더 빠르다.

    예시)
    학생 엔티티 / 수업 엔티티의 관계를 나타내주는, 학생_수업 엔티티를 만들경우,
    학생과 수업의 식별자만을 이용해서, 처리해주는게 빠르다.

  2. 불필요한 n+1쿼리가 발생한다.
    연관관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(n)만큼 연관관계의 조회쿼리가 추가로 발생하여 데이터를 읽어오게 되므로, 성능 저하가 발생한다.
    이를 해결하기위한 EntityGraph나 Fetch Join과 같은 방법이 있는데.. 굳이? 싶은 방법으로 생각된다.

  3. 개발자가 인지 못할 장애가 발생할 수 있다.
    연관관계를 설정하게 되면 개발자가 인지하지 못하는 것들이 생겨날 수 있는데 그 곳에서 에러가 발생할 시 대처가 늦어지게 된다.
    그래서, 차라리 명시적으로 Query를 작성하는 것이 유지보수할 때 더 명확하다고 느껴진다.

🐣 나의 생각

네이버랑 카카오도 JPA 연관관계매핑을 쓰지 않는 것을 보면, 보이지 않는 곳에서 발생하는 에러에 의한 문제들이 오히려 연관관계 매핑을 썼을 때의 이점보다 크다고 느껴지는 것 같다.
그래도, 연관관계 매핑을 무조건 쓰지않는다기 보다는 상황을 봐가면서 쓰는 게 좋지않을까 싶다.
단방향 매핑정도는 괜찮지 않을까?

profile
🐻‍❄️

2개의 댓글

comment-user-thumbnail
2023년 3월 23일

이글 예전부터 궁금했는데 이제 보게 되네요..
몇몇회사에서 안쓰는 이유가 궁금하긴 하네요 ! 참조키로는 반드시 쓸 거 같은데 말이죠! 이것도 아닌가?? 궁금하네요

1개의 답글