🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

타임 트래블과 데이터 버전 관리 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 12. · 12 Views

타임 트래블과 데이터 버전 관리 완벽 가이드

Delta Lake의 타임 트래블 기능을 활용하여 데이터의 과거 버전을 조회하고 복원하는 방법을 배웁니다. 데이터 감사, 변경 이력 추적, 롤백 전략까지 실무에서 바로 활용할 수 있는 핵심 개념을 다룹니다.


목차

  1. 타임_트래블_개념과_활용_사례
  2. 버전_번호로_과거_데이터_조회
  3. 타임스탬프로_특정_시점_조회
  4. RESTORE_명령으로_롤백하기
  5. 데이터_감사와_변경_이력_추적
  6. 버전_보존_정책_설정

1. 타임 트래블 개념과 활용 사례

어느 날 데이터 엔지니어 김개발 씨는 새벽에 긴급 전화를 받았습니다. "어제 저녁에 업데이트한 데이터가 잘못됐어요.

이전 상태로 되돌릴 수 있나요?" 당황한 김개발 씨는 백업 파일을 찾기 시작했지만, 막막하기만 했습니다.

타임 트래블은 데이터의 과거 버전을 조회하고 복원할 수 있는 기능입니다. 마치 타임머신을 타고 과거로 돌아가듯이, 데이터 테이블의 이전 상태를 자유롭게 확인할 수 있습니다.

Delta Lake는 모든 변경 사항을 자동으로 기록하여 언제든 원하는 시점의 데이터로 되돌릴 수 있습니다.

다음 코드를 살펴봅시다.

from pyspark.sql import SparkSession

# Delta 테이블 생성
spark = SparkSession.builder.appName("TimeTravel").getOrCreate()

# 초기 데이터 작성
data = [(1, "김철수", 5000), (2, "이영희", 6000)]
df = spark.createDataFrame(data, ["id", "name", "salary"])
df.write.format("delta").mode("overwrite").save("/data/employees")

# 데이터 업데이트
update_data = [(1, "김철수", 5500), (2, "이영희", 6500)]
update_df = spark.createDataFrame(update_data, ["id", "name", "salary"])
# 새로운 버전이 생성됩니다
update_df.write.format("delta").mode("overwrite").save("/data/employees")

김개발 씨는 3년 차 데이터 엔지니어입니다. 회사의 핵심 데이터 파이프라인을 관리하고 있죠.

어느 금요일 저녁, 정기 배치 작업을 실행한 후 퇴근했습니다. 주말을 즐기고 있던 김개발 씨에게 월요일 아침 팀장님으로부터 급한 연락이 왔습니다.

"김 대리, 금요일에 업데이트된 매출 데이터가 이상해요. 고객사에서 숫자가 맞지 않는다고 연락이 왔어요." 심장이 철렁 내려앉았습니다.

데이터를 잘못 업데이트한 걸까요? 이전 상태로 되돌려야 하는데, 백업은 어디에 있었던가요?

그렇다면 타임 트래블이란 정확히 무엇일까요? 쉽게 비유하자면, 타임 트래블은 마치 문서 편집 프로그램의 실행 취소 기능과 같습니다.

워드 프로세서에서 문서를 작성하다가 실수했을 때 Ctrl+Z를 누르면 이전 상태로 돌아가죠. 하지만 더 강력한 점은, 단순히 한 단계 전으로만 가는 것이 아니라 원하는 시점으로 자유롭게 이동할 수 있다는 것입니다.

타임 트래블도 마찬가지로 데이터 테이블의 모든 변경 이력을 추적하여 원하는 과거 시점의 데이터를 조회할 수 있습니다. 타임 트래블이 없던 시절에는 어땠을까요?

전통적인 데이터 웨어하우스에서는 데이터를 변경할 때마다 별도로 백업을 만들어야 했습니다. "employees_20250101.parquet", "employees_20250102.parquet" 이런 식으로 날짜별 파일을 관리했죠.

문제는 백업을 언제 만들어야 하는지 결정하기가 어렵다는 점이었습니다. 매시간?

매일? 너무 자주 하면 스토리지 비용이 급증하고, 너무 가끔 하면 중요한 시점을 놓치게 됩니다.

더 큰 문제는 실수로 데이터를 삭제하거나 잘못 업데이트했을 때였습니다. 백업 파일을 찾아서 복원하는 과정이 복잡하고 시간이 오래 걸렸습니다.

게다가 백업과 백업 사이에 발생한 변경 사항은 영영 잃어버리게 되는 경우도 많았습니다. 바로 이런 문제를 해결하기 위해 Delta Lake의 타임 트래블 기능이 등장했습니다.

Delta Lake는 모든 데이터 변경을 트랜잭션 로그에 자동으로 기록합니다. 새로운 데이터를 추가하든, 기존 데이터를 수정하든, 삭제하든 상관없이 모든 작업이 버전으로 관리됩니다.

개발자가 별도로 백업을 만들 필요가 없습니다. 시스템이 알아서 처리해주니까요.

타임 트래블을 사용하면 언제든 원하는 시점의 데이터를 조회할 수 있습니다. 버전 번호로도 접근할 수 있고, 타임스탬프로도 접근할 수 있습니다.

잘못된 데이터를 발견했다면 몇 분 만에 이전 상태로 복원할 수 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 Spark 세션을 생성하고 초기 데이터를 Delta 형식으로 저장합니다. 이때 첫 번째 버전이 생성됩니다.

직원 2명의 정보가 담긴 데이터프레임을 만들어 저장했죠. 다음으로 같은 직원들의 급여를 업데이트합니다.

이번에도 overwrite 모드로 저장하지만, Delta Lake는 이전 데이터를 삭제하지 않습니다. 대신 새로운 버전을 생성하고 트랜잭션 로그에 변경 사항을 기록합니다.

실제 현업에서는 어떻게 활용할까요? 전자상거래 회사를 예로 들어보겠습니다.

매일 밤 자정에 주문 데이터를 집계하여 재고 테이블을 업데이트합니다. 어느 날 아침, 재고 수량이 음수로 표시되는 버그가 발견되었습니다.

타임 트래블 기능을 사용하면 어젯밤 배치 작업 실행 직전의 데이터를 즉시 조회할 수 있습니다. 문제가 언제 시작되었는지 정확히 파악하고, 필요하다면 정상 상태로 복원할 수 있죠.

