리팩토링

  • 타임리프 form태그로 api 요청 하던것을 ajax를 사용하여 api 요청하도록 수정

 

문제 상황

  • 카페가 삭제 되었음에도 s3에 저장된 이미지 파일이 남아있음
  • 카페 삭제 요청시 이벤트 내역이 있는 경우 에러발생, cascade 설정할 경우 미래에 이벤트가 남아있음에도 함께 삭제되는 문제 발생.

 

문제 상황 해결을 위한 세부기능 추가

  • 카페 삭제시 s3에 저장된 파일 삭제
  • 카페 삭제 요청시  data JPA의 StartDateAfter 메소드를 사용하여 금일 날짜 이후에 등록된 이벤트가 있는지 여부를 파악하고 예약된 이벤트 내역이 있는 경우 삭제 불가하도록 분기 처리하였습니다.

 

1. 리팩토링

기존 코드 - 타임리프 form태그로 요청

<form id="delete-form" method="post" th:action="@{'/cafes/' + ${cafe.id}}">-->
	<input name="_method" type="hidden" value="DELETE"/>-->
	<button class="delete-button"-->
		onclick="return confirm(this.getAttribute('data-confirm-delete'))"-->
		th:data-confirm-delete="|정말 삭제하시겠습니까?|">삭제-->
	</button>
</form>

 

수정 코드

# html
<button class="delete-button" th:cafeId="${cafe.id}" th:onclick="deleteCafe(this.getAttribute('cafeId'))">삭제</button>

# js
function deleteCafe(cafeId){
    if(confirm("정말 삭제하시겠습니까?")){
        $.ajax({
            type: "DELETE",
            url: `/cafes/${cafeId}`,
            data: {},
            success: function(response){
                alert(response)
                location.reload(true);
            }
        })
    }
}

 

2. 세부 기능 추가

  • 카페 삭제시 s3에 저장된 파일 삭제
  • 카페 삭제 요청시 예약된 이벤트 내역이 있는 경우 삭제 불가
    @Transactional
    public String removeCafe(Long id) {
        Cafe cafe = cafeRepository.getById(id);
        LocalDate now = LocalDate.now();
        // 이벤트 존재 여부 확인
        Event hasEventAfterNow = eventRepository.findTop1ByCafeIdAndEventStartDateAfter(id, now.toString());

        if (hasEventAfterNow != null) {
            return "이벤트 예약내역이 존재하므로 삭제가 불가능합니다.";
        } else {
            List<CafeImage> cafeImages = cafe.getCafeImages();
            List<String> imageKeys = new ArrayList<>();
            for (CafeImage cafeImage : cafeImages) {
                // 3번째 '/'의 위치를 찾아서 +1 번째 부터 문자열 반환받아 key값으로 사용
                int location = cafeImage.getCafeImageUrl().indexOf("/", 10);
                String imageKey = cafeImage.getCafeImageUrl().substring(location + 1);
                imageKeys.add(imageKey);
            }
            // s3에 저장된 파일들 삭제
            s3Service.deleteImages(imageKeys);

            cafeRepository.deleteById(id);
            return "삭제 성공";
        }
    }

+ Recent posts