그동안 일대다 관계에서 '다'를 표현할 Entity의 Colletion으로 List를 사용했었다. 이전에 들었던 Spring 강의에서 List를 사용했기 때문이고, 문제가 없어 보였다. 그러나, 굳이 List가 아니라 Set으로도 표현이 가능함을 알게 되었고, 어떤 자료형이 더 최적 일지 고민했다.
알다시피 List는 중복이 허용되는 순서를 유지하는 자료를 모으는 자료형이고, Set은 중복이 허용되지 않는 순서가 없는 자료형이다. 혼자 고민하기보다, StackOverflow에 검색을 했더니 아래와 같은 좋은 글을 발견했다.
stackoverflow.com/questions/4655392/which-java-type-do-you-use-for-jpa-collections-and-why
Which Java Type do you use for JPA collections and why?
Which of the following collection types do you use in your JPA domain model and why: java.util.Collection java.util.List java.util.Set I was wondering whether there are some ground rules for this.
stackoverflow.com
JPA에서 Hibernate를 구현체로 사용할 때, List 자료형은 Bag이라는 자료형으로 변환이 된다고 한다. 이 Bag에는 치명적인 단점이 있다. 예를들어 userA가 작성한 글 제목이 "ABC"라는 글을 삭제하려 할 때,
delete from userPost where userName = "userA";
insert into userPost(userName, postTitle) values("userA", "ABA");
insert into userPost(userName, postTitle) values("userA", "ABB");
insert into userPost(userName, postTitle) values("userA", "ABD");
이런식으로 작성자가 userA인 글을 모두 삭제한 후 ABC가 아닌 나머지 값을 다시 insert 하는 식으로 쿼리가 실행된다.
Bag 자료형을 사용하면 delete & update 를 실행할 때 delete All & re-insert 방식으로 구현이 된다는 것이다. 이는 프로그램 성능에는 치명적일 수 있다. 이런 문제를 피하기 위해 Set 자료형을 사용하면 Hibernate가 Bag 자료형을 사용하지 않고 문제를 해결할 수 있다고 한다.
생각해보면 내 프로젝트에서, 중복 허용이나 개체 순서는 중요하지 않기 때문에 List 자료형을 전부 Set으로 변경 & 적용했다. 객체가 정렬될 필요도 없기 때문에 TreeSet이 아닌 HashSet으로 설정했다.
'프로젝트 > Songstagram' 카테고리의 다른 글
[Songstagram] 쿼리 최적화 (0) | 2020.10.07 |
---|---|
[Songstagram] 갑자기 회원 수정이 안 되는 상황 해결하기 (0) | 2020.09.21 |
[Songstagram] 분노의 ip 차단 기능 구현 (0) | 2020.09.12 |
[Songstagram] 피드백 정리 (0) | 2020.08.25 |
[Songstagram] AWS Elastic Beanstalk에 HTTPS 적용하기 (0) | 2020.08.24 |