금융권에서는 데이터 감사와 컴플라이언스를 위해 타임 트래블을 적극 활용합니다. 규제 당국에서 특정 시점의 거래 내역을 요청하면, 버전 번호나 날짜를 지정하여 정확한 데이터를 제공할 수 있습니다.

모든 변경 이력이 보존되므로 누가 언제 무엇을 변경했는지 추적 가능합니다. 하지만 주의할 점도 있습니다.

초보 데이터 엔지니어들이 흔히 하는 실수 중 하나는 타임 트래블을 영구적인 백업으로 착각하는 것입니다. Delta Lake는 기본적으로 30일간의 이력만 보존합니다.

30일이 지난 오래된 버전은 VACUUM 명령으로 삭제될 수 있습니다. 따라서 장기 보관이 필요한 데이터는 별도의 백업 전략을 수립해야 합니다.

또 다른 주의사항은 스토리지 비용입니다. 버전이 쌓일수록 저장 공간이 증가합니다.

대용량 테이블에서 빈번한 업데이트가 발생한다면 비용이 급증할 수 있습니다. 적절한 보존 정책을 설정하여 오래된 버전을 정리하는 것이 중요합니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 김개발 씨는 팀장님께 Delta Lake의 타임 트래블 기능을 설명했습니다.

그리고 금요일 저녁 배치 작업 실행 직전의 데이터를 조회했습니다. 숫자를 비교해보니 문제를 발견할 수 있었습니다.

환율 계산 로직에서 실수가 있었던 것이죠. 10분 만에 이전 버전으로 복원하고, 버그를 수정한 후 다시 배치 작업을 실행했습니다.

타임 트래블을 제대로 이해하면 데이터 파이프라인의 안정성을 크게 향상시킬 수 있습니다. 실수를 두려워하지 않고 과감하게 실험할 수 있는 안전망이 생기는 셈이죠.

여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.

실전 팁

💡 - Delta Lake는 기본적으로 30일간의 데이터 버전을 보존합니다

  • 장기 보관이 필요하다면 보존 정책을 별도로 설정하세요
  • 대용량 테이블은 정기적으로 VACUUM을 실행하여 스토리지를 최적화하세요

2. 버전 번호로 과거 데이터 조회

박시니어 개발자는 주니어 김개발 씨에게 물었습니다. "어제 업데이트하기 전 데이터를 확인해볼 수 있을까요?" 김개발 씨는 잠시 고민했습니다.

백업 파일을 찾아야 하나? 하지만 박시니어는 웃으며 말했습니다.

"버전 번호만 알면 간단해요."

Delta Lake는 모든 데이터 변경에 대해 순차적으로 증가하는 버전 번호를 부여합니다. 버전 0부터 시작하여 매 변경마다 1씩 증가하죠.

이 버전 번호를 사용하면 정확한 시점의 데이터를 조회할 수 있습니다. 특정 버전을 지정하는 것만으로 타임머신을 타고 과거로 돌아가는 것과 같은 효과를 얻을 수 있습니다.

다음 코드를 살펴봅시다.

from delta.tables import DeltaTable

# 버전 0의 데이터 조회 (최초 버전)
df_v0 = spark.read.format("delta").option("versionAsOf", 0).load("/data/employees")
print("Version 0:")
df_v0.show()

# 버전 1의 데이터 조회 (첫 번째 업데이트 후)
df_v1 = spark.read.format("delta").option("versionAsOf", 1).load("/data/employees")
print("Version 1:")
df_v1.show()

# 버전 히스토리 확인
deltaTable = DeltaTable.forPath(spark, "/data/employees")
deltaTable.history().select("version", "timestamp", "operation").show()

김개발 씨는 오늘도 데이터 파이프라인을 모니터링하고 있습니다. 고객 정보 테이블이 하루에도 수십 번씩 업데이트됩니다.

신규 고객이 가입하고, 기존 고객의 정보가 변경되고, 탈퇴하는 고객도 있죠. 이 모든 변경 사항이 쌓여갑니다.

어느 날 데이터 분석팀에서 요청이 들어왔습니다. "지난주 월요일 오전에 실행한 분석 결과를 재현해야 하는데, 그때 데이터를 다시 볼 수 있나요?" 김개발 씨는 처음에는 막막했습니다.

일주일 전 데이터를 어떻게 찾지? 하지만 Delta Lake의 버전 관리 시스템을 떠올렸습니다.

버전 번호란 정확히 무엇일까요? 쉽게 비유하자면, 버전 번호는 마치 책의 개정판과 같습니다.

프로그래밍 책이 처음 출간되면 1판입니다. 내용을 수정하고 보완하여 다시 출간하면 2판이 됩니다.

독자들은 "이 내용은 3판 127페이지에 나와 있어요"라고 정확하게 참조할 수 있죠. Delta Lake의 버전 번호도 똑같습니다.

각 변경마다 고유한 번호가 부여되어 정확한 참조가 가능합니다. Delta Lake에서 테이블을 처음 생성하면 버전 0이 만들어집니다.

이것이 최초 버전입니다. 데이터를 추가하거나 수정하면 버전 1이 생성됩니다.

또 변경하면 버전 2, 3, 4 이런 식으로 계속 증가합니다. 각 버전은 완전한 데이터의 스냅샷을 나타냅니다.

버전 번호가 없던 전통적인 시스템에서는 어땠을까요? 많은 팀에서 파일 이름에 날짜를 붙여 관리했습니다.

"customers_20250101.csv", "customers_20250102.csv" 이런 식이죠. 하루에 한 번만 백업하는 경우가 대부분이었습니다.

만약 오전 10시의 데이터가 필요한데 오전 9시와 오후 6시 백업만 있다면? 정확한 시점의 데이터를 얻을 수 없었습니다.

더 큰 문제는 버전 간의 차이를 파악하기 어렵다는 점이었습니다. 어제 파일과 오늘 파일을 비교하려면 직접 열어서 확인해야 했죠.

어떤 레코드가 추가되었고, 어떤 값이 변경되었는지 추적하기가 매우 번거로웠습니다. 바로 이런 불편함을 해결하기 위해 버전 기반 조회가 등장했습니다.

Delta Lake는 모든 변경을 트랜잭션 로그에 기록합니다. 각 변경마다 자동으로 버전 번호가 부여되죠.

