관리 메뉴

기록하는 공간

@ManyToMany를 사용하지 말자! 본문

Spring

@ManyToMany를 사용하지 말자!

giwoong01 2023. 7. 26. 18:17

JPA에서 다대다 연관관계를 제공한다. @ManyToMany 어노테이션을 사용하는 것이다.

이 글에서는 다대다의 문제점들과 해결책을 설명하고자 한다.


실제로 최근 프로젝트를 진행하면서 사용했던 예시이다

이 코드를 간단히 설명하자면 유저가 스크랩한 공지를 가지고 있기 위해 만들어진 테이블들이다.

 

유저 테이블과 공지 테이블을 @ManyToMany 어노테이션으로 다대다매핑을 해주었었다.

“member_scrap_notice”라는 연결 테이블을 자동으로 생성해 주고 설정해 주니 편리했다.


다대다의 문제점

  • 중간 테이블에는 매핑정보만 들어가고 추가 데이터를 넣는 것이 불가능하다.
  • 중간 테이블이 숨겨져 있기 때문에 쿼리가 예상하지 못하는 형태로 나간다.
  • 실무 비즈니스는 복잡해서 ManyToMany로 풀 수 있는 게 거의 없다고 보면 된다.

처음 코드를 구현할 때 아무것도 모르고 @ManyToMany를 사용하였다.

하지만 @ManyToMany 매핑이 매우 위험하다는 것이다.

 

위에서 말했다시피 연결 테이블은 단순히 연결만 하고 끝나는 것이 아니다. 다른 정보가 필요로 하면 추가를 해주어야 한다.

그리고 연결 테이블이 숨겨져 있기 때문에 예상하지 못한 쿼리들이 실행이 된다.


JPA에 대해 너무 무지한 상태로 프로젝트를 진행하니 이런 일이 생긴 것이다.

 

이제라도 문제점을 알았으니 다행이다. 해결해 보자!

 

그 해결법은 바로 연결테이블용 엔티티를 만들어주고 @OneToMany, @ManyToOne을 사용하여 일대다 다대일 관계로 @ManyToMany관계를 풀어주는 것이다.

 

바로 알고 수정 한 코드이다.

 

Member.java

Notice.java

 

연결테이블 엔티티 MemberScrapNotice.java

 

연결테이블 엔티티를 만들고 자세한 서비스 코드는 모두 바뀌었다. 이것은 이 글에서 다룰 내용은 아니니 넘어가도록 하겠다.

 


마무리

첫 프로젝트를 진행하면서 한계를 다다르는 순간들이 있다.

내 뜻대로 되지 않고, 코드에 대해 이해가 가지 않는 그런 순간들.

이번 글에서 다룬 내용도 그렇다.

 

하지만 이런 경험을 지금하고 스스로 해결하는 것이 얼마나 큰 배움인 것인가!

이번 문제를 해결하면서 많이 배우게 된 시간이었다.