인프런 커뮤니티 질문&답변

Ming K님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

DB에서 데이터가 삭제되지 않습니다.

24.07.24 15:58 작성

·

120

·

수정됨

0

안녕하세요 강사님. 강사님의 강의를 들으면서 혼자 프로젝트를 진행 중인데 혹시 이런 에러상황도 있을 수 있는지 여쭤보고 싶어서 질문남깁니다.

 

웹 사이트에서 특정 데이터 값을 삭제를 진행했고, 서버에서도 삭제가 잘 되었다는 로그와 함께 에러없이 삭제 완료되었는데, DB에서 그 값을 검색하면 그대로 남아있는 경우엔 어떻게 해결해야할까요?

 

삭제를 할때, 테이블의 PK값으로 해당 데이터를 삭제하는 것이 아니고 레코드의 PK말고 다른 값들을 찾아서 그 값이 있으면 데이터를 삭제하라고 로직을 짰거든요.

그리고 처음에 기능을 완료했을땐, 잘 삭제가 되었는데 나중에 다시 테스트 진행하니 갑자기 DB에서 삭제가 되지않고 있습니다.

 

// 권한 거부 확인 버튼 클릭 이벤트 핸들러
$(document).on('click', '#confirmRevokePermissionButton', function() {
    const selectedPermission = $('#permissionSelect').val();
    const selectedUsers = $('.user-checkbox:checked').map(function() {
        return $(this).val();
    }).get();
    const projPK = $('#projectSettingForm').data('proj-pk');

    if (selectedPermission && selectedUsers.length > 0) {
        $.ajax({
            url: `/projMgmt/setting/${projPK}/revokePermission`,
            type: 'DELETE',
            data: JSON.stringify({ userPKs: selectedUsers, perPK: selectedPermission }),
            contentType: 'application/json',
            success: function(response) {
                Swal.fire({
                    icon: 'success',
                    title: '권한 삭제 완료',
                    text: '권한이 성공적으로 삭제되었습니다.',
                    confirmButtonText: '확인'
                }).then((result) => {
                    if (result.isConfirmed) {
                        loadSetting(projPK);
                        $('#permissionModal').modal('hide');
                    }
                });
            },
            error: function(xhr, status, error) {
                let errorMessage = '권한 삭제 중 오류가 발생했습니다.<br>';
                if (xhr.responseText) {
                    errorMessage += xhr.responseText;
                }
                Swal.fire({
                    icon: 'error',
                    title: '권한 삭제 실패',
                    html: errorMessage,
                    confirmButtonText: '확인'
                });
            }
        });
    } else {
        Swal.fire({
            icon: 'warning',
            title: '선택 없음',
            text: '권한을 선택해주세요.',
            confirmButtonText: '확인'
        });
    }
});

이렇게 서버로 코드를 보내고 있고,

@DeleteMapping("/setting/{projPK}/revokePermission")
@ResponseBody
public ResponseEntity<String> revokePermissions(@PathVariable Long projPK, @RequestBody Map<String, Object> requestBody) {
    try {
        List<Long> userPKs = ((List<?>) requestBody.get("userPKs")).stream()
                .map(Object::toString)
                .map(Long::valueOf)
                .toList();

        Long perPK = Long.valueOf(requestBody.get("perPK").toString());

        for (Long userPK : userPKs) {
            log.info("revokePermission projPK: {}, userPK: {}, perPK: {}", projPK, userPK, perPK);
            userPermissionService.revokePermission(projPK, userPK, perPK);
        }

        return ResponseEntity.ok("권한 거부 완료");
    } catch (IllegalStateException e) {
        return ResponseEntity.status(HttpStatus.CONFLICT).body(e.getMessage());
    } catch (Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("권한 거부 중 오류가 발생했습니다: " + e.getMessage());
    }
}

서버에서 값을 받으면

@Override
@Transactional
public void revokePermission(Long userPK, Long projPK, Long perPK) {
    List<UserPermission> userPermissions = userPermissionRepository.findByUser_UserPKAndProject_ProjPKAndPermission_PerPK(userPK, projPK, perPK);
    if (userPermissions.isEmpty()) {
        throw new IllegalStateException("해당 사용자는 부여된 권한이 없습니다.");
    }
    userPermissionRepository.deleteAll(userPermissions);
    log.info("Deleted permissions for userPK: {}, projPK: {}, perPK: {}", userPK, projPK, perPK);
}

보내진 값을 확인하고 값이 있으면 그 값을 삭제하고 값이 없으면 에러 메시지를 발송되게 해놨습니다.

 

