[TIL-CH3] 일정 관리 Develop 과제 트러블슈팅

김유란·2025년 2월 12일

CH 3 일정 관리 Develop 과제 트러블슈팅🚨


1️⃣ update 후 수정 시간이 응답에 반영되지 않는 문제

💡 배경

수정 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()를 호출하여 변경 사항이 반영되도록 수정하였습니다.

📌 결말

트랜잭션이 종료되기 전에는 변경된 값이 반영되지 않으므로, 커밋 시점을 고려하여 반환되는 값이 최신 상태로 갱신되었는지 확인해야 합니다.

0개의 댓글