상세 컨텐츠

본문 제목

[nestJS] @OneToMany((type) => Board, (board) => board.user, { eager: true }) boards: Board[] 이게 무슨문법인가

카테고리 없음

by esoesmio 2024. 5. 10. 13:14

본문

`@OneToMany` 데코레이터는 TypeORM에서 제공하는 데코레이터로, 엔티티 간의 일대다 관계를 설정할 때 사용됩니다. 이 구문을 사용하면 한 엔티티 인스턴스가 다수의 연관된 엔티티 인스턴스를 가질 수 있으며, 이 관계는 데이터베이스의 외래키를 통해 관리됩니다. 

### @OneToMany 구문 분석

```typescript

@OneToMany((type) => Board, (board) => board.user, { eager: true })
boards: Board[];


```

이 구문은 다음의 구성 요소로 이루어져 있습니다:

1. **첫 번째 파라미터 - (type) => Board**:
   - 이 함수는 관계의 타겟이 되는 엔티티 타입을 반환합니다. 여기서는 `Board` 엔티티가 타겟입니다.
   - `type`이라는 단어는 함수의 파라미터 이름으로, 실제로는 어떤 이름을 사용해도 괜찮습니다. 중요한 것은 이 파라미터가 관계를 맺을 타입을 반환한다는 점입니다.
   
2. **두 번째 파라미터 - (board) => board.user**:
   - 이 함수는 타겟 엔티티(`Board`)에서 연결된 소스 엔티티(`User`)를 참조하는 필드를 지정합니다.
   - 여기서 `board.user`는 `Board` 엔티티 내에 있는 `user` 필드를 의미합니다. 이 필드는 `Board`가 어떤 `User`에 속하는지를 나타내는 외래 키와 연결됩니다.
   
3. **세 번째 파라미터 - { eager: true }**:
   - 이 옵션은 로딩 전략을 설정합니다. `eager: true`는 `User` 엔티티를 조회할 때 관련된 `Board` 엔티티들이 자동으로 함께 로드되어야 함을 의미합니다. 즉, 사용자 정보를 조회하면 해당 사용자의 게시판 정보도 함께 가져옵니다.
   - 반대로 `lazy: true` 였다면, `Board` 엔티티는 필요할 때만 별도로 로드되며, 이 경우 관련 필드는 프라미스 형태로 제공됩니다.

### 속성 - boards: Board[]

- `boards`는 `User` 엔티티가 연관된 `Board` 엔티티들의 배열을 저장하는 필드입니다. 이 필드를 통해 특정 사용자가 소유한 모든 게시판에 접근할 수 있습니다.
- 이 배열은 데이터베이스의 `Board` 테이블에서 해당 `User`의 `id`를 외래 키로 사용하는 모든 로우를 포함합니다.

### 사용 예

```typescript

let user = userRepository.findOne({ id: 1 }, { relations: ["boards"] });
console.log(user.boards); // 이 사용자의 모든 게시판 출력


```

이 구문은 사용자와 그 사용자의 게시판을 함께 로드하는 일반적인 사용 예를 보여줍니다. `@OneToMany` 설정 덕분에, `boards` 필드를 통해 간단히 사용자가 소유한 모든 게시판에 접근할 수 있습니다. 이러한 설정은 데이터베이스 설계에서 중요한 관계를 표현하고 객체 지향적으로 데이터를 관리하는 데 도움을 줍니다.

댓글 영역