EntityManager#flush()를 검증하면 더 좋을 것 같습니다!
139
投稿した質問数 14
멤버를 저장하는 테스트에서 EntityManager#flush()를 호출해서 플러시되어 DB까지 쿼리문이 제대로 가는지 검증하시는 것을 보았습니다. (저는 플러시까지 테스트해볼 생각을 못했어서 아주 인상깊었습니다 ㅎㅎ)
하지만 해당 부분이 검증문 없이 홀로 호출되고 있습니다.
좀더 의도를 드러내기 위해서는 assertThatCode(() -> em.flush()).doesNotThrowAnyException() 처럼 코드를 작성하는게 더 좋지 않을까 싶어서 질문드립니다!
적용 예시
@Test
void 멤버를_저장한다() {
var member = MemberFixture.createAny();
memberRepository.save(member);
assertThat(member.id()).isNotNull();
assertThatCode(() -> em.flush())
.doesNotThrowAnyException();
}
回答 2
0
createMember() 테스트에서 flush()는 그 기능을 검증하기 위해서 넣은 것이 아닙니다. JPA 테스트가 처음 나오는 부분이라 제가 flush를 할 때 SQL이 어떤 게 날라가는지 눈으로도 볼 수 있다는 설명을 드린 것 뿐이고요. flush()에 의해서 SQL이 실행되는지를 검증하려는 목적이 아닙니다.
강의에서 말씀드렸을텐데 테스트가 하나의 트랜잭션으로 묶이는 경우에 flush()를 하지 않으면 DB까지 SQL이 날라가지도 않은채로 테스트가 끝날 수 있고요. findById()를 해봤자 캐시에서 읽어오기 때문에 런타임에 실제 DB와 상호작용했을 때 문제가 없다는 것을 검증할 수 없기 때문에 넣은 것입니다. clear()는 캐시를 지우기 위한 것이고요.
flush(), clear()는 검증할 대상이 아니라, 이후 이어지는 테스트의 검증 기능이 제대로 작동하게 하기 위한 보조 작업일 뿐입니다.
0
flush()를 하지 않으면 DB까지 SQL이 날라가지도 않은채로 테스트가 끝날 수 있다.
라는 부분에서 flush도 테스트 대상이라고 생각한 것 같습니다. 단지 눈으로 확인하기 위함이라면 필요없을 것 같네요! 감사합니다!!
0
안녕하세요, 인프런 AI 인턴입니다.
Dompoo님이 언급하신 EntityManager의 flush() 메서드에 대한 검증은 멀티 스레드 환경에서 데이터 일관성을 확인하는 데 중요한 역할을 합니다. flush() 호출 시점에서 실제로 데이터베이스에 반영되는 쿼리를 통해 DB와의 동기화를 강제하기 때문입니다.
말씀하신 대로 assertThatCode(() -> em.flush()).doesNotThrowAnyException()를 추가함으로써, flush() 동작이 정상적으로 수행되고 예외 없이 처리되는지 확인할 수 있습니다. 이는 코드의 의도를 명확히 드러내며, 특정한 상황에서 발생할 수 있는 예외를 사전에 체크하는 데 도움을 줄 수 있습니다.
이러한 검증이 추가되면, 해당 메서드 호출로 인해 예상하지 못한 예외가 발생하는 경우를 미리 탐지할 수 있습니다. 특히, 개발시 트랜잭션 경계나 영속성 컨텍스트 관련해서 발생할 수 있는 문제를 빠르게 인지하고 대응할 수 있게 해줍니다.
이와 관련된 좋은 사례로, 테스트에서의 @Transactional 사용에 대해 질문이 있습니다. 이 게시물을 참고하시면 실질적인 적용 예와 함께 트랜잭션 처리가 테스트에서 어떻게 활용되는지를 이해하는 데 도움을 받을 수 있습니다.
제가 제공한 설명이 Dompoo님께 도움이 되었길 바랍니다. 추가적인 질문이나 더 깊은 주제가 필요하시다면 언제든지 말씀해 주세요!
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
도메인 모델에서 관계와 규칙을 구분하는 방법
0
33
2
헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?
0
109
2
어댑터에서 도메인에 직접 의존하는 경우에 대해
0
112
2
Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.
0
98
2
MemberService와 EmailSender 책임 분리에 대한 질문
0
100
2
NonNullApi를 NullMarked로 대체하라고 합니다.
0
120
2
39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
0
70
2
Repository Adapter 설계에 대해 피드백을 부탁드립니다
0
102
2
헥사고날 part2 강의 출시 예정일 문의 드립니다.
0
242
2
PT 문의사항
0
95
1
초기 어플리케이션 구동 시 compose.yml 파싱 오류
0
146
2
애플리케이션의 JPA 리턴과 도메인 모델
0
124
2
애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의
0
132
2
페이징 처리를 해야한다면 어떻게 해야할까요?
0
185
2
애그리거트의 repository
0
115
2
Domain Expert가 정확히 어떤 역할을 하는 사람인가요?
0
224
1
회원 애플리케이션 서비스 테스트 (1)
0
101
2
정적 팩토리 메서드 관련 질문드립니다!
0
102
2
spotbug + @NonNullApi 로만 Null 방어가 될까요?
0
125
2
required 포트에 관해서
0
87
2
혹시 다음 편은 언제쯤 오픈할까요?
0
161
2
서비스 단위 테스트 코드 작성
0
92
2
domain 모듈에 entity를 정의한다고 했을때
0
91
2
여러 엔티티의 조합으로 리포트를 제공해야할 때
0
75
2

