Firebase란 💡
서버 대신 만들어주는 서비스이다. 대표적인 기능으로인증
,데이터베이스
,스토리지
,원격 구성
,푸시 알람
,실시간
등이 있다.
원래 사이드 프로젝트로 BE 2명 / FE 1명으로 구성한 쇼핑몰 프로젝트를 구현하던 중 협업 과정에서 BE의 작업 속도에 따라서 데이터를 받아야하는 FE입장에서는 진행함에 있어서 수동적으로 request에만 의존해야 했던 문제가 있었다.
이를 통해, 단순 FE단에서 먼저 구현해보고 BE와 나중에 추가적으로 병합할 수 있으면 작업 속도와 효율성이 좋을 것이라 판단하였습니다. 그렇게 FE단에서도 BE의 흉내를 낼 수 있는 Firebase
를 사용해보고 프로젝트를 만들어낼 때, 프로토타입으로 적용하기에 큰 이점이 될 수 있다는 것을 알게 됨.
firebase
를 이요하면오랜시간을 들여서 백엔드를 모두 구현할 필요가 없다. 개인 프로젝트를 하면서, 백엔드를 할 수 없으니 나에겐 필요한 기능이라고 볼 수 있다. 스카마가 없기 때문에 데이터 관리의 어려움이 있다. 따라서, 타입 기반의 스키마를 정의하는
graphql
을 연동하여 사용한다면, 좋지않을까...? 판단
url
과 http
메소드를 통해서 데이터를 패칭하는것에는 대표적으로 두 가지 단점이 존재한다. over-fetching
, under-fetching
const server = new ApolloServer({
typeDefs: schema,
resolvers: resolvers,
context: {
db: {
......
},
},
});
const app = express();
await server.start();
server.applyMiddleware({
app,
path: "/graphql",
cors: {
origin: ["http://localhost:3000", "https://studio.apollographql.com"],
credentials: true,
},
});
typeDefs
와 resolvers
이다.
const productSchema = gql`
type Category {
category_lg: String!
category_md: String!
category_sm: String!
}
type Product {
id: ID!
brand: String!
name: String!
image_url: String!
origin_price: Int!
discount: Int!
new: Boolean!
category: Category!
createdAt: Float!
}
extend type Query {
products: [Product!]
product(id: ID!): Product!
selectedProducts(
category_lg: String!
category_md: String
category_sm: String
): [Product!]
}
`;
export default productSchema;
products: async (parent, arg) => {
const products = collection(db, "products");
const querySnapshot = await getDocs(products);
const data: DocumentData[] = [];
querySnapshot.forEach((doc: DocumentData) => {
const d = doc.data();
data.push({
id: doc.id,
...d,
});
});
return data;
},
product: async (parent, { id }) => {
const querySnapshot = await getDoc(doc(db, "products", id));
return {
...querySnapshot.data(),
id: querySnapshot.id,
};
},
collection(db, "products")
을 통해서, firebase의 컬렉션에 products
로 정의된 컬렉션에 접근을 하고 getDocs()
을 사용하여 해당 데이터들을 가져와서 스냅샷을 찍고, 새로운 배열을 만들고 그 배열안에 스냅샷의 데이터를 변형하여 넣도록 한다.foreEach
메소드를 통해서, 각각의 데이터에 id값을 부여하여 return하도록 한다.
Key Point
스냅샷을 만들어서 사용
- 원본 데이터가 변형되는 것을 막기 위해
https://velog.io/@taetae-5/FE-Study-Javascript-3
주의 !!
firebase에서는 기본적으로 제공하는 메소드들이 정해져있고, map은 제공하지 않는다.