개발자는 단순히 원하는 버전 번호를 지정하기만 하면 됩니다. 시스템이 알아서 그 시점의 데이터를 재구성해줍니다.

버전 조회는 매우 빠릅니다. Delta Lake는 스마트하게 설계되어 있어서, 전체 데이터를 다시 읽지 않습니다.

트랜잭션 로그를 분석하여 필요한 파일만 선택적으로 읽습니다. 대용량 테이블에서도 빠른 성능을 유지할 수 있는 이유입니다.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 versionAsOf 옵션을 사용하여 버전 0의 데이터를 읽습니다.

이것은 테이블이 생성된 직후의 최초 상태입니다. 동일한 방법으로 버전 1의 데이터도 조회할 수 있습니다.

마지막으로 history() 메서드를 호출하여 전체 버전 히스토리를 확인합니다. 각 버전의 타임스탬프와 수행된 작업(INSERT, UPDATE, DELETE 등)을 볼 수 있습니다.

실제 현업에서는 어떻게 활용할까요? 데이터 과학 팀에서 머신러닝 모델을 학습시킬 때 버전 번호가 큰 도움이 됩니다.

"이 모델은 데이터 버전 157로 학습했습니다"라고 명확하게 기록할 수 있죠. 나중에 모델 성능을 재현하거나 검증할 때 정확히 같은 데이터를 사용할 수 있습니다.

금융 거래 시스템에서는 감사 추적을 위해 버전 번호를 필수적으로 기록합니다. 특정 시점의 계좌 잔액을 조회해야 할 때, 버전 번호로 정확한 상태를 확인할 수 있습니다.

"2025년 3월 15일 오후 3시 28분 시점의 잔액"이 필요하다면, 그 시각의 버전을 찾아 조회하면 됩니다. A/B 테스트를 진행하는 팀에서도 버전 관리가 중요합니다.

실험 그룹과 대조 그룹을 나눌 때 사용한 데이터의 버전을 기록해둡니다. 나중에 결과를 분석할 때 정확히 같은 버전의 데이터로 검증할 수 있습니다.

하지만 주의할 점도 있습니다. 초보자들이 흔히 하는 실수는 버전 번호가 영구적이라고 생각하는 것입니다.

하지만 VACUUM 명령을 실행하면 오래된 버전이 삭제됩니다. 기본 보존 기간은 30일입니다.

30일이 지난 버전을 조회하려고 하면 오류가 발생합니다. 따라서 장기 보관이 필요한 중요한 버전은 별도로 백업해야 합니다.

또 다른 주의사항은 버전 번호의 연속성입니다. Delta Lake는 작업이 실패하더라도 버전 번호를 건너뛸 수 있습니다.

예를 들어 버전 10에서 11로 넘어갈 때 작업이 실패하면, 다음 성공한 작업은 버전 12가 될 수 있습니다. 버전 11은 존재하지 않는 거죠.

따라서 버전 번호만으로 작업 횟수를 정확히 계산할 수는 없습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

김개발 씨는 히스토리를 조회하여 지난주 월요일 오전에 해당하는 버전을 찾았습니다. 버전 234였습니다.

그 버전의 데이터를 읽어서 분석팀에 전달했습니다. 분석팀은 정확히 같은 데이터로 결과를 재현할 수 있었고, 고객사에 신뢰할 수 있는 보고서를 제출했습니다.

버전 번호를 활용하면 데이터의 변경 이력을 정확하게 추적하고 관리할 수 있습니다. 데이터 품질을 보장하고, 문제 발생 시 빠르게 대응할 수 있는 강력한 도구입니다.

여러분도 오늘 배운 버전 관리 기법을 실전에 적용해 보세요.

실전 팁

💡 - history() 메서드로 전체 버전 히스토리를 먼저 확인하세요

  • 중요한 버전은 문서로 기록하여 팀원들과 공유하세요
  • VACUUM 실행 전에 필요한 버전을 백업하는 것을 잊지 마세요

3. 타임스탬프로 특정 시점 조회

회의 중에 팀장님이 물었습니다. "작년 12월 31일 자정 시점의 매출 데이터를 확인해볼 수 있나요?" 김개발 씨는 고개를 갸웃했습니다.

버전 번호는 알겠는데, 정확한 날짜와 시간으로는 어떻게 조회하지? 옆에서 박시니어가 미소를 지으며 말했습니다.

"타임스탬프 조회를 사용하면 돼요."

버전 번호 외에도 타임스탬프를 사용하여 특정 시점의 데이터를 조회할 수 있습니다. "2025년 1월 15일 오후 3시" 같은 정확한 날짜와 시간을 지정하면, Delta Lake가 그 시점에 유효했던 가장 최근 버전의 데이터를 반환합니다.

버전 번호를 모르더라도 시간만으로 과거 데이터에 접근할 수 있는 편리한 방법입니다.

다음 코드를 살펴봅시다.

from datetime import datetime

# 특정 날짜와 시간의 데이터 조회
timestamp = "2025-01-15 15:30:00"
df_ts = spark.read.format("delta") \
    .option("timestampAsOf", timestamp) \
    .load("/data/employees")
print(f"Data as of {timestamp}:")
df_ts.show()

# 상대적 시간으로 조회 (24시간 전)
yesterday = "2025-01-14"
df_yesterday = spark.read.format("delta") \
    .option("timestampAsOf", yesterday) \
    .load("/data/employees")

김개발 씨는 월말 결산 작업을 준비하고 있습니다. 재무팀에서 요청한 리포트를 만들어야 하는데, 정확히 12월 31일 자정 시점의 데이터가 필요합니다.

1월 1일 새벽에 대량의 데이터 업데이트가 있었기 때문에, 현재 데이터와는 많이 달라졌을 거예요. 버전 번호로 조회하는 방법은 알고 있습니다.

하지만 문제가 있습니다. 12월 31일 자정이 정확히 몇 번 버전인지 모릅니다.

히스토리를 뒤져서 하나하나 확인해야 할까요? 시간이 너무 오래 걸릴 것 같습니다.

바로 이럴 때 타임스탬프 조회가 빛을 발합니다. 쉽게 비유하자면, 타임스탬프 조회는 마치 사진 앨범에서 날짜로 사진을 찾는 것과 같습니다.

