function bbb(qqqq :any) {
console.log('qqq',qqqq)
}
@bbb
class Board {
}
@
는 함수를 의미한다.
class Board가 bbb 함수의 인자로 들어간다.
js 파일을 실행시키기 위해서는 node aaa.js를 하면 됐고, ts 파일을 실행시키기 위해서는 ts-node bbb.ts를 하면 된다.
node는 컴퓨터 전체에 설치했어서 실행이 가능했지만, ts-node는 설치한 적이 없다.
단지 다운로드 받은 것은 node-modules
이라서, ts-node bbb.ts 하게 되면 실행이 안된다.
node-modules 안에 ts-node가 있으므로, node-modules를 기준으로 실행시켜줘야 한다.
그렇게 하기 위해, 실행 명령어를 package.json에 script로 등록을 해줘야 한다.
yarn dev
로 실행하게 되면 class Board가 실행되는 것을 볼 수 있다.테이블 만들라
는 명령이 실행된다.cors: true
한 줄만 추가해주면 된다.// DOCS와 api를 그룹핑하여 server를 만들어줌.
const server = new ApolloServer({
typeDefs,
resolvers,
// cors: true,
cors: {
origin: [
"https//naver.com",
]
}
});
정리
-DOCS와 API는 생긴 것이 똑같아야 한다(제목, type이 일치해야함)
-그리고 DOCS와 API를 서버에서 합치고 누군든지 접근이 가능하게끔 cors를 true 해서 서버를 만들어줬고 서버에서 DB까지 접속이 완료된 모든 세팅이 끝나고 마지막에 다른 사람의 접근을 기다려줘야한다.
전체코드
console.log('반갑습니둥');
const aaa: number = 2;
import { DataSource } from "typeorm";
import { Board } from "./Board.postgres";
// import { ApolloServer } from '@apollo/server';
// import { startStandaloneServer } from '@apollo/server/standalone';
// import { gql } from "apollo-server";
// //commonjs -> 옛날 방식
// const { ApolloServer, gql } = require("apollo-server");
// module -> 최신 방식
import { ApolloServer, gql } from "apollo-server";
// The GraphQL schema
// const typeDefs = `#graphql
// type Query {
// hello: String
// }
// `;
// DOCS
const typeDefs = gql`
type Query {
fetchBoard: String
}
type Mutation {
createBoard: String
}
`
// api
const resolvers = {
Query: {
fetchBoards: () => {
return "게시글 조회에 성공하였습니다.";
}
},
Mutation: {
createBoard: () => {
return "게시글 등록에 성공하였습니다.";
}
}
};
// DOCS와 api를 그룹핑하여 server를 만들어줌.
const server = new ApolloServer({
typeDefs,
resolvers,
cors: true,
// // 선택한 사이트만 풀어주고 싶을때
// cors: {
// origin: [
// "https//naver.com",
// ]
// }
});
// const { url } = await startStandaloneServer(server);
// console.log(`🚀 Server ready at ${url}`);
//DB 접속 정보
const AppDataSource = new DataSource({
type: "postgres",
host: "34.22.64.245",
port: 5004,
username: "postgres",
password: "postgres2022",
database: "postgres",
synchronize: true,
logging: true,
entities: [Board]
});
AppDataSource.initialize()
.then(() => {
console.log('DB접속에 성공하였습니다.');
// DB 연결까지 모두 끝나고, 가장 마지막에 실행(다른 사람들의 접속을 기다리기 위해서)
server.listen(4000).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
}).catch((error) => {
console.log('DB접속에 실패하였습니다,');
console.log('원인: ');
console.log(error);
})
find()
, 한 개만 꺼내올 때에는 fetchBoard에서 Board.findOne({where: {number: 3 }})
를 통해 꺼내온다.전체 코드
import { DataSource } from "typeorm";
import { Board } from "./Board.postgres";
// module -> 최신 방식
import { ApolloServer, gql } from "apollo-server";
// DOCS
const typeDefs = gql`
type MyBoard {
number: Int
writer: String
title: String
contents: String
}
type Query {
fetchBoard: [MyBoard]
}
type Mutation {
createBoard: String
}
`
// api
const resolvers = {
Query: {
fetchBoards: async () => {
// 전부 꺼내기: find()
const result = await Board.find();
// // 한 개만 골라서 꺼내기: findOne()
// Board.findOne({where: {number: 3 }})
return result; // [{number:1, writer:"철수", title:"안녕하세요", contents:"반갑습니다."},{...},{...},...]
}
},
Mutation: {
createBoard: async () => {
await Board.insert({
writer: "철수",
title: "안녕하세요~",
contents: "반갑습니다~~",
})
return "게시글 등록에 성공하였습니다.";
}
}
};
// DOCS와 api를 그룹핑하여 server를 만들어줌.
const server = new ApolloServer({
typeDefs,
resolvers,
cors: true,
// // 선택한 사이트만 풀어주고 싶을때
// cors: {
// origin: [
// "https//naver.com",
// ]
// }
});
//DB 접속 정보
const AppDataSource = new DataSource({
type: "postgres",
host: "34.22.64.245",
port: 5004,
username: "postgres",
password: "postgres2022",
database: "postgres",
synchronize: true,
logging: true,
entities: [Board]
});
AppDataSource.initialize()
.then(() => {
console.log('DB접속에 성공하였습니다.');
// DB 연결까지 모두 끝나고, 가장 마지막에 실행(다른 사람들의 접속을 기다리기 위해서)
server.listen(4000).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
}).catch((error) => {
console.log('DB접속에 실패하였습니다,');
console.log('원인: ');
console.log(error);
})
데이터의 타입을 지정해주는 typeDefs에서 type과 input의 차이점은?
-> type은 받아올 때만 사용 가능하고, input은 입력값을 넣을 때 사용한다.
updateBoard: async () => {
// Board.update({조건},{바꿀 내용})
await Board.update({number:3},{writer:"영희"}); // 3번 게시글의 작성자를 영희로 바꿔줘.
return "게시글 수정에 성공하였습니다."
},
deleteBoard: async () => {
await Board.delete({number: 3}) // 3번 게시글 삭제해줘
await Board.update({number: 3}, {isDeleted: true})
// 실무에서는 실제로 삭제하지 않고, isDeleted라는 column을 추가하여 삭제되었다고 설정함
await Board.update({number: 3}, {deletedAt: new Date() })
// deletedAt이 null이면 삭제 안된 게시글, new Date() 시간이 들어가 있으면 그 시간에 삭제된 게시글
프론트엔드 개발자가 백엔드 없이 데이터를 Firebase에 직접 넣어줄 수 있게 해주는 것.
BaaS(Backend As A Service) : 구글에서 백엔드를 서비스로 제공해주고 있다.
SaaS(Software As A Service)
Paas(Platform As A Service)
IaaS(Infra As A Service)
// ////// 파이어베이스 app.tsx///////////
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: "...",
authDomain: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "...",
appId: "...",
};
// Initialize Firebase
export const firebaseApp = initializeApp(firebaseConfig);
// ///////////////////////
collection
을 통해 firebase 의 cloud storage에 해당하는 컬렉션을 지정해,
addDoc
을 통해 해당 컬렉션에 내용을 넣어준다.
getDocs
를 통해 저장된 내용들을 꺼내어 불러올 수 있다
백엔드에서 rest-api 만들때 유명한 라이브러리/프레임워크 중 하나인 express
백엔드에서 graphql-api 만들때 유명한 라이브러리/프레임워크 중 하나인 apollo-server
const {ApolloServer, gql} = require("apollo-server");
import {ApolloServer, gql} from "apollo-server";
-> 방식의 차이는 조금 있으나 모양은 비슷하지만 애초에 가져오는 양 자체가 다르기 때문에 Module 방식이 효율적이다.
라이브러리 앞에 @ 붙은 것은 회사이름이다.
ex) graphqlapi -> @apollo/client