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

궁금이님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 기능 테스트

회원가입 테스트 select 문이 나가는 이유.

해결된 질문

작성

·

336

0

    @Test
    public void 회원가입(){
        Member member = new Member();
        member.setName("memberA");

        Long savedMemberId = memberService.join(member);

        Member findMember = memberService.findOne(savedMemberId);

        assertThat(member).isEqualTo(findMember);
    }

근데

제가 em.find() 동작이

먼저 영속성 컨텍스트에서 찾아보고 있으면 그걸 return.

없으면 DB에 쿼리 날려서 가져온 다음에 return.(쓰기지연은 잠깐 생각 안하고)

로 알고 있는데,

 

그렇다면 코드상

멤버 생성하고,

join해서 쿼리가 쌓이고,

그 다음 findOne해서 가져오는데, 저게 결국은 em.find() 잖아요. 그러면 이미 영속성 컨텍스트에 id가 같은 게 있기 때문에 그걸 반환하잖아요.

그래야 할 것 같은데

select

m1_0.member_id,

m1_0.city,

m1_0.street,

m1_0.zipcode,

m1_0.name

from

member m1_0

where

m1_0.name=?

이렇게 로그로 나가요.

그래서 아, isEqualTo니까 혹시 막 이름같은 거 참조해서 가져오는 건가? 했는데

isSameAs 해봐도 똑같아요.

왜 하필 name으로 조회하는지도 모르겠어요.

em.find()쪽이 실행된 것은 분명해요.

답변 1

1

안녕하세요. 궁금이님, 공식 서포터즈 OMG입니다.

궁금해하시는 상황에서 join() 과정 중 validateDuplicateMember()에서 중복회원 검증을 위한 findByName()이 고려되어 있는걸까요?imageselect문은 여기서 발생하는것일텐데요, 질문에서는 이 내용은 미포함되어 있어서요 :)

 

감사합니다.