우선, List와 Set의 차이를 생각해보자
List는 순서가 보장되고 Set은 중복을 제거한다.
영한샘은 우선 Set을 쓰면 지연 로딩 때 성능 이슈가 있다고 하셨다. 개념적으로, 지연로딩은 필요할 때 데이터를 조회한다.
그런데, Set 특성상 컬렉션에 데이터를 추가할 때 중복 체크를 해야 한다. 조회를 하지 않더라도, insert를 할 때 중복 체크 때문에 컬렉션이 로딩된다는 말 같다.
List는 이런 문제에서 자유롭다.
하이버네이트 4.3 버전의 doc에서 위 내용이 나온다.
How do Set and List collections behave with JPA and Hibernate
다만, 이 글에 따르면 중복 문제가 있는 것으로 보인다.
CASCADE를 MERGE, PERSIST, ALL 셋 중 하나로 준 경우
연관관계의 주인이 아닌 쪽에 객체를 생성하면, INSERT 쿼리가 두 번 발생해 중복이 생겼다고 한다.
다만,Hibernate 5.0.8에서 HHH-5855 이슈가 해결됐기 때문에 그 이후로 버전에서는 List를 사용해도 중복 문제가 발생하지 않는다(링크)