백엔드를 개발하다 보면 적절한 ORM library 선정도 중요하다.
Golang을 공부하고 있기 때문에, Golang ORM을 선정해야해서 공부를 해봤는데, 각각 장단점이 있는 것 같아서 찾아 정리해봤다.
예전에 gorm을 사용했을 때는, 당시에 가장 많이 쓰여서 사용했었던 기억이 있다.
현재에도 가장 많이 사용하는 듯
찾아보면 장점은 열심히 README에 적어두고 단점은 잘 안적는 듯 그래서 찾아봤다.
GORM
Star나 Fork의 갯수로 라이브러리를 평가하는 것은 적합한 방식은 아니지만.. 참고용으로 둘러보곤 한다.
다른 라이브러리에 비해 Fork, Star수가 가장 많고 최근까지 꾸준하게 commit이 되는 것 같다.
장점
- preloading, Join, callbacks, plugin, RDBMS에 대해 쉽게 지원
- MySQL, PostgreSQL, SQLite 등 다양한 DB 지원
- 사용자가 많으니 문서화도 잘 되어있음
- auto migration 지원
- 꾸준한 테스트 + 업데이트 지원
- DryRun, transaction + save point등 지원
단점
- 기능이 많으니 처음 사용하기엔 복잡할 수도 있음
- orm을 통한 쿼리가 비효율적으로 생성되는 경우가 있고, 그에 따라 느릴 수 있음
- 런타임에 타입, 필드매핑이 됨
장단점을 정리하면서 찾아보니, 확실히 사용자가 많고 업데이트가 빠르다보니 단점이 지속적으로 보완되고 있는 것 같았다.
예전에 쓸때도 orm 쿼리가 복잡할수록 비효율적으로 사용되고 느리다는 것을 확인했었던 기억이 있다.
XORM
2020년에 찾아볼 때는 계속 사용되던걸로 봤었는데, 2021기준으로 archived되고 더이상 개발되지 않는 것으로 보인다.
아무래도 이런 라이브러리는 사용하기 꺼려지는 경향이 있는 듯
장점
- 간결한 기능 제공하여 simple함
- gorm, sqlboiler에 비해 빠른 performance 제공
- auto caching
- gorm과 마찬가지로 다양한 DB 지원
- https://github.com/go-xorm/cmd/blob/master/README.md reverse engineering 지원 (이미 존재하는 스키마에 대해 관련된 xorm Golang code를 생성해주는 기능)
단점
- gorm에 비해 적은 기능 제공
- archived된 library, 축소되는 community, 빈약한 documents
- 복잡한 query, transaction 지원에 제한이 존재
단점이 워낙 크고 개선이 될 여지가 없기 때문에, 실서비스에 사용하기는 어려울 것 같았다.
SQLboiler
아직 Fork, Star수는 적지만 꾸준하게 업데이트 되고 있는 것으로 보인다.
장점
- type-safe하게 database schema를 지원하여, runtime이 아닌 compile시 에러를 잡아줌
- 앞선 gorm, xorm과 비슷하게 다양한 DB지원
- query optimize를 통해 go-like performance보장
- 다양하고 유연한 기능 지원, 다른 라이브러리나 프레임워크와 연계하여 사용 가능
- documents, active community등 존재
단점
- 학습이 다른 라이브러리에 비해 좀 더 필요
- 아직 많은 기능이 존재하지는 않음
- 다른 라이브러리에 비해 사용자 수가 적긴함
- multi-column foreign key 미지원
실제로 benchmark 사이트(물론 본인들이 측정한 것이긴 하지만)에 가보면 확실하게 빠른 performance를 확인할 수 있고, 지속적으로 feature가 개발되고 사용자가 늘어날수록 사용할만한 라이브러리인 것 같다.
정리
유명한 golang orm들에 대해서 찾아봤는데, gorm과 sqlboiler 두개로 마음이 좀 기울었다.
gorm은 이미 사용해봤기 때문에 어차피 공부하는 것이라면 sqlboiler를 사용해보는게 낫지 않을까 생각 중이다.
benchmark를 저렇게 당당하게 올려두고 다른 라이브러리랑 비교한 걸 보고 흥미가 많이많이 생겼다.
gorm을 사용할 때도 친구들이랑 이야기하면 어차피 그 라이브러리 써도 migration, orm 기본 기능 제외하면 사용 시 비효율적인 raw query로 적용되서 별로라고 이야기가 나오긴 했었다.
고민고민
'개발 > 개발공부' 카테고리의 다른 글
React StyledComponents / 리액트, css, style, 기능 (0) | 2023.03.06 |
---|---|
Golang ORM SQLBoiler / Go, DB, ORM (0) | 2023.03.03 |
Golang Gin Graceful restart, stop / golang, go, 고랭, 고, 언어 (2) | 2023.02.16 |
Golang Gin Middleware / golang, go, 고랭, 고, 언어, 미들웨어 (0) | 2023.02.07 |
Golang Gin Router / golang, go, 고랭, 고, 언어, 라우터 (0) | 2023.02.04 |
댓글