"2024년 여름 휴가 때 찍은 사진"을 찾고 싶을 때, 사진 번호를 기억할 필요가 없습니다. 날짜로 검색하면 그 시기의 사진들이 자동으로 나타나죠.

Delta Lake의 타임스탬프 조회도 마찬가지입니다. 날짜와 시간만 알면, 시스템이 알아서 해당 시점의 데이터를 찾아줍니다.

타임스탬프 조회는 어떻게 동작할까요? Delta Lake는 각 버전의 생성 시간을 트랜잭션 로그에 기록합니다.

타임스탬프 조회 요청이 들어오면, 시스템은 로그를 스캔하여 지정된 시간 이전의 가장 최근 버전을 찾습니다. 예를 들어 "2025-01-15 15:30:00"을 요청했는데, 실제 버전들이 15:25:10과 15:35:20에 생성되었다면, 15:25:10 버전의 데이터를 반환합니다.

타임스탬프를 사용하지 않던 시절에는 어땠을까요? 많은 조직에서 날짜별로 스냅샷을 만들어 관리했습니다.

매일 자정에 자동 백업을 실행하는 스크립트를 돌렸죠. 하지만 오후 3시 시점의 데이터가 필요하다면?

그날 자정 백업과 다음 날 자정 백업 사이의 어딘가인데, 정확한 시점을 찾을 수 없었습니다. 더 큰 문제는 시간대 처리였습니다.

글로벌 서비스를 운영하는 회사라면 여러 지역의 시간대를 고려해야 합니다. "뉴욕 시간으로 오후 3시"와 "서울 시간으로 오후 3시"는 다른 시점입니다.

수동으로 변환하다 보면 실수가 자주 발생했습니다. 바로 이런 복잡함을 해결하기 위해 타임스탬프 기반 조회가 등장했습니다.

Delta Lake는 모든 타임스탬프를 UTC로 저장합니다. 일관성이 보장되죠.

어느 지역에서 조회하든 같은 결과를 얻을 수 있습니다. 개발자는 원하는 시간대의 타임스탬프를 전달하기만 하면 됩니다.

시스템이 자동으로 UTC로 변환하여 처리합니다. 타임스탬프 조회는 매우 직관적입니다.

"어제 데이터"나 "지난주 월요일 데이터"처럼 상대적인 시간 표현도 가능합니다. 사람이 기억하는 방식 그대로 데이터를 조회할 수 있어서, 버전 번호보다 훨씬 사용하기 편합니다.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 timestampAsOf 옵션에 날짜와 시간 문자열을 전달합니다.

ISO 8601 형식("YYYY-MM-DD HH:MM:SS")을 사용합니다. Delta Lake는 이 시간 이전의 가장 최근 커밋을 찾아 데이터를 읽습니다.

날짜만 지정하면 그날 자정으로 해석됩니다. 실제 현업에서는 어떻게 활용할까요?

규제 준수가 중요한 금융권에서는 특정 시점의 데이터를 제출해야 하는 경우가 많습니다. "2024년 12월 31일 영업 종료 시점의 포트폴리오 내역"을 요구받으면, 타임스탬프로 정확히 그 시점의 데이터를 추출할 수 있습니다.

감사 대응이 훨씬 간편해집니다. 고객 지원팀에서도 타임스탬프 조회를 자주 사용합니다.

"고객님, 어제 오후 5시에 주문하셨다고요? 잠시만요." 고객이 말한 시간의 데이터를 즉시 조회하여 문제를 파악할 수 있습니다.

고객 만족도가 크게 향상됩니다. 데이터 파이프라인 디버깅에도 유용합니다.

"어제 저녁 9시 배치 작업이 실패했는데 왜 그런 거죠?" 실패 직전 시점의 데이터를 조회하여 원인을 분석할 수 있습니다. 로그와 데이터를 시간으로 연결하면 문제 해결이 빨라집니다.

하지만 주의할 점도 있습니다. 초보자들이 흔히 하는 실수는 미래 시간을 지정하는 것입니다.

아직 발생하지 않은 시간의 데이터를 요청하면 오류가 발생합니다. 또한 테이블이 생성되기 이전의 시간을 지정해도 오류가 납니다.

항상 테이블의 생성 시간과 현재 시간 사이의 값을 사용해야 합니다. 시간대 혼동도 주의해야 합니다.

서버가 UTC로 설정되어 있는데 로컬 시간으로 착각하면 엉뚱한 시점의 데이터를 조회하게 됩니다. 타임스탬프를 전달할 때는 항상 시간대를 명확히 해야 합니다.

타임스탬프 조회는 정확한 시점을 보장하지만, 그 시점에 커밋이 없었다면 그 이전의 가장 최근 버전을 반환합니다. 예를 들어 오후 3시를 요청했는데 그날 오전 9시와 오후 6시에만 커밋이 있었다면, 오전 9시 버전이 반환됩니다.

이 점을 이해하고 사용해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

김개발 씨는 "2024-12-31 23:59:59"를 타임스탬프로 지정하여 데이터를 조회했습니다. 정확히 12월 31일 마지막 순간의 데이터가 나타났습니다.

재무팀에 리포트를 제출했고, 팀장님께 칭찬을 들었습니다. "이렇게 빠르게 준비할 수 있을 줄 몰랐네요!" 타임스탬프 조회를 활용하면 시간 기반 데이터 분석이 훨씬 쉬워집니다.

버전 번호를 일일이 찾을 필요 없이, 직관적인 날짜와 시간으로 과거를 탐색할 수 있습니다. 여러분도 이 강력한 기능을 프로젝트에 적용해 보세요.

실전 팁

💡 - 타임스탬프는 ISO 8601 형식을 사용하세요 (YYYY-MM-DD HH:MM:SS)

  • 시간대 혼동을 피하기 위해 UTC 기준으로 통일하세요
  • history()로 실제 커밋 시간을 먼저 확인하면 더 정확합니다

4. RESTORE 명령으로 롤백하기

금요일 저녁, 김개발 씨는 큰 실수를 했습니다. 프로덕션 데이터베이스에서 테스트용 DELETE 쿼리를 실행했는데, WHERE 절을 빼먹은 겁니다.

모든 데이터가 사라졌습니다. 식은땀이 흘렀습니다.

하지만 박시니어는 침착하게 말했습니다. "괜찮아요.

RESTORE 명령으로 복구할 수 있어요."

