데이터베이스 설계의 '기본 중의 기본'이자, 실무에서 결코 빠질 수 없는 두 필드 createdAt과 updatedAt에 대해 알아보겠습니다.
단순히 날짜를 기록하는 것을 넘어, SQL의 '절' 기능을 이용해 어떻게 이 과정을 자동화하는지도 함께 살펴볼까요?
'절'이 뭐길래 자동화를 해주나요?
우리는 보통 데이터의 타입(INT, VARCHAR 등)과 제약 조건(NOT NULL, UNIQUE 등)만 신경 쓰곤 합니다. 하지만 SQL에는 '절'이라는 네 번째 요소가 존재합니다.
절이란? 특정 데이터 타입에 부착하는 '특별 지시 사항'입니다. 데이터베이스가 특정 상황(데이터 수정 등)이 발생했을 때 어떤 행동을 할지 정의합니다.
예를 들어, updatedAt 필드에 다음과 같은 절을 붙여봅시다. ON UPDATE CURRENT_TIMESTAMP
이 한 줄은 데이터베이스에게 "누군가 이 행(row)을 수정하면, 시키지 않아도 알아서 현재 시간으로 업데이트해!"라고 명령하는 것과 같습니다. 개발자가 일일이 코드로 수정 시간을 기록할 필요가 없어지는 기능이죠.
createdAt만 있으면 안 되나요? 왜 updatedAt까지 필요하죠?
초보 개발자분들이 가장 많이 하는 질문입니다. "생성된 날짜만 알면 되는 거 아닌가요?" 하지만 실무에서는 '데이터의 생애주기'를 관리하는 것이 매우 중요합니다.
기록의 탄생 vs 변화의 역사
createdAt: 데이터의 '생일'입니다. 한 번 정해지면 영원히 변하지 않습니다. 사용자가 언제 가입했는지, 게시글이 언제 처음 올라왔는지를 증명합니다.
updatedAt: 데이터의 '마지막 활동 기록'입니다. 데이터가 조금이라도 바뀌면 그때마다 갱신됩니다. 현재 이 정보가 얼마나 '최신'인지를 알려줍니다.
실무에서 빛을 발하는 updatedAt의 3가지 역할
① 보안과 정책 관리
사용자가 비밀번호를 언제 바꿨는지 updatedAt을 통해 확인합니다. "마지막 변경일로부터 90일이 지났으니 비밀번호를 변경해 주세요"라는 안내 문구는 바로 여기서 시작됩니다.
② 휴면 계정 및 비활성 데이터 선별
"최근 1년간 로그인을 한 적이 있나?"를 판단할 때 updatedAt은 훌륭한 기준이 됩니다. 서비스의 활성 사용자를 필터링하는 핵심 지표가 되죠.
③ 데이터 싱크와 캐싱(Caching)
모바일 앱이나 웹에서 데이터를 새로고침할 때, 서버는 모든 데이터를 다시 보내주는 대신 "마지막 수정 시간 이후로 바뀐 데이터가 있는가?"를 체크합니다. 이때 updatedAt을 비교하여 꼭 필요한 데이터만 전송해 성능을 비약적으로 높입니다.