포스트

MySQL 물리삭제와 논리삭제

한 3달전쯤에 백기선님 라이브방송에서 다른 분이 만든 API를 코드 리뷰하던 도중 CRUD 얘기가 나왔었다. 이때 어느 한 시청자분이 다음과 같이 채팅을 남기셨다.

시청자 A : 실제로 현업에선 CRUD보단 CRU만 사용하지 않나요?

이에 백기선님도 어느 정도 동의 하셨던 것 같았다. 과연 CRUD를 안 쓰고 CRU만 쓴다는 건 무슨 뜻이며, 어떤 의미가 있을까?

CRUD

CRUD는 Create, Read, Update, Delete의 줄임말이다(위키피디아). 흔히들 REST API를 만들면서 보았을 것이다. 게시판 기능을 만든다면, 글 생성은 Create에 해당하고, 글 조회는 Read, 글 수정은 Update, 글 삭제는 Delete에 해당 할 것이다. 흔히들 하나의 API를 만들때 CRUD를 모두 구현하곤 한다.

하지만 시청자분이 말씀하신 CRU는 무엇을 의미한 것일까?

CRU

CRU는 원래 사전에 있는 단어는 아니다. 단순히 아까 말했던 Create, Read, Update, Delete에서 Delete를 제외하고 부른 것이다.
그 말인즉슨… 삭제 기능은 만들지 않는다는 것인가?라고 생각할 수 있다. 하지만 그건 아니다.
다음 챕터에서 확인해 보자.

물리삭제 VS 논리삭제

물리삭제

물리삭제는 말 그대로 물리적으로 삭제하는 것이다. 즉 진짜 삭제한다는 의미인 것이다.

게시물ID제목내용작성자ID작성자이름작성일시조회수좋아요수
1첫 번째 게시물이 게시물은 첫 번째 게시물입니다.101홍길동2023-09-13 10:00:0025032
2두 번째 게시물두 번째 게시물의 내용입니다.102김철수2023-09-13 10:10:0013015
3새로운 게시물이 게시물은 최근에 작성된 게시물입니다.103이영희2023-09-13 10:20:009820
4인기 있는 게시물많은 사람들이 좋아하는 게시물입니다.104박철영2023-09-13 10:30:00750120
5마지막 게시물이 게시물은 마지막 게시물입니다.105정민지2023-09-13 10:40:00638

만약에 이런 게시판 테이블 이 있다고 가정해 보자.
첫번째 게시물을 물리삭제로 삭제한다고 하면,

게시물ID제목내용작성자ID작성자이름작성일시조회수좋아요수
2두 번째 게시물두 번째 게시물의 내용입니다.102김철수2023-09-13 10:10:0013015
3새로운 게시물이 게시물은 최근에 작성된 게시물입니다.103이영희2023-09-13 10:20:009820
4인기 있는 게시물많은 사람들이 좋아하는 게시물입니다.104박철영2023-09-13 10:30:00750120
5마지막 게시물이 게시물은 마지막 게시물입니다.105정민지2023-09-13 10:40:00638

이런식으로 정말 삭제하게 된다.

논리삭제

논리삭제는 말 그대로 논리적으로 삭제한다는 것이다. 논리삭제를 하기 위해선 여러가지 방법이 있겠지만, 제일 대표적인 방법으로는 별도의 삭제여부 칼럼을 두는 것이다.

게시물ID제목내용작성자ID작성자이름작성일시조회수좋아요수삭제여부
1첫 번째 게시물이 게시물은 첫 번째 게시물입니다.101홍길동2023-09-13 10:00:0025032false
2두 번째 게시물두 번째 게시물의 내용입니다.102김철수2023-09-13 10:10:0013015false
3새로운 게시물이 게시물은 최근에 작성된 게시물입니다.103이영희2023-09-13 10:20:009820false
4인기 있는 게시물많은 사람들이 좋아하는 게시물입니다.104박철영2023-09-13 10:30:00750120false
5마지막 게시물이 게시물은 마지막 게시물입니다.105정민지2023-09-13 10:40:00638false

이전 예시와 달리, 별도의 ‘삭제 여부’라는 이름의 칼럼이 생겼다.
만약 첫 번째 게시물을 논리 삭제로 삭제한다고 하면,

게시물ID제목내용작성자ID작성자이름작성일시조회수좋아요수삭제여부
1첫 번째 게시물이 게시물은 첫 번째 게시물입니다.101홍길동2023-09-13 10:00:0025032true
2두 번째 게시물두 번째 게시물의 내용입니다.102김철수2023-09-13 10:10:0013015false
3새로운 게시물이 게시물은 최근에 작성된 게시물입니다.103이영희2023-09-13 10:20:009820false
4인기 있는 게시물많은 사람들이 좋아하는 게시물입니다.104박철영2023-09-13 10:30:00750120false
5마지막 게시물이 게시물은 마지막 게시물입니다.105정민지2023-09-13 10:40:00638false

이런 식으로 첫 번째 게시물 삭제 여부가 true로 변경되며 삭제되게 된다.
여기서 주의해야 될 점은 삭제된 게시물을 조회하지 않기 위해서, 매번 조회할 때마다 삭제 여부 = false과 같은 where 절을 추가하여야 한다.

  • SQL 쿼리 기준 WHERE is_deleted = false 추가
    1
    
    SELECT * FROM board WHERE writer_id = 블라블라 AND is_deleted = false
    
  • JPA 엔티티 기준 클래스 상위에 @Where() 어노테이션을 추가하면 된다.
    1
    2
    3
    4
    5
    6
    
    @Entity  
    @Table(name = "save")  
    @Where(clause = "is_removed = 0") // 이렇게 !!
    public class Member extends BaseTimeEntity {
      // ....... 생략
    }
    

정리

만약, 자사에 회원 탈퇴를 해도 정산 기록은 3년간 보존되어야 한다는 개인정보처리 방침이 존재한다면 논리 삭제를 사용해야 할 것이다. 결국 3년 이후엔 삭제를 해야 하기 때문에, 별도의 배치를 추가적으로 만들어야 할 것이다.
또한 3년 전까진 계속 데이터를 가지고 있어야 하기에 DB 사용 용량이 증가한다.

간단한 사이드 프로젝트라면 밑도 끝도 없이 물리삭제를 사용해도 되겠지만,
여러 이해관계가 얽힌 복잡한 프로젝트라면 논리삭제를 사용해야 할 것이다.

감히 예상을 해보자면, 기업들은 자료 보존, 수사 협조 등의 이유로 데이터를 곧장 지우지 않을 것이다. 그래서 현업에서는 CRUD보단 CRU를 주로 개발하고 있다고 하는 듯하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Comments powered by Disqus.