inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

질문있습니다

해결된 질문

160

Jack

작성한 질문수 11

1

안녕하세요 제로초님.

트랜잭션에서 nest-typeorm폴더를 보니 트랜잭션이 적용이 안되어 있어서 back폴더의 express로 nest와 비교하며 공부하고 있습니다

router.post("/workspaces"isLoggedInasync (reqresnext=> {
  const t = await sequelize.transaction();
  try {
    const exWorkspace = await Workspace.findOne({
      where: { url: req.body.url },
    });
    if (exWorkspace) {
      await t.rollback();
      return res.status(404).send("사용중인 워크스페이스 URL입니다.");
    }
    const workspace = await Workspace.create(
      {
        name: req.body.workspace,
        url: req.body.url,
        OwnerId: req.user.id,
      },
      {
        transaction: t,
      }
    );
    await workspace.addMembers(req.user.id, { transaction: t });

    const channel = await Channel.create(
      {
        name: "일반",
        WorkspaceId: workspace.id,
      },
      {
        transaction: t,
      }
    );

    await channel.addMembers(req.user.id, { transaction: t });
    await t.commit();
    return res.json(workspace);
  } catch (error) {
    await t.rollback();
    next(error);
  }
});

1. 제가 이해한게 맞는지 헷갈립니당.  

각각 네개의 Workspace.create,  workspace.addMembers,  Channel.create, channel.addMembers

에 두번째 인수로 transaction:t를 넣어주고 있는데 이는 이 네개중 하나라도 에러가 나면 모두 rollback되어서 4개 전부다 초기화 됩니다. 4개다 성공하면 commit되어 데이터베이스에 성공적으로 접근됩니다.

제가 이해한것이 맞나요?..

2.

 const workspace = await Workspace.create(
      {
        name: req.body.workspace,
        url: req.body.url,
        OwnerId: req.user.id,
      },
      {
        transaction: t,
      }
    );
    await workspace.addMembers(req.user.id, { transaction: t });

    const channel = await Channel.create({
      name: "일반",
      WorkspaceId: workspace.id,
    });

    await channel.addMembers(req.user.id);

그런데 만약  Workspace.create,  workspace.addMembers,에만 두번째 인수로 transaction:t를 넣어주고

Channel.create, channel.addMembers에는 transaction:t를 빼주면 Channel.create, channel.addMembers에는  transaction에 적용을 받지는 않지만 정상적으로 디비에 저장되어야 하지 않나요?. 실제로 실험해보니 저장이 안되네요. 왜 그런지 궁금합니다

3.

 if (exWorkspace) {
      await t.rollback();
      return res.status(404).send("사용중인 워크스페이스 URL입니다.");
   }

여기서 t.rollback이 왜 필요한지 궁금합니다.  이 코드를 기준으로 위에 코드에서 workspace를 find하는 코드이고 커밋이나 transaction:t 를 해준곳이 없고   , 또한 어차피  return되면 초기화일텐데 여기서 t.rollback()을 해주는게 궁금합니다.

nodejs express NestJS TypeORM

답변 1

0

제로초(조현영)

1. 네 맞습니다. 4개가 세트가 된다고 보시면 됩니다.

2. 저 부분은 저장이 되는게 맞다고 판단되는데요. 백엔드 서버 콘솔에 찍히는 SQL을 직접 봐서 무슨 일이 생기는지 확인해봐야할 것 같습니다.

3. 저 부분은 필요 없습니다만 항상 예외 때는 롤백 적어주는 습관을 들이는 게 좋습니다. 하나라도 빼먹으면 치명적이거든요.

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

0

141

4

질문 있습니다.

0

315

3

코드 편집기 확장 프로그램

0

220

2

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

0

161

2

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

0

177

3

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

0

161

2

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

0

197

2

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

0

305

4

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

0

247

2

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

0

245

2

RxJS 디버깅 질문 있습니다.

0

198

3

CacheManager에 대해 질문 있습니다.

0

184

2

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

0

237

1

CORS 질문 있습니다.

0

425

2

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

0

188

2

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

0

458

1

401 unauthorized문제

0

304

1

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

0

232

1

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

0

254

2

CORS 에러 질문 있습니다.

0

328

2

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

0

417

2

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

1

1166

3

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

0

462

1

start:dev-backup으로 돌리면 핫 리로딩이 되요 정상인가요?

0

324

1