문제 발생 상황
user 와 게시물의 1:N 관계를 맺은 후
게시물을 올리는 유저의 이 메일을 이용하여 유저정보를 검색하려는 상황에서 발생
코드
board.service.ts
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { WriteBoardRequestDto } from './dto/writeBoard.request.dto';
import { WriteBoardResponseDto } from './dto/writeBoard.response.dto';
import { DataSource, Repository } from 'typeorm';
import { Board } from './board.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { UpdateBoardRequestDto } from './dto/updateBoard.request.dto';
import { UpdateBoardResponseDto } from './dto/updateBoard.response.dto';
import { SearchKeywordBoardResponseDto } from './dto/searchKeywordBoard.response.dto';
import { User } from '../User.entity';
import { SnakeNamingStrategy } from 'typeorm-naming-strategies';
import { AppModule } from '../app.module';
@Injectable()
export class BoardService {
constructor(
@InjectRepository(Board)
private readonly boardRepository: Repository<Board>,
) {}
async write(
writeBoardRequestDto: WriteBoardRequestDto,
): Promise<WriteBoardResponseDto> {
const { title, content, email } = writeBoardRequestDto;
const dataSource = new DataSource({
type: 'mysql',
host: 'localhost', //'127.0.0.1',
port: 3306,
username: 'root',
password: '',
database: 'test_typeORM',
entities: [User],
synchronize: false, // true : 동기화가 되지만 데이터가 다 날라간다.
logging: true,
namingStrategy: new SnakeNamingStrategy(),
});
const userRepository = dataSource.getRepository(User);
const user = await userRepository.findOne({ where: { email: email } }); // 에러 발생
const newMessage = new Board();
newMessage.title = title;
newMessage.content = content;
newMessage.user = postingUser;
const savedBoard = await this.boardRepository.save(newMessage);
return new WriteBoardResponseDto(
savedBoard.id,
savedBoard.title,
savedBoard.content,
savedBoard.user,
);
}
에러메세지
ERROR [ExceptionsHandler] No metadata for "User" was found.
EntityMetadataNotFoundError: No metadata for "User" was found.
에러발생 위치 및 원인 파악
User 의 위치를 확인해보니 위치는 맞았다.
User 엔티티가 잘못되었나 해서 유저를 생성하는 서비스에서 확인을 해보니 잘 생성되었다.
그러면 문제는 userRepository를 생성하는 과정에서 문제가 있다는 걸로 확인하고
해결 시도 1
constructor 에 추가를 해보았다.
constructor(
@InjectRepository(Board)
private readonly boardRepository: Repository<Board>,
@InjectRepository(User)
private readonly userRepository: Repository<User>,
) {}
이렇게 선언을 하고 나니 서버자체가 실행되지 않았다.
에러메세지
Nest can't resolve dependencies of the BoardService (BoardRepository, ?). Please make sure that the argument "UserRepository" at index [1] is available in the BoardModule context.
.... 두개의 레포지터리를 사용하는 것이 안되나 보다
해결 시도 2
TypeORM 공식문서에서 레포지토리를 사용하는 다른 방법을 찾아보았다.
https://www.npmjs.com/package/typeorm
ActiveRecord implementation 를 하는 방법이 있다는 것을 발견
// user.entity.ts
@Entity('users') //생성할 데이터 테이블의 이름을 적는다.
export class User {
// 코드...
}
// 아래로 변경 extends BaseEntity 추가
export class User extends BaseEntity {
// 코드...
}
이제 아래와 같이 사용이 가능하다.
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.age = 25
await user.save()
const allUsers = await User.find()
const firstUser = await User.findOneBy({
id: 1,
})
const timber = await User.findOneBy({
firstName: "Timber",
lastName: "Saw"
})
await timber.remove()
일단은 해결이 되었다.
'프로그래밍 > Nest.js' 카테고리의 다른 글
[ NestJS ] [TypeORM ] N : M 관계 형성 (0) | 2024.04.27 |
---|---|
[ NestJS ] [ TypeORM ] 1: N 관계 형성, 수정, 삭제 (0) | 2024.04.27 |
[ NestJS ] Modules (0) | 2024.04.18 |
[ NestJS ] Providers (0) | 2024.04.18 |
[NestJS] TypeORM 설정방법 (0) | 2024.04.17 |