justgo_developer

golang ent + sqlite 본문

IT/Golang

golang ent + sqlite

다날92 2024. 11. 7. 20:18
728x90
반응형

golang ent + sqlite

ent 프레임워크

ent는 Facebook에서 개발한 Go 언어용 엔티티 프레임워크입니다. 이 프레임워크는 강력한 ORM(Object-Relational Mapping) 기능을 제공하며, 다음과 같은 특징을 가집니다:

  • 코드 생성: 스키마 정의를 기반으로 타입 안전한 코드를 자동으로 생성합니다.
  • 그래프 기반 쿼리: 복잡한 데이터 관계를 쉽게 탐색할 수 있는 그래프 기반 쿼리를 지원합니다.
  • 스키마 마이그레이션: 데이터베이스 스키마 변경을 쉽게 관리할 수 있습니다.
  • 확장성: 사용자 정의 필드와 엣지를 통해 복잡한 비즈니스 로직을 구현할 수 있습니다.
  • 데이터베이스 지원: SQLite를 포함한 다양한 데이터베이스를 지원합니다.

ent를 사용하면 다음과 같은 이점을 얻을 수 있습니다:

  • 타입 안정성: 컴파일 시점에 많은 오류를 잡아낼 수 있어 런타임 오류를 줄일 수 있습니다.
  • 생산성 향상: 반복적인 CRUD 작업을 자동화하여 개발 시간을 단축할 수 있습니다.
  • 유지보수성: 잘 정의된 스키마와 자동 생성된 코드로 프로젝트의 유지보수가 용이해집니다.

ent와 SQLite를 함께 사용하면, Go 애플리케이션에서 경량화된 데이터베이스 작업을 타입 안전하고 효율적으로 수행할 수 있습니다.

SQLite 데이터베이스

SQLite는 경량화된 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 다음과 같은 주요 특징을 가지고 있습니다:

  • 서버리스: 별도의 서버 프로세스 없이 애플리케이션에 직접 내장되어 사용됩니다.
  • 자체 완결성: 전체 데이터베이스가 단일 파일로 저장되어 이식성이 매우 뛰어납니다.
  • 제로 구성: 복잡한 설정이나 관리가 필요 없어 사용이 간편합니다.
  • 트랜잭션 지원: ACID(원자성, 일관성, 고립성, 지속성) 속성을 준수하는 트랜잭션을 지원합니다.
  • 표준 SQL 지원: SQL 표준의 대부분을 지원하여 사용이 익숙합니다.

SQLite는 다음과 같은 상황에서 특히 유용합니다:

  • 임베디드 시스템: 모바일 앱, IoT 장치 등 리소스가 제한된 환경에 적합합니다.
  • 로컬 저장소: 데스크톱 애플리케이션이나 브라우저의 로컬 데이터 저장에 활용됩니다.
  • 테스팅 및 개발: 개발 단계에서의 빠른 프로토타이핑과 테스트에 이상적입니다.

Go 언어에서 SQLite를 사용할 때는 주로 database/sql 패키지와 SQLite 드라이버를 조합하여 사용합니다. ent 프레임워크와 함께 사용하면 타입 안전성과 ORM의 장점을 누리면서도 SQLite의 경량화된 특성을 효과적으로 활용할 수 있습니다.

SQLite 설치

SQLite 다운로드 페이지

설치:

sudo wget <https://www.sqlite.org/snapshot/sqlite-snapshot-202410221619.tar.gz>
sudo tar -xvf sqlite-snapshot-202410221619.tar.gz
cd sqlite-snapshot-202106031851
sudo ./configure
sudo make
sudo make install

sqlite3 --version

Ent 사용법

Ent 시작하기 문서

  1. 스키마 생성: 자동으로 "프로젝트명/ent/schema/" 경로에 스키마명.go 파일이 생성됨.
go run -mod=mod entgo.io/ent/cmd/ent new 스키마명
  1. 기본으로 생성된 Fields 함수에 스키마명.go 파일에 사용하는 항목 추가(lnkg_dts, key, data)
    • Edges는 Relation을 테이블간 연관관계 의미함
package schema

import (
    "entgo.io/ent"
    "entgo.io/ent/schema/field"
    "time"
)

// LimiterLog holds the schema definition for the LimiterLog entity.
type LimiterLog struct {
    ent.Schema
}

// Fields of the LimiterLog.
func (LimiterLog) Fields() []ent.Field {
    return []ent.Field{
        field.Time("lnkg_dts").Default(time.Now()),
        field.String("key"),
        field.String("data"),
    }
}

// Edges of the LimiterLog.
func (LimiterLog) Edges() []ent.Edge {
    return nil
}
  1. go generate 명령어 실행
    • CRUD와 같은 기능들을 담당하는 go 파일이 자동으로 생성됨.
go generate ./ent

sqlite3 db로 조회 및 저장 하기

package main

import (
    "context"
    "log"

    "entdemo/ent"

    _ "github.com/mattn/go-sqlite3"
)

func main() {
    client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
    if err != nil {
        log.Fatalf("failed opening connection to sqlite: %v", err)
    }
    defer client.Close()
    // Run the auto migration tool.
    if err := client.Schema.Create(context.Background()); err != nil {
        log.Fatalf("failed creating schema resources: %v", err)
    }
}

메모리 모드 방식과 파일모드 방식 2가지로 Sqlite를 사용할수 있음.

// memory mode
client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
// file mode
client, err := ent.Open("sqlite3", "file:data.db?_fk=1")

ent를 이용해 CRUD 간편히 할수 있음.

func CreateLimiterLog(ctx context.Context, client *ent.Client, limiterLog *ent.LimiterLog) (*ent.LimiterLog, error) {
    ll, err := client.LimiterLog.Create().SetLnkgDts(time.Now()).SetKey(limiterLog.Key).SetData(limiterLog.Data).Save(ctx)

    if err != nil {
        return nil, fmt.Errorf("failed creating limiterLog : %w", err)
    }
    log.Println("limiterLog was created: ", ll)
    return ll, nil
}

func SelectLimiterLog(ctx context.Context, client *ent.Client, key string) ([]*ent.LimiterLog, error) {
    ll := client.LimiterLog.Query().Where(limiterlog.Key(key)).AllX(ctx)

    return ll, nil
}
728x90
반응형

'IT > Golang' 카테고리의 다른 글

리눅스 환경에서 Go 설치  (0) 2024.08.16