본문 바로가기

개발

Golang - Connect to MongoDB

1. MongoDB 생성

Golang에서 MongoDB를 연결하기 전, MongoDB를 생성합니다.
Atlas에서 무료로 MongoDB를 생성할 수 있습니다.

2. MongoDB 접속 및 테스트 데이터 입력

admin> show dbs;
admin   296.00 KiB
config  500.00 KiB
local     5.72 MiB

admin> use example;
switched to db example

example> show collections;


example> db.example.insertOne({hello: "world!"});
{
  acknowledged: true,
  insertedId: ObjectId('66ead2add160d405b44abe79')
}


example> show collections;
example

3. Golang 코드 작성

전체 코드는 다음과 같습니다.

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "os"

    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    var err error

    if err := godotenv.Load(); err != nil {
        log.Println("No .env file found")
        return
    }

    uri := os.Getenv("MONGODB_URI")
    if uri == "" {
        log.Fatal("Set your 'MONGODB_URI environment variable")
    }

    client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
    if err != nil {
        panic(err)
    }

    defer func() {
        if err := client.Disconnect(context.TODO()); err != nil {
            panic(err)
        }
    }()

    coll := client.Database("example").Collection("example")
    var result bson.M

    err = coll.FindOne(context.TODO(), bson.D{{Key: "hello", Value: "world!"}}).Decode(&result)
    if err == mongo.ErrNoDocuments {
        fmt.Println("No document was found.")
        return
    }

    if err != nil {
        panic(err)
    }

    jsonData, err := json.MarshalIndent(result, "", "    ")
    if err != nil {
        panic(err)
    }

    fmt.Printf("%s\n", jsonData)
}

하나씩 살펴봅시다.

godotenv를 통해 .env 파일에 있는 정보들을 환경변수로 등록해줍니다.
이 코드가 실행되면 .env 파일에 정의되어있는 내용들에 os.Getenv()를 통해 접근할 수 있습니다.

if err := godotenv.Load(); err != nil {
    log.Println("No .env file found")
    return
}

이후 MONGODB_URI를 가져옵니다. 이는 중요한 정보로 다른 사람들에게 노출되면 안되기 때문에 환경변수로 저장하여 사용합니다.

uri := os.Getenv("MONGODB_URI")
if uri == "" {
    log.Fatal("Set your 'MONGODB_URI environment variable")
}

정의된 MONGODB_URI ( connection string ) 을 통해 MongoDB에 커넥션을 생성합니다.

client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
if err != nil {
    panic(err)
}

이 connection이 main 함수가 종료가 된다면 커넥션을 끊을 수 있도록 defer 함수에 disconnect에 관련된 로직을 작성해줍니다.

defer func() {
    if err := client.Disconnect(context.TODO()); err != nil {
        panic(err)
    }
}()

이후 example 데이터베이스의 example 컬렉션을 조회하고, 가져온 결과를 출력합니다.

coll := client.Database("example").Collection("example")
var result bson.M

err = coll.FindOne(context.TODO(), bson.D{{Key: "hello", Value: "world!"}}).Decode(&result)
if err == mongo.ErrNoDocuments {
    fmt.Println("No document was found.")
    return
}

jsonData, err := json.MarshalIndent(result, "", "    ")
if err != nil {
    panic(err)
}

fmt.Printf("%s\n", jsonData)

4. .env 파일 생성 및 MONGODB_URI 작성

main.go 와 동일한 위치에 .env 를 생성해줍니다.
그리고 MONGODB_URI를 다음과 같이 넣어줍니다.

MONGODB_URI="mongodb connection string"

5. Golang 실행

go get .을 통해 필요한 package를 다운로드 받습니다.

go get .      
go: downloading go.mongodb.org/mongo-driver v1.17.0
go: downloading github.com/joho/godotenv v1.5.1
go: downloading github.com/xdg-go/scram v1.1.2
go: downloading github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78
go: downloading github.com/xdg-go/stringprep v1.0.4
go: downloading github.com/golang/snappy v0.0.4
go: downloading github.com/montanaflynn/stats v0.7.1
go: downloading golang.org/x/sync v0.8.0
go: downloading golang.org/x/crypto v0.26.0
go: downloading golang.org/x/text v0.17.0
go: added github.com/golang/snappy v0.0.4
go: added github.com/joho/godotenv v1.5.1
go: added github.com/klauspost/compress v1.13.6
go: added github.com/montanaflynn/stats v0.7.1
go: added github.com/xdg-go/pbkdf2 v1.0.0
go: added github.com/xdg-go/scram v1.1.2
go: added github.com/xdg-go/stringprep v1.0.4
go: added github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78
go: added go.mongodb.org/mongo-driver v1.17.0
go: added golang.org/x/crypto v0.26.0
go: added golang.org/x/sync v0.8.0
go: added golang.org/x/text v0.17.0

go run main.go 를 통해 코드를 실행시킵니다.
다음과 같은 결과가 노출됩니다.

go run main.go
{
    "_id": "66ead2add160d405b44abe79",
    "hello": "world!"
}

'개발' 카테고리의 다른 글

Golang - Swagger 연동  (1) 2024.09.21
Golang - echo를 활용한 API Server 만들기  (0) 2024.09.21
Golang - Connect to MySQL  (1) 2024.09.18
Golang - 프로젝트 시작  (0) 2024.09.18
Q Learning과 DQN  (0) 2023.12.09