RESTORE 명령은 Delta 테이블을 이전 버전으로 완전히 되돌리는 기능입니다. 조회만 하는 것이 아니라, 테이블의 현재 상태를 과거 버전으로 교체합니다.

버전 번호나 타임스탬프를 지정하여 롤백할 수 있으며, 잘못된 업데이트나 삭제를 빠르게 복구할 수 있는 강력한 안전장치입니다.

다음 코드를 살펴봅시다.

from delta.tables import DeltaTable

# 테이블 객체 생성
deltaTable = DeltaTable.forPath(spark, "/data/employees")

# 실수로 모든 데이터를 삭제함
deltaTable.delete()
print("All data deleted!")

# 버전 1로 복구 (삭제 전 상태)
deltaTable.restoreToVersion(1)
print("Restored to version 1")

# 또는 타임스탬프로 복구
# deltaTable.restoreToTimestamp("2025-01-15 14:00:00")

# 복구 후 데이터 확인
df = spark.read.format("delta").load("/data/employees")
df.show()

김개발 씨는 평소처럼 업무를 보고 있었습니다. 개발 환경에서 테스트 데이터를 정리하려고 DELETE 쿼리를 작성했죠.

테스트가 끝나고 퇴근 직전, 프로덕션 데이터베이스에 접속한 채로 같은 쿼리를 실행했습니다. WHERE 절 없이 말이죠.

순간 화면이 멈췄습니다. "1,250,000 rows deleted." 심장이 멎는 것 같았습니다.

고객 데이터 125만 건이 순식간에 사라진 겁니다. 주말 직전 금요일 저녁이었습니다.

회사 전체가 마비될 수 있는 상황이었습니다. 떨리는 손으로 박시니어에게 메시지를 보냈습니다.

5분 후, 박시니어가 자리에 왔습니다. 상황을 파악하더니 미소를 지었습니다.

"다행히 Delta Lake를 쓰고 있네요. RESTORE로 복구할 수 있어요." RESTORE 명령이란 정확히 무엇일까요?

쉽게 비유하자면, RESTORE는 마치 컴퓨터의 시스템 복원 기능과 같습니다. 윈도우에서 문제가 생기면 "시스템 복원"을 실행하여 이전 시점으로 돌아갈 수 있죠.

설정, 프로그램, 드라이버 등이 모두 과거 상태로 되돌아갑니다. RESTORE도 마찬가지입니다.

테이블의 데이터와 스키마를 지정한 버전의 상태로 완전히 되돌립니다. 중요한 점은 RESTORE가 단순히 조회가 아니라 실제 복원이라는 것입니다.

타임 트래블 조회는 과거 데이터를 읽기만 합니다. 현재 테이블은 변하지 않습니다.

하지만 RESTORE는 테이블 자체를 과거로 되돌립니다. 현재 버전이 변경되는 거죠.

RESTORE가 없던 시절에는 어땠을까요? 데이터를 실수로 삭제하면 백업 파일을 찾아야 했습니다.

백업 파일을 찾아서 압축을 풀고, 데이터베이스에 임포트하는 과정이 필요했죠. 대용량 테이블의 경우 복구에 몇 시간씩 걸렸습니다.

그 사이 서비스는 중단되고, 고객들은 불편을 겪었습니다. 더 큰 문제는 백업 시점과 사고 시점 사이의 데이터 손실이었습니다.

매일 자정에 백업을 한다면, 오후 5시에 발생한 사고를 복구할 때 그날 하루 동안의 모든 변경 사항이 사라집니다. 고객들이 입력한 데이터, 처리된 거래 내역 등이 모두 증발하는 거죠.

바로 이런 재앙을 막기 위해 RESTORE 명령이 등장했습니다. Delta Lake의 RESTORE는 매우 빠릅니다.

실제로 데이터를 복사하거나 이동하지 않기 때문입니다. 트랜잭션 로그만 업데이트하여 "현재 버전은 이제 버전 N입니다"라고 표시합니다.

메타데이터만 변경되므로 몇 초 안에 완료됩니다. RESTORE는 새로운 버전을 생성합니다.

예를 들어 버전 10에서 실수가 발생하여 버전 8로 RESTORE하면, 버전 11이 생성됩니다. 버전 11의 데이터는 버전 8과 동일하지만, 히스토리에는 모든 과정이 기록됩니다.

나중에 "왜 롤백했지?"라는 질문에 답할 수 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 DeltaTable 객체를 생성합니다. 그리고 실수로 delete() 메서드를 WHERE 조건 없이 호출합니다.

모든 레코드가 삭제되죠. 하지만 당황하지 않습니다.

restoreToVersion(1) 메서드를 호출하여 버전 1로 복구합니다. 몇 초 만에 데이터가 되돌아옵니다.

타임스탬프를 사용하려면 restoreToTimestamp() 메서드를 쓰면 됩니다. 실제 현업에서는 어떻게 활용할까요?

전자상거래 회사에서 재고 업데이트 스크립트에 버그가 있었습니다. 모든 상품의 재고가 0으로 설정되어 버렸죠.

고객들이 "품절"만 보게 되었습니다. RESTORE 명령으로 10분 전 상태로 복구했습니다.

고객들은 문제를 거의 눈치채지 못했습니다. 마케팅 캠페인 중에 실수로 고객 세그먼트를 잘못 업데이트한 적도 있었습니다.

프리미엄 고객에게 일반 할인 쿠폰이 발송될 뻔했죠. 다행히 발송 전에 발견하여 RESTORE로 복구했습니다.

브랜드 이미지를 지킬 수 있었습니다. 머신러닝 파이프라인에서도 RESTORE가 유용합니다.

새로운 feature를 추가하다가 기존 feature를 망가뜨렸습니다. 모델 성능이 급격히 떨어졌죠.

RESTORE로 안정적인 이전 버전으로 돌아가고, 천천히 문제를 수정했습니다. 하지만 주의할 점도 있습니다.

RESTORE는 데이터만 복구합니다. 애플리케이션 코드나 외부 시스템의 상태는 복구하지 않습니다.

예를 들어 고객에게 이메일을 발송한 후 데이터를 복구해도 이메일은 취소되지 않습니다. RESTORE를 실행할 때는 전체 시스템의 일관성을 고려해야 합니다.

