Go

Golang - ORM(1) [7]

YunSeYeong 2021. 2. 7. 23:36
728x90
반응형

백엔드개발을 하다보면 데이터를 객체화해서 DB에 저장하는 일이 많다.

 

이 과정에서 DB에서 객체로 객체에서 DB로 변환해주는 과정을 거쳐야 된다.

 

이런 과정을 줄이고 정리하기위해 ORM이란걸 사용하게된다.

 

ORM 이란?

객체 관계 매핑(Object-relational mapping; ORM)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법이다. 객체 관계 매핑을 가능하게 하는 상용 또는 무료 소프트웨어 패키지들이 있고, 경우에 따라서는 독자적으로 개발하기도한다.

 

golang에서도 orm을 사용할 수 있도록 해주는 api가 있다. (https://gorm.io/index.html)

 


 

 

ORM을 사용한 예제이다. 서버에 연결하고 DB를 자동으로 마이그레이션, 생성, 삭제, 수정, 조회등을 간단히 할 수 있다.

 

db, err := gorm.Open(mysql.Open("root:raspberry@tcp(192.168.0.100:3306)/RASPBERRY_SERVER?parseTime=true"), &gorm.Config{})
if err != nil {
	return err
}

db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&(user.User{}))

db.Create(&(user.User{
	Id:       "test2",
	Password: "test2",
	Email:    "test2",
	Phone:    "test2",
}))

var u user.User

db.Take(&u)

fmt.Println(u)

 

먼저 아래와 같이 데이터베이스에 연결한다.

db, err := gorm.Open(mysql.Open("root:raspberry@tcp(192.168.0.100:3306)/RASPBERRY_SERVER?parseTime=true"), &gorm.Config{})
if err != nil {
	return err
}

뒤에 ?parseTime=true 이건 기본 테이블 생성시 날짜데이터가 있는데 이를 받아올때 기본적으로 []uint8 타입으로 가져오게 되어있다. 이걸 Time객체로 받아오기 위해 추가한 내용이다.

 

만약에 붙이지 않으면 다음과 같은 오류가 발생한다.

Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time

 

 

DB에 연결이되면 마이그레이션을 해야된다. 다음과같이 user내용을 저장할 DB를 마이그레이션 하면 자동으로 Table을 생성해 준다. (이미 존재하면 생성하지 않는다.)

db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&(user.User{}))

 

 

아래와같이 User구조체를 만들고 생성하면 자동으로 데이터가 생성되어 들어간다.

db.Create(&(user.User{
	Id:       "test2",
	Password: "test2",
	Email:    "test2",
	Phone:    "test2",
}))

 

 

아래는 한개의 데이터를 조회할 수 있다.

db.Take(&u)

fmt.Println(u)

 

이렇게 사용하면 객체를 sql문으로 만들어 DB로 저장하고 다시 조회할 때 row데이터들을 객체로 변환하는 수고를 덜수 있고, DB Migration도 자동으로 되어 편하게 사용할 수 있다.

728x90
반응형