코드로 우주평화

물리삭제와 논리삭제를 코드로 구현해 보았다. 본문

나는 이렇게 학습한다/DB

물리삭제와 논리삭제를 코드로 구현해 보았다.

daco2020 2022. 2. 3. 19:48
반응형

삭제에는 두 가지 방법이 있다.

물리삭제는 실제 데이터베이스에서 제거하는 것이고, 논리삭제는 같은 테이블에 '삭제플레그'의 값을 변경하여 실제 삭제된 것과 동일하게 처리하는 방식이다.(이 외에도 논리삭제의 방법은 다양하다) 

 

 

코드로 구현해 본다면?

깃헙 링크 (깃헙 링크에 들어가면 코드를 모두 볼 수 있다.)

 

@app.route("/snack/<int:id>", methods=["DELETE", "PUT"])
def delete(id):
    if request.method == "DELETE":
        SnackDelete.delete_physics(id)

    elif request.method == "PUT":
        SnackDelete.delete_logical(id)

    result_value = SnackDelete.select_all()

    return jsonify({"remaining_users": result_value}), 200

삭제요청 후 남은 데이터를 반환하는 간단한 API를 만들어 보았다. 

(동일한 URI를 받고 HTTP메서드만 'DELETE'(물리삭제), 'PUT'(논리삭제)으로 구분한다)

 

 

 

현재 데이터베이스에는 다음처럼 11명의 이름 정보가 있다. 

 

 

 

 

 

포스트 맨으로 1번 유저를 물리삭제하는 요청을 보내보겠다. 

 

 

 

 

데이터베이스를 확인해보니 id 1번이 물리적으로 삭제된 것을 볼 수 있다.

 

 

 

 

코드 반환 값에서도 1번 유저는 보이지 않는다.

더보기
{
    "remaining_users": [
        {
            "id": 2,
            "name": "장득현"
        },
        {
            "id": 3,
            "name": "변덕순"
        },
        {
            "id": 4,
            "name": "도태준"
        },
        {
            "id": 5,
            "name": "박정현"
        },
        {
            "id": 6,
            "name": "성종호"
        },
        {
            "id": 7,
            "name": "박진성"
        },
        {
            "id": 8,
            "name": "제갈창민"
        },
        {
            "id": 9,
            "name": "장도원"
        },
        {
            "id": 10,
            "name": "고민혁"
        },
        {
            "id": 11,
            "name": "김은혜"
        }
    ]
}

 

 

 

 

이제 메서드를 PUT으로 바꾸어 2번 유저를 논리삭제 해보자!

 

 

 

 

테이블에서 데이터가 지워진 것이 아닌 'is_del'이라는 열의 값이 0에서 1로 변한 것을 볼 수 있다.

 

 

 

 

그렇다면 요청에 대한 반환 값은 어떨까?

물리삭제와 마찬가지로 논리삭제를 요청한 2번 유저 또한 반환되지 않는다.

즉, 실제 데이터는 지워지지 않았지만 해당 데이터를 '삭제한 것으로 간주'하는 것이다.

더보기
{
    "remaining_users": [
        {
            "id": 3,
            "name": "변덕순"
        },
        {
            "id": 4,
            "name": "도태준"
        },
        {
            "id": 5,
            "name": "박정현"
        },
        {
            "id": 6,
            "name": "성종호"
        },
        {
            "id": 7,
            "name": "박진성"
        },
        {
            "id": 8,
            "name": "제갈창민"
        },
        {
            "id": 9,
            "name": "장도원"
        },
        {
            "id": 10,
            "name": "고민혁"
        },
        {
            "id": 11,
            "name": "김은혜"
        }
    ]
}

 

 

 

 

 

왜 논리삭제가 필요한가?

논리삭제는 실제 데이터를 삭제하지 않기 때문에 나중에 복원할 수 있다는 장점이 있다. 예를들어 휴면계정을 다시 복원할 경우, 삭제처리되어있던 유저 정보를 되살려야 한다. 이때 사용하는 것이 논리삭제라고 볼 수 있다. 

 

반면 단점도 있다. 논리삭제는 데이터를 그대로 보관해두는 것이기 때문에 데이터의 양이 많아지면 이에 대한 유지비용이 계속해서 누적된다.

 

 

 

상황에 따라 선택하자

어떤 방법이 좋아보인다고 항상 그 방법만을 고수해야 하는 것은 아니다. 각각 삭제 방법에 따른 장단점이 있으므로 상황과 목적에 맞게 선택하여 적용해야 한다.

 

 

 

 


 

 

 

레퍼런스

SQL첫걸음

 

반응형