Nodejs

NodeJS typeORM 단방향 참조

_HelloWorld_ 2024. 12. 22. 10:50

ERD를 참고하여 DB모델 스키마 변경


사용자 테이블

@Entity('users')
export class UserEntity {
  @PrimaryGeneratedColumn('increment')
  id!: number;

  @Column({ type: 'varchar', length: 100 })
  username!: string;

  @Column({ type: 'varchar', length: 200, unique: true })
  email!: string;

  @Column({ type: 'varchar', length: 255 })
  password!: string;

  @Column({ type: 'varchar', length: 255, nullable: true })
  bio!: string;

  @Column({ type: 'varchar', length: 255, nullable: true })
  profile!: string;

  // 권한 ( 0: 일반 사용자, 1: 관리자 )
  @Column({ type: 'int2', default: 0 })
  role!: number;

  @CreateDateColumn()
  createdAt!: Date;

  @UpdateDateColumn()
  updatedAt!: Date;
}

토큰 테이블

@Entity('user_tokens')
export class UserTokenEntity {
  @PrimaryGeneratedColumn('increment')
  id!: number;

  // 사용자 ID를 명시적으로 지정
  @Column({ type: 'int' })
  userId!: number;

  // 사용자 테이블과의 관계 설정
  @OneToOne(() => UserEntity, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'userId' })
  user!: UserEntity;

  @Column({ type: 'varchar', length: 255 })
  token!: string;

  @Column({ type: 'timestamp' })
  expires_at!: Date;
}
  • 토큰 테이블에서는 로그인한 사용자 정보를 FK로 참조함 ( 객체 ) 
    • 또한 단순 Find 시에 사용자 객체를 가져오지 않고도 Id만을 사용할 수  있게 명시적으로 userId 컬럼 추가

단순 토큰 객체 조회

UserTokenEntity {
  id: 13,
  userId: 10,
  token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEwLCJyb2xlIjowLCJpYXQiOjE3MzQ4MzE3NjMsImV4cCI6MTczNDgzNTM2M30.uJ4G5_h3JDOnazqsEd_6N6sUEZ4xz0taQ5HpsJIMpSE',
  expires_at: 2024-12-22T02:42:43.854Z
}

 

토큰 객체 조회 및 사용자 객체 조회

UserTokenEntity {
  id: 14,
  userId: 10,
  token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEwLCJyb2xlIjowLCJpYXQiOjE3MzQ4MzE4MjYsImV4cCI6MTczNDgzNTQyNn0.Kxb7XRRbpRUKa0n5pltdPuE9dLtIk-OGRNKPwBheMf4',
  expires_at: 2024-12-22T02:43:46.596Z,
  user: UserEntity {
    id: 10,
    username: 'user1',
    email: 'user1@gmail.com',
    password: '$2a$10$mq6thYXnI6HsM9hX7.Iu1eHbofEH/idUpGuq9/JeTsk5ULUvZWDVi',
    bio: null,
    profile: '1734657578942-스크린샷 2024-12-19 10-07-09.png',
    role: 0,
    createdAt: 2024-12-19T16:19:39.013Z,
    updatedAt: 2024-12-19T16:19:39.013Z
  }
}

  • 단방향 참조 ( 1:1 ) 때문에 사용자 테이블에서는 토큰 테이블의 컬럼을 저장하지 않음
  • 또한 토큰 테이블에서는 사용자 ID를 컬럼으로 지정하지만 외래키 조인 필드는 사용자 객체로 지정

 

  • 위 이미지로 볼 수 있듯이 토큰 테이블 단순 조회 시에 사용자 Id 를 가져오는 모습과
  • 토큰 테이블 조회 동시에 사용자 객체도 가져와지는 모습

'Nodejs' 카테고리의 다른 글

NodeJS 사용자 정보 조회 기능 구현  (0) 2024.12.22
Service에서의 에러 핸들링 방법  (0) 2024.12.22
NodeJS 로그아웃 기능 구현  (1) 2024.12.20
NodeJS 로그인 기능 구현  (0) 2024.12.20
NodeJS 회원가입 기능 구현  (2) 2024.12.20