강의

멘토링

로드맵

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

rladygks1210님의 프로필 이미지
rladygks1210

작성한 질문수

따라하며 배우는 NestJS

회원가입 기능 구현

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

작성

·

8

·

수정됨

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(/* ... */);
  }
}

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

답변 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

rladygks1210님의 프로필 이미지
rladygks1210

작성한 질문수

질문하기