작성
·
1.8K
·
수정됨
0
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
@Modifying 을 어노테이션으로 단다면, em.flush(),clear() 코드없이 동일한 동작을 수행하게 되나요?
스프링 데이터 JPA에서는 Repository위에 달았는데요. 뒷 강의에서 Spring data JPA와 QueryDSL을 병행해서 사용하기 위해 custom Repository를 만든다고 배웠습니다.
이 custom Repository의 함수에 @Modifying을 달아도 동일하게 동작하는지 궁금합니다.
정리하자면 QueryDSL에서도 @Modifying이 적용되는지 궁금합니다.
답변 2
0
테스트 코드를 짜보았더니 @Modifying이 동작하지 않는다는 것을 확인했습니다.
그래서 QueryDSL 구현체 내부에서 em.flush(), em.clear()를 호출하는 방식으로 구현해보았는데요.
원하는 대로 동작하기는 하는데, EntityManager를 clear하는 코드를 매번 넣어주어야 되는건지 고민이됩니다.
수행한 테스트는 아래와 같습니다.
for (Message m : insertBeforeMessages) {
System.out.println("before test = " + m.getStatus());
}
messageRepository.updateMessageStatus(bundle,MessageStatusType.DONE);
// em.flush();
// em.clear();
List<Message> insertAfterMessages = messageRepository.findByBundle(bundle);
for (Message m : insertAfterMessages) {
System.out.println("after test = " + m.getStatus());
org.junit.jupiter.api.Assertions.assertEquals(m.getStatus(),MessageStatusType.DONE);
}
@Modifying
void updateMessageStatus(Bundle bundle, MessageStatusType status);
@Override
@Transactional
public void updateMessageStatus(Bundle bundle, MessageStatusType status) {
QMessage message = new QMessage("m");
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
long execute = queryFactory.update(message).set(message.status, status).where(message.bundle.eq(bundle)).execute();
em.flush();
em.clear();
}
0
안녕하세요 YJJY님^^
제가 직접 정답을 알려드릴 수 도 있지만, 그러면 더 많은 것을 얻어가지 못합니다.
개발자는 궁금한 부분을 직접 코드로 테스트 해볼 때 가장 많이 배울 수 있습니다.
해당 부분을 코드로 직접 테스트해보시고, 그 결과를 공유해주세요. 그러면 함께 공부하는 분들께도 큰 도움이 될거에요.
그럼 테스트 해보시고 결과도 정리해서 공유 부탁드립니다.
감사합니다.
벌크 연산이 기존 로직에 영향을 줄 가능성이 있다면 호출을 해주셔야 합니다.
감사합니다.