롤백 후에도 히스토리는 남아있습니다. 실수로 삭제한 버전도 VACUUM 전까지는 접근할 수 있습니다.

만약 롤백 후 "아, 삭제한 데이터 중 일부가 필요했는데"라고 생각한다면, 삭제 직후 버전을 조회하여 데이터를 추출할 수 있습니다. 대용량 테이블에서 RESTORE를 실행할 때는 동시성을 고려해야 합니다.

다른 작업이 진행 중이라면 충돌이 발생할 수 있습니다. 가능하면 서비스를 일시 중단하고 복구하는 것이 안전합니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어의 도움으로 김개발 씨는 히스토리를 확인했습니다.

삭제 직전이 버전 523이었습니다. restoreToVersion(523)을 실행했습니다.

10초 후, 125만 건의 데이터가 모두 복구되었습니다. 식은땀이 마르며 안도의 한숨을 쉬었습니다.

"이번 일로 교훈을 얻었네요." 김개발 씨는 다짐했습니다. 앞으로는 프로덕션 작업 전에 반드시 WHERE 절을 확인하고, 가능하면 읽기 전용 모드로 먼저 확인하겠다고요.

RESTORE 명령은 데이터 엔지니어의 생명줄입니다. 실수는 누구나 합니다.

중요한 것은 빠르게 복구하는 능력입니다. RESTORE를 알고 있으면 자신감 있게 작업할 수 있습니다.

여러분도 이 강력한 안전장치를 꼭 기억하세요.

실전 팁

💡 - RESTORE 전에 반드시 history()로 복구 대상 버전을 확인하세요

  • 프로덕션 RESTORE는 팀원들에게 먼저 알리고 진행하세요
  • RESTORE도 새로운 버전을 생성하므로 히스토리가 보존됩니다

5. 데이터 감사와 변경 이력 추적

컴플라이언스 팀에서 김개발 씨를 찾아왔습니다. "지난달 고객 정보가 누가 언제 수정했는지 보고서를 만들어야 해요." 김개발 씨는 난감했습니다.

로그 파일을 일일이 뒤져야 하나? 박시니어가 지나가다 말했습니다.

"Delta Lake 히스토리 기능을 써보세요."

Delta Lake는 모든 데이터 변경을 트랜잭션 로그에 상세히 기록합니다. 누가, 언제, 무엇을, 어떻게 변경했는지 완벽하게 추적할 수 있습니다.

감사(audit) 목적으로 변경 이력을 조회하고, 컴플라이언스 요구사항을 충족할 수 있습니다. 데이터 거버넌스와 규제 준수에 필수적인 기능입니다.

다음 코드를 살펴봅시다.

from delta.tables import DeltaTable

# 테이블 히스토리 조회
deltaTable = DeltaTable.forPath(spark, "/data/employees")
history_df = deltaTable.history()

# 상세 정보 선택
history_df.select(
    "version",
    "timestamp",
    "operation",
    "operationParameters",
    "userMetadata",
    "userName"
).show(truncate=False)

# 특정 기간의 변경 이력 필터링
from pyspark.sql.functions import col
recent_changes = history_df.filter(
    col("timestamp") >= "2025-01-01"
).orderBy("timestamp", ascending=False)
recent_changes.show(truncate=False)

김개발 씨의 회사는 금융 서비스를 제공합니다. 규제 기관의 감사를 정기적으로 받아야 하죠.

이번 분기에도 감사 통지서가 도착했습니다. "고객 개인정보 변경 이력을 제출하시오." 정확히 누가 언제 어떤 데이터를 수정했는지 상세한 보고서가 필요합니다.

예전 시스템이었다면 악몽 같은 작업이었을 겁니다. 애플리케이션 로그를 파싱하고, 데이터베이스 감사 로그를 분석하고, 여러 출처의 정보를 취합해야 했으니까요.

하지만 지금은 Delta Lake를 사용합니다. 데이터 감사란 정확히 무엇일까요?

쉽게 비유하자면, 데이터 감사는 마치 은행 계좌의 거래 내역과 같습니다. 통장을 보면 언제 얼마가 입금되고 출금되었는지 모든 기록이 남아있죠.

누가 어떤 ATM에서 인출했는지, 어떤 가맹점에서 결제했는지도 알 수 있습니다. 데이터 감사도 똑같습니다.

데이터에 대한 모든 작업이 빠짐없이 기록되어, 나중에 검증하고 추적할 수 있습니다. 트랜잭션 로그는 Delta Lake의 핵심입니다.

테이블에 대한 모든 변경 사항이 JSON 형식으로 기록됩니다. 누가 작업했는지(userName), 언제 했는지(timestamp), 무슨 작업인지(operation), 어떤 파라미터를 사용했는지(operationParameters) 모든 정보가 담겨있습니다.

감사 추적이 없던 전통적인 시스템에서는 어땠을까요? 많은 조직에서 애플리케이션 레벨에서 로깅을 구현했습니다.

"User123이 2025-01-15에 레코드를 업데이트했습니다"라는 식의 로그를 남겼죠. 하지만 문제가 많았습니다.

개발자가 로깅 코드를 빼먹으면 기록이 남지 않았습니다. 로그 형식이 일관되지 않아 분석하기 어려웠습니다.

데이터베이스 자체의 감사 기능을 사용하는 경우도 있었습니다. 하지만 성능 오버헤드가 컸습니다.

모든 쿼리를 기록하면 시스템이 느려졌죠. 또한 감사 로그가 데이터와 분리되어 있어서, 나중에 연결하기가 복잡했습니다.

바로 이런 한계를 극복하기 위해 Delta Lake의 통합 감사 기능이 등장했습니다. Delta Lake는 감사 추적을 핵심 기능으로 제공합니다.

별도의 설정이나 코드 없이 자동으로 모든 작업이 기록됩니다. 개발자가 실수로 빼먹을 일이 없죠.

트랜잭션 로그는 데이터와 함께 저장되므로 일관성이 보장됩니다. 히스토리 조회는 매우 간단합니다.

history() 메서드 하나면 충분합니다. 반환되는 DataFrame은 표준 Spark 연산을 모두 지원합니다.

필터링, 정렬, 집계가 자유롭습니다. SQL에 익숙하다면 익숙한 방식으로 분석할 수 있습니다.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 DeltaTable 객체를 만들고 history() 메서드를 호출합니다.

