ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Golang - ORM(1) [7]
    Go 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
    반응형

    댓글

Designed by Tistory.