728x90

그동안 일대다 관계에서 '다'를 표현할 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으로 설정했다.

728x90

+ Recent posts