인프런 커뮤니티 질문&답변
typeORM과 몽구스 비교 질문 드립니다
작성
·
901
1
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
typeorm의 경우 imports의 forFeature에서 entity를 직접 넣어주고, providers에 repository를 삽입하지 않고 repository.ts를 만들지 않더라도 서비스에서 바로 Repository<DTO> 처럼 typeORM 제공 레포지토리를 이용해서 사용할 수 있는 것으로 알고 있습니다.
몽구스와 typeORM의 차이 때문에 그런 것 같은데, 몽구스의 경우 레포지토리 패턴을 사용하려면 항상 repository.ts를 만든 뒤 providers에 직접적으로 Repository를 입력해주어야 하나요?
답변 1
3
안녕하세요!
좋은 질문입니다. 추가로 제작하고 있는 TypeORM 보너스 강좌에서 설명드릴 예정이였는데,
먼저 레포지토리 패턴이란 "(서비스) 레이어에서 데이터의 출처에 관계 없이 동일한 방식으로 데이터를 쿼리(사용)할 수 있는 패턴"입니다.(데이터베이스 캡슐화) 데이터 중앙 처리 방식으로, 특정 서비스 레이어 뿐만 아니라 어떤 레이어에서든 중앙의 레포지토리에 접근하여 재사용성도 증가 시킬 수 있습니다.
사실 MySQL, PostgreSQL 등 디비에 직접적으로 접근하지 않고 TypeORM에서 제공해주는 동일한 메서드를 사용하는 것 자체가 레포지토리 패턴입니다. 그 이유는 MySQL이든, PostgreSQL이든, MariaDB든 관계 없이 TypeORM에서는 아래와 같은 usersRepository를 제공해주고 동일한 방식으로 데이터를 사용할 수 있기 때문입니다.

하지만 Mongoose의 경우에는 TypeORM과는 달리 MongoDB만 지원합니다. 따라서 아래와 같이 의존성 주입해서 사용한다면 MongoDB만 사용해야 합니다. 따라서 저희는 레포지토리를 따로 만들어서 사용을 했었습니다. ![]()
하지만 MongoDB 특성상 SQL과는 달리 쿼리 자체가 자바스크립트에 친숙하게 설계가 되어 있어서 mongoose에서 사용하는 쿼리(예를들어, findOne, find 등)가 TypeORM에서 사용하는 레포지토리의 메서드(findOne 등)와 비슷합니다. 즉, MongoDB는 로우 쿼리조차 레포지토리 패턴을 적용한 것처럼 쉽게 사용할 수 있었던 것이죠.
하지만 데이터베이스가 변경되거나 여러 데이터베이스를 사용하는 경우, 여러 서비스 레이어에서 동일한 인터페이스로 데이터베이스에 접근하는 경우 등의 이유로 레포지토리를 따로 만들었습니다.
이렇게 레포지토리 패턴으로 분리를 했을 때 이점을 생각해 보면, 만일 MongoDB에서 DynamoDB로 바꾼다고 가정합시다. 이때 저희는 레포지토리 패턴만 수정한다면 서비스 자체에 접근하지 않고도 쉽게 수정할 수 있습니다. (레포지토리 패턴의 findUserByEmail 부분의 쿼리를 DynamoDB에 맞게 조금만 수정하면 되는 것이죠.)
TypeORM의 경우에는 MySQL을 사용하다가 PostgreSQL로 바꾼다고 가정한다면 TypeORM에서 이를 반영하여 자동으로 repository를 제공해줍니다. 따라서 저희는 서비스 로직에서 TypeORM 레포지토리 메서드 몇개만 수정해주면 되는 것이죠. (이때 TypeORM 자체에서 제공해주는 레포지토리 메서드가 많이 바뀐다고 한다면 레이어를 한 개 더 만들어서 두 번 적용할 수도 있습니다.)
레포지토리 패턴을 필수로 적용할 필요는 없습니다. 다만 적용한다면, 프로젝트가 커질때 재사용성을 증가시킬 수 있고 데이터베이스 스팩이 바뀌어도 유지보수가 편리해집니다. (만일 MongoDB만을 사용하는 프로젝트이고 특별한 이유가 없다면 레포지토리 파일을 따로 만들어 패턴을 적용 시킬 필요는 크게 없다고 할 수 있습니다.)
이해가 되지 않는 부분은 언제든 답글 달아주세요!
감사합니다.





.png?w=112)