{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/about-change-data","result":{"data":{"markdownRemark":{"id":"a68ee651-a21a-58fe-b4f4-3f6bbd13dd4b","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 960px;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/994afe2c71a749e5eab38cc459f4baac/b89a9/fail-db.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAGt2XWHrCyk/wD/xAAaEAACAwEBAAAAAAAAAAAAAAAAAgEDESIj/9oACAEBAAEFAr2SSt8Yj0lF6w//xAAWEQADAAAAAAAAAAAAAAAAAAABEFH/2gAIAQMBAT8BMX//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAgEBPwEn/8QAHhAAAQIHAQAAAAAAAAAAAAAAAQAQAhETMTJBUZH/2gAIAQEABj8ChB2qZ9YT6r5Fv//EABoQAAMBAAMAAAAAAAAAAAAAAAERIQAQUXH/2gAIAQEAAT8hEUugsUQCZOCdPCOeTKj3vf/aAAwDAQACAAMAAAAQXN//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAEf//EABURAQEAAAAAAAAAAAAAAAAAABBR/9oACAECAQE/EKP/xAAeEAEAAgIBBQAAAAAAAAAAAAABABEhUTFBYXGh8P/aAAgBAQABPxDAFwy0fqhCAp0muTyalxChG5UI79TJlYwMVXGmdlDU/9k='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/994afe2c71a749e5eab38cc459f4baac/8ac56/fail-db.webp 240w,\n/static/994afe2c71a749e5eab38cc459f4baac/d3be9/fail-db.webp 480w,\n/static/994afe2c71a749e5eab38cc459f4baac/e46b2/fail-db.webp 960w,\n/static/994afe2c71a749e5eab38cc459f4baac/f992d/fail-db.webp 1440w,\n/static/994afe2c71a749e5eab38cc459f4baac/882b9/fail-db.webp 1920w\"\n          sizes=\"(max-width: 960px) 100vw, 960px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/994afe2c71a749e5eab38cc459f4baac/5a194/fail-db.jpg 240w,\n/static/994afe2c71a749e5eab38cc459f4baac/8a430/fail-db.jpg 480w,\n/static/994afe2c71a749e5eab38cc459f4baac/0781d/fail-db.jpg 960w,\n/static/994afe2c71a749e5eab38cc459f4baac/e5be1/fail-db.jpg 1440w,\n/static/994afe2c71a749e5eab38cc459f4baac/b89a9/fail-db.jpg 1920w\"\n          sizes=\"(max-width: 960px) 100vw, 960px\"\n          type=\"image/jpeg\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/994afe2c71a749e5eab38cc459f4baac/0781d/fail-db.jpg\"\n          alt=\"schema\"\n          title=\"schema\"\n          loading=\"lazy\"\n          style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        />\n      </picture>\n  </a>\n    </span></p>\n<hr>\n<p>근래 들어, 일하면서 특정 조건에 해당하는 고객데이터를 수정할 일이 많았다. DB 데이터를 변경하게 되는 UPDATE/DELETE 쿼리 문은 사용할 때 항상 조심스럽다. 트랜잭션을 마친 데이터는 DB에서의 복구가 불가능하며, 백업본으로 복구하는 것 밖에는 방법이 없기 때문이다. (백업본마저 없다면 애도를 표한다 …) </p>\n<p>따라서 여러 개의 데이터를 변경할 경우에는, 잘못된 변경에 대한 복구가 가능하도록 보험을 들어놓고 시도하는 것이 안전하다. 아래는 데이터를 잘못 변경하더라도 복구할 수 있는 보편적인 방법들이다. </p>\n<ol>\n<li>DB 백업</li>\n<li>트랜잭션</li>\n</ol>\n<hr>\n<p>나는 백업과 트랜잭션을 조합해서 다음과 같이 사용한다.</p>\n<ol>\n<li>(테스트 DB에서) <strong>트랜잭션</strong>을 이용해, UPDATE/DELETE 쿼리문을 실행하고 롤백해보면서 개발한다.</li>\n<li>\n<p>(라이브 DB 반영시) 라이브 DB <strong>스냅샷 떠서 백업본을 만들고</strong>, <strong>트랜잭션</strong>을 거쳐 업데이트를 실행한다.</p>\n<ul>\n<li>\n<p>업데이트 결과가 적절한지 확인한다.</p>\n<ul>\n<li>affected rows를 체크</li>\n<li>SELECT 문을 실행하여 해당 데이터들이 의도한데로 수정된지 확인 후 COMMIT</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>라이브 배포</li>\n</ol>\n<hr>\n<p>지금까지 DB 데이터를 안전하게 변경하는 방법에 대해서 알아보았다. 백업과 트랜잭션을 사용하는 방법에 대한 내용은 다음 글에서 다룰 예정이다. </p>","fields":{"slug":"/posts/about-change-data","tagSlugs":["/tag/think/","/tag/backend/"]},"frontmatter":{"date":"2020-03-22T10:00:00.169Z","description":null,"tags":["think","backend"],"title":"DB 데이터를 변경할 때 사용하는 보험들 (UPDATE, DELETE)","socialImage":"/media/fail-db.jpg"}}},"pageContext":{"slug":"/posts/about-change-data"}}}