레일즈 애플리케이션에서의 사용자 아이덴티티 분석

Identifying User Identity / MOROHASHI Kyosuke - Kaigi on Rails 2024

3줄 요약

  • 레일즈에서 사용자 아이덴티티는 본질적으로 '존재' 자체를 의미하며, User 모델은 최소한의 정보만 가집니다.
  • 프로필, 인증 정보 등은 별도 테이블로 분리하여 관리하며, 이는 데이터 모델의 명확성을 높입니다.
  • 이러한 구조는 회원가입, 로그인, 탈퇴 등 복잡한 사용자 관련 기능을 체계적으로 구현하는 데 유리합니다.

본 발표는 Ruby on Rails 애플리케이션에서 '사용자(User)'의 아이덴티티를 어떻게 정의하고 효율적으로 구현할 것인가에 대해 다룹니다. 일반적으로 User 모델에 사용자의 모든 정보를 집중시키는 경향이 있지만, 발표자는 사용자의 본질적인 '존재'에 초점을 맞추고 관련 데이터를 구조적으로 분리하여 관리하는 접근 방식을 제안하며, 이를 통해 사용자 관리 기능 구현의 복잡성을 해소하고 유연성을 확보할 수 있음을 강조합니다.

레일즈 애플리케이션 내에서 사용자는 서비스 상에서 식별되는 ‘하나의 주체’를 의미합니다. 발표자는 User 모델이 이 ‘존재’ 자체를 표현해야 하며, 이를 위해 기본적으로 주 식별자(ID)만으로 충분하다고 주장합니다. 사용자 이름, 이메일, 프로필 정보 등은 UserProfile, UserCredential과 같이 데이터의 성격에 따라 별도의 테이블로 분리하고, User 모델과 belongs_to :user 관계로 연결하는 방식을 권장합니다. 이러한 분리는 User 테이블을 ‘현재 존재하는 사용자’만을 나타내도록 유지하고, 정보 유형별 관리 및 보안에 유리합니다.

로그인 기능은 요청을 보낸 사용자가 누구인지 식별하는 과정입니다. current_user와 같은 헬퍼 메서드를 통해 세션에 저장된 사용자 ID로 User 인스턴스를 가져와 사용자의 소유 데이터에 접근합니다. 로그인 조작 자체는 사용자 입력 정보(예: 패스워드)와 서버 정보를 대조하여 본인임을 확인한 후, 해당 사용자의 ID를 세션에 저장하는 방식으로 구현됩니다.

회원가입 시 사용자의 아이덴티티는 가입 절차가 ‘완료’될 때 비로소 생성됩니다. 가입 과정 중에는 UserRegistration과 같은 임시 모델을 사용하여 입력 데이터를 관리하고, 가입 완료 시점에 User 레코드를 생성하고 관련 데이터를 연결합니다. 이는 가입 중인 사용자와 가입 완료된 사용자를 명확히 구분하여 User 테이블을 깔끔하게 유지하는 데 도움을 줍니다.

회원 탈퇴 시에도 사용자의 ‘존재했던 사실’은 기록으로 남습니다. User 테이블의 레코드는 유지하되, UserCredential과 같은 개인 정보는 삭제하여 탈퇴 상태를 표현합니다. 이를 통해 외래 키 제약을 유지하며 사용자의 과거 활동 기록(예: 결제 내역)을 보존할 수 있습니다.

마지막으로 관리 스태프와 같은 특수 사용자는 일반 사용자와 역할 및 목적이 다르므로, 동일한 User 모델의 권한 차이로 구현하기보다 별도의 아이덴티티 풀로 분리하고 관리 기능을 독립적으로 구현하는 것이 인가(Authorization) 로직의 복잡성을 줄이는 데 효과적입니다.

사용자 아이덴티티의 핵심을 '존재'로 정의하고, 관련 데이터를 기능별/성격별로 분리하여 모델링하는 접근 방식은 레일즈 애플리케이션에서 사용자 관리 기능을 구현할 때 발생하는 여러 복잡성을 관리 가능하게 만듭니다. 이는 초기 개발뿐만 아니라 서비스가 성장함에 따라 발생하는 다양한 기능 추가 및 변경 요구사항에 유연하게 대처할 수 있는 기반을 마련해 줍니다. 데이터 모델을 명확히 하고 각 기능을 책임에 따라 분리함으로써, 보다 견고하고 확장성 있는 애플리케이션을 구축할 수 있습니다.