본문으로 건너뛰기

ActiveRecord의 숨겨진 기능: `previously_new_record?` 활용법

TIL: previously_new_record? — A Hidden Gem in ActiveRecord

작성자
발행일
2025년 07월 03일
https://glaucocustodio.github.io/2025/07/03/til-previously-new-record-a-hidden-gem-in-active-record/

핵심 요약

  • 1 `previously_new_record?`는 `create_or_find_by` 후 레코드가 새로 생성되었는지 확인하는 Rails 6.1+의 유용한 메서드입니다.
  • 2 `new_record?`와 달리, 이 메서드는 레코드가 저장된 이후에도 생성 여부를 정확히 판단할 수 있습니다.
  • 3 온보딩 로직, 메타데이터 로깅 등 새롭게 생성된 레코드에만 특정 작업을 수행할 때 효과적으로 활용됩니다.

도입

Rails 개발 시 `create_or_find_by` 또는 `find_or_create_by`와 같은 메서드를 사용하여 레코드를 생성하거나 찾는 경우가 빈번합니다. 이때, 해당 레코드가 실제로 새로 생성된 것인지 아니면 기존 레코드를 찾은 것인지 구분해야 할 필요가 종종 발생합니다. 많은 개발자가 `new_record?` 메서드를 떠올리지만, 이 메서드는 레코드가 이미 저장된 후에는 항상 `false`를 반환하기 때문에 이러한 상황에서는 적절한 해결책이 되지 못합니다. 본문에서는 이러한 문제를 해결하기 위한 Rails의 강력한 기능인 `previously_new_record?`에 대해 탐구합니다.

create_or_find_by와 같은 메서드는 레코드를 생성하거나 찾은 후 즉시 저장하기 때문에, 이후 record.new_record?를 호출하면 레코드가 이미 저장된 상태이므로 항상 false를 반환하게 됩니다. 이는 레코드가 실제로 새로 생성되었는지 여부를 판단하려는 개발자에게 혼란을 줄 수 있습니다.

previously_new_record?의 등장

이러한 한계를 극복하기 위해 Rails 6.1 버전부터 previously_new_record? 메서드가 도입되었습니다. 이 메서드는 이름에서 알 수 있듯이, 레코드가 *마지막 저장 직전에 * 새로운 레코드였는지 여부를 알려줍니다. 즉, 레코드가 데이터베이스에 커밋되기 전의 상태를 기억하여, 저장된 이후에도 해당 레코드가 이전에 새로운 상태였음을 확인할 수 있게 해줍니다.

주요 활용 사례

previously_new_record?는 다음과 같은 다양한 시나리오에서 매우 유용하게 활용될 수 있습니다:

  • 온보딩 로직 트리거: 신규 사용자가 생성되었을 때만 특정 온보딩 프로세스를 시작해야 하는 경우.

  • 메타데이터 로깅: 레코드의 생성 시점과 관련된 특정 로그를 남겨야 하는 경우.

  • 기본값 설정: 새로 생성된 레코드에만 특정 기본값을 설정하거나 초기화 작업을 수행해야 하는 경우.

사용 예시

다음은 previously_new_record?의 실제 사용 예시입니다: ruby user = User.create_or_find_by(email: params[:email]) # 사용자가 방금 생성된 경우에만 로그를 생성합니다. if user.previously_new_record? create_log(user) end 이 코드를 통해 user 객체가 create_or_find_by 메서드에 의해 새로 생성되었을 때만 create_log 메서드가 호출되도록 할 수 있습니다. previously_new_record?는 ActiveRecord의 일부로 제공되므로, 별도의 추가 설정 없이 바로 사용할 수 있습니다.

결론

`previously_new_record?` 메서드는 `create_or_find_by` 또는 `find_or_create_by`와 같이 레코드의 생성 및 조회가 동시에 일어나는 상황에서, 레코드가 실제로 새로 생성되었는지 여부를 명확하게 구분할 수 있도록 돕는 ActiveRecord의 필수적인 기능입니다. Rails 6.1부터 제공되는 이 메서드는 `new_record?`가 제공하지 못하는 중요한 컨텍스트를 제공하여, 개발자가 새로 생성된 레코드에만 특정 로직을 적용해야 할 때 매우 효과적인 해결책을 제시합니다. 이 기능을 활용함으로써 코드의 명확성과 견고성을 향상시키고, 더욱 정교한 애플리케이션 로직을 구현할 수 있습니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.