๐ GraphQL APIs ์ค๋ช (์ค์ Node.js ์์ ์ ํจ๊ป)
Source: Dev.to
REST๋ ์ด๋์๋ ์กด์ฌํ์ง๋ง, GraphQL์ ํ๋ API๊ฐ ๊ตฌ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๊พธ๊ณ ์์ต๋๋ค.
์ด ๊ธ์์ ๋ฐฐ์ฐ๊ฒ ๋ ๋ด์ฉ:
- GraphQL์ด ์ค์ ๋ก ๋ฌด์์ธ์ง
- ์ด๋ป๊ฒ ์๋ํ๋์ง (์ ๋ฌธ ์ฉ์ด ์์ด)
- ์ค์ Node.js GraphQL API ์์
- ์ฅ์ ๊ณผ ๋จ์ (๋ง์ผํ ๊ณผ๋๊ด๊ณ ์์ด)
- NOT ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ
๐ค GraphQL์ด๋?
GraphQL์ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์ด๋ฉฐ, ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํ ๋ฐํ์์
๋๋ค.
REST์ ๊ฐ์ด ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๋์ , GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ์ ํํ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ ์ ์๋ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค โ ๋ ๋ง์ง๋, ์ ์ง๋ ์๊ฒ.
REST ์์
GET /users/1
GET /users/1/posts
GET /users/1/followers
GraphQL ์์
query {
user(id: 1) {
name
posts {
title
}
followers {
name
}
}
}
ํ๋์ ์์ฒญ. ํ๋์ ์๋ต. ์ ํํ ๋ฐ์ดํฐ.
๐ง GraphQL์ด ์ธ๊ธฐ๋ฅผ ๋ ์ด์
์ ํต์ ์ธ REST API๋ ์ค๋ฒํจ์นญ(๋ฐ ์ธ๋ํจ์นญ) ๋ฌธ์ ๋ฅผ ๊ฒช์ต๋๋ค. GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ต ํํ๋ฅผ ์ ์ดํ๋๋ก ํจ์ผ๋ก์จ ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค.
โ๏ธ GraphQL ์๋ ๋ฐฉ์ (๊ฐ๋จ ์ค๋ช )
GraphQL์๋ ์ธ ๊ฐ์ง ํต์ฌ ๋ถ๋ถ์ด ์์ต๋๋ค:
- Schema โ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ์ง ์ ์ํฉ๋๋ค (๊ณ์ฝ)
- Queries / Mutations โ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ฑฐ๋ ์์ ํ๋ ๋ฐฉ๋ฒ
- Resolvers โ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์
๐งฉ GraphQL vsโฏREST (๋น ๋ฅธ ๋น๊ต)
| Feature | GraphQL | REST |
|---|---|---|
| Endpoint count | Single endpoint | Multiple endpoints |
| Data fetching | Clientโspecified shape | Fixed responses per endpoint |
| Over/underโfetching | Eliminated | Common issue |
| Tooling & typing | Strongly typed schema, autoโcomplete | Varies per implementation |
Source:
๐งช ์ค์ GraphQL API ์์ (Node.js)
๐ฆ ์์กด์ฑ ์ค์น
npm init -y
npm install @apollo/server graphql
๐๏ธ index.js ๋ง๋ค๊ธฐ
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';
const users = [
{ id: "1", name: "Anshul", role: "Full Stack Developer" },
{ id: "2", name: "Rohit", role: "Backend Developer" }
];
// 1๏ธโฃ ์คํค๋ง
const typeDefs = `#graphql
type User {
id: ID!
name: String!
role: String!
}
type Query {
users: [User]
user(id: ID!): User
}
`;
// 2๏ธโฃ ๋ฆฌ์กธ๋ฒ
const resolvers = {
Query: {
users: () => users,
user: (_, { id }) => users.find(u => u.id === id)
}
};
// 3๏ธโฃ ์๋ฒ
const server = new ApolloServer({
typeDefs,
resolvers
});
const { url } = await startStandaloneServer(server, {
listen: { port: 4000 }
});
console.log(`๐ GraphQL Server ready at ${url}`);
๐ API ์ฟผ๋ฆฌํ๊ธฐ
๋ธ๋ผ์ฐ์ ์์ http://localhost:4000 ๋ฅผ ์ด๊ณ ๋ค์์ ์คํํฉ๋๋ค:
query {
users {
name
role
}
}
๊ฒฐ๊ณผ: ์์ฒญํ ํ๋๋ง ๋ฐํ๋ฉ๋๋คโ์ถ๊ฐ ๋ฐ์ดํฐ๋ ์์ต๋๋ค.
โ๏ธ ๋ฎคํ ์ด์ (๋ฐ์ดํฐ ์์ฑ / ์ ๋ฐ์ดํธ)
mutation {
createUser(name: "Amit", role: "Frontend Dev") {
id
name
}
}
๋ฎคํ ์ด์ ์ GraphQL์์ POST/PUT/DELETE์ ํด๋นํฉ๋๋ค.
๐ ฐ๏ธ GraphQL with Angular (ํ๋ก ํธ์๋๊ฐ ์ฌ๋ํ๋ ์ด์ )
- ํ์ํ ํ๋๋ง ๊ฐ์ ธ์ค๊ธฐ
- API ํธ์ถ ์ ๊ฐ์ โ UI ๋ ๋๋ง ์๋ ํฅ์
- ๋ชจ๋ฐ์ผ ์ฑ ๋ฐ ๋ณต์กํ ๋์๋ณด๋์ ์ด์์
์ธ๊ธฐ ์๋ Angular GraphQL ๋๊ตฌ
- Apollo Angular
- GraphQL Code Generator
- ๊ฐ๋ ฅํ TypeScript ์ง์
โ GraphQL์ ์ฅ์
- ํด๋ผ์ด์ธํธ๊ฐ ์ ์ดํ๋ ๋ฐ์ดํฐ โ ํ์ํ ๊ฒ๋ง ์ ํํ ๊ฐ์ ธ์ต๋๋ค.
- ๋จ์ผ ์๋ํฌ์ธํธ โ ์๋ํฌ์ธํธ ํญ๋ฐ์ด ์์ต๋๋ค.
- ๊ฐ๋ ฅํ ํ์ ์คํค๋ง โ ์๋ ์์ฑ, ๊ฒ์ฆ, ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ.
- ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์๋ ํฅ์ โ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์์ ํ ์ ์์ต๋๋ค.
- ๋ณต์กํ UI์ ์ต์ โ ๋์๋ณด๋, ๋ชจ๋ฐ์ผ ์ฑ, ์ค์๊ฐ ์์คํ ๋ฑ์ ์ ํฉํฉ๋๋ค.
โ GraphQL์ ๋จ์ (์ค์!)
- ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ โ ์คํค๋ง, ๋ฆฌ์กธ๋ฒ, ์ฟผ๋ฆฌ ๋ฌธ๋ฒ์ด ์ด๋ณด์์๊ฒ ์น์ํ์ง ์์.
- ์บ์ฑ์ด ์ด๋ ค์ โ REST๋ ๋ด์ฅ๋ HTTP ์บ์ฑ์ ํ์ฉํ์ง๋ง, GraphQL์ ๋ง์ถคํ ์๋ฃจ์ ์ด ํ์ํจ.
- ์ฟผ๋ฆฌ ๋ณต์ก๋ โ ๋ชจ๋ํฐ๋ง๋์ง ์์ ์๋ชป๋ ์ฟผ๋ฆฌ๋ ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์์.
- ๋จ์ CRUD API์ ์ ํฉํ์ง ์์ โ ๋จ์ํ ์ฌ์ฉ ์ฌ๋ก์์๋ ์ค๋ฒํค๋๊ฐ ์ด์ ์ ์์ํ ์ ์์.
๐ซ GraphQL์ ์ฌ์ฉํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ
- ๋งค์ฐ ๊ฐ๋จํ CRUD API
- HTTP ์บ์ ์์กด๋๊ฐ ๋์ ๊ฒฝ์ฐ
- ๊ท๋ชจ๊ฐ ์๊ฑฐ๋ ๊ฒฝํ์ด ๋ถ์กฑํ ํ
- ๋ณต์กํ ํด๋ผ์ด์ธํธโ์ฌ์ด๋ ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ
๐ง When GraphQL Is the BEST Choice
- ์ฌ๋ฌ ํ๋ก ํธ์๋ ํด๋ผ์ด์ธํธ(์น, ๋ชจ๋ฐ์ผ ๋ฑ)
- ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ ์ง๊ณ
- ๋น ๋ฅธ UI ๊ฐ๋ฐ ํ์
- ํ์ฅ ๊ฐ๋ฅํ๊ณ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์์คํ ๊ตฌ์ถ
๐ฅ GraphQL + Node.js ์คํ (ํธ๋ ๋ฉ)
- Node.js + TypeScript
- NestJS / Apollo Server
- Angular / React ํ๋ก ํธ์๋
- GraphQL Code Generator ๋ฅผ ์ฌ์ฉํ ํ์ ์์ ์ฑ
- JWT + ์ญํ ๊ธฐ๋ฐ ์ธ์ฆ
Source: Source on Medium
๐ ์ต์ข ์๊ฐ
GraphQL์ REST๋ฅผ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ๊ณผ ๋ค์์ ์๋น์๊ฐ ์๋ ์ํฉ์์ ๋น์ ๋ฐํ๋ ๋ณด์์ ์ธ ๋๊ตฌ์ ๋๋ค.
์ ์ฒด ์คํ Angularโฏ+โฏNode.js ๊ฐ๋ฐ์๋ผ๋ฉด, ํดํท์ GraphQL์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์ด ๊ธ์ด ๋ง์์ ๋์ จ๋ค๋ฉด, ๋ฐ์๋ฅผ ์น๊ฑฐ๋, ๊ณต์ ํ๊ฑฐ๋, โGRAPHQLโ์ด๋ผ๊ณ ๋๊ธ์ ๋ฌ์ ์ฃผ์ธ์. ๋ ๊น์ Angularโฏ+โฏGraphQL ํํ ๋ฆฌ์ผ์ ์ ๊ณตํด ๋๋ฆฝ๋๋ค.