earthkingman / 42Swim

42서울 QnA 서비스
14 stars 3 forks source link

data mapper pattern #40

Closed hainho closed 2 years ago

hainho commented 3 years ago

제목

data mapper pattern

이슈에 대한 설명

active recode pattern 으로 프로젝트를 진행하다 data mapper pattern으로 변경하였다 이 둘의 차이점과 이 프로젝트에서 적용된 data mapper pattern에 대한 설명

checkList

active recode pattern entity model을 정의할 때 baseEntity 를 상속 받아서 db에 접근을 model이 직접 하는 방식 model에 baseEntity를 상속하기 때문에 model이 무겁다

data mapper pattern entity model을 정의할 때 baseEntity를 상속 받지 않고 model의 요소만 정의해주는 방식 model에 요소만 정의해주기 때문에 가볍다. db에 접근은 repository를 통해서 수행한다. repository는 디폴트 repository를 사용할 수도 있고 필요에 따라서 custom repository를 생성하는 방법으로도 가능하다

프로젝트에 적용된 data mapper pattern 아직 복잡한 db 작업이 필요하지 않아서 디폴트 repository를 사용하여 db 작업을 하고 있다. 이후 필요에 따라서 custom repository를 추가할 계획이다.

service getRepository를 통해 레포지토리를 가져와 db 작업을 진행하는 것은 service 에서 진행하고 있다. controller는 db 작업이 필요할 때 service를 호출하여 service 가 해당 작업을 수행하도록 한다. 이렇게 파일별로 역할을 분리하면 코드가 더 명확해진다.

transaction service 에서는 한번에 여러가지 db 추가 삭제 수정을 하는 경우에는 중간에 에러가 발생했을 때 rollback을 해준다. 예를들어 돈을 송금할 때 내 계좌에서 돈이 빠져나가고 상대 계좌에 돈이 들어가야하는데 그 중간에 에러가 발생하면 내 계좌에서 돈이 빠져나가지만 상대 계좌에 돈이 들어가지 않게 된다 이때 롤백을 해주면 내 계좌에 돈이 빠져나간 것이 취소가 되어 큰 문제가 발생하는 것을 막을 수 있다.

queryRunner 쿼리러너를 사용하여 transaction을 수행했다. 이때 getRepository 는 queryRunner.manager를 통해서 수행주어야 transaction과 repository가 같은 connection을 가져서 transaction이 정상적으로 이루어 질 수 있다. 만약 getRepository를 따로 수행한다면 해당 작업은 transaction에서 제외된다.

주의사항

active recode pattern을 data mapper pattern을 바꾸며 기존의 함수들이 잘 작동하는지 많은 테스트가 필요했다. 그때마다 postman을 작성하여 테스트를 수행했는데 여기에서 많은 시간을 사용했다. 테스트 코드를 작성의 필요성이 느껴진다.

queryBuilder 디폴트 repository에 있는 save를 사용하는 것과 queryBuilder를 사용하는 것에서 성능 차이가 있다 https://github.com/typeorm/typeorm/blob/master/docs/relational-query-builder.md 자세한 정보는 찾을수 가 없어 다른 이슈에서 다시 정리 예정이다.

참고

https://github.com/ZeroCho/sleact/blob/master/nest-typeorm/src/users/users.service.ts https://github.com/typeorm/typeorm/blob/master/docs/query-runner.md https://github.com/typeorm/typeorm/blob/master/docs/relational-query-builder.md https://velog.io/@leeinae/TypeORM-TypeORM%EC%9D%98-%ED%8C%A8%ED%84%B4%EB%93%A4%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90