Inflearn brand logo image

인프런 커뮤니티 질문&답변

김종원님의 프로필 이미지
김종원

작성한 질문수

React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드

Ch4-3. MongoDB 관리자 계정 모델 설계

질문 userSchema 의 timestamps: true

해결된 질문

작성

·

41

0

userSchema의 timestamps: true를 하면 createdAt과 updatedAt이라는 두 개의 필드가 자동으로 생성된다고 하는데 createdAt 필드를 직접 작성한 이유가 있나요 ?

답변 3

1

닭강정님의 프로필 이미지
닭강정
지식공유자

안녕하세요. 질문에 답변드리도록 하겠습니다.

Q. createdAt 필드를 직접 작성한 이유가 있나요?

A. timestamps 옵션을 true로 설정하면 Mongoose는 자동으로 createdAtupdatedAt 필드를 생성하고, 각각의 기본값은 현재 시간(new Date())으로 자동 설정됩니다.

timestamps: true 로 설정하면 createdAt 필드를 따로 명시하지 않아도, 문서 생성 시 자동으로 현재 시간이 기록됩니다.

하지만 createdAt을 스키마에 직접 명시한 이유는 다음과 같습니다:

  1. 강의 목적: 수강생분들에게 createdAt 필드가 어떻게 동작하는지를 명확히 보여드리기 위해 기본 옵션을 코드에 직접 작성했습니다.

  2. 가독성과 명시성: 스키마를 보는 사람에게 해당 필드의 존재와 타입, 기본 동작을 명확히 전달하기 위해 의도적으로 작성한 경우입니다.

  3. 커스터마이징 및 호환성 고려: 실제 프로젝트에서는 createdAt 값을 직접 포맷하거나 사용하는 커스텀 로직이 있을 수 있어, 명시적으로 정의해두는 것이 향후 유지보수나 확장 시 유리할 수 있습니다.

즉, 실무 개발 단계에서는 timestamps: true만 설정해도 충분하고, createdAt 필드를 기본 옵션만 사용할 경우에는 생략하셔도 전혀 문제되지 않습니다.


사용자에게 포맷된 날짜를 보여줘야 하는 경우에 대해 간략히 설명드리면

사용자에게 2025-05-19 20:10처럼 보기 좋은 형식으로 날짜를 보여줘야 할 때, createdAt을 직접 정의하고 관련 포맷터를 설정해둘 수 있습니다.

    createdAt: {
      type: Date,
      default: Date.now,
      get: (timestamp) => {
        // 한국 시간 기준 YYYY-MM-DD HH:mm 형식
        return new Date(timestamp).toLocaleString("ko-KR", {
          timeZone: "Asia/Seoul",
          year: "numeric",
          month: "2-digit",
          day: "2-digit",
          hour: "2-digit",
          minute: "2-digit",
        });
      },
    },

결과 예시:

{
  "username": "example",
  "createdAt": "2025.05.19. 20:10"
}

답변이 도움이 되셨길 바랍니다!
혹시 이해가 어려운 부분이 있거나 추가로 궁금한 점이 있으시면 언제든지 편하게 질문해주세요

1

안녕하세요, 인프런 AI 인턴입니다. 김종원님.

MongoDB에서 userSchematimestamps: true 옵션을 사용하게 되면 createdAtupdatedAt 필드가 자동으로 생성되어 각 문서의 생성 및 수정 시간을 기록합니다. 이는 일반적으로 데이터의 시계열 관리를 용이하게 하고, 변경 이력을 추적하는 데에 유용합니다.

하지만 특정한 경우, 예를 들어 커스텀 로직이 필요한 경우나 기존 데이터베이스에서 이와 비슷한 필드가 이미 존재하는 경우, createdAt 필드를 직접 작성하거나 커스터마이징할 필요가 있을 수 있습니다. 여기에는 다음과 같은 이유가 있을 수 있습니다:

  1. 기존 데이터 마이그레이션: 만약 이전 프로젝트나 다른 시스템에서 createdAt 같은 타임스탬프 데이터를 이미 포함하고 있다면, 이를 일관되게 유지하기 위해 수동으로 설정할 수 있습니다.

  2. 특별한 포맷 요구사항: 타임스탬프의 포맷이나 시간대를 맞춰야 하는 요구사항이 있을 경우, 직접 필드를 작성하여 포맷팅하는 방법이 필요할 수 있습니다.

  3. 커스텀 로직 적용: 특정 이벤트 또는 행동에 기반하여 타임스탬프를 조정해야 하는 시나리오에서는 수동 설정이 필요할 수 있습니다.

직접 createdAt 필드를 작성하는 이유는 프로젝트의 요구 사항이나 설계에 따라 다양할 수 있으므로, 구체적인 상황에 따라 어떤 방법이 유용할지 결정하시면 됩니다.

아래 URL에서도 유사한 주제에 대한 설명을 확인하실 수 있습니다:
- Mongoose의 Timestamps 옵션 이해하기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

김종원님의 프로필 이미지
김종원
질문자

보기좋게 보여줘야 하는 경우를 알려주시니 이해가 갑니다

답변 감사합니다 !👍

 

김종원님의 프로필 이미지
김종원

작성한 질문수

질문하기