라벨이 업무자동화인 게시물 표시

[연구 자동화 #37] 소중한 실험 데이터를 지키는 최후의 보루: 파이썬 DB 백업 및 복구 자동화

연구실에서 가장 등골이 오싹해지는 순간이 언제일까요? 아마 어제까지 멀쩡히 돌아가던 분석 프로그램이 "Database file is corrupted"라는 에러를 내뱉거나, 실수로 DROP TABLE 명령어를 날려 지난 몇 달간의 실험 기록이 증발했다는 사실을 깨달았을 때일 것입니다. 저 역시 석사 과정 시절, 외장 하드 전원을 잘못 뽑아 수천 장의 분석 이미지가 담긴 DB를 통째로 날리고 꼬박 사흘을 밤새워 복구했던 아픈 기억이 있습니다. 자동화의 핵심은 단순히 일을 빨리 처리하는 것에 그치지 않습니다. 예상치 못한 재난 상황에서도 내 연구 성과를 안전하게 지켜내는 '복원력'을 갖추는 것이 진정한 자동화의 완성입니다. 오늘은 파이썬의 표준 라이브러리만을 활용해, 매일 정해진 시간에 DB를 백업하고 필요할 때 즉시 복구하는 시스템을 구축해 보겠습니다. 1. 왜 연구용 DB는 '자동' 백업이 필수인가? 우리는 흔히 "중요한 파일이니까 수동으로 자주 복사해둬야지"라고 생각합니다. 하지만 연구에 몰입하다 보면 백업은 늘 우선순위에서 밀리기 마련입니다. 특히 데이터가 실시간으로 쌓이는 자동화 시스템에서는 백업 시점을 놓치면 수 시간 분량의 귀한 실험 수치를 잃게 됩니다. SQLite는 파일 하나로 구성되어 있어 백업이 매우 쉽지만, 반대로 그 파일 하나가 손상되면 모든 데이터를 잃는다는 위험도 큽니다. 따라서 사람이 직접 복사하는 것이 아니라, 파이썬 스크립트가 알아서 날짜와 시간을 붙여 복사본을 만들어두는 시스템이 반드시 필요합니다. 2. 파이썬 shutil을 활용한 초간단 백업 스크립트 파이썬에는 파일을 복사하는 데 최적화된 shutil 라이브러리가 있습니다. 이를 활용하면 단 몇 줄의 코드로 완벽한 백업 파일을 생성할 수 있습니다. 단순히 복사만 하는 것이 아니라, 파일명에 현재 날짜와 시간을 포함해 언제 만든 백업인지 한눈에 알 수 있게 하는 것이 핵심입니다. Python import shu...

[연구 자동화 #36] 수만 개의 데이터를 단 한 줄로: SQL 집계 함수로 통계 요약하기

연구 데이터가 쌓이다 보면 가장 먼저 마주하는 벽은 '전체적인 흐름 파악'입니다. 엑셀 파일에 센서 데이터가 10만 줄 정도 쌓여 있다고 가정해 봅시다. 이 데이터들의 전체 평균 온도를 구하거나, 실험이 총 몇 번 성공했는지 확인하려고 엑셀을 켜면 일단 로딩 속도부터 우리를 지치게 합니다. 저 역시 예전에는 데이터가 너무 많아 엑셀이 응답 없음 상태가 되면, 컴퓨터를 원망하며 커피를 마시러 가곤 했습니다. 하지만 데이터베이스(DB)의 집계 함수(Aggregate Functions)를 알게 된 뒤로는 그런 기다림이 사라졌습니다. 파이썬으로 모든 데이터를 불러와서 계산할 필요도 없습니다. DB에게 "이 데이터들의 평균 좀 내줘"라고 말만 하면, DB가 내부적으로 계산을 끝내고 결과값 딱 하나만 보내주기 때문입니다. 1. 연구자가 가장 많이 쓰는 5대 집계 함수 SQL에는 복잡한 수학 공식 대신, 누구나 직관적으로 알 수 있는 단어들로 구성된 함수들이 있습니다. COUNT: 데이터가 총 몇 개인지 세어줍니다. (예: 총 실험 횟수) AVG: 수치 데이터의 평균을 구합니다. (예: 평균 전압 수치) SUM: 데이터의 합계를 구합니다. (예: 총 약물 투여량) MAX / MIN: 최댓값과 최최솟값을 찾습니다. (예: 실험 중 최고 온도) 이 함수들의 가장 큰 매력은 속도입니다. 수백만 건의 데이터가 들어있어도 집계 함수를 사용하면 거의 실시간으로 답을 얻을 수 있습니다. 이는 우리가 파이썬 루프를 돌려 직접 계산하는 것보다 훨씬 효율적입니다. 2. 주의해야 할 '함정': NULL 값의 처리 여기서 제가 처음 공부할 때 당황했던 포인트가 하나 있습니다. 바로 '데이터가 비어있는 경우(NULL)'입니다. 예를 들어, COUNT(*) 는 데이터가 비어있든 말든 전체 행의 개수를 세지만, COUNT(column_name) 은 해당 열에 값이 있는 것만 골라 셉니다. 만약 센서 고장으로 온도가 기록되지 않은 행...