Svelte 에서 MongoDB 연결하기

Svelte 에서 MongoDB 연결하는 예시가 어디 딱 나와있지 않다. 그래서 여러 삽질을 통해 연결이 되었고 그 부분을 대략 정리해본다. 사실 javascript 에서 module 을 import 하고 export 하는 방법이 가장 난항이었다. 그 부분을 중점적으로 정리해본다.

그리고 Mongo driver를 구글에 검색하면 대부분의 언어에서 mongoDB 를 연결 및 사용할 수 있도록 driver 가 갖춰져 있다. 그 중 Nodejs 의 connect 예시를 찾아 참고했다.

우선 mongo driver 설치가 필요하다. 프로젝트 폴더내에서 npm 으로 설치.

$ npm install mongodb@6.0

javascript 는 import & Export 방식이 Named exportDefault export으로 나뉜다. 각각 호출방식을 사용해보면서 모듈 사용법을 알아본다.

case1. Named export

현재 sveltekit 를 사용하고 있는데, DB 커넥션 하는 부분은 lib 폴더에, 실제 화면별로 데이터를 조회하는 소스는 routes 폴더 하위에서 작성하였다. export 할때 Named 방식은 변수이름이 지정되어야 하며, 아래 방식으로 export 처리를 할수 있다.

// path: /lib/database/test03.js
import { MongoClient } from 'mongodb';

const uri = "mongodb://my-mongo:27017/test03";
const client = new MongoClient(uri);
await client.connect();
const test03 = client.db('test03');

export { test03 }; // Named export !!

아니면 괄호 없이 아래와 같이 변수이름을 지정하면서 바로 export 하는게 일반적이긴 하다.

export const test03 = client.db('test03'); // Named export !!

이제 export 한 모듈을 import 해서 연결하는 부분이다. Named 방식으로 export 된 모듈은 무조건 { } 를 이용해서 import 해야 한다. 그리고 export 당시 변수명을 그대로 가져와서 사용해야 한다. 물론 as 문법으로 다른 이름으로 변경해서 받을 수도 있는데, 자세한 내용은 여기 클릭해서 확인한다.

// path : /routes/member/select/+server.js
import { json } from '@sveltejs/kit';
import { test03 } from "$lib/database/test03"

export async function GET() {
    const sample01 = test03.collection('sample01');
    const query = { type : 'con01' };
    const result = await sample01.findOne(query, { projection: { _id : 0 } });
	return json(result);
}

case2. Default export

Default 방식은 한 모듈 js 파일내에 하나의 기능 혹은 데이터가 정의되어 있을때 사용한다. default 문법을 쓰면되고, { } 가 필요없다.

// path: /lib/database/test03.js
import { MongoClient } from 'mongodb';

const uri = "mongodb://my-mongo:27017/test03";
const client = new MongoClient(uri);
await client.connect();
const test03 = client.db('test03');

export default test03; // Default export!!

사실 default export 는 모듈당 한개일때만 하다보니, 이름이 필요없이 아래처럼 export 하는게 일반적이다.

export default client.db('test03'); // Default export!!

default export 된 모듈을 import 할때 역시, { } 가 필요없이 바로 이름을 지정하면된다. Default 방식인 경우, import 할때 이름은 아무거나 해도 된다. 하지만 보통 export 한 모듈의 파일명을 따라쓰는게 일반적인거 같다.

import { json } from '@sveltejs/kit';
import newName from "$lib/database/test03"

export async function GET() {
    const sample01 = newName.collection('sample01');
    const query = { type : 'con01' };
    const result = await sample01.findOne(query, { projection: { _id : 0 } });
	return json(result);
}

더 보면 좋을 글들