GraphQL ๊ตฌ์กฐ
- ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒฝ์ฐ, REST API์ ๊ฒฝ์ฐ GET ์์ฒญ์ ํ๋ค๋ฉด, GraphQL์์๋ query๋ฅผ ์ด์ฉํด์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ Create, Update, Delete ์ ๊ฐ์ด ์์ ํ๋ค๋ฉด, GraphQL์์๋ mutation๋ฅผ ์ด์ฉํ๋ค.
- ๋ ๋์๊ฐ GraphQL์์๋ subscription์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ ์ ์๋ค.
โ๏ธ ์ฟผ๋ฆฌ (query) = ๋ฐ์ดํฐ ์กฐํํ๊ธฐ
โป ํ๋
์์1)
๐์์ฒญ๐
{
pizza {
name
}
}
๐์๋ต๐
{
"data" : {
"pizza":{
"name" : "bulgogi pizza"
}
}
}
GraphQL์ ์๋ฒ์ ์์ฒญํ ๋ ์์ํ๋ ๋๋ก ์๋ต๋ฐ๋๋ค. (์๋๋ฉด ์๋ฒ๋ GraphQL์ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์๊ตฌํ๋ ํ๋๋ฅผ ์ ํํ๊ฒ ์๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. )
์์2)
๐์์ฒญ๐
{
pizza {
name
topping {
name
}
}
}
๐์๋ต๐
{
"data" : {
"pizza":{
"name" : "bulgogi pizza",
"topping" : [
{
"name" : "cheese"
},
{
"name" : "bacon"
}
]
}
}
}
โฅ ์ํ๋ ํ๋๋ฅผ ์ค์ฒฉํด์ ์ฟผ๋ฆฌํ๋ ๊ฒ๋ ๊ฐ๋ฅ!
โป ์ ๋ฌ์ธ์
ํ๋์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ถ์ ์ถ๊ฐํ๋ฉด ์ฟผ๋ฆฌ์ ํ๋ ๋ฐ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ค์ ์ ๋ฌํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ง ๋ฐ์์ฌ ์ ์๋ค.
๐์์ฒญ๐ (id๊ฐ 5์ธ ํ์์ ์ด๋ฆ๊ณผ ์ ์๋ฅผ ์ฟผ๋ฆฌ)
{
student(id: '5'){
name
score
}
}
๐์๋ต๐
{
'data': {
'student':{
'name' : 'Lee',
'score' : 100
}
}
}
(REST API๋ฅผ ์ด์ฉํ๋ค๋ฉด ?id=1000 ์ด๊ฑฐ๋ /1000(/:id)์ผ ๋์ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฟผ๋ฆฌ)
โป ๋ณ๋ช
ํ๋ ์ด๋ฆ์ ์ค๋ณตํด์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ํ๋ ์ด๋ฆ์ ์ค๋ณต์ผ๋ก ์ฌ์ฉํด์ผํ ๊ฒฝ์ฐ์๋ ๋ณ๋ช ์ ๋ถ์ฌ์ ์ฟผ๋ฆฌ
๐ํ๋ฆฐ ์์ฒญ๐
{
hero(episode:EMPIRE) {
name
}
hero(episode:JEDI) {
name
}
}
๐์ฌ๋ฐ๋ฅธ ์์ฒญ๐ (ํ๋์ด๋ฆ ์ค๋ณต๋๋ฉด ๋ณ๋ช ๋ถ์ด๊ธฐ!)
{
empireHero: hero(episode:EMPIRE) {
name
}
jediHero: hero(episode:JEDI) {
name
}
}
๐์๋ต๐
{
'data':{
'empireHero':{
'name':'Lee'
}
'jediHero':{
'name':'Sue'
}
}
}
โป ์คํผ๋ ์ด์ ๋ค์
์ฝ๋๋ฅผ ๋ชจํธํ์ง ์๊ฒ query keyword, query name ์์ฑํ๊ธฐ
๐์์ฒญ๐ / ์คํผ๋ ์ด์ ํ์ ์ ์๋์ฒ๋ผ query๋ ์๊ณ , mutation, subscription, describes ๋ฑ์ด ์๋ค.
query HeroNameAndFriends {
hero{
name
friends {
name
}
}
}
๐์๋ต๐
{
'data':{
'hero':{
'name':'Lee',
'friends':[
{'name':'Sue'},
{'name':'Bae'},
]
}
}
}
โป ๋ณ์
์์ ์์๋ ๊ณ ์ ๋ ์ธ์๋ฅผ ๋ฐ๋ ์์ ์ด๋ค.
๋์ ์ผ๋ก ์ธ์๋ฅผ ๋ฐ์์ ์ฟผ๋ฆฌํ๋ ค๋ฉด ๋ณ์๋ฅผ ์จ์ผํ๋ค.
์คํผ๋ ์ด์ ๋ค์ ์์ ๋ณ์๋ฅผ $๋ณ์ ์ด๋ฆ:ํ์ ํํ๋ก ์ฐ๊ธฐ
๋ง์ฝ $episode: Episode ์์ ๋ค์ !๊ฐ ๋ถ์ผ๋ฉด episode๋ ๋ฐ๋์ Episode์ฌ์ผ ํ๋ค! (! ๋ ์ต์ ๋!!)
๐์์ฒญ๐
query HeroNameAndFriends($episode: Episode){
hero(episode: $episode){
name
friends {
name
}
}
}
โ๏ธ ๋ฎคํ ์ด์ (mutation) = ๋ฐ์ดํฐ ์์ ํ๊ธฐ
mutation CreateReviewForEpisode($ep: Episode!, #review:ReviewInput!){
createReview(episode: $ep, review:$review){
stars
commentary
}
}
โ๏ธ ์คํค๋ง/ํ์ (Schema/Type)
type Character {
name: String!
appearsIn: [Episode!]!
}
- Character๋ GraphQL ๊ฐ์ฒด ํ์ ์ด๋ฉฐ, ์ฆ ํ๋๊ฐ ์๋ ํ์ ์์ ์๋ฏธํ๋ค. (์คํค๋ง ๋๋ถ๋ถ์ ํ์ ์ ๊ฐ์ฒด ํ์ )
- name ๊ณผ appearIn ์ Character ํ์ ์ ํ๋์ด๋ค. ์ฆ name ๊ณผ appearIn ์ GraphQL ์ฟผ๋ฆฌ์ Character ํ์ ์ด๋์๋ ์ฌ์ฉํ ์ ์๋ ํ๋์ด๋ค.
- String์ ๋ด์ฅ๋ ์ค์นผ๋ผ ํ์ ์ค ํ๋์ด๋ค. ์ด๋ ๋จ์ผ ์ค์นผ๋ผ ๊ฐ์ฒด๋ก ํ์ธ๋๋ ์ ํ์ด๋ฉฐ ์ฟผ๋ฆฌ์์ ํ์ ์ ํ์ ๊ฐ์ง ์ ์๋ค. ์ค์นผ๋ผ ํ์ ์๋ ID, Int๋ ์๋ค.
- !๊ฐ ๋ถ๋๋ค๋ฉด ์ด ํ๋๋ nullableํ์ง ์๊ณ ๋ฐ๋์ ๊ฐ์ด ๋ค์ด์จ๋ค๋ ์๋ฏธ! ๋๋ํ!๋ฅผ ๋ถ์ฌ ์ฟผ๋ฆฌํ๋ค๋ฉด ๋ฐ๋์ ๊ฐ์ ๋ฐ์ ์ ์์ ๊ฒ์ด๋ ์์์ ํ ์ ์๋ค.
- [ ]๋ ๋ฐฐ์ด์ ์๋ฏธํ๋ค. ๋ฐฐ์ด์๋ !๊ฐ ๋ถ์ ์ ์๋ค. ์ฌ๊ธฐ์๋ ! ์ด ๋ค์ ๋ถ์ด ์์ด null ๊ฐ์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ํญ์ 0๊ฐ ์ด์์ ์์๋ฅผ ํฌํจํ ๋ฐฐ์ด์ ๊ธฐ๋ํ ์ ์๋ค.
โ๏ธ ๋ฆฌ์กธ๋ฒ(Resolver)
์์ฒญ์ ๋ํ ์๋ต์ ๊ฒฐ์ ํด์ฃผ๋ ํจ์์ด๋ค.
์คํค๋ง๋ฅผ ์ ์ํ๋ฉด ๊ทธ ์คํค๋ง ํ๋์ ์ฌ์ฉ๋๋ ํจ์์ ์ค์ ํ๋์ Resolver์์ ์ ์ํ๋ค.
(์ด๋ฐ ํจ์๋ค์ด ๋ชจ์ฌ์๊ธฐ ๋๋ฌธ์ Resolvers๋ผ๊ณ ํจ)
* GraphQL์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ (๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ, ์๊ฒฉ API ์์ฒญ)์ ์ง์ ๊ตฌํํด์ผ ํ๋๋ฐ ์ด๋ฅผ Resolver๊ฐ ๋ด๋นํ๋ค.
const db = require("./../db")
const resolvers = {
Query: { // **Query :** ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (REST ์ GET ๊ณผ ๋น์ทํฉ๋๋ค.)
getUser: async (_, { email, pw }) => {
db.findOne({
where: { email, pw }
}) ... // ์ค์ ๋๋น์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ์์ฑํฉ๋๋ค.
...
}
},
Mutation: { // **Mutation :** ์ ์ฅ๋ ๋ฐ์ดํฐ ์์ ํ๊ธฐ ( Create , Update , Delete )
createUser: async (_, { email, pw, name }) => {
...
}
}
Subscription: { // **Subscription :** ์ค์๊ฐ ์
๋ฐ์ดํธ
newUser: async () => {
...
}
}
};
๋ ๊ณต๋ถํ๊ธฐ)
๐ ์๋ชป๋ ๊ฐ๋ ์ ๋ฌ์ด ์๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค. ์ ์ ์ฑ์ฅ์ ํฐ ๋์์ด ๋ฉ๋๋ค๐ค
'๐ฌComputer Science > ๋คํธ์ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
axios instance๋ก ์จ๋ณด๊ธฐ (0) | 2022.09.14 |
---|---|
AWS๋ฅผ ์ด์ฉํ ์๋ฒ ๋ฐฐํฌ ์๋ํ ํ์ดํ๋ผ์ธ ๊ตฌ์ถํ๊ธฐ, EC2 ๊ธฐ๋ณธ ์ธํ ๋ถํฐ, AWS๋ก ์๋ฒ ๋ฐฐํฌ (0) | 2022.08.09 |
GraphQL์ด๋, ํน์ง, ์ฅ๋จ์ , REST API์ ๋น๊ต (0) | 2022.08.02 |
์น ์บ์๋, ์บ์์ ์ฅ์ , ์บ์๊ฐ ์ฌ์ฉ๋๋ ๊ณณ (0) | 2022.08.01 |
๊ฐ๋น์ง ์ปฌ๋ ์ ์ด๋ (0) | 2022.08.01 |