https://github.com/Aliheym/typeorm-transactional
스프링 쓰는 사람들은 메서드 위에 어노테이션 달아서 트랜잭션으로 묶는 게 자연스럽겠지만
놀랍게도 노드 진영의 대표적인 orm인 typeorm은 그런 방법을 공식적으로 지원하지 않는다.
(예전 버전엔 비슷한 게 있었떤 거 같은데 deprecated 되었음)
그래서 저렇게 누가 따로 만든 라이브러리를 많이 쓰는 것 같은데 저걸 쓰면 어노테이션처럼 메서드 데코레이터를 써서
@Transactional()
function example(){}
이렇게 간단히 힌 트랜잭션으로 묶는 게 가능해진다.... 근데 그걸 어케 했나 궁금해서 예전에 찾아봤거든?
typeorm의 리파지토리, 쿼리빌더 등의 함수들을 걍 몽키패칭해서 그 함수들이 실행될때 트랜잭션을 생성하고
그 트랜잭션을 비동기 컨텍스트 안에 담아서 물고 빨고 하는거더라.
근데 mongoDB도 4.0부턴가 여러 컬렉션에 걸친 작업을 한 트랜잭션으로 묶는 게 지원이 되어서
mongoose의 경우엔 session을 넘기면서 session.startTransaction() <== 이런 식으로 트랜잭션 시작, 롤백, 커밋 하게끔 되어있음
그럼 똑같이 session을 컨텍스트에 바인드 시켜서 typeorm-transactional과 비슷하게 동작하는 라이브러리가 분명 있을텐데
대충 찾아보긴 했지만 없는 것 같다. 없을 이유가 있나??? 몽고는 트랜잭션 쓰는 게 안티패턴인가??
여기 99퍼가 대기업도 못가서 빌빌거리는 새끼들인 건 알지만
혹시라도 이 글을 보는 누군가가 제말 mongoose-transactional" 같은 라이브러리좀 만들어줘라
내가 만들고 싶은데 난 달에 외주 2~3개씩 치면서 돈버느라 시간이 없음
오
찾아보니 mongoose-transaction-decorator라고 누가 만든게 있긴한데 허접하네
돈좀
솔직히 트랜잭션 commit만 호출하면 되는데 굳이 길지도않은 코드를 어노테이션으로 뺄필요는 없는듯ㅋ 겉멋충인듯
ㄴㄴ 저렇게 하는 건 서비스 코드 오염도를 최소화 할 수 있어서지 멋 때문이 아님. 포트 어댑터 패턴에서 트랜잭션을 콜백형태로만 지원하는 라이브러리 쓰기가 참 애매한데, 저런 식으로하면 데코레이터 자체를 인터페이스처럼 쓸 수가 있어서 좋음
몽구스 쓰다 갑자기 typeorm 쓴다 해도 데코레이터 구현을 어댑터 쪽에서 하면 깔끔하게 관심사 분리가 가능함
저는 그냥 코드끝나고 commit 호출하는게 더 깔끔헤보임ㅋ 언제커밋하는지도 눈에 보이고
관심사분리 어쩌고하다가 코드가 복잡해지는 느낌이랄까요? 트랜잭션 여러개 쓰고있으면 언제커밋하는지 대중개발자 입장에서 명확하지 않고 헷갈리기도 하고말이죠
맞긴함ㅇㅇ 오히려 유지보수성 좋은 코드기 헷갈릴 수 있음 그래서 주니어들이 오픈소스 못 뜯어보잖음
저 병신 라이브러리 쓰지마셈