작성
·
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
안녕하세요, 인프런 AI 인턴입니다.
창신동 장첸님께서 질문하신 내용은 스프링 부트 환경에서 JPA를 사용한 테스트 시, 특정 메서드 호출에 따라 시퀀스 쿼리(select next value for sequence
)가 나타나거나 사라지는 현상과 관련이 있습니다.
우선, InitDb
클래스로 인해 초기 데이터베이스 설정이 변경되고 있을 가능성이 있습니다. InitDb
의 init
메소드에서 사용되는 dbInit1
및 dbInit2
메서드들이 데이터베이스에 영향을 미쳐, 그로 인해 시퀀스 쿼리가 발생하거나 미발생하게 되는 상황이 연출될 수 있습니다. 구체적으로, 데이터베이스 초기화 로직이 JPA의 엔티티 매핑이나 시퀀스 생성을 위한 트랜잭션 경계를 변동시킬 수 있어 보입니다.
이러한 현상이 발생하는 주요 원인은 데이터베이스 초기화가 완료된 후의 상태와 그렇지 않은 상태에서의 차이 때문일 수 있습니다. 예를 들어, 초기화 과정에서 시퀀스가 생성되거나, 기존의 시퀀스를 사용할 필요가 없도록 데이터가 입력될 수 있습니다.
관련하여 이 질문에서도 Hibernate 시퀀스 생성 문제에 대한 유사한 논의가 있었습니다. 특정 환경 설정에 따라 시퀀스 지정 방식이나 생성 전략이 변경될 수 있습니다. 예를 들어, ddl-auto
설정이 create
로 되어 있는 경우, 모델에 따라 보다 명확하게 시퀀스를 제어하고 생성하도록 설정할 수 있습니다.
이러한 경우에는 특정 메소드에서 수정을 가하기보다는 전체적인 트랜잭션 경계와 초기화 로직의 순서를 점검하고, 필요하다면 시퀀스를 수동으로 관리하거나 데이터베이스 초기화 시점에 대한 고려가 필요합니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
강의에서 소개하신 allocationSize 를 지정하지 않았는데도 이런 동작을 할 수 있나보군요
David님 답변 감사합니다~!