실수로 프로덕션 데이터베이스의 전체 데이터 세트를 지웠습니다. 다음은 다음과 같습니다.

직장에서 일어난 비극적인 사고 중 하나는 최근에 저에게 좋은 교훈이 되었습니다. 예, 실수로 프로덕션 데이터베이스의 전체 데이터 세트를 지웠습니다.

전에 세부 사항에 들어가기 전에. 제 자신에 대해 조금 말씀드리자면 저는 React, Nodejs를 전문으로 하는 풀스택 엔지니어입니다. 프로덕션에서 Nodejs, Postgres를 사용하는 스타트업에서 일하고 있습니다.

최근에 저는 데이터베이스 테이블을 업데이트하는 API에서 작업하고 있었습니다. 테이블은 이런 구조를 가지고 있습니다

module.exports = (sequelize, Sequelize) => {
    const User = sequelize.define("user", {
      name: {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING
      },
      data : Sequelize.JSON,
    });

    return User;
  };


여기서 주목해야 할 중요한 사항은 JSON 구조에 있는 data입니다. 내가 빌드한 API는 테이블의 데이터 개체를 업데이트해야 합니다.

예를 들어 GET 요청에 대한 데이터 구조는 다음과 같습니다.



여기에는 data , phone , addresscountry 와 같은 필드가 있는 JSON 구조의 postal code가 포함됩니다.

그래서 데이터 내부에 전화번호를 변경하는 API를 작성해야 합니다. 나는 그것이하기 쉬운 일이라고 생각했고 몇 단계 만에 그렇게했습니다.

app.post('/phone-number/update/:id',async (req,res) => {
    try {
        const id = req.params.id;
        const phonenumber = req.body.phonenumber

        const user = await User.update({ "data.phone" : phonenumber  },{
            where : {
                id
            }
        })

        res.status(200).json(user)
    }
    catch(e){
        res.status(500).json(null)
    }   
})


데이터 개체 내부의 전화 번호를 업데이트합니다. 지금까지 모든 것이 좋아 보입니다. 그 후 업데이트된 전화번호가 DB에 저장되는 시나리오를 커버하기 위해 테스트 케이스를 작성했고 통과했습니다.

지금까지는 모든 것이 좋아 보입니다. 그래서 제작에 들어갔습니다. 나는 프로덕션에서 일어날 재난을 깨닫지 못했습니다. 나는 내 집에 있었다.



다음은 프로덕션에서 발생한 일입니다. API는 JSON 데이터를 완전히 지우고 phone number 로 대체했습니다. 나는 이것을 보고 충격을 받았고,

예를 들어 API 전후의 데이터는 다음과 같습니다.



API 업데이트 후,



그런 다음 JSON의 postgres 업데이트가 이와 같이 작동해서는 안된다는 것을 깨달았습니다. 운 좋게도 이것이 발생하기 전에 데이터베이스가 백업되었습니다. 그래서 데이터베이스 데이터를 롤백하고 이 API의 기능을 주석 처리했습니다.

하지만 제 CTO가 이 문제를 지적하고 이 문제를 해결하는 데 도움을 주었습니다. 그동안 API 기능을 수정하는 다른 방법을 찾았습니다. 그것은 다음과 같을 것입니다.

app.post('/phone-number/update/:id',async (req,res) => {
    try {
        const id = req.params.id;
        const phonenumber = req.body.phonenumber

        let user = await User.findOne({ id })

        user.data = { ...user.data,phone : phonenumber }
        await user.save()

        res.status(200).json(user)
    }
    catch(e){
        res.status(500).json(null)
    }   
})


나는 그것이 효과적인 해결책처럼 보이지 않는다는 것을 압니다. 하지만 그 순간에 배포되어야 하는 작업 솔루션을 원했습니다. 시나리오를 커버하기 위해 테스트 케이스를 빠르게 작성하고 PR을 올렸습니다. CTO가 직접 이 코드를 살펴보고 검토한 후 피드백을 주었습니다. 마침내 그날 패치가 프로덕션에 병합되었습니다.



작고 어리석은 문제처럼 보일 수 있습니다. 그러나 전체 데이터 세트를 지울 가능성이 있습니다. 이 사건에 대해 걱정하는 대신. 나는 그것을 나에게 좋은 배움으로 받아들였다. 그들은,
  • 상황을 커버하기 위해 테스트 케이스를 작성하더라도. 상황을 수동으로 테스트할 수 있다면 항상 한 단계 더 나아집니다.
  • 코드가 프로덕션 서버를 중단하더라도 스트레스를 받지 마십시오. 나는 그것이 일어나서는 안된다는 것을 압니다. 최악의 경우에는 그럴 것입니다. 따라서 이를 학습 곡선으로 삼고 앞으로는 그러한 실수를 피하십시오.
  • 이런 일들이 생기겠지만 그때그때 옆에서 도와주는 동료나 선배들이 있으면 많은 도움이 된다. 그것은 우리의 경력에 ​​따라옵니다.

  • 이 실제 경험에서 무언가를 배웠기를 바랍니다. 같은 상황을 겪지 않고도 그 경험을 얻을 수 있도록 제 경험을 공유하고 싶었습니다. 우리는 또 다른 실시간 경험에서 보게 될 것입니다. 그때까지 해피코딩 :-)

    좋은 웹페이지 즐겨찾기