• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

값 컬렉션 HashSet 타입인 favoriteFoods를 수정할 때 궁금한 것이 있습니다.

24.01.02 14:21 작성 조회수 149

0

<Member 클래스>

@ElementCollection
    @CollectionTable(name = "FAVORITE_FOOD", joinColumns =
    @JoinColumn(name = "MEMBER_ID")
    )
    @Column(name = "FOOD_NAME") // 값이 하나라 가능
    private Set<String> favoriteFoods = new HashSet<>();

<JpaMain 함수>

try {
            Member member = new Member();
            member.setUsername("member1");
            member.setHomeAddress(new Address("homeCity", "street", "10000"));
            member.getFavoriteFoods().add("치킨");
            member.getFavoriteFoods().add("족발");
            member.getFavoriteFoods().add("피자");

            member.getAddressHistory().add(new Address("old1", "street", "10000"));
            member.getAddressHistory().add(new Address("old2", "street", "10000"));

            em.persist(member);
            
            em.flush();
            em.clear();

            System.out.println("=========== START ===========");
            //todo: 값 타입 수정
            Member findMember = em.find(Member.class, member.getId());

            Address a = findMember.getHomeAddress();
            findMember.setHomeAddress(new Address("newCity", a.getStreet(), a.getZipcode()));

            // HashSet이라서 set 메서드 활용 불가
            findMember.getFavoriteFoods().remove("치킨");
            findMember.getFavoriteFoods().add("한식");

            tx.commit();

위의 메인함수를 여러 번 실행했는데 HashSet임에도 불구하고 순서가 지켜진 체로 DB에 저장된 결과가 다음과 같습니다.

그러나, em.flush()와 em.clear()를 주석처리하고 다시 실행해보면 DB로 조회할 때 순서가 지켜지지 않고 무작위로 저장이 됩니다. 제 예상은 em.flush()가 add()로 저장된 컬렉션 값을 먼저 DB에 반영하니까 순서가 보장되서 항상 같은 결과가 나오지 않나 생각됩니다. 이것이 맞나요?

답변 2

·

답변을 작성해보세요.

2

안녕하세요. Ambition님

이 부분은 프로그래밍의 여러 요소로 인해서 같은 내용의 경우 순서가 보장되는 것 처럼 보일 수는 있습니다.

하지만 결과적으로 다른 데이터가 들어가거나, 프로그램의 버전 등 상황이 변하면 언제든지 순서가 변경될 가능성이 있습니다.

따라서 HashSet을 사용할 때는 순서가 보장되지 않는다고 생각하셔야 합니다.

감사합니다.

Ambition님의 프로필

Ambition

질문자

2024.01.03

아 그렇군요 아마 DB 내부적으로 캐싱이 적용되서 그런것 같네요 감사합니다 :)

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.02

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용과 관련된 유사한 질문의 답변을 찾았습니다. HashSet은 순서를 보장하지 않는 자료구조임에도 불구하고 결과가 순서대로 나온다는 것과 관련하여, 질문에 답변한 내용이 도움이 될 것 같습니다.

질문 제목: 값타입 컬렉션 질문 있습니다 21분 50초
질문 링크: https://www.inflearn.com/questions/817247

강의 수강 시 궁금한 내용이 있을 때는 질문&답변 게시판을 활용하시면 좋습니다. 해당 링크를 방문하셔서 더 자세한 내용을 확인해 보시기 바랍니다.