Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] feature : 트랜잭션 AOP 분리 #242

Merged
merged 4 commits into from
Dec 12, 2023

Conversation

HKLeeeee
Copy link
Collaborator

PR 설명

  • 트랜잭션 AOP 분리

✅ 완료한 기능 명세

  • Transactional 데코레이터 생성
  • AsyncLocalStorage 적용
  • Typeorm Transactional
  • Mongoose Transactional

📸 스크린샷

고민과 해결과정

기존 코드의 문제점

  • 트랜잭션을 적용하기 위해서 매번 트랜잭션을 시작하고 commit / rollback 해주어야했음
  • 인터셉터로 구현하게 되면 컨트롤러 레벨에 적용해야해서, 무조건 라우트 핸들러 하나가 한 트랜잭션으로 작동해야함

해결

  • 자바에서 ThreadLocalStorage를 활용하여 트랜잭션을 구현하는 것처럼 노드에서는 asyncLocalStorage를 활용할 수 있음
    asyncLocalStorage에 쿼리러너를 저장해서 한 요청에서 계속 그 스토리지에 접근해서 값을 전역으로 이용할 수 있다.
    이를 활용해서 트랜잭션을 담당하는 데코레이터를 만들어서 처리.

NestJS 라이프 사이클에 맞는 데코레이터를 만들어주는 것이 어려웠는데,
메타데이터를 등록해주고, OnModuleInit, DiscoveryService를 이용해서 데코레이터를 만들수 있었다.

참고
https://toss.tech/article/nestjs-custom-decorator
https://github.com/boostcampwm2023/iOS02-moti/tree/develop
https://nodejs.org/api/async_context.html#asynclocalstoragegetstore

@HKLeeeee HKLeeeee self-assigned this Dec 11, 2023
@HKLeeeee HKLeeeee added feature 기능 구현 BackEnd 백엔드 관련 labels Dec 11, 2023
@HKLeeeee HKLeeeee requested a review from Gseungmin December 11, 2023 12:11
TRANSACTIONAL_KEY,
originalMethod,
);
switch (metadata) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SWITCH 문도 좋은데 Early Return 패턴 적용해보는 것도 좋을것 같아요! 물론 지금도 좋습니다!

}
const result = await this.codesService.delete(userID, id);
if (result.deletedCount <= 0) throw new ResourceNotFound();
return { message: 'delete success' };
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dto로 처리해도 좋을것 같아요!

@Gseungmin
Copy link
Member

LGTM!

@Gseungmin Gseungmin merged commit c383286 into boostcampwm2023:dev Dec 12, 2023
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BackEnd 백엔드 관련 feature 기능 구현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants