4주 프로젝트를 진행 했을 때
서버에서 가장 메인이 되었던 기술은 GraphQL
입니다.
코드스테이츠에서 이머시브 코스를 수강하는 중에는 REST API를 학습했었습니다.
그러나 우연하게 GraphQL에 대해서 알 수 있는 기회가 있었고 궁금증을 가지게 되었습니다.
REST API와 GraphQL에 차이는 무엇일까? 를 직접 두 가지 방식을 사용하여
차이점을 몸소 느껴보고싶었습니다.
그것이 2주 프로젝트에서는 REST API 방식 4주 프로젝트에서는 GraphQL 방식을 사용한 이유입니다.
REST API 와 같이 서버로부터 데이터를 응답으로 받기 위하여 어떤 방식으로 요청할지에 대해서 정의한 문법입니다.
페이스북에서 만들어졌습니다.
FaceBook의 서비스 구동 환경은 다양합니다.
Android, Ios, Web 환경이 있습니다.
다양한 구동 환경의 문제점.
- 각 구동 환경마다 필요한 데이터의 형태가 같지 않다는게 가장 큰 문제 였습니다.
우선 응답받을 데이터의 형태가 같지 않다면 요청에 대한 endpoint가 그만큼 늘어나야 하기 때문입니다.
그래서 FaceBook은 모바일 환경과 웹 환경에서의 API들을 일일히 구현 하는것이 매우 힘들었다고 합니다.
FaceBook이 내놓은 해결책은 간단했습니다.
- 단순하게 하나의 응답만을 반환하는 다수의 EndPoint가 아니라
{
userName: "jake",
email: "jake@naver.com",
profileImage: "url"
}
- Query는 Server로 보내는 요청입니다.
예시 코드
```javascript
// 서버로 쿼리문의 형태로 요청을 보냅니다.
query {
convenienceStore {
apple,
pork
}
}
```
그리고 그 부탁(요청)은 한 번에 여러가지의 일도 맡길 수 있습니다.
query {
convenienceStore {
apple,
pork
},
tailorShop { // 한 번의 요청에 다른 종류의 데이터를 받아 올 수 있습니다.
shoes
}
}
- 부탁은 한 번에 여러가지 일도 맡길 수 있습니다.
- convenienceStore와 tailorShop에서 각각 다른 데이터를 가져오고 있습니다.
- REST API의 UnderFetching 문제를 해결 할 수 있습니다.
```javascript
query {
convenienceStore { // 받아올 데이터의 형태가 달라졌습니다.
snack
},
tailorShop {
shoes
}
}
- 같은 EndPorint로 요청을 보내더라도 받아올 데이터의 형태가 달라 질 수 있습니다.
- REST API의 OverFetching 문제를 해결할 수 있습니다.
type Query {
convenienceStore: {
pork: String!
apple: String!
snack: String!
}
tailorShop: {
suit: String!
shoes: String!
}
}
export default{
Query: {
convenienceStore: (root, args, context, info) => {
return {
pork: "Pork!",
apple: "Apple!",
snack: "Snack!"
}
},
tailorShop: (root, args, context, info) => {
return {
shoes: "Shoes!",
suit: "Suit!"
}
}
}
}
- Resolver가 바로 REST API의 Controller라고 생각하면 될 것 같습니다.
- Resolver로 원하는 데이터만을 Query로 작성하여 요청을 보내면 Resolver에서 데이터를 응답으로 반환합니다.
- 이 부분은 실제 가게에서 판매하는 물품이라고 생각하면 됩니다.
GraphQL
에 대해서 공부를 하고 나서 처음으로 느꼈던 점은 거대한 쇼핑몰 같다는 생각이 들었습니다.
한 번 요청을 보낼 때마다 쇼핑몰에 입장하여 원하거나 혹은 필요한 물건들만 구매하여 집으로 돌아간다는 느낌을 받았기 떄문입니다.
REST API와는 확연히 다른 느낌입니다.
REST API에서 느꼇던건 멀리 멀리 동떨어져 있는 가게들을 한 번의 요청이 오면 딱 하나의 가게 밖에 가지 못한다고 느꼈기 때문입니다.
프로젝트를 진행하면서 큰 문제에 봉착하게 됩니다.
바로 카카오 소셜 로그인
이 문제였습니다.
카카오 소셜 로그인의 흐름
1. 클라이언트에서 서버로 요청을 보낸다.
2. 서버에서 카카오로 유저 인증을 위한 요청을 보낸다.
3. 카카오에서 유저 인증을 완료한다.
4. 다시 서버로 요청을 리다이렉트한다.
5. 모든 요청이 완료 되면 클라이언트로 응답을 보내준다.
위의 흐름 중 카카오에서 다시 서버로 요청을 보내는 부분에서 문제가 생겼습니다.
GraphQL의 서버는 Endpoint가 단 하나!
그러나 카카오에서 서버로 리다이렉트를 해줄 url을 설정해야 했습니다.
이 부분에서 팀원들과 EndPoint가 하나이기 때문에 발생한 문제를 어떻게 해결해야 하나 고민했습니다.
놀랍게도 이 문제는 간단하게 해결되었습니다.
바로 REST API를 같이 사용하면 해결될 문제였습니다.
저는 GraphQL 서버에서는 무조건 GraphQL 방식을 고수해야만 하는 줄 알았지만
딱히 그런 것도 아니었습니다.
REST API를 사용해야 될 부분에서는 그냥 REST API 방식을 이용하면 됐습니다.
하지만 조심해야될 부분이 있는데
기능 하나를 구현할 때에 GraphQL 방식과 REST API 방식을 사용하는 건 그다지 좋은 방법이 아니기 떄문에
독립적인 기능일 때에만 두 가지 방식을 혼용해서 써야합니다.
GraphQL은 REST API의 상위 호환이 아니며 REST API를 대체할 수 있는 하나의 스펙이라고 생각합니다.
두 가지 방식의 장단점을 잘 파악하여 GraphQL만을 사용한 서버 혹은 REST API만을 사용한 서버 그것도 아니라면 두 가지 모두 혼용한 서버를 구축할지 설계를 해야할 것 입니다.
우연히 봤는데, 잘 정리되어 있어서 읽고 갑니다!
덕분에 GraphQL 개념 간단하게나마 이해하고 가욧