[Golang으로 백엔드 개발하기] 2. ORM 선정

개수는 많지만 쓸만한건 하나

다른 언어의 ORM

아마 어떤 ORM을 써야하지 고민할 언어는 Golang 하나 뿐일 것이다.

  • Java -> JPA
  • Django -> Django ORM
  • Python (Flask, FastAPI...) -> SQLAlchemy
  • Node.js -> Sequelize, TypeORM, Prisma

이렇게 Node.js를 제외하면 사실상 ORM는 따로 고민해가면서 선택할 필요가 없지만 Golang은 생각을 좀 해봐야한다.

GORM - 😥

일단 Golang ORM이라고 검색하면 가장 먼저 그리고 가장 많이 쓰이는 것은 GORM이다. 그러나 솔직히 말하면 왜 인기가 있는지 모르겠다.

  1. 너무나도 빈약한 공식 문서
    그나마 한글로 번역이 되어 있긴한데 애초에 번역전 공식 문서가 너무 빈약해서 궁금한 점이 있으면 죄다 코드를 뜯어보아야 한다...
  2. 불편한 Struct Tag 기반의 Entity
    Golang은 Statically Typed Language로서 Type을 강제하며 높은 안정성과 이를 바탕으로 한 편의성이 강점인 언어이지만 Struct Tag을 사용하면 그 중 하나도 얻을 수 있는 것이 없다. Client에 제공할 JSON 정도야 Tag를 붙여서 사용한다고 쳐도 테이블과 컬럼의 설정도 Tag를 덕지덕지 붙여서 사용해야 하기 때문에 가독성이 정말 최악이다.
  3. 기본적인 메서드만 제공
    이 점은 GORM이 지향하는 바가 가벼운 ORM이기에 단점으로 꼽기는 뭐하지만 기본적인 작업에서 벗어나면 ORM을 사용하는 건지 SQL문을 작성하는 건지 모를 정도로 기본으로 제공하는 메서드가 적다. 알아서 적절히 SQL 비슷한 것을 매개변수로 넘겨주어야 하는데 이 또한 Typed Language와 맞지 않다고 느껴졌다.

Ent - 😀

Star History Chart

그야말로 파죽지세다. ent는 재단에서 관리되는 만큼 확실한 완성도를 보장하기에 엄청난 속도로 성장하고 있다.

  1. Tag가 아니라 타입 기반의 스키마 설계
    ent가 미리 제공하는 정의된 타입과 메서드를 기반으로 정말 편리하게 스키마를 설계할 수 있다. 자동완성 기능과 함께하면 이 필드에 어떤 속성을 적용할 수 있는지 따로 문서를 찾지 않고도 확인할 수 있고 릴리이션 또한 코드로 쉽게 정의할 수 있다
  2. 다양한 메소드 제공
    go generate ./ent 를 실행하면 정의한 스키마(DB 테이블 설정 및 필드들)를 바탕으로 실제 Go 코드를 만들어주고 이는 꽤 다양한 메소드를 제공한다. 이로 인해서 GORM과 다르게 따로 SQL문을 작성할 필요 없이 ent에서 제공하는 메서드만으로도 개발이 충분히 가능한 수준이다.
  3. 코드 생성 방식
    위에서 언급했듯이 스키마를 정의하면 Golang 코드를 만들어 주는 방식이기 때문에 Magical한 부분 없이 작동을 쉽게 이해할 수 있다. 공식 문서가 친절하지만 사실 공식 문서를 안 보고 코드만 봐도 이해할 수 있을 정도로 Golang의 코드는 이해하기 쉽고 간결하다 :)

마치며

아직 ent는 0.x 버전대인 만큼 API가 Fix되지도 않았고 성숙한 기술이라고 볼 수는 없다.

아마 Roadmap for v1 이슈에 나와 있는 기능들을 모두 구현해야 v1이 릴리즈될 것 같다.

그러나 GORM을 필두로한 Tag 기반의 ORM이나 Raw SQL문을 작성해야 하는 sqlx보다 ORM이라는 것을 잘 구현한 라이브러리는 ent말곤 아직 없는 것 같으며 인기가 날이 갈 수록 높아지는 만큼 커뮤니티도 더 활성화 될 것 같다.