문제 발생 상황

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

+ Recent posts