inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (3)

테스트 코드 createOrderWithStock 로그에 관하여

206

부자가될거야

작성한 질문수 11

0

 안녕하세요 강사님.

 

테스트코드의 @Transactional은 마지막에 rollback을 하기 때문에 dirty checking을 하지 않고, 이로 인하여 update쿼리가 전송되지 않을것이라 생각했습니다.

하지만 로그에는

update
        stock 
    set
        created_date_time=?,
        modified_date_time=?,
        product_number=?,
        quantity=? 
    where
        id=?
Hibernate: 
    update
        stock 
    set
        created_date_time=?,
        modified_date_time=?,
        product_number=?,
        quantity=? 
    where
        id=?

이처럼 quantity를 변경한것에 대한 update쿼리가 전송되었습니다.

이 부분에 대해서 찾아본 결과

"테스트 코드 마지막에서 stockRepository.findAll() 을 통해 stock을 전체 조회할때, select쿼리가 db에 직접 날라가기 때문에 select쿼리가 수행되기전 flush()로 인하여 update쿼리가 날아갔다." 라고 이해했습니다. 제가 이해한 내용이 맞을까요?

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

0

박우빈

안녕하세요, 부자가될거야 님!

네 맞습니다! 테스트에는 @Transactional이 있고, OrderService에는 @Transactional이 없을 때, findAll() 시점에 flush()가 수행되어서 update 쿼리가 날아간 상황이 맞습니다.

감사합니다. 🙂

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 부자가될거야님.

질문해주신 @Transactional 어노테이션의 동작 원리와 관련된 내용은 여러 수강생들 사이에서도 공통된 궁금증 중 하나입니다. 관련하여 유사한 질문과 답변들은 아래 링크를 통해 확인하실 수 있습니다.

  1. @Transactional을 붙였을 때 “만” Stock 감소 검증에 성공합니다

    • 해당 질문은 @Transactional을 사용했을 때와 사용하지 않았을 때의 차이로 인해 Stock 감소 검증에 성공하거나 실패하는 이유를 다루고 있습니다. 귀하의 질문과 유사하게 update 쿼리가 왜 발생하는지에 대해 논의되는 부분이 있습니다.
  2. 테스트 동시성 관련 질문드립니다

    • 테스트 환경 내에서 @Transactional 동작과 쿼리 발생 시점을 논의하는 좋은 예입니다. 동시성 문제 해결을 위해 각 테스트의 쿼리가 어떻게 처리되는지에 대한 설명이 포함되어 있습니다.
  3. 테스트 환경의 독립성을 보장하자

    • 테이블 생성 시점과, 테스트 환경 내 쿼리 동작에 대한 이해를 돕는 내용입니다. @Transactional과 관련된 테스트 환경 설정에 도움이 될 것입니다.

요약:

  • 귀하의 이해가 맞습니다. @Transactional로 인해 롤백이 발생하더라도, 테스트 코드 내에서 stockRepository.findAll() 과 같은 쿼리 실행 시 데이터베이스와의 싱크를 맞추기 위해 flush()가 호출됩니다. 이는 Hibernate가 변경된 엔티티를 DB에 동기화하기 위해 update 쿼리를 발생시키는 원인입니다.
  • @Transactional은 트랜잭션 범위 내에서 엔티티의 변경 사항을 감지하지만, 트랜잭션이 끝나기 전에 데이터베이스와 동기화 해야하는 작업(flush)이 필요할 시에는 update 쿼리를 전송하게 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

private 상수 테스트 관련 질문

0

87

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

128

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

163

2

테스트 문서화 질문입니다

0

107

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

106

2

ERD 가장자리에 있는 도메인 테스트 질문

0

90

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

136

2

OrderCreateRequest DTO에 대해서 궁금한점

0

104

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

157

2

계층 관련 질문이 있습니다.

0

140

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

135

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

235

2

Service+Repository 통합테스트 관련 질문입니다.

0

151

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

186

2

test 용 .yml

0

91

2

throws Exception

0

81

2

카페키오스크 클래스 문의 ,,

0

90

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

176

2

테스트 코드에서 필요한 생성자

0

139

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

137

2

@DisplayName gradle / intellJ

0

94

2