인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

zoezoe님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Column Annotation들 탐구하기

@VersionColumn() save 관련 질문

작성

·

36

0

@VersionColumn() 관련하여

'save()함수가 몇번 불렸는지 기억한다' 라고 하셔서

save함수가 불린 횟수에 따라 1씩 증가하는 것으로 처음에 이해를 했었는데,

 

강의 영상과 조금 다르게 service & controller 나눠 작성하는 연습을 하다가 아래와 같이

title을 동일한 값으로 수정하는 코드를 작성했었습니다

async PatchUsers(id: string) {
  const user = await this.userRepository.findOne({
    where: {
      id,
    },
  });

  if (!user) {
    throw new NotFoundException();
  }
  console.log('Before save - Version:', user.version);

  if (user) {
    user.title = '수정하기';
  }

  const newUser = await this.userRepository.save(user);
  console.log('After save - Version:', user.version);

  return newUser;
}

이때 title이 이전과 동일하면 실제로 save함수는 실행이 되지만 DB상에 변화가 없기 때문에 @VersionColumn() 으로 정의한 version에는 변화가 없는 것 같은데

 

save함수의 실행횟수보다 db의 변화가 있는지에 초점을 맞춰서 생각하면 될까요 ?

 

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

제가 설명을 잘 못한 것 같군요.

말씀하신게 맞습니다.

실제 변경이 이뤄져야 됩니다.

감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

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

여러 질문에서 다룬 바와 같이, @VersionColumn()은 데이터베이스의 행(row)이 실제로 변경되었을 때만 업데이트됩니다. save() 메소드는 호출되었을 때 항상 데이터베이스에 저장을 시도하지만, 그 동안 데이터가 변경되지 않은 경우에는 @VersionColumn()이 증가하지 않습니다.

기본적으로 @VersionColumn()은 Optimistic Locking을 위해 사용되며, 데이터 무결성을 보장하기 위한 것입니다. 이로 인해 실제로 변경이 있어야만 버전 번호가 증가하게 됩니다.

유사한 주제와 관련이 있는 기존 답변으로는 아래 두 링크를 참고하실 수 있습니다:

  1. @VersionColumn() 질문
    • 이 질문에서는 히스토리 관리와 관련된 설명이 포함되어 있습니다. @VersionColumn() 자체는 변경된 칼럼의 내용을 추적하지 않으며, 그 역할은 데이터베이스 버전 관리와 관련되어 있습니다.

이처럼 각종 데이터 잔재와 무효한 갱신을 막는 데 @VersionColumn()이 사용되고 있으며, 다른 이유로 인해 변경되지 않은 데이터에 대해서는 버전이 증가하지 않음을 이해하실 수 있을 것입니다.

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

zoezoe님의 프로필 이미지

작성한 질문수

질문하기