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 |