일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- redis
- 자바
- 프로그래머스
- 백준알고리즘
- k8s
- puppeteer
- Spring
- Docker
- java11
- 스프링부트
- mysql
- nodejs
- java
- mongodb
- ai
- bufferdreader
- 스프링
- Apollo
- LangChain
- eof
- Mongoose
- Scanner
- restapi
- 서버
- graphql
- Android
- 조건문
- MapReduce
- TCP
- HTTP
- Today
- Total
자라나라 개발머리
3. 환경변수 세팅 / 코드 모듈화 / 테스트 (완) 본문
환경변수 세팅
github에 해당 코드를 올려야 하는 상황인데, 데이터베이스 아이디 비밀번호가 코드 상에 노출되어 있어 그대로 올리기가 위험했다. 구글링해보니, 이를 환경변수로 세팅하는 방법이 있길래 이를 시도했다. 나처럼 민감한 정보를 환경변수 파일에 숨기기도 하고, 협업 시 서로 다른 컴퓨터에서 같은 환경을 유지하기 위해 환경변수 세팅을 한다고 한다.
dotenv 프레임워크를 사용했다.
npm i dotenv
프로젝트 최상위 폴더에 .env파일을 만들어주고 안에 환경변수를 작성해주면 된다.
파일에 작성한 환경 변수는 process.env.변수명으로 사용하면된다.
아래는 사용 전, 사용 후 코드이다.
사용 전
mongoose
.connect( 'mongodb+srv://{id}:<password>@exchangeratecluster.1uwsu64.mongodb.net/?retryWrites=true&w=majority');
.then(() => console.log('MongoDB conected'))
.catch((err) => {
console.log(err);
});
사용 후
import dotenv from 'dotenv';
dotenv.config();
mongoose
.connect(process.env.DB_URL;);
.then(() => console.log('MongoDB conected'))
.catch((err) => {
console.log(err);
});
이렇게 수정한 뒤 .env 파일을 .gitignore에 .env을 추가하면 된다.
코드 모듈화
작성한 코드가 정상적으로 돌아가긴 하나, 모든 기능이 한 문서안에 구현되어 있어 유지보수, 확장성, 코드가독성 모두 꽝 이어서 코드 모듈화를 진행했다.
딱 정해져있는 구조가 없는 것 같아서, github의 여러 repo의 구조를 참고했다.
정리한 디렉토리 구조는 이렇다.
아래는 수정한 최종코드이다.
index.js
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';
import dotenv from 'dotenv';
import typeDefs from './graphql/typeDefs.js'
import resolvers from './graphql/resolvers.js'
import connectDB from './db.js';
dotenv.config();
connectDB();
const server = new ApolloServer({ typeDefs,resolvers });
const { url } = await startStandaloneServer(server, {
listen: { port: process.env.PORT },
});
console.log(`🚀 Server ready at: ${url}`);
db.js
import mongoose from 'mongoose';
import dotenv from 'dotenv';
dotenv.config();
const mongoDB = process.env.DB_URL;
const connectDB = async () => {
try {
await mongoose.connect(mongoDB);
console.log('MongoDB connected');
} catch (err) {
console.error(err);
}
};
export default connectDB;
models/exchangeRate.js
import mongoose from 'mongoose';
// ExchangeRate 모델 정의
const exchangeRateSchema = new mongoose.Schema({
src: String,
tgt: String,
rate: Number,
date: String
});
const ExchangeRate = mongoose.model('ExchangeRate', exchangeRateSchema);
export default ExchangeRate;
graphql/typeDefs.js
import { gql } from "graphql-tag"
const typeDefs = gql`
type Query {
"환율조회"
getExchangeRate(src:String!, tgt:String!): ExchangeInfo
}
type Mutation {
"환율등록, src, tgt, date에 대해서 upsert"
postExchangeRate(info: InputUpdateExchangeInfo): ExchangeInfo
"환율삭제, 해당일자의 해당 통화간 환율을 삭제"
deleteExchangeRate(info: InputDeleteExchangeInfo): ExchangeInfo
}
"환율업데이트정보 Input"
input InputUpdateExchangeInfo {
"소스통화, krw, usd"
src: String!
"타겟통화"
tgt: String!
"환율"
rate: Float!
"기준일, 값이 없으면, 최신일자로 등록"
date: String
}
"환율삭제 Input"
input InputDeleteExchangeInfo {
"소스통화"
src: String!
"타겟통화"
tgt: String!
"기준일"
date: String!
}
"환율정보"
type ExchangeInfo {
"소스통화"
src: String!
"타겟통화"
tgt: String!
"환율"
rate: Float!
"기준일, 값이 없으면, 최신일자의 환율을 응답"
date: String!
}
`;
export default typeDefs;
graphql/resolvers.js
import moment from 'moment';
import ExchangeRate from '../models/exchangeRate.js';
const resolvers = {
Query: {
async getExchangeRate(_, args) {
const { src, tgt } = args
const date = moment().format('YYYY-MM-DD');
const filter = { src: src, tgt: tgt, date: date };
try {
const exchangeRate = await ExchangeRate.findOne(filter);
return exchangeRate;
} catch (err) {
console.error('환율 조회 오류:', err);
}
}
},
Mutation: {
async postExchangeRate(_, args) {
const { info } = args;
const filter = { src: info.src, tgt: info.tgt, date: info.date };
const update = { rate: info.src == info.tgt ? 1.0 : info.rate };
const options = { upsert: true, new: true };
try {
const exchangeRate = await ExchangeRate.findOneAndUpdate(filter, update, options);
return exchangeRate;
} catch (err) {
console.error('환율 업데이트 오류:', err);
}
},
async deleteExchangeRate(_, args) {
const { info } = args;
const filter = { src: info.src, tgt: info.tgt, date: info.date };
try {
const deletedExchangeRate = await ExchangeRate.findOne(filter);
await ExchangeRate.deleteOne(filter);
return deletedExchangeRate;
} catch (err) {
console.error('환율 삭제 오류:', err);
}
},
}
};
export default resolvers;
테스트
postman을 이용해 테스트했다.
headers에서 Content-Type = application/json 세팅해줬다.
Body엔 각 조회, 수정 및 생성, 삭제에 대한 쿼리를 json으로 작성한다.
테스트 결과
조회
수정 및 생성
삭제
마무리
여기까지 node.js-mongoDB를 이용한 GraphQL API 서버를 구현해보았다.
코드는 아래 github 주소에 있다.
https://github.com/iammindy/GraphQL-mongoDB-CRUD
GitHub - iammindy/GraphQL-mongoDB-CRUD: GraphQL, mongoDB를 이용한 API 서버 구현
GraphQL, mongoDB를 이용한 API 서버 구현. Contribute to iammindy/GraphQL-mongoDB-CRUD development by creating an account on GitHub.
github.com
'프로젝트 > 개인' 카테고리의 다른 글
2. GraphQL 정리 / 스키마 분석 / resolvers 구현 (0) | 2023.06.05 |
---|---|
1. node.js - MongoDB 개발 환경 세팅 / DB 연동 (0) | 2023.06.05 |
0. Node.js - MongoDB GraphQL API 서버 구현 개요 / 리서치 (0) | 2023.06.05 |
3. 스프링 부트 - 안드로이드 스튜디오 연결/Retrofit2 (완) (0) | 2023.02.25 |
2. 스프링 부트 - MySQL 연결 (JPA 사용) (0) | 2023.01.28 |