Nestjs-TypeORM으로 Backend프로그램을 개발하는 도중에
서론
DB Connection 로직과 Transaction 관리하는 부분을 모듈화 하기로했다.
가장 처음에 적용한 방법은 아래와 같다.
1. Interceptor에서 Transaction, DB Connection 관리하기
NestJS의 Interceptor는 Spring의 AOP와 맥을 같이한다. 그리고 많은 NestJS 예제들도 Interceptor에서 DBConnection과 Transaction을 관리하고 있어서 Interceptor에서 Transaction을 관리하기로 했다.
작동은 잘됐지만 두가지 문제가 생겼다. 1) TransactionNorStartedError : Transaction is not started yet, start transaction before committing or rolling it back 오류 발생. 그리고 2)Interceptor로 관리를 하면 Service계층이 아닌 Controller계층에서 Transaction이 관리되는 문제이다.
1) TransactionNorStartedError : Transaction is not started yet, start transaction before committing or rolling it back
먼저 이 첫번 째 문제는 Rollback을 하려고하는데 Transaction이 시작된적이 없다는 오류이다. 백엔드 서버는 Socket 과 Rest통신에서 각각 두개의 Transaction Interceptor를 등록하여 따로 관리하고있었다. 그리고 여기서 Transaction의 무결성이 깨지는 오류가 발생하였다고 판단하였다.
임시방편으로 한 Interceptor에서 Transaction 로직을 주석처리해주면 오류는 발생하지 않았지만, Transaction관리가 되지 않아 또다시 무결성이 깨지게 되었다.
2) Interceptor로 Transaction을 관리하면 Service계층이 아닌 Controller계층에서 Transaction이 관리되는 문제
transaction은 Service 계층에서 관리하는것이 효율적이다. 말그대로 서비스 로직과 Respository 로직이 Service 단에 있기 때문이다. 그런데 Interceptor를 사용하면 Controller 부터 Transaction을 관리하게 된다.
이러한 문제들로 인해 새로운 방법을 찾아야했다. 새롭게 적용한 방법은 다음과같다.
2. typeorm-transactional 라이브러리를 사용하여 Transaction을 관리하기
Interceptor로 Transaction을 관리할 때 발생하는 문제를 해결하기 위해 찾은것이 typeorm-transactional 라이브러리를 사용하여 Transaction을 관리하는 것이다. 이 라이브러리는 데코레이터 하나로 Transaction을 기깔나게 관리해준다. 물론 NestJS-TypeORM에서 제공하는 Transaction 관리 데코레이터도 있지만 공식문서에서 지양하라고 나와있기 때문에 사용하지 않았다.
typeorm-transactional 라이브러리를 알게된 경로는, 회사 선배에게 이 문제를 공유했는데 선배는 Spring으로 개발을하다가 동일한 오류를 겪었고 오류를 해결한 방법과 동일한 방법이 NestJS에도 있을거라며 함께 찾아주어 알게되었다.
이 라이브러리를 사용한 기록은 아래 링크를 참고 !
본론
아무튼 이렇게 typeorm-transactional 라이브러리를 사용하여 Transaction을 관리하였고, 이전의 생긴 문제들을 해결하였는데 또다른 문제가 생겼다.
@Transactional() 데코레이터를 적용한 Service 단에서 오류가 Catch되지 않는 것이다 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'Study > NestJS' 카테고리의 다른 글
| TypeOrm) typeorm-transactional 라이브러리로 transaction 관리하기 (0) | 2024.07.17 |
|---|---|
| NestJS JWT 오류 해결 secretOrPrivateKey must have a value (0) | 2023.06.16 |