본문 바로가기
개발/개발공부

Golang ORM SQLBoiler / Go, DB, ORM

by 치킨개발자 2023. 3. 3.
728x90

https://dev-chicken.tistory.com/49

 

Golang ORM library / gorm, xorm, sqlboiler, 비교

백엔드를 개발하다 보면 적절한 ORM library 선정도 중요하다. Golang을 공부하고 있기 때문에, Golang ORM을 선정해야해서 공부를 해봤는데, 각각 장단점이 있는 것 같아서 찾아 정리해봤다. 예전에 gorm

dev-chicken.tistory.com

에 이어서 SQLBoiler에 대해 공부를 해봐야겠다는 생각이 확실해져서, 좀 더 탐구해봤다.

사실 golang을 공부하거나 개발하다보면 ORM선택에 있어서 큰 고민이 되는데..

sqlx 또는 SQLBoiler를 쓰는게 대세이고 퍼포먼스, 개발 등에 있어서 기존에 존재하는 타 ORM에 비해 장점이 많은 것 같다.

raw-query를 위주로 직접 작성하려면 sqlx를 라이브러리를 통해 편리하게 사용하려면 SQLBoiler를 쓴다고 한다.

실제로 현업에서 golang ORM을 사용하고 있는 개발자들과 이야기를 나눠보면 두 ORM을 용도에 맞게 가장 많이 사용하고, 규모가 커진 유명한 스타트업과 같은 경우에는 직접 내부에서 개발하여 사용하는 곳도 있는 것 같았다.

 

SQLBOILER

SQLBoiler 장점

  1. 빠른 실행 속도: SQLBoiler는 컴파일시 데이터베이스 스키마를 분석하여 모델 코드를 생성. 이미 생성된 모델로 접근하기 때문에 빠르게 실행할 수 있음. 다른 라이브러리는 runtime에 실행되어 그때그때 json parsing을 통해 가져오기 때문에 무거움
  2. 쉬운 구현: SQLBoiler는 Go native하게 구현되어 있음. 또한 SQLBoiler는 SQL 쿼리의 세부 정보가 추상화되어 있어서, 개발자가 보기 쉬움.
  3. 데이터베이스 native: SQLBoiler는 데이터베이스 중심으로 모델이 생성 / 업데이트 됨. 따라서 신경써야할 포인트가 줄어듬
  4. 다양한 데이터베이스 지원: 전글에서 작성했던 것과 마찬가지로, 다른 라이브러리들에 비해 부족하지 않게 지원
  5. 유연한 쿼리 지원: SQLBoiler는 SQL 쿼리 작성에 대한 세부 정보를 추상화하지만, raw query도 사용 가능. 다양한 옵션을 지원한다는데 찾아봐야할 듯
  6. Type safety: SQLBoiler는 타입을 지정할 수 있게 해줘서 runtime error같은 것 방지를 도와줌 앞선 모델생성과 연관.

장점을 정리해보면, 빠르고 / Go native하고 / DB native하고 / raw query도 지원 / type지정으로 에러방지 등 많은 것을 지원한다. 그리고 Golang ORM을 쓰는데 Go / DB native하고 빠르다면 안쓸 이유가 없는 것으로 생각된다.

 

err := queries.Raw("select * from pilots where id=$1", 5).Bind(ctx, db, &obj)

raw query 지원 예시

// WHERE clause building
Where("name=?", "John")
models.PilotWhere.Name.EQ("John")
And("age=?", 24)
// No equivalent type safe query yet
Or("height=?", 183)
// No equivalent type safe query yet

Where("(name=? and age=?) or (age=?)", "John", 5, 6)
// Expr allows manual grouping of statements
Where(
  Expr(
    models.PilotWhere.Name.EQ("John"),
    Or2(models.PilotWhere.Age.EQ(5)),
  ),
  Or2(models.PilotAge),
)

이렇게 추상화 된 쿼리도 제공하는데, type safe하게 사용할지 말지도 선택 가능한 것으로 보인다.

 

이제 실제로 적용해보면서 공부를 해봐야겠다.

반응형

댓글