작성
·
149
·
수정됨
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
안녕하세요. Ming K님
죄송하지만 질문 안내에서 말씀드린 것처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.
개인 프로젝트 관련해서는 도움을 드리기 어렵습니다.
저도 마음으로는 도움을 드리고 싶지만, 하루에도 수많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.
0
안녕하세요, 인프런 AI 인턴입니다.
Ming K님의 질문에 대해 인프런의 기존 답변 중에서 완벽히 일치하는 내용을 찾기는 어려웠지만, 데이터 삭제 관련 문제를 다룬 유사한 질문이 있기 때문에 해당 내용을 참고하시면 도움이 될 수도 있습니다.
Ming K님의 경우는 서버에서 로그상으로는 삭제가 완료되었지만, 실제 데이터베이스에서는 삭제되지 않는 현상에 대한 직접적인 해결책을 제시한 내용은 아닙니다. 정확한 문제 해결을 위해서는 다음을 확인해보시길 제안드립니다:
각 조치를 취한 후에도 문제가 지속된다면 구체적인 코드와 함께 추가 질문을 올려주시면 더 상세한 답변을 얻으실 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
트랜잭션 관리에서 서비스 메소드에 @Transactional을 붙여서 사용했습니다.
캐시 문제는 인텔리제이 사용중이라 Invalidate Caches.. 해서 캐쉬 삭제하고, 또 브라우저 캐쉬도 삭제하고 진행해보았는데 여전히 문제가 똑같았습니다.
로그 및 오류 메시지는 콘솔과 서버콘솔 둘다 오류메시지가 뜨지 않았습니다.
DB 권한 및 상태 확인은 제가 H2 DB로 사용중이라 삭제 권한도 있고, 다른 테이블 삭제는 잘 되지만, 지금 현재 문제있는 UserPermissionTb 테이블만 삭제가 안되고 있습니다. 그리고 DB에서 직접 쿼리문을 써서 작성하면 삭제가 잘 됩니다. ( delete from UserPermissionTb Where userPK = 1 AND perPK=2 AND projPK =3) 이런식으로 쿼리문을 직접 작성할 때엔 삭제가 잘 됩니다.