전체 히스토리가 DataFrame으로 반환됩니다. 필요한 컬럼만 선택하여 보기 좋게 출력합니다.

마지막으로 특정 기간의 변경 사항만 필터링합니다. 올해 1월 1일 이후의 작업만 추출하는 예제입니다.

실제 현업에서는 어떻게 활용할까요? 의료 기관에서는 환자 기록 접근을 엄격히 관리해야 합니다.

HIPAA 같은 규제를 준수해야 하죠. Delta Lake 히스토리를 사용하면 누가 언제 어떤 환자의 데이터를 조회했는지 완벽하게 추적할 수 있습니다.

권한 없는 접근이 발생하면 즉시 감지하고 대응할 수 있습니다. 금융권에서는 거래 데이터의 변경 이력이 매우 중요합니다.

내부 부정을 방지하고, 외부 감사에 대응하기 위해서죠. Delta Lake를 사용하면 "이 계좌 잔액이 왜 변경되었나요?"라는 질문에 정확한 시간과 작업자, 변경 내용을 제시할 수 있습니다.

SaaS 서비스를 운영하는 회사에서는 고객에게 감사 로그를 제공하는 경우가 많습니다. 엔터프라이즈 고객들은 "우리 데이터를 누가 접근했나요?"라고 물어봅니다.

Delta Lake 히스토리를 기반으로 고객용 감사 대시보드를 만들 수 있습니다. 투명성이 높아지고 신뢰가 구축됩니다.

데이터 과학 팀에서는 재현성을 위해 히스토리를 활용합니다. "이 모델은 어떤 데이터로 학습했나요?" 정확한 버전과 타임스탬프를 기록해둡니다.

몇 달 후에도 똑같은 결과를 재현할 수 있습니다. 하지만 주의할 점도 있습니다.

히스토리에는 민감한 정보가 포함될 수 있습니다. operationParameters에 WHERE 조건이나 값들이 기록되기 때문입니다.

히스토리 접근 권한을 적절히 관리해야 합니다. 모든 사람이 히스토리를 볼 수 있어서는 안 됩니다.

대용량 테이블에서는 히스토리 자체가 커질 수 있습니다. 수천 개의 버전이 쌓이면 히스토리 조회도 느려집니다.

필요한 기간만 필터링하여 조회하는 것이 좋습니다. 전체 히스토리를 매번 가져오지 마세요.

userMetadata 필드를 활용하면 커스텀 감사 정보를 추가할 수 있습니다. 작업의 목적이나 티켓 번호를 기록해두면 나중에 변경 이유를 파악하기 쉽습니다.

"왜 이렇게 바꿨지?"라는 질문에 답할 수 있는 문서가 됩니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

김개발 씨는 한 시간 만에 감사 보고서를 완성했습니다. 히스토리를 조회하고, 필요한 컬럼을 선택하고, CSV로 내보냈습니다.

누가 언제 무엇을 변경했는지 모든 정보가 깔끔하게 정리되었습니다. 컴플라이언스 팀은 만족했고, 감사도 무사히 통과했습니다.

"Delta Lake를 선택하길 정말 잘했네요." 팀장님이 말했습니다. "감사 준비하는 데 예전에는 일주일씩 걸렸는데 말이죠." 데이터 감사는 선택이 아니라 필수입니다.

규제가 강화되고 있고, 고객들의 프라이버시 의식도 높아지고 있습니다. Delta Lake의 통합 감사 기능을 활용하면 컴플라이언스를 쉽게 달성하고, 데이터 거버넌스를 강화할 수 있습니다.

여러분의 프로젝트에도 꼭 적용해 보세요.

실전 팁

💡 - history()는 비용이 들 수 있으니 필요한 기간만 필터링하세요

  • userMetadata에 작업 목적이나 티켓 번호를 기록하면 유용합니다
  • 히스토리 접근 권한을 적절히 관리하여 민감한 정보를 보호하세요

6. 버전 보존 정책 설정

어느 날 김개발 씨는 스토리지 비용 청구서를 보고 깜짝 놀랐습니다. 지난달보다 3배나 증가했습니다.

원인을 조사해보니 Delta 테이블의 오래된 버전들이 계속 쌓이고 있었습니다. 박시니어가 다가와 말했습니다.

"버전 보존 정책을 설정하지 않았나 보네요."

Delta Lake는 기본적으로 30일간의 데이터 버전을 보존합니다. VACUUM 명령으로 오래된 버전을 삭제하여 스토리지를 최적화할 수 있습니다.

하지만 무분별한 삭제는 위험합니다. 적절한 보존 정책을 설정하여 필요한 버전은 유지하면서 불필요한 파일은 정리하는 균형을 찾아야 합니다.

다음 코드를 살펴봅시다.

from delta.tables import DeltaTable
from pyspark.sql import SparkSession

# 테이블의 보존 기간 확인
spark = SparkSession.builder.appName("VacuumPolicy").getOrCreate()
deltaTable = DeltaTable.forPath(spark, "/data/employees")

# 보존 기간 설정 (7일)
spark.sql("""
    ALTER TABLE delta.`/data/employees`
    SET TBLPROPERTIES (
        'delta.deletedFileRetentionDuration' = 'interval 7 days',
        'delta.logRetentionDuration' = 'interval 30 days'
    )
""")

# VACUUM 실행 (7일 이전 파일 삭제)
deltaTable.vacuum(7)  # 7일 보존
print("Vacuum completed!")

# 예방 차원: DRY RUN으로 미리 확인
# spark.conf.set("spark.databricks.delta.vacuum.dryRun", "true")
# deltaTable.vacuum(7)

김개발 씨의 팀은 대용량 데이터를 다룹니다. 주문 테이블에는 매일 수백만 건의 레코드가 추가됩니다.

배치 작업으로 매시간 데이터를 업데이트하죠. 3개월이 지나자 Delta 테이블의 크기가 테라바이트 단위로 증가했습니다.

CFO가 회의를 소집했습니다. "클라우드 스토리지 비용이 예산을 초과했습니다.

최적화 방안을 찾아야 합니다." 김개발 씨는 데이터 파이프라인을 점검하기 시작했습니다. 분석 결과, 문제는 Delta Lake의 버전 관리였습니다.

