Go언어 ORM GORM의 크나큰 문제점
2020. 5. 15. 00:33ㆍTutorial & Training/Go
728x90
type AuthUser struct {
gorm.Model
ID uint `gorm:"column:id;primary_key;" json:"id"`
IsActive bool `gorm:"column:is_active" json:"isActive"`
DateJoined time.Time `gorm:"column:date_joined" json:"dateJoined"`
Profile Profile `gorm:"foreignkey:UserID;" json:"profile"`
ProfileID uint
}
type Profile struct {
gorm.Model
Idx uint `gorm:"column:idx;primary_key:true;"`
UserID uint `gorm:"column:user_id;ForeignKey:id"`
}
위 와 같은 구조체가 있다고 가정하면
Go에서 Join을 구현하려면 .Joins()가 있기는 하지만 ORM적인 구현이라기보단
원시쿼리(SQL)에 가깝습니다.
그럴거면 그냥 SQL로 쓰고 Struct로 박아서 뽑지 뭣하러 굳이 힘들게 gorm.Model로 명시하는거지...
https://gmyankee.tistory.com/297
위 글에서 언급한적이 있는데 Preload, Related, Association을 사용해도
Django ORM처럼 select_related나 Prefetch_related처럼 동작하지는 않습니다.
단지 쿼리를 한번더 때립니다. 정말 암덩어리죠
그래서 실제로 해당 Github Issues에서는 이런말이 오갑니다.
1. 이 라이브러리는 오래되었고 관리를 안하는것 같아
2. Preload vs Join 뭐가 더 좋은가?( 그냥 raw쿼리로 짜렴)
ORM이 주는 가장 크나큰 이점은... Migrations가 용이한점? DB 이관할때 편리한거?
그거말곤 없긴한데 원시쿼리가 자세히보면 사실 속도가 좀더 빠르고 직관적이긴 합니다.
결론 원시쿼리(SQL)로 쓰세요!
728x90
'Tutorial & Training > Go' 카테고리의 다른 글
#02. Go - gqlgen 프로젝트 설정하기 (0) | 2020.06.01 |
---|---|
#01.Go - GraphQL 알아보기 (0) | 2020.05.31 |
Go Gorm Preload without order by (0) | 2020.05.13 |
Go.#3 / 패키지 (0) | 2019.12.15 |
Go.#2 / Go언어 컴파일러 설치하기 (0) | 2019.12.06 |