일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Elk
- consumer group
- gin
- broker
- Kubernetes
- k8s
- Kafka
- kafka-connect
- Golang
- ElasticSearch
- Helm
- http
- Consumer
- docker
- create topic
- loadbalance
- minikube
- kafka broker
- go test
- eck
- Produce
- topic
- go
- Kafka Connect
- tls disable
- gortsplib
- Message
- gorm
- kibana
- 쿠버네티스
- Today
- Total
개발자의 개발괴발
gorm 사용하기(feat. sqlite3) 본문
backend 개발에 빼놓을 수 없는것 하나만 뽑으라면 db일 것이다.
backend만으로 client의 요청에 응답을 할 수 있지만 영구적으로 데이터를 저장하는데는 한계가 있다.
물론 메모리에 저장할 순 있지만 backend 서버가 재기동될 경우 데이터는 모두 날아가버린다.
따라서 영구적으로 데이터를 저장할 수 있는 기능을 제공하는 것이 db이다.
단순히 영구 데이터 저장만이 목적이 아니라 db를 이용하면 단순히 파일로 저장하는 것보다 많은 이점이 있다.
그래서 이전 글에 이어 db를 추가해보도록 하겠다.
sqlite3
db 종류에는 여러가지가 있고 상황에 따라 적절한 선택을 하면 된다.
여기서는 무거운 backend 서비스를 만드는 것도 아니 때문에 sqlite3를 사용하려고 한다.
가볍다고해서 다른 db에 뒤쳐지는 것이 절대 아니며 안드로이드 앱에서나 여기저기서 아직까지 많이 쓰인다고 한다.
gorm
sql을 써본 사람들이라면 쿼리를 많이 짜보거나 본 경우가 많을 것이다.
backend 개발하면서 db에 접근하는 경우가 많은데 이것들을 모두 sql query로 짜는 것은 여간 귀찮은 것이 아니다.
물론 상황에 따라 sql 쿼리를 직접 짜는 것이 더 쉽거나 유용할때도 있다.
하지만 많은 상황에서 orm은 db에 접근하여 데이터를 읽거나 쓰는데에 편리함을 제공해준다.
나는 gorm을 선택했다.
써본적은 없지만 문서를 보니 python의 sqlalchemy와 비슷한점이 많아 보여서 골랐다.(golang 초보자 입장이어서 많이 쓰는 것을 고른것도 이유가 있다.)
gorm을 사용해 sqlite3에 접근하기
먼저 gorm과 sqlite3를 사용하기 위해 아래와 같이 package를 설치한다.
sqlite3말고 다른 것을 원하는 사람은 다른 db의 package를 받으면 된다.
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
아래와 같이 간단하게 db.go 파일을 만들어 보았다.
package db
import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
var DB *gorm.DB
func Connect() {
var err error
DB, err = gorm.Open(sqlite.Open("sqlite3.db"), &gorm.Config{})
if err != nil {
panic("Failed to connect to database: " + err.Error())
}
}
DB를 전역변수로 뺀 이유는 한번만 초기화하고 여러 goroutine에서 같이 사용하기 위해서다.
gorm은 goroutine을 사용할때 동시에 접근해도 안전하다고 하니 걱정하지 말고 사용하자.
Connect()가 호출되면 sqlite3.db라는 파일을 생성하거나 파일이 있으면 그 파일을 사용할 것이다.
sqlite3는 파일에 db데이터를 저장한다.
특별히 어려울게 없는 코드이다.
아래처럼 User 정보를 담을 수 있는 struct를 user.go에 하나 만들어보자.
package models
type User struct {
Id int `json:"id" gorm:"primaryKey"`
Username string `json:"username" gorm:"unique;not null"`
Password string `json:"password" gorm:"not null"`
}
func (User) TableName() string {
return "users"
}
User라는 struct를 만들면서 ``로 tag를 설정해줬다. gorm: 부분에 column의 속성들을 적어주면 된다.
users라는 테이블에 id, username, password라는 column이 있고 primary key는 id라는 것을 쉽게 알 수 있다.
간단하게 실행해보기 위해서 user_test.go파일을 만들어 아래와 같이 작성해보자.
package models
import (
"testing"
"home-cam/db"
)
func TestUserModel(t *testing.T) {
db.Connect()
db.DB.AutoMigrate(&User{})
// Create a new user instance
user := User{
Username: "testuser",
Password: "testpassword",
}
result := db.DB.Create(&user)
if result.Error != nil {
t.Errorf("Failed to create user: %v", result.Error)
}
var retrievedUser User
db.DB.Where("username = ?", user.Username).First(&retrievedUser)
if retrievedUser.Username != user.Username {
t.Errorf("Failed to retrieve user: expected %s, got %s", user.Username, retrievedUser.Username)
}
db.DB.Where("username = ?", user.Username).Delete(&User{})
var deletedUser User
err := db.DB.Where("username = ?", user.Username).First(&deletedUser).Error
if err == nil {
t.Errorf("User was not deleted: expected error, got nil")
} else if err.Error() != "record not found" {
t.Errorf("Unexpected error when checking deleted user: %v", err)
}
}
Connect()는 db에 연결하는 과정
db.DB.AutoMigrate()를 실행하므로써 sqlite에 users table을 생성해준다.
그 밑으로는 User를 생성하고
User가 잘 생성됐는지 확인하고
User를 지워보고
잘 지워졌는지 확인하는 로직이다.
이때 이 디렉토리로 이동해 go test라고 치면 아래와 같이 테스트 성공 실패가 나온다.
하지만 vscode에선 더 편리한 방법을 제공해준다.
아래 그림처럼 함수 위에 run test | debug test 중 원하는 것을 누르면 run/debugging을 할 수 있다.
Thanks to
Building user authentication and authorisation API in Go using Gin and Gorm
The popularity of Go has surged recently, largely owing to its simplicity, concurrency features, and efficiency. This piece delves into…
ututuv.medium.com
'Home Cam Service 개발하기' 카테고리의 다른 글
Handler test 작성 (1) | 2025.06.01 |
---|---|
gorm orm을 controller와 연결하기 (0) | 2025.05.31 |
gin으로 web service 시작하기 (0) | 2025.05.28 |
사전준비 (0) | 2025.05.16 |