Go언어 ORM GORM의 크나큰 문제점

2020. 5. 15. 00:33Tutorial & 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

 

Go Gorm Preload without order by

GORM 을 사용할 때 특정 쿼리 First, Preload 등을 사용하면 Order by 쿼리 가 붙게되는데 다좋은데 문제가 Gorm에서 부여된 Primary key (ID)로 조회를 하는데 테이블에 ID 컬럼이 존재하지 않으면 오류가 발��

gmyankee.tistory.com

위 글에서 언급한적이 있는데 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