클라우드 코드 함수를 사용한 GraphQL 및 NodeJS 통합
GraphQL은 API 개발자에게 설탕과 양념, 그리고 모든 좋은 기능을 제공하지만 기본적으로 쿼리 언어이기 때문에 원하는 것을 지정할 수 있습니다.
애플리케이션에 이보다 더 많은 비즈니스 인텔리전스가 필요하다면 어떻게 해야 할까요?
로직이 함께 필요하다면 어떻게 해야 할까요?
깔끔한 NPM 모듈 모듈을 함께 사용하려면 어떻게 해야 할까요?
오늘은 아주 강력한 무언가를 보여드릴 테니 안전벨트를 단단히 매세요. 그리고 강력한 힘에는 엄청난… 음… 엄청난 시간 절약, 엄청난 가능성, 엄청난 많은 좋은 것들이 따라오기 마련입니다.
GraphQL에 대해 더 자세히 알고 싶으시다면 이 포스팅을 살펴보세요: GraphQL이란?
Contents
타려면 키가 이 정도는 돼야…
그리고 Parse 3.5.0 이상을 사용하여 GraphQL을 사용하세요.
서버 설정 및 Parse 서버 관리로 이동하여 호환되는 버전을 사용 중인지 확인하세요.
새롭고 멋진 기능입니다: GraphQL + 클라우드 코드 함수
이미 Parse/Back4app 사용자라면 클라우드 코드를 사용해 보셨거나 적어도 들어보셨을 것입니다.
클라우드 코드는 기본적으로 최종 디바이스가 아닌 Back4app의 애플리케이션 서버에서 실행되는 NodeJS 코드입니다.
필요에 따라 몇 가지 주요 이점이 있지만 기본적으로 다음과 같은 이점이 있습니다:
-
휴대폰 배터리 절약
처리량이 많은 작업을 디바이스에서 클라우드로 가져가면 디바이스에서 처리량이 많은 작업을 수행하지 않으므로 배터리를 절약할 수 있습니다. 서버에서 처리를 완료하고 최종 결과만 클라이언트로 가져올 수 있습니다. 더 이상 주머니에 뜨거운 휴대전화를 넣을 필요가 없습니다. 더 이상 “이 앱 때문에 배터리가 다 닳았어!”라고 말할 필요가 없습니다.
-
데이터 요금 절약
보고서를 받기 위해 검색해야 하는 개체가 엄청나게 많다고 가정해 보세요. 수천 개? 수백만 개?
검색해야 하는 데이터의 양이 너무 많아서 와이파이를 사용하지 않는다면 휴대폰 데이터 요금제를 업그레이드하는 것이 좋습니다.
데이터 요금제가 꽤 비싸다는 것은 누구나 알고 있지만(더 이상 SMS 메시지를 유료로 보내는 사람은 없겠죠?), 좀 더 스마트한 접근 방식이 있다면 어떨까요?
클라우드에서 보고서를 완전히 계산하고 마지막 결과만 디바이스로 가져올 수 있다면 어떨까요? 데이터 요금제를 훨씬 덜 소모하고 더 빠르게 실행할 수 있는 더 작은 페이로드가 있다면 어떨까요?
멋지게 들리시나요? 이것이 바로 Cloud Code가 하는 일입니다…
-
더 빠른 코드 배포
예전에는 개발자가 소프트웨어를 앱 스토어에 다시 게시해야 했습니다. 그 당시에는 복권처럼 빠른 검토자를 확보하면 당일에 앱을 사용자에게 제공할 수 있었습니다. 느리거나 까다로운 리뷰어를 만나면 앱이 게시되는 데 몇 주가 걸릴 수도 있었습니다. 만약 앱이 게시되었다면요.
왜 그런 위험을 감수할까요?
애플리케이션의 프론트엔드 부분만 App Store에 제공하고 가능한 한 많은 로직을 클라우드 코드로 남겨두세요.
로직을 조금만 변경해야 하나요? 아니면 크게 변경해야 하나요? 문제 없습니다.
클라우드 코드를 변경하고 다시 배포하면 새것처럼 사용할 수 있습니다. 다른 곳의 누군가가 검토할 필요도 없고 고객에게 즉시 사용할 수 있습니다.
하지만 다시… GraphQL은 어떨까요?
GraphQL을 사용하면 쿼리를 만들 수 있습니다. 매우 스마트한 쿼리를 만들 수 있지만, 그냥 쿼리만 만들 수 있습니다.
저희 CEO인 Davi가 더 스마트하게 만드는 방법에 대해 논의할 때, Cloud Code Functions와의 통합은 논리에 불과해 보였습니다: 두 가지 장점을 모두 누릴 수 있습니다! 클라우드 코드 함수의 강력한 성능과 지능, 그리고 GraphQL의 간편함과 유지관리 용이성.
새로운 기능을 통해 GraphQL의 유형을 확장하여 클라우드 코드 함수를 실행하고 그 결과를 검색할 수 있습니다.
클라우드 코드 함수에 상상할 수 있는 모든 비즈니스 로직을 적용하고, NPM 모듈과 함께 포함시키고, GraphQL로 모든 것을 쿼리할 수 있습니다.
이야기는 충분합니다. 직접 해보겠습니다…
우리가 사용할 클래스와 객체
이 포스팅에서는 두 개의 클래스를 만들었습니다: Employee와 Pet으로, 여기 Back4app의 직원과 각각의 반려동물을 담을 것입니다.
Employee에는 다음과 같은 프로퍼티가 있습니다:
- 이름 (문자열)
- 나이 (숫자)
- 이메일 (문자열)
- 위치 (문자열)
- hasThisPet (펫 클래스에 대한 포인터)
펫에는 다음과 같은 프로퍼티가 있습니다:
- 이름 (문자열)
- 종 (문자열)
그리고 일부 클라우드 코드 함수
클라우드 코드 함수의 경우 main.js라는 파일을 작성하고 다음 코드를 포함하겠습니다.
여기에는 완전한 주석이 달린 5개의 클라우드 코드 함수가 있습니다:
- checkGraphQLSupport
앱이 GraphQL을 지원하는지 검색합니다. - retrieveFirstEmployeeByName
주어진 이름으로 데이터베이스에서 찾은 첫 번째 직원의 모든 세부 정보를 검색합니다. - retrieveAllEmployees
모든 직원에 대한 모든 세부 정보를 검색합니다. - retrieveOnwerOfPetByName
주어진 이름의 펫을 가진 직원의 세부 정보를 검색합니다. - retrieveEmployeeByNameWithPet
직원과 해당 반려동물의 모든 세부 정보를 검색합니다.
Parse.Cloud.define("checkGraphQLSupport", async req => {}) /* 이 함수는 앱이 GraphQL을 지원하는 경우 반환합니다. 앱이 지원하면 parseGraphQLServer는 참이고, 그렇지 않으면 거짓입니다. */ if (parseGraphQLServer){ 반환 "이 앱은 GraphQL을 지원합니다."; } else { 반환 "이 앱은 GraphQL을 지원하지 않습니다. 잘못된 Parse 버전일 수 있습니다."; } }); Parse.Cloud.define("retrieveFirstEmployeeByName", async req => { /* 이 함수는 주어진 이름으로 검색된 첫 번째 직원을 검색합니다. 해당 직원의 모든 속성이 검색됩니다. 데이터베이스에 직원이 둘 이상 있는 경우 하나의 직원만 반환됩니다. 직원이 없으면 null이 반환됩니다. */ const query = new Parse.Query("Employees"); query.equalTo("name", req.params.name); const result = await query.first(); 반환 결과; }); Parse.Cloud.define("retrieveAllEmployees", async req => { /* 이 함수는 모든 Employees를 검색합니다. Employee 클래스의 모든 프로퍼티가 검색되지만 해당 클래스만 검색됩니다. 포인터나 관계에 대한 세부 정보는 검색되지 않고 objectId만 검색됩니다. Employees 배열이 반환됩니다. Employees가 없으면 비어 있습니다. */ const query = new Parse.Query("Employees"); const results = await query.find(); 결과를 반환합니다; }); Parse.Cloud.define("retrieveOnwerOfPetByName", async req => {{ /* 이 함수는 펫의 이름으로 펫과 관련된 직원에 대한 정보를 검색합니다, 펫의 이름으로 정보를 검색합니다. Employee 클래스의 모든 속성이 검색됩니다. 펫에 대한 세부 정보는 검색되지 않습니다. 펫 배열이 반환됩니다. 펫이 없으면 비어 있습니다. */ // 먼저 펫에 대한 정보를 검색하기 위해 쿼리를 작성합니다. const petQuery = new Parse.Query("Pet"); petQuery.equalTo("name", req.params.name); // 그런 다음 hasThisPet 속성을 기반으로 해당 온워의 세부 정보를 검색하는 쿼리를 만듭니다. let employeeQuery = new Parse.Query("Employees"); employeeQuery.matchesQuery("hasThisPet", petQuery); const results = await employeeQuery.find(); 결과를 반환합니다; }); Parse.Cloud.define("retrieveEmployeeByNameWithPet", async req => {{ /* 이 함수는 직원과 관련된 펫에 대한 정보를 검색합니다, Employee의 이름으로 정보를 검색합니다. Employee 클래스와 Pet 클래스의 모든 속성이 검색됩니다. 애완동물에 대한 정보로 완전히 채워진 hasThisPet 속성( 를 포함하여 Employee 배열이 반환됩니다. Employee를 찾을 수 없는 경우 Empy 배열이 반환됩니다. */ const query = new Parse.Query("Employees"); query.equalTo("name", req.params.name); query.include("hasThisPet") const results = await query.find(); 결과를 반환합니다; });
클라우드 코드 함수를 클라우드 폴더에 업로드합니다.
약간의 추가 단계
이제 방금 게시한 클라우드 코드 함수를 사용할 수 있지만 GraphQL과 함께 작동하려면 schema.graphql이라는 파일을 만들어 해당 함수를 노출해야 합니다.
구문은 매우 간단하지만 주의가 필요합니다:
확장 유형 쿼리 { GraphQLMethodName (매개변수 이름: 매개변수 유형): ReturnType! @resolve(to:"CloudCodeFunctionName") }
위 코드의 경우 구문은 다음을 나타냅니다:
- GraphQLMethodName
이것은 GraphQL 쿼리에서 호출할 이름입니다. 클라우드 코드 함수 이름과 일치할 필요는 없지만 해당 메서드가 수행하는 작업을 쉽게 이해할 수 있는 이름을 선택해야 합니다.
- 매개변수 이름
클라우드 코드 함수 내에서 요청에 사용할 매개변수의 이름입니다. 클라우드 코드 함수에서 매개변수를 사용하지 않는 경우 전달할 필요가 없습니다.
- parameterType
전달하려는 매개변수의 유형입니다. 스키마에 대해 자세히 알아보고 모든 가능성을 확인할 수 있습니다. 클라우드 코드 함수에서 매개 변수를 사용하지 않는 경우 이 값을 전달할 필요가 없습니다.
- 반환 유형
메서드의 반환 유형입니다.
- CloudCodeFunctionName
함수 이름으로 해당 코드를 호출하므로 main.js 파일에 제공한 클라우드 코드 함수 이름과 일치해야 합니다.
따라서 방금 만든 main.js 파일의 경우 schema.graphql이 될 것입니다:
확장 유형 Query { checkGraphQLSupport: String! @resolve(to: "checkGraphQLSupport") retrieveThisEmployeeByName(이름:문자열): EmployeesClass! @resolve(to: "retrieveFirstEmployeeByName") giveMeAllEmployees: [EmployeesClass!]! @resolve(to: "retrieveAllEmployees") 어느EmployeeIsOnwerOfThisPet (이름:문자열): [EmployeesClass!]! @resolve(to: "retrieveOnwerOfPetByName") 직원 이름별로 직원과 반려동물을 수집합니다 (이름:문자열): [EmployeesClass!]! @resolve(to: "retrieveEmployeeByNameWithPet") }
그렇게 어렵지 않죠?
노출할 때 이름을 바꿀 수 있도록 클라우드 코드 함수 이름과 일치하지 않는 매우 광범위한 이름을 사용했음을 알 수 있습니다.
이제 앱의 클라우드 코드 함수 섹션으로 돌아가서 해당 파일도 업로드하세요. 파일이 클라우드 폴더에도 있는지 확인하세요. 필요한 경우 파일을 끌어다 놓을 수 있습니다.
이미 해당 이름의 파일이 있어 새 파일을 업로드할 수 없는 경우 업로드하기 전에 마우스 오른쪽 버튼으로 클릭하고 삭제할 수 있습니다.
모든 것을 배포하면 준비가 완료됩니다:
이제 마법의 시간입니다…
GraphQL 콘솔로 이동합니다. “쿼리”를 입력하고 자동 완성 기능(Windows의 경우 CTRL + 스페이스바, Mac의 경우 OPTION + 스페이스바)을 사용하면 마법이 일어나는 것을 볼 수 있습니다:
모든 메서드가 표시되며 각각의 메서드를 쿼리할 수 있습니다. 하나씩 시도해 보겠습니다:
-
checkGraphQLSupport
(클라우드 코드 함수 checkGraphQLSupport로 해석됨)
-
retrieveThisEmployeeByName (이름:문자열)
(클라우드 코드 함수 retrieveFirstEmployeeByName으로 리졸브)
-
giveMeAllEmployees
(클라우드 코드 함수 retrieveAllEmployees로 리졸브)
위의 예제에서 이름과 나이 속성은 올바르게 검색되었지만 hasThisPet에는 반려동물의 이름과 종에 대한 값이 null인 것을 확인할 수 있습니다.
이는 해당 클라우드 코드 함수에서 포함() 메서드를 사용하여 반려동물에 대한 정보를 포함하지 않았기 때문입니다.
자동 완성 기능은 가능성을 보여 주지만 해당 정보를 채우기 위한 데이터가 클라우드 코드 함수에 제공되지 않았습니다.
정보를 포함하는 방법을 보려면 아래의 gatherEmployeeAndPetByEmployeeNameresolves 예제를 참조하세요.
-
어느 직원이 이 반려동물의 주인인지
(클라우드 코드 함수 retrieveOnwerOfPetByName으로 해결)
-
직원 이름으로 직원 및 반려동물 수집
(클라우드 코드 함수 retrieveEmployeeByNameWithPet으로 리졸브)
멋진 정의가 업데이트되었습니다.
이제, 이것이 GraphQL에 비즈니스 로직을 도입하는 방법입니다.
사랑해요 3000!
결론
GraphQL은 강력하고 쉬운 멀티플랫폼 쿼리 언어이자 런타임이지만, 결국은 쿼리 언어일 뿐입니다.
클라우드 코드 함수와의 새로운 통합을 통해 두 가지 장점을 모두 가져와서 클라우드 코드( NPM 모듈 포함!)의 힘을 발휘할 수 있게 되었습니다.
이제 여러분과 여러분의 창의력에 달려 있습니다! 아래 댓글을 통해 마음에 드는 점과 프로젝트에서 어떻게 사용하고 있는지 알려주세요!
클라우드 코드란 무엇인가요?
클라우드 코드는 기본적으로 Node.js입니다. 최종 기기가 아닌 Back4app 서버에서 실행됩니다. 필요에 따라 다양한 장점을 제공합니다. 배터리 절약, 코드 배포 속도 향상, 필요에 따른 데이터 저장 등 다양한 이점을 제공합니다.
클라우드 코드는 어떻게 휴대폰 배터리를 절약하는 데 도움이 되나요?
기기의 부하가 줄어들어 배터리 절약에 도움이 됩니다. 기기에서 항상 처리하던 처리 부하가 클라우드 코드로 이전되어 기기가 평소보다 더 많은 시간을 사용하지 않게 됩니다. 따라서 궁극적으로 배터리 절약에 도움이 될 것입니다.
Cloud Code는 어떻게 데이터를 절약하는 데 도움이 되나요?
클라우드 코드 자체가 Wi-Fi 또는 모바일 데이터로 처리하던 모든 데이터를 검색합니다. 데이터를 계속 추출하여 클라우드에서 전체 보고서를 계산합니다.
마지막 결과만 기기로 가져오므로 페이로드가 줄어들고 데이터 사용량도 줄어듭니다.