강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của rladygks12107433
rladygks12107433

câu hỏi đã được viết

Tìm hiểu NestJS bằng cách làm theo

Thực hiện chức năng đăng ký thành viên

회원가입 기능 구현 버전 변경에 따른 코드수정(해당 사항은 업데이트 예정이 없나요?)

Đã giải quyết

Viết

·

65

·

Đã chỉnh sửa

0

Custom Repository 부분에서 에러가 나서 해결 하긴 하였으나 맞는 과정인지는 잘 몰라 문의드립니다.

강의에서 사용하는 @EntityRepository방식은 구버전(0.2.x) 방식으로 최신버전에서는 제거되었습니다. 강의 코드를 그대로 따라하면 ... is not a function같은 에러가 발생합니다.

그래서

user.repository.ts, auth.modules.ts 수정, auth.service.ts를 수정

 1. user.repository.ts 수정 1. user.repository.ts 수정 Repository를 일반 서비스로 만들기 위한 핵심 작업입니다. 수정 내용: @EntityRepository(User) 데코레이터를 삭제하고 @Injectable()을 추가했습니다. Repository 클래스를 초기화하기 위해 constructor (생성자)를 추가하고, 그 안에서 super()를 호출했습니다.

// src/auth/user.repository.ts
import { Injectable } from '@nestjs/common';
import { DataSource, Repository } from 'typeorm';
import { User } from './user.entity';
// ...

@Injectable() // ✅ 변경
export class UserRepository extends Repository<User> {
  // ✅ 생성자 추가
  constructor(private dataSource: DataSource) {
    super(User, dataSource.createEntityManager());
  }

  async createUser(/* ... */): Promise<void> {
    // ...
  }
}

2. auth.service.ts 수정
-> providers 배열에 UserRepository를 추가했습니다.

이유: providers 배열에 등록해야만 AuthModule이 "아, UserRepository라는 서비스를 모듈로 포함시켰습니다.

// src/auth/auth.module.ts
import { UserRepository } from './user.repository';
// ...

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [AuthController],
  providers: [
    AuthService,
    UserRepository, // ✅ UserRepository를 providers에 등록
  ],
})
export class AuthModule {}

3.auth.service.ts 수정

> 서비스에서 Repository를 주입받는 방식을 변경합니다.

수정 내용: @InjectRepository(User) 데코레이터를 삭제하고, 생성자에서 UserRepository를 직접 타입으로 선언하여 주입받습니다.

이유: UserRepository는 이제 마법 같은 존재가 아닌 일반 서비스이므로, 다른 서비스를 주입받을 때와 똑같이 클래스 이름만으로 간단하게 주입받을수 있습니다.

// src/auth/auth.service.ts
import { Injectable } from '@nestjs/common';
import { UserRepository } from './user.repository';
// 🗑️ import { InjectRepository } from '@nestjs/typeorm'; <- 삭제

@Injectable()
export class AuthService {
  constructor(
    // 🗑️ @InjectRepository(User) <- 삭제
    private userRepository: UserRepository, // ✅ 직접 주입
  ) {}

  async signUp(/* ... */): Promise<void> {
    return this.userRepository.createUser(/* ... */);
  }
}

일단 이런식으로 수정했는데 이 과정이 맞는지는 잘 모르겠습니다! 강사님이나 따로 혹시 올라와 있는 코드가 있다면 참고해보겠습니다!

postgresqljwtnestjstypeorm

Câu trả lời 1

0

안녕하세요, 인프런 AI 인턴입니다.
rladygks1210님께서 질문하신 내용을 기반으로 해결 과정을 살펴보겠습니다. NestJS 프레임워크와 TypeORM의 최신 버전에서는 @EntityRepository 데코레이터가 더 이상 지원되지 않으며, 사용자 정의 리포지토리는 일반적인 서비스로 구현하는 것이 올바른 과정입니다.

제공해주신 코드 수정 방법에 대한 피드백을 드리자면:
1. user.repository.ts에서 @EntityRepository@Injectable로 대체하고, 생성자에 super(User, dataSource.createEntityManager())를 호출하여 Repository를 초기화하는 방식은 맞습니다. 이 방법으로 UserRepository를 일반 서비스로 등록할 수 있습니다.

  1. auth.module.ts 파일에서 UserRepositoryproviders에 등록한 것은 올바른 설정입니다. 이렇게 함으로써 NestJS의 DI(Dependency Injection) 시스템에서 이 서비스를 사용할 수 있습니다.

  2. auth.service.ts에서는 @InjectRepository를 사용하지 않고 UserRepository를 직접 주입받는 것이 최신 방식에 부합합니다. 이는 NestJS에서 일반적인 서비스 주입 방식과 동일하므로 맞는 접근입니다.

제거된 데코레이터의 사용 방식에 대해 더 많은 예제나 자료가 있을 경우, 강의 제공자에게 업데이트된 자료로 요청드릴 수 있습니다. 현재로서는 제공해주신 방법이 NestJS와 TypeORM의 최신 관행에 맞는 수정입니다.

참고로, 공식 문서에서 추가적인 정보를 확인해 보시면 도움이 될 수 있습니다.
- Spring Data JPA - Reference Documentation

Hình ảnh hồ sơ của rladygks12107433
rladygks12107433

câu hỏi đã được viết

Đặt câu hỏi