인프런 커뮤니티 질문&답변

KimJongHyun님의 프로필 이미지

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

관심 주제 삭제

안녕하세요 백기선님!

작성

·

242

2

안녕하세요 백기선님 강의 잘보고있습니다!

강의내용과 같은 형태로 Account와 Tag의 연관관계를 ManyToMany로 설정후 강의와 같은방식으로 tag 정보를 삭제하고 있는데요.

위 로그와 같이 account_id를 기준으로 조인테이블을 모두삭제하고 다시 삭제대상 tag를 제외한 tag를 다시 insert하는 방식으로 쿼리가 나가는데 어느부분에서 차이가 있는지 파악이 안되어서 질문 드립니다. 추후에 수정을 의도하시고 강의하신줄 알았는데 영상을 보니 강의에서는 delete 쿼리 하나만 나가는것으로 확인하였는데 어떤 문제인지 모르겠습니다.

답변 4

0

KimJongHyun님의 프로필 이미지
KimJongHyun
질문자

많은 도움이 됐습니다! 상세히 답변해주셔서 감사합니다

0

백기선님의 프로필 이미지
백기선
지식공유자

안녕하세요. 중요한 걸 찾아내셨네요. 바로 그 이유 때문에 ManyToMany 맵핑은 대부분 Set으로 맵핑하는게 효율적입니다. 다음 글도 읽어보시면 좋은데 구체적인 이유는 나와있지 않아요. 동작 원리에 대해서는 저도 추측해 보건데 List라는 컬렉션 자체가 중복을 허용하는 콜렉션이기 때문에 어떤 엘리먼트 하나를 빼는 식으로 동작하는게 아니라 비운 다음에 빼라고 했던 엘리먼트를 제외하고 다시 다 넣는게 아닐까 싶습니다. 그래야 하당하는 엘러먼트가 여러개 있어도 다 빠질테니까? 반면에 Set은 중복을 허용하지 않는 컬렉션이니 빼고 싶은 엘리먼트만 빼면 될테구요.

https://vladmihalcea.com/the-best-way-to-use-the-manytomany-annotation-with-jpa-and-hibernate/

0

KimJongHyun님의 프로필 이미지
KimJongHyun
질문자

자문자답이지만 저는 List를 이용해서 tag를 받았는데 Set으로 바꾸니까 쿼리가 제대로 delete만 나가네요! 그렇다면 List로 했을시에 insert 쿼리가 나가는 방식으로 삭제가 되는게 궁금합니다! 제 생각으로는 List로 받아오던 Set으로 받아오던 tag의 pk를 가지고 있으니 해당 데이터만 삭제가 가능할꺼라고 생각했는데 어떤 차이에서 이렇게 나가는 쿼리에서 차이가 보이는지 궁금합니다.

0

KimJongHyun님의 프로필 이미지
KimJongHyun
질문자

혹시 몰라서 github 남기도록 하겠습니다!

https://github.com/KJongHyun/studithm