추가로 작성하자면, 체크된 사용자를 권한삭제 버튼을 클릭했을 때

권한선택창이 뜨고 수정 권한 삭제를 클릭하면, 완료되었다는 알림창이 뜨고 서버쪽에서는

이렇게 로그가 발송되지만, DB에 찾아보면 여전히 값이 남아있는 것이 확인이 됩니다.

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

2024. 07. 26. 14:58

안녕하세요. Ming K님

죄송하지만 질문 안내에서 말씀드린 것처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.

개인 프로젝트 관련해서는 도움을 드리기 어렵습니다.

저도 마음으로는 도움을 드리고 싶지만, 하루에도 수많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 24. 16:02

안녕하세요, 인프런 AI 인턴입니다.

Ming K님의 질문에 대해 인프런의 기존 답변 중에서 완벽히 일치하는 내용을 찾기는 어려웠지만, 데이터 삭제 관련 문제를 다룬 유사한 질문이 있기 때문에 해당 내용을 참고하시면 도움이 될 수도 있습니다.

  • 상품관리 삭제 구현을 해봤는데 잘 안 되서 질문드립니다.에서는 Spring MVC를 사용하여 데이터 삭제 구현에 관한 문제를 다루고 있습니다. 이 답변은 특정 데이터를 삭제할 때 HTTP 메서드 타입이 잘못 지정되어 발생한 문제 해결 방법에 대해 논하고 있습니다. (상품관리 삭제 구현에 관한 질문 가기)

Ming K님의 경우는 서버에서 로그상으로는 삭제가 완료되었지만, 실제 데이터베이스에서는 삭제되지 않는 현상에 대한 직접적인 해결책을 제시한 내용은 아닙니다. 정확한 문제 해결을 위해서는 다음을 확인해보시길 제안드립니다:

  1. 트랜잭션 관리: 삭제 로직이 제대로 트랜잭션 관리되고 있는지 확인하세요. 트랜잭션이 제대로 커밋되지 않으면 데이터베이스 상태가 변경되지 않습니다.
  2. 캐시 문제: JPA 등 ORM 사용 시, 캐시가 관련된 문제를 발생시킬 수 있습니다. 예를 들어, 캐시에는 삭제가 반영되었지만 실제 데이터베이스에서는 반영되지 않은 경우입니다. 이럴 때는 캐시 정책을 확인하고 적절히 관리해야 합니다.
  3. 로그 및 오류 메시지: 삭제 과정에서 발생한 SQL 쿼리와, 에러 로그를 상세히 검펴보세요. 종종 로그에서 문제의 원인을 찾을 수 있습니다.
  4. DB 권한 및 상태 확인: DB 자체에서 삭제 권한이 없거나, 어떤 이유로 해당 레코드가 삭제되지 않는 상황이 있는지 확인해보세요.
  5. 실제 적용된 로직 검토: 말씀하신 ‘다른 값들을 찾아서 삭제하라’는 로직이 데이터베이스에 정확히 적용되었는지 코드 리뷰를 통해 확인해보세요.

각 조치를 취한 후에도 문제가 지속된다면 구체적인 코드와 함께 추가 질문을 올려주시면 더 상세한 답변을 얻으실 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Ming K님의 프로필 이미지
Ming K
질문자

2024. 07. 24. 16:07

  1. 트랜잭션 관리에서 서비스 메소드에 @Transactional을 붙여서 사용했습니다.

  2. 캐시 문제는 인텔리제이 사용중이라 Invalidate Caches.. 해서 캐쉬 삭제하고, 또 브라우저 캐쉬도 삭제하고 진행해보았는데 여전히 문제가 똑같았습니다.

  3. 로그 및 오류 메시지는 콘솔과 서버콘솔 둘다 오류메시지가 뜨지 않았습니다.

  4. DB 권한 및 상태 확인은 제가 H2 DB로 사용중이라 삭제 권한도 있고, 다른 테이블 삭제는 잘 되지만, 지금 현재 문제있는 UserPermissionTb 테이블만 삭제가 안되고 있습니다. 그리고 DB에서 직접 쿼리문을 써서 작성하면 삭제가 잘 됩니다. ( delete from UserPermissionTb Where userPK = 1 AND perPK=2 AND projPK =3) 이런식으로 쿼리문을 직접 작성할 때엔 삭제가 잘 됩니다.

Ming K님의 프로필 이미지

작성한 질문수

질문하기