링크게더 프로젝트 - transaction

CH_Hwang·2022년 10월 31일
0

LinkGather

목록 보기
6/10

네스트를 사용하던 중 난관에 부딪혔다. transaction이 너무 어렵다...

기존에 koa 서버에서 transaction을 관리할때는 request마다 매니저를 사용하고 있고 transaction이 걸린 method를 사용할때는 typedi 라이브러리의 context에 담겨져있는 manager를 사용하여 해당 서비스에서 사용하는 manager를 모두 context에 담겨져있는 manager로 대체하여 transaction을 해주었다..

똑같은 방식으로 global module에서 provider를 통해 entityManager를 저장해주었고 request마다 생성되도록 해주었는데 해당방식이 무언가 잘못되었는지 다르게 된다.

아마도 nest.js의 싱글톤 방식때문인 것 같은데 시작될때 프로바이더 인스턴스가 전부 생성되는 방식이라서 매니저가 바뀌지 않아서 롤백이 되지 않는것 같다.

해당방법을 해결하기위한 가설을 세워봤을때

  1. middleware를 이용하여 repository에 엔티티를 저장한다....?
  2. Provider가 생성될때는 각각의 entity manager를 가지고 행동하다가 transactional에서 전역 transactionManager (고립되어 생성된 어떤 전역상수....? 잘 모르겠다..)를 이용한다...
  3. 현재 매니저를 글로벌 module에서 생성중인데 해당 모듈을 갈아치운다. -> database 실행 모듈도 따로..?

현재 프로젝트는 설문조사 설계중!

2022-11-05
transaction을 일단 대충이라도 만들었다.

service와 repository 클래스가 서로 같은 모듈의 inject한 entityManager 가 서로 다른 매니저여서 service단에서 해당 manager를 아무리 바꿔도 repository단에서 일어나는 transaction을 막을 수가 없다.

그래서 service단에서 repository의 매니저를 전부 돌아서 바꿔주는 방식으로 일단 transaction을 걸었다...

추후에 더 좋은 방법이 생각나면 추가로 수정할 것.

현재 프로젝트는 설문조사중!

0개의 댓글