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

박해빈님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

예제 도메인 모델과 동작확인

MemberTest

작성

·

402

0

MemberTest에서 changeTeam메소드를 테스트 해보고 싶어서 추가로 코딩해서 실행해보았습니다.

화면 캡처 2023-05-22 092038.png근데

System.out.println(member1.getTeam().getName());
        System.out.println(teamB.getMembers().stream().collect(Collectors.toList()));

위의 코드에는 반영이 되는 데 h2에 select문으로 member를 쿼리해보면 반영이 안되어있더라구요.

제가 공부한바로는 em.flush(), em.close 하면 db에 반영되는 걸로 이해하고 있는데... 잘못이해하고 있는 건가요??

 

 

답변 2

1

박해빈님의 프로필 이미지
박해빈
질문자

아 이코드를 추가하니 update쿼리가 나가네요! 감사합니다

        Member member = em.find(Member.class, 1);
        member.changeTeam(teamB);

파이팅입니다!

1

안녕하세요, 박해빈 님. 공식 서포터즈 y2gcoder 입니다.

테스트 코드의 나머지 부분은 동일하게 두고 뒤에 추가로 changeTeam() 에 대한 테스트 코드를 작성하신 것으로 보입니다.
혹시 로그에 changeTeam()에 대한 update 쿼리가 찍혀있는지 궁금합니다. 테스트 코드에 @Rollback(false)가 붙어있기 때문에 변경감지가 작동했다면 update query 또한 발생해야 합니다.

제 생각에는 //초기화 주석 밑의 초기화 과정 이후 members 리스트 이외에는 기존 member1, member2, member3, member4, teamA, teamB가 영속 상태가 아니게 되었기 때문에 객체 레벨의 동작만 하고 있는 것으로 조심스럽게 추측합니다. 그래서 member1은 이미 영속성 컨텍스트의 관리대상이 아니게 된 시점에서 changeTeam()을 하면, Java 객체로서의 동작으로 member1의 team 객체는 바꿀 수 있으나 DB에 쿼리까지 발생하지는 않게 되는 것이 아닐까 생각합니다.

해당 부분에 대해 직접 테스트를 해보시는 것도 좋고, 아니면

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

추가로 테스트 메서드는 한 번에 하나의 기능만 테스트하는 것이 좋습니다. 해당 테스트 코드에서는 member entity가 잘 저장되었는지 확인하는 것, 팀 변경 메서드가 잘 작동하는지 확인하는 것까지 두 가지 기능을 테스트하고 있습니다.

테스트할 기능을 명확하게 하기 위해 테스트 코드를 분리하시는 것을 추천하겠습니다!