타임 트래블을 위해 모든 버전을 보존하고 있었는데, 실제로는 최근 일주일 치만 사용하고 있었습니다. 3개월 전 버전은 전혀 조회하지 않는데 계속 저장되고 있었던 거죠.

버전 보존 정책이란 정확히 무엇일까요? 쉽게 비유하자면, 버전 보존 정책은 마치 집안의 정리 정돈 규칙과 같습니다.

"1년 동안 입지 않은 옷은 기부한다" 같은 규칙을 정하면 옷장이 깔끔하게 유지되죠. 필요한 옷은 보관하고, 불필요한 것은 정리하는 겁니다.

데이터 버전도 마찬가지입니다. 최근 데이터는 보존하고, 오래된 버전은 삭제하여 스토리지를 효율적으로 관리합니다.

VACUUM 명령은 오래된 데이터 파일을 물리적으로 삭제하는 작업입니다. Delta Lake는 데이터를 업데이트할 때 기존 파일을 수정하지 않고 새 파일을 만듭니다.

시간이 지나면 더 이상 사용되지 않는 파일들이 쌓입니다. VACUUM이 이런 파일들을 정리합니다.

버전 관리가 없던 전통적인 시스템에서는 어땠을까요? 많은 조직에서 수동으로 오래된 백업을 삭제했습니다.

매달 말에 관리자가 로그인하여 "30일 이전 백업 삭제" 같은 스크립트를 실행했죠. 하지만 위험했습니다.

실수로 필요한 백업을 삭제하는 경우가 종종 있었습니다. 복구할 방법이 없었죠.

자동화를 시도한 팀도 있었습니다. 하지만 파일 이름 패턴을 기반으로 삭제하다 보니 정확성이 떨어졌습니다.

"customers_old_final_v2.csv" 같은 파일은 언제 삭제해야 할까요? 판단하기 어려웠습니다.

바로 이런 복잡함을 해결하기 위해 통합 보존 정책이 등장했습니다. Delta Lake는 두 가지 보존 기간을 제공합니다.

deletedFileRetentionDuration은 삭제된 데이터 파일의 보존 기간입니다. logRetentionDuration은 트랜잭션 로그의 보존 기간입니다.

일반적으로 로그는 더 오래 보존합니다. 로그는 크기가 작지만 감사와 추적에 중요하기 때문입니다.

기본 보존 기간은 30일입니다. 대부분의 조직에게 적절한 값이죠.

최근 한 달간의 실수는 복구할 수 있지만, 오래된 데이터는 정리되어 비용이 절감됩니다. 하지만 요구사항에 따라 조정할 수 있습니다.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 ALTER TABLE로 테이블 속성을 변경합니다.

데이터 파일은 7일, 로그는 30일 보존하도록 설정했습니다. 그 다음 vacuum(7) 메서드를 호출하여 7일 이전의 파일을 삭제합니다.

실행 전에 dry run 모드로 미리 확인하는 것도 좋은 습관입니다. 실제 현업에서는 어떻게 활용할까요?

스타트업에서는 빠른 반복 개발이 중요합니다. 실수가 잦고, 롤백이 자주 필요하죠.

보존 기간을 7일로 짧게 설정하여 스토리지 비용을 줄이면서도 최근 변경 사항은 복구할 수 있게 합니다. 대기업에서는 컴플라이언스 요구사항이 엄격합니다.

규제 기관이 90일간의 데이터 이력을 요구할 수 있습니다. 이 경우 보존 기간을 90일 이상으로 설정합니다.

비용은 증가하지만 규제를 준수할 수 있습니다. 머신러닝 팀에서는 실험 추적이 중요합니다.

모델 학습에 사용한 데이터를 재현해야 하는 경우가 많죠. 학습용 데이터셋은 보존 기간을 길게 설정하고, 중간 처리 데이터는 짧게 설정하여 차별화합니다.

개발 환경과 프로덕션 환경의 정책을 다르게 가져가는 것도 좋은 전략입니다. 개발 환경은 3일, 스테이징은 7일, 프로덕션은 30일처럼 중요도에 따라 차등 적용합니다.

하지만 주의할 점도 있습니다. VACUUM은 되돌릴 수 없습니다.

삭제된 파일은 영구적으로 사라집니다. 실행 전에 반드시 필요한 버전이 보존 기간 내에 있는지 확인해야 합니다.

dry run 모드를 적극 활용하세요. 동시성 문제도 조심해야 합니다.

VACUUM을 실행하는 동안 다른 작업이 오래된 버전을 읽으려고 하면 오류가 발생할 수 있습니다. 가능하면 사용량이 적은 시간대에 실행하세요.

너무 짧은 보존 기간은 위험합니다. 7일 미만으로 설정하면 주말에 발생한 문제를 월요일에 발견했을 때 이미 복구가 불가능할 수 있습니다.

최소 7일 이상을 권장합니다. 보존 기간과 VACUUM 실행 주기를 맞춰야 합니다.

보존 기간이 30일인데 VACUUM을 60일마다 실행하면 의미가 없습니다. 자동화 스크립트로 정기적으로 실행하는 것이 좋습니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 김개발 씨는 팀과 논의하여 보존 정책을 수립했습니다.

트랜잭션 데이터는 30일, 분석용 집계 데이터는 7일로 설정했습니다. 매주 일요일 새벽에 자동으로 VACUUM이 실행되도록 스케줄링했습니다.

한 달 후 스토리지 비용을 확인했습니다. 40% 감소했습니다.

CFO는 만족했고, 팀은 칭찬받았습니다. "데이터 엔지니어링이 비용 절감에도 기여할 수 있다는 걸 보여줬네요." 버전 보존 정책은 기술적 이슈인 동시에 비즈니스 이슈입니다.

복구 능력과 비용의 균형을 찾아야 합니다. 조직의 요구사항을 파악하고, 적절한 정책을 수립하세요.

정기적으로 검토하고 조정하는 것도 잊지 마세요. 여러분의 프로젝트도 최적의 정책을 찾아가길 바랍니다.

실전 팁

💡 - 프로덕션 환경에서는 최소 7일 이상의 보존 기간을 권장합니다

  • VACUUM 실행 전 반드시 dry run으로 확인하세요
  • 환경별로 다른 정책을 적용하여 비용과 안정성의 균형을 찾으세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Delta Lake#Time Travel#Data Versioning#RESTORE#Audit Trail#Data Engineering,Big Data,Delta Lake

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.