inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

typeorm을 더 좋아하는 이유

createWorkspaceMembers 도 transaction 걸어줘야 하나요?

해결된 질문

372

miniapp

작성한 질문수 9

0

안녕하세요 이장우 닮은 제로초 선생님,

// workspaces.service.ts

async createWorkspaceMembers(url: string, email: string) {
    const workspace = await this.workspacesRepository.findOne({
      where: { url },
      relations: ['Channels'],
    });

    // queryBuilder 버전
    this.workspacesRepository
      .createQueryBuilder('workspaces')
      // typeorm은 innerJoin 하면 join한 테이블은 가져오지 않는데,
      // innerJoinAndSelect을 하면 join한 테이블을 다 가져온다.
      .innerJoinAndSelect('workspaces.Channels', 'channels')
      .getOne();

    const user = await this.usersRepository.findOne({ where: { email } });
    if (!user) return null;

    const workspaceMember = new WorkspaceMembers();
    workspaceMember.WorkspaceId = workspace.id;
    workspaceMember.UserId = user.id;
    await this.workspaceMembersRepository.save(workspaceMember);

    const channelMember = new ChannelMembers();
    channelMember.ChannelId = workspace.Channels.find(
      (v) => v.name === '일반',
    ).id;
    channelMember.UserId = user.id;
    await this.channelMembersRepository.save(channelMember);
  }

강의에서 위와 같이 createWorkspaceMembers 를 작성하셨는데, 여기도 transaction을 걸어주는게 낫겠죠?

걸어주는게 맞다면, 아래와 같이 하면 되나요?

 async createWorkspaceMembers(url: string, email: string) {
    const queryRunner = this.dataSource.createQueryRunner();
    await queryRunner.connect();
    await queryRunner.startTransaction();
  
    try {
      const workspace = await queryRunner.manager.findOne(Workspaces, {
        where: { url },
        relations: ['Channels'],
      });
  
      const user = await queryRunner.manager.findOne(Users, { where: { email } });
      if (!user) return null;
  
      const workspaceMember = new WorkspaceMembers();
      workspaceMember.WorkspaceId = workspace.id;
      workspaceMember.UserId = user.id;
      await queryRunner.manager.save(workspaceMember);
  
      const channelMember = new ChannelMembers();
      channelMember.ChannelId = workspace.Channels.find(
        (v) => v.name === '일반',
      ).id;
      channelMember.UserId = user.id;
      await queryRunner.manager.save(channelMember);
  
      await queryRunner.commitTransaction();
    } catch (error) {
      console.error(error);
      await queryRunner.rollbackTransaction();
    } finally {
      await queryRunner.release();
    }
  }

node.js express nestjs typeorm

답변 1

1

제로초(조현영)

네 맞습니다. 웬만하면 다 그렇게 걸어주는 게 좋습니다.

강의자료는 어디서 다운받나요?

0

147

4

질문 있습니다.

0

323

3

(강의 5:42 질문) providers를 통한 여러 개의 인스턴스 생성 & exports 통한 싱글톤 생성

0

169

2

코드 편집기 확장 프로그램

0

222

2

(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?

0

165

2

(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문

0

182

3

로그인을 해도 LoggedInGuard쪽에서 false값이 나옵니다.

0

164

2

로그인방법이 고민됩니다.

0

197

2

yarn seed 명령어 실행 시 데이터 삽입 안됨

0

310

4

yarn run db:create 시에 발생하는 데코레이터 오류

0

252

2

npm run db:create 시에 발생하는 decorating 오류

0

248

2

RxJS 디버깅 질문 있습니다.

0

202

3

CacheManager에 대해 질문 있습니다.

0

185

2

로깅은 어떻게 하는게 효율적일까요?

0

242

1

CORS 질문 있습니다.

0

429

2

쿠키 옵션에 대해서 질문 있습니다.

0

193

2

로그아웃 요청이 403 forbidden 에러가 나는데 왜그런걸까요??

0

459

1

401 unauthorized문제

0

306

1

가드의 장점에 대해서 질문이 있습니다.

0

235

1

로그 관리에 대해 질문 있습니다.

0

258

2

CORS 에러 질문 있습니다.

0

330

2

배포 환경 DB 연결 질문 있습니다.

0

418

2

socket io 미 연결 문제 (nest & flutter)

1

1170

3

no elements in sequence 에러 관해서 질문이 있습니다.

0

467

1