인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

창신동 장첸님의 프로필 이미지

작성한 질문수

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

회원 기능 테스트

채번 쿼리 로그

작성

·

57

0

안녕하세요.

아래 강의 소스의 내용중 memberService.join메소드를 호출시 em.persist로 인해 select next value 시퀀스값을 가져오는 쿼리를 기대했습니다.

@SpringBootTest(classes = JpashopApplication.class)
@Transactional
public class MemberServiceTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;
    @Autowired EntityManager em;

    @Test
    @Rollback(value = false)
    public void 회원가입() throws Exception {
        System.out.println("MemberServiceTest.회원가입");
        //given
        Member member = new Member();
        member.setName("kim");

        //when
        Long savedId = memberService.join(member);

        //then
        assertThat(memberRepository.findOne(savedId)).isEqualTo(member);
    }

 

하지만, 아래 소스 InitDb의 init메소드의 제거 여부에 따라

위 시퀀스 채번쿼리가 나타났다 사라졌다 합니다.

@Component
@RequiredArgsConstructor
public class InitDb {

    private final InitService initService;

    @PostConstruct
    public void init() {
        initService.dbInit1();
        initService.dbInit2();
    }

....
}

다른 분들 도 같은 현상을 겪는지 궁금하며 원인을 알고싶습니다.

답변 2

0

David님의 프로필 이미지

안녕하세요. 창신동 장첸님, 공식 서포터즈 David입니다.

시퀀스의 경우 한 번에 특정 개수 이상을 가져와서 사용하는 경우가 있습니다.

1~50번까지 미리 애플리케이션이 할당받고 내부에서 50번까지 부여하게 됩니다.

이런 경우 최초 시퀀스를 조회하는 경우를 제외하고 이후 저장 로직에서는 시퀀스를 가져오는 쿼리가 안 보일 수 있습니다.

감사합니다.

창신동 장첸님의 프로필 이미지

강의에서 소개하신 allocationSize 를 지정하지 않았는데도 이런 동작을 할 수 있나보군요

David님 답변 감사합니다~!

0

인프런 AI 인턴님의 프로필 이미지

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

창신동 장첸님께서 질문하신 내용은 스프링 부트 환경에서 JPA를 사용한 테스트 시, 특정 메서드 호출에 따라 시퀀스 쿼리(select next value for sequence)가 나타나거나 사라지는 현상과 관련이 있습니다.

우선, InitDb 클래스로 인해 초기 데이터베이스 설정이 변경되고 있을 가능성이 있습니다. InitDbinit 메소드에서 사용되는 dbInit1dbInit2 메서드들이 데이터베이스에 영향을 미쳐, 그로 인해 시퀀스 쿼리가 발생하거나 미발생하게 되는 상황이 연출될 수 있습니다. 구체적으로, 데이터베이스 초기화 로직이 JPA의 엔티티 매핑이나 시퀀스 생성을 위한 트랜잭션 경계를 변동시킬 수 있어 보입니다.

이러한 현상이 발생하는 주요 원인은 데이터베이스 초기화가 완료된 후의 상태와 그렇지 않은 상태에서의 차이 때문일 수 있습니다. 예를 들어, 초기화 과정에서 시퀀스가 생성되거나, 기존의 시퀀스를 사용할 필요가 없도록 데이터가 입력될 수 있습니다.

관련하여 이 질문에서도 Hibernate 시퀀스 생성 문제에 대한 유사한 논의가 있었습니다. 특정 환경 설정에 따라 시퀀스 지정 방식이나 생성 전략이 변경될 수 있습니다. 예를 들어, ddl-auto 설정이 create로 되어 있는 경우, 모델에 따라 보다 명확하게 시퀀스를 제어하고 생성하도록 설정할 수 있습니다.

이러한 경우에는 특정 메소드에서 수정을 가하기보다는 전체적인 트랜잭션 경계와 초기화 로직의 순서를 점검하고, 필요하다면 시퀀스를 수동으로 관리하거나 데이터베이스 초기화 시점에 대한 고려가 필요합니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.