GORM은 Go 언어의 강력한 ORM 라이브러리로, 데이터베이스와의 상호작용을 간편하게 만듭니다. 아래는 주요 메서드와 사용 예제를 기능별로 정리한 내용입니다.



데이터 생성

Create

새로운 레코드를 데이터베이스에 삽입합니다.

user := User{Name: "John", Age: 30}
db.Create(&user)

데이터 조회

First

조건에 맞는 첫 번째 레코드를 가져옵니다.

var user User
db.First(&user)              // 첫 번째 레코드
db.First(&user, 1)           // ID가 1인 레코드
db.First(&user, "id = ?", 2) // 조건을 사용한 검색

Find

조건에 맞는 여러 레코드를 가져옵니다.

var users []User
db.Find(&users)              // 모든 레코드
db.Find(&users, "age > ?", 20) // 조건에 맞는 레코드

Where

조건에 맞는 레코드를 필터링합니다.

var users []User
db.Where("name = ?", "John").Find(&users)        // 이름이 John인 레코드
db.Where("age BETWEEN ? AND ?", 18, 30).Find(&users) // 나이가 18~30인 레코드

데이터 수정

Update

특정 필드를 업데이트합니다.

db.Model(&user).Update("name", "Updated Name") // 단일 필드 업데이트
db.Model(&user).Updates(User{Name: "John", Age: 35}) // 여러 필드 업데이트

데이터 삭제

Delete

레코드를 삭제합니다.

db.Delete(&user)             // 특정 레코드 삭제
db.Delete(&User{}, 10)       // ID가 10인 레코드 삭제

SQL 직접 실행

Raw

SQL 쿼리를 실행하고 결과를 매핑합니다.

var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 20).Scan(&users)

Exec

SQL 쿼리를 실행하고, 결과를 반환하지 않습니다.

db.Exec("DELETE FROM users WHERE age < ?", 18)
db.Exec("UPDATE users SET age = ? WHERE name = ?", 30, "John")
db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Jane", 25)

고급 기능

Joins

SQL JOIN을 수행합니다.

var users []User
db.Joins("INNER JOIN orders ON orders.user_id = users.id").Find(&users)

Preload

관계 데이터를 미리 로드합니다.

db.Preload("Orders").Find(&users) // 사용자와 함께 주문 데이터 로드

Transaction

트랜잭션을 처리합니다.

err := db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&user).Error; err != nil {
        return err
    }
    if err := tx.Save(&order).Error; err != nil {
        return err
    }
    return nil
})
if err != nil {
    log.Fatal("Transaction failed:", err)
}

결과 제어

Order

결과를 정렬합니다.

db.Order("age desc").Find(&users) // 나이 내림차순
db.Order("name asc").Find(&users) // 이름 오름차순

Limit

결과의 개수를 제한합니다.

db.Limit(5).Find(&users) // 최대 5개의 레코드

Offset

결과의 시작 위치를 지정합니다.

db.Offset(5).Limit(5).Find(&users) // 6번째부터 5개의 레코드

Count

레코드의 개수를 반환합니다.

var count int64
db.Model(&User{}).Where("age > ?", 20).Count(&count) // 나이가 20 이상인 사용자 수