작성
·
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
를 일반 서비스로 등록할 수 있습니다.
auth.module.ts
파일에서 UserRepository
를 providers
에 등록한 것은 올바른 설정입니다. 이렇게 함으로써 NestJS의 DI(Dependency Injection) 시스템에서 이 서비스를 사용할 수 있습니다.
auth.service.ts
에서는 @InjectRepository
를 사용하지 않고 UserRepository
를 직접 주입받는 것이 최신 방식에 부합합니다. 이는 NestJS에서 일반적인 서비스 주입 방식과 동일하므로 맞는 접근입니다.
제거된 데코레이터의 사용 방식에 대해 더 많은 예제나 자료가 있을 경우, 강의 제공자에게 업데이트된 자료로 요청드릴 수 있습니다. 현재로서는 제공해주신 방법이 NestJS와 TypeORM의 최신 관행에 맞는 수정입니다.
참고로, 공식 문서에서 추가적인 정보를 확인해 보시면 도움이 될 수 있습니다.
- Spring Data JPA - Reference Documentation