DEV Community

vultor-xyz
vultor-xyz

Posted on • Edited on

go(golang) ORM 찾기 #1

시리즈

서론

어떤 ORM을 사용하는가에 따라 백엔드 개발에서의 생산성이 크게 영향받는다고 생각합니다. 그래서 go 언어에서 여러 가지 ORM을 살펴보면서 추후 백엔드 개발에서 사용할 ORM을 찾아보겠습니다. 후보 중에서는 ORM이라고 부르기 어려운 기술들도 있는데 여기에서는 데이터베이스에 접근하는 라이브러리를 탐색한다는 생각으로 접근해보려고 합니다.

ORM을 비교할 기준을 먼저 정해보자면 아래와 같습니다.

1. 모델 정의 방법

Code first, Database first 전략이 대표적인데 개인적으로는 코드만 작성하면 나머지는 라이브러리가 알아서 해주는 Code first를 좀 더 선호합니다. SQL을 따로 작성하기보다는 항상 다루는 코드를 작성하는 것이 더 편하다고 생각하기 때문입니다. 그리고 저에게는 사용하기만 편하다면 Active record인지 Data mapper인지는 큰 상관이 없을 것 같습니다.

2. 관계 데이터를 다루는 방법

관계 데이터를 다루는 방법은 정답이 있기보다는 데이터 간 관계를 정의하는 방식이 작성하기 쉽게 되어있는지를 또 쿼리를 할 때 얼마나 쉽게 관계를 불러올 수 있는지를 중점적으로 볼 예정입니다. 부모-자식, many to many와 같은 관계들 그리고 Eager Loading과 같은 기능을 지원하는지가 자세히 봐야 할 것 같습니다.

3. 마이그레이션 처리 방법

데이터베이스의 구조를 변경하기 위한 마이그레이션이 어떤 식으로 처리되는지를 주요하게 볼 예정입니다. 사실 지원하지 않는 ORM들도 상당수 있는데 그 경우 ORM의 모델과 Migration을 따로 작성하는 불편함이 있기 때문에 어떤 툴을 사용하여 마이그레이션을 수행할 수 있는지 그리고 마이그레이션의 롤백은 어떤 식으로 동작하는지를 중점적으로 살펴볼 예정입니다.

4. 이벤트 지원

ORM을 사용하다 보면 어떤 모델이 수정되면 그에 대한 이벤트를 받아야 할 때가 있습니다. 이런 기능을 지원하는지 또한 중점적으로 살펴볼 예정입니다.

5. 지원 데이터베이스

어떤 데이터베이스를 지원하는지 살펴볼 예정입니다. ORM의 장점 중 하나는 여러 가지 데이터베이스에 대하여 동일한 코드로 접근을 할 수 있다는 것인데 과연 이것들이 잘 지원하는지 살펴보면 좋을 것 같네요.

6. 기타 기능들

pagination 관련 기능, 모델 transform 관련 기능, raw query 기능들 등 있으면 좋겠다고 생각하는 기능들에 대하여도 살펴볼 예정입니다.


검증용 데이터베이스 모델

위의 내용들을 검증하기 위한 모델을 작성하였습니다. 모델은 아래와 같습니다.
orm_test_models


후보

최근까지 업데이트 되고 있는지 github star가 적절한지에 따라 후보들을 추려보았습니다.

  1. sqlc : database first 전략을 사용하며 각각의 쿼리도 sql로 작성하면 code를 만들어주는 방법을 사용하고 있습니다.
  2. sqlboiler : Rails에서 영감을 받은 것으로 보이고 database first 전략을 취하고 있습니다. 데이터베이스 테이블을 읽어서 모델을 만드는 형태이기 때문에 미리 테이블들을 만들고 이를 기반으로 코드를 생성해야 합니다.
  3. ent : code first 전략을 사용하며 모델 코드를 작성하면 이를 기반으로 다른 필요한 구성요소를 생성하는 형태를 취하고 있습니다.
  4. gorm : code first 전략을 취하고 있고 go 언어 orm을 찾으면 가장 많이 나오는 orm 중 하나입니다.

다음 포스팅부터는 각각의 후보들을 실제로 구현해 보면서 살펴볼 예정입니다.

Top comments (0)