수정 API 호출 시 응답의 수정 시간이 제대로 반영되지 않는 문제가 발생했습니다.
update() 메서드를 실행한 후 수정 API를 호출했을 때의 응답에서는 수정일이 갱신되지 않았지만, 이후 조회 API를 호출했을 때는 수정일이 정상적으로 반영된 것을 확인했습니다.
@Transactional
public ScheduleResponseDto update(Long id, ScheduleRequestDto requestDto, LoggedInMemberDto memberDto) {
Schedule findSchedule = scheduleRepository.findByIdOrElseThrow(id);
// 일정 작성자가 로그인된 회원과 일치하는지 확인
if (!findSchedule.getMember().getEmail().equals(memberDto.getEmail())) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "본인이 작성한 일정만 수정할 수 있습니다.");
}
findSchedule.setTitle(requestDto.getTitle());
findSchedule.setContents(requestDto.getContents());
return new ScheduleResponseDto(findSchedule);
}
findSchedule의 setTitle(), setContents()는 JPA의 변경 감지에 의해 변경 사항으로 인식되지만, modifiedAt은 트랜잭션이 종료될 때 업데이트됩니다.
return new ScheduleResponseDto(findSchedule);
트랜잭션 커밋 시 flush가 동작하여 수정된 내용이 DB에 반영됩니다. 그러나 update() 호출 시, 트랜잭션 내에서 커밋이 일어나기 전에 갱신되기 전의 modifiedAt 값이 ScheduleResponseDto 객체로 반환되어 응답에서 modifiedAt 값이 갱신되지 않았습니다.
flush()를 호출하면 트랜잭션 커밋 전에 변경 사항이 즉시 DB에 반영되므로 modifiedAt 값을 최신 상태로 갱신할 수 있습니다.
update() 메서드를 반환하기 전에 entityManager.flush();
로 flush()를 호출하여 변경 사항이 반영되도록 수정하였습니다.
트랜잭션이 종료되기 전에는 변경된 값이 반영되지 않으므로, 커밋 시점을 고려하여 반환되는 값이 최신 상태로 갱신되었는지 확인해야 합니다.