DB

DB의 “snapshot” 필드란? (DB의 버전관리)

혜이드 2025. 9. 13. 16:30

<들어가며>

 

DB는 항상 바뀐다. 왜냐구? 정보가 업데이트 되니까 ..

쇼핑몰의 사용자 정보를 생각해보자. 나의 구매이력에 따라서 적립금,회원등급.. 같은 정보가 계속 바뀔 것이다.

그렇다고 이전 정보를 완전히 날려버릴까? 그렇지 않다.

대신, 갱신된 정보를 반영하면서 새로운 데이터를 버전처럼 기록하는 방식을 사용한다.

그렇다면 버전번호를 붙여주면 좋겠지.

“Yoon”사용자 정보:버전 1.

“Yoon”사용자 정보:버전 2.

“Yoon”사용자 정보:버전 3….

이 때 사용하는 것이 바로 스냅샷이다.(특정 시점의 버전관리 필드에 해당)

 


예시를 들어보자

나는 맥도날드라는 브랜드의 정보를 크롤링해서 긁어온다.

// 데이터 수집 시마다 증가하는 버전 번호
const snapshotId = sid + 1;  // 이전 스냅샷 + 1

// 사용 예시
await FranchiseeModel.create({
  snapshotId: 12345,  // 현재 수집 버전
  brandName: "맥도날드",
  branchName: "강남점",
  // ...
});

 

최신화 된 정보를 얻기 위해서.. 크롤링은 한 번에 끝나지 않을 것이다.

매번 크롤링할 때마다 버전 관리를 위해서 스냅샷 변수를 갱신해준다. 

 

<스냅샷을 API 파라미터로 이용하기>

또한 .. 추후 이 정보를 API로 내보낼 떄 활용하기도 좋겠지?

API 사용 예시:

# 특정 스냅샷의 브랜드 목록 조회
GET /api/v1/macdonalds/12345/
GET /api/v1/macdonalds/6789

 

보다 보니까 … 스냅샷 아이디라는 필드는 아주 중요한 것 같다.

그럼 모~든 테이블마다 스냅샷 필드를 넣어주는게 좋을까? 

 

개발 마법의 단어는 효율성과 유지보수성!

효율성을 위해서 필요할 때에만 사용하는 게 맞다.

 

그럼 . 아래 퀴즈의 두 테이블 중 어떤 테이블에 더 스냅샷이 필요하고 어떤 테이블에는 굳이 필요가 없을 지 생각해보자.

 

 

1.상품 카테고리 테이블

  • 카테고리ID, 카테고리명
  • “전자제품 → TV” 같은 기준 정보.
  • 과거 버전이 필요할까, 아니면 항상 최신 카테고리만 유지하면 될까?

👉 이 테이블에 snapshotId가 필요할까요?


2.주식 가격 테이블

  • 종목코드, 날짜, 종가
  • 시간에 따라 계속 변동, 과거 기록이 분석에 필수

👉 이 테이블에 snapshotId가 필요할까요?

 

 

사람마다 해석의 여지는 다를 수있지만. 

나라면,최신 카테고리 정보만 있으면되는 1번은 스냅샷을 넣지 않고, 이전 버전의 데이터도 중요한 2번에는 스냅샷을 넣어 버전관리를 하겠다.

 

다시한번 정리하자면!

 

snapshotId 없음: 기준/참조성 마스터 데이터 또는 점증 갱신형 데이터(덮어쓰기해도 괜찮을거같은 데이터⇒ 무조건 최신으로 유지해야함)

snapshotId 있음: 크롤링/수집 시점별로 “동결된 스냅샷”을 유지해야 하는 테이블

동일한 브랜드라도 스냅샷마다 별도 레코드가 생김. 시점 비교/롤백/증분처리에 유리

이다. 앞으로 버전관리가 필요하다고 생각되는 데이터에는 스냅샷 필드를 추가하도록 하자!