어떤 ORM 을 사용해야 할까?
선택 후보군
Prisma
장점:
- TypeScript 통합: Prisma는 TypeScript를 기본 언어로 지원하므로 Nest.js와 함께 사용하기에 이상적입니다. 타입 안정성을 보장하고 개발자들이 더 쉽게 협업할 수 있습니다.
- 선언적 모델 정의: Prisma는 선언적 데이터 모델 정의를 제공하여 데이터베이스 스키마를 쉽게 관리하고 변경할 수 있습니다.
- 쉬운 쿼리 빌더: Prisma는 간단하고 직관적인 쿼리 빌더를 제공하여 데이터베이스 쿼리 작성을 간단하게 만듭니다.
- ORM 및 데이터베이스 마이그레이션: Prisma는 ORM 기능과 데이터베이스 마이그레이션을 함께 제공하여 데이터베이스 스키마를 쉽게 관리할 수 있습니다.
단점:
- 상대적으로 새로운 라이브러리: Prisma는 비교적 새로운 라이브러리이므로 커뮤니티 및 생태계가 다른 ORM 라이브러리보다는 작을 수 있습니다.
- 모든 데이터베이스 지원하지 않음: Prisma는 현재 PostgreSQL, MySQL, SQLite를 공식적으로 지원하지만 다른 데이터베이스와의 통합이 제한될 수 있습니다.
Sequelize
장점:
- 다양한 데이터베이스 지원: Sequelize는 PostgreSQL, MySQL, SQLite, MariaDB, MSSQL과 같은 다양한 데이터베이스를 지원합니다.
- 성숙한 ORM: Sequelize는 오랜 기간 동안 개발되어 오픈 소스 커뮤니티에 의해 유지되며, 안정적이고 성숙한 ORM입니다.
- 완전한 ORM 기능: Sequelize는 데이터 모델링, 마이그레이션, 트랜잭션 처리, 쿼리 빌더 등의 완전한 ORM 기능을 제공합니다.
단점:
- 콜백 기반 API: Sequelize는 기본적으로 콜백 기반 API를 사용하기 때문에 Promise나 async/await를 사용하려면 추가 작업이 필요합니다.
- 복잡한 설정: 초기 설정 및 데이터베이스 연결 구성이 다른 ORM 라이브러리에 비해 복잡할 수 있습니다.
TypeORM
장점:
- TypeScript 통합: TypeORM은 TypeScript를 지원하고 Nest.js와 쉽게 통합할 수 있습니다.
- 확장성 및 유연성: TypeORM은 다양한 데이터베이스와 통합할 수 있는 확장성과 유연성을 제공합니다.
- 액티브 레코드 패턴: TypeORM은 액티브 레코드 패턴을 지원하여 개발자들이 더 직관적으로 데이터 모델을 다룰 수 있습니다.
- 마이그레이션: 데이터베이스 마이그레이션을 지원하여 데이터베이스 스키마를 관리하기 용이합니다.
단점:
- 문서화 부족: TypeORM의 문서화가 다른 ORM 라이브러리에 비해 부족할 수 있으며, 사용자들은 추가 리소스와 커뮤니티 지원에 의존할 수 있습니다.
- 성숙도: TypeORM은 다른 ORM 라이브러리에 비해 덜 성숙한 라이브러리일 수 있으며, 릴리스 버전 간의 변경 사항이 있을 수 있습니다.
이러한 장단점을 고려하여 프로젝트의 요구 사항과 개발자 선호도에 따라 Prisma, Sequelize, TypeORM 중 어떤 ORM 라이브러리를 선택할지 결정할 수 있습니다. Nest.js와 함께 사용할 때 TypeScript를 지원하고 데이터베이스와의 통합을 용이하게 만드는 것이 중요한 고려 사항입니다.
Graphql
장점:
- 정확한 데이터 요청: GraphQL은 클라이언트가 정확히 어떤 데이터를 필요로 하는지를 명시적으로 지정할 수 있도록 해줍니다. 이로써 "과도한 데이터" 또는 "부족한 데이터"를 가져오는 문제를 해결할 수 있습니다. 클라이언트가 필요한 필드만 요청하므로 네트워크 트래픽을 줄이고 효율성을 높일 수 있습니다.
- 단일 요청 및 응답: RESTful API와 달리 GraphQL은 단일 요청으로 다수의 데이터를 가져올 수 있습니다. 이로써 "Over-fetching" 또는 "Under-fetching"과 같은 과도한 API 호출 문제를 해결할 수 있으며, 클라이언트와 서버 간의 왕복 시간을 최소화할 수 있습니다.
- 타입 시스템: GraphQL은 강력한 타입 시스템을 갖고 있어 데이터 모델을 정의하고 문서화하기 쉽습니다. 이로써 개발자 간의 의사 소통을 쉽게 하고 API의 신뢰성을 향상시킬 수 있습니다.
- 커스터마이징 가능한 요청: 클라이언트는 필요한 데이터를 정확히 지정할 수 있으므로 모바일 앱 및 브라우저에서 필요한 데이터를 커스터마이징하거나 캐싱을 최적화하기가 더 쉽습니다.
- 독립적인 클라이언트: GraphQL은 클라이언트와 서버 간의 강력한 계약을 제공합니다. 클라이언트는 필요한 데이터를 명시적으로 요청하고 서버는 해당 데이터를 제공하므로 서로 독립적으로 개발 및 배포할 수 있습니다.
단점:
- 학습 곡선: GraphQL은 RESTful API에 비해 학습 곡선이 높을 수 있습니다. 쿼리 언어 및 서버 개발에 대한 새로운 개념을 이해해야 합니다.
- 복잡성 증가: GraphQL 쿼리는 클라이언트에서 서버로 전달되므로 복잡한 쿼리가 서버에 도달할 수 있습니다. 이를 효율적으로 처리하기 위해 쿼리의 복잡성을 관리해야 합니다.
- 보안 고려 사항: GraphQL은 클라이언트가 요청한 데이터를 정확히 제공해야 하므로 권한 및 보안을 효과적으로 관리해야 합니다.
- 쿼리 오버로드: 클라이언트가 과도한 쿼리를 만들 경우, 서버 부하 및 성능 문제를 야기할 수 있습니다. 이를 방지하기 위해 쿼리 복잡성 분석 및 제한이 필요합니다.
- 캐싱 어려움: GraphQL은 각각의 쿼리가 고유하므로 전통적인 HTTP 캐싱 기법을 사용하기 어려울 수 있습니다. 캐싱 전략을 신중하게 고려해야 합니다.
GraphQL은 많은 장점을 가지고 있지만 학습 곡선과 일부 복잡성을 가질 수 있으며, 프로젝트의 특정 요구 사항에 따라 적절한지를 고려하여 사용해야 합니다.
결론 :
graphql은 RESTful API와 조금 다르게 API를 호출하며 이 때문에 학습곡선이 높아 질 수 있음
쿼리가 복잡해 질 수 있고 http 방식으로 캐싱기법을 사용하기 어려울 수 있음
Sequelize
오래개발된 ORM 이라 검색했을때 참고할 자료가 많음
아직 접해보지 못한 팀원이 많고 추가적인 학습이 필요한 ORM임
초기설정이 복잡함
Prisma
부트캠프 초기부터 쭉 사용해오던 ORM이라 팀원들에게 익숙한 ORM임
TypeScript를 기본적으로 지원하여 nest 와 함께 사용하기에 좋음
쿼리 작성이 쉬움
새로운 라이브러리라 검색시에 찾을수 있는 자료들이 상대적으로 적음
(거의 대부분 공식문서안에서 해결해야함)
TypeORM
참고할 강의가 제공되어서 많은 팀원들이 쉽게 접근해서 학습할 수 있음
TypeScript를 기본적으로 지원
참고할 자료가 prisma에 비해 많음
공식문서가 prisma에 비해 아쉬움