React+GraphQL을 Heroku+Hasura로 설정
12269 단어 경 6GraphQLReactTypeScriptHasura
이번에는 이전부터 궁금했던 GraphQL을 Heroku + Hasura로 구축하고, React에서 Apollo Client로 호출하기까지의 흐름을 비망록으로 기사로 하고 싶습니다.
실제로 시도해 보면 Firebase만큼 쉽게 서버를 구축할 수 있었습니다.
Hasura로 프로젝트 만들기
Hasura에서 새 GraphQL 서버를 만듭니다.
PostgresSQL 서버를 선택하지만 Heroku를 사용하는 경우 계정 링크를 사용하여 Heroku 측 프로젝트를 자동으로 초기화합니다.
프로젝트 작성이 완료되면 관리 화면이 표시되어 GraphQL 엔드포인트와 익숙한 GraphQL 화면을 확인할 수 있습니다.
샘플 데이터 추가
이 상태에서는 데이터베이스에 아무것도 데이터가 없는 상태이므로 더미 데이터를 넣어 보겠습니다.
데이터는 무엇이든 좋지만 이 리포지토리 의 load_employees.dump 에서 일부 데이터를 가져왔습니다.
Create Table에서 테이블 유형을 결정합니다. 이번에는 다음과 같이 했습니다.
테이블 유형을 결정한 후 Insert Row에서 데이터를 넣습니다.
결국 다음과 같이 되었습니다.
데이터 입력이 완료되면 맨 위 페이지에서 GraphQL 쿼리를 시도할 수 있습니다.
쿼리 구문을 기억하지 않아도 Explorer에서 선택하는 것만으로 자동으로 쿼리가 생성되므로 꽤 쉽지 않을까요?
React 애플리케이션 만들기
위에서 제공한 GraphQL 서버를 React+Apollo Client에서 호출해 봅니다.
GitHub도 공개하고 있으므로 좋으면 복제하고 시도해보십시오.
Client를 만들고 Provider에게 제공
React hooks에서 GraphQL을 호출 할 수 있도록 작성한 client
를 Provider에서 지정하십시오.
index.tsximport { ApolloProvider } from "@apollo/client";
import { ApolloClient, InMemoryCache } from "@apollo/client";
const client = new ApolloClient({
uri: process.env.REACT_APP_SERVER_URL,
cache: new InMemoryCache(),
});
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById("root")
);
구성 요소 측면에서 useQuery
를 사용하여 쿼리를 실행합니다.
App.tsximport { useQuery, gql } from "@apollo/client";
const GET_EPLOYEES = gql`
query GetEmployees {
employees {
birth_date
emp_no
first_name
hire_date
last_name
}
}
`;
function App() {
const { data } = useQuery(GET_EPLOYEES);
return (
<Container>
<Pre>{JSON.stringify(data, null, 2)}</Pre>
</Container>
);
}
이것을 보면 다음과 같습니다.
이전에 Hasura에서 등록한 내용을 표시할 수 있음을 알 수 있습니다.
취득하는 데이터를 형태 안전하게 한다
여기에서 TypeScript를 사용하는 사람들을위한 것입니다.
방금 취득한 data
는 any
형이 되고 있습니다. apollo-tooling 을 사용하면 쿼리 문에서 형식을 생성할 수 있습니다.
먼저 Apollo Tooling을 설치합니다.
yarn global add apollo
그런 다음 React 프로젝트의 루트에 apollo.config.js
를 만듭니다.
GraphQL의 URL도 이 안에 지정합니다.
module.exports = {
client: {
name: "client",
includes: ["src/**/*.ts", "src/**/*.tsx"],
tagName: "gql",
addTypename: true,
service: {
// remote endpoint
name: "sever",
url: "https://xxxxxxxxxxxxxxxxx/graphql",
},
},
};
그리고 client:codegen
명령으로 형식 정의 파일을 생성합니다.
apollo client:codegen --target typescript types
완료되면 src/types/xxxx.ts
에 생성된 파일이 저장됩니다.
export interface GetEmployees_employees {
__typename: "employees";
birth_date: any;
emp_no: number;
first_name: string;
hire_date: any;
last_name: string;
}
export interface GetEmployees {
/**
* fetch data from the table: "employees"
*/
employees: GetEmployees_employees[];
}
useQuery
의 제네릭스에 이 생성된 형태를 지정하면(자), data
에 형태가 붙습니다. 🎉
const { data } = useQuery<GetEmployees>(GET_EPLOYEES);
결론
DB 서버 준비부터 React 사용까지 상상보다 훨씬 쉽게 할 수 있었습니다.
게다가 TypeScript 의 형식화도 자동으로 실시할 수 있어 꽤 DX 가 향상한다고 생각합니다.
또, Hasura에서는 데이터베이스내의 액세스 권한등의 관리는 할 수 있는 것 같습니다만, 인증등은 탑재하고 있지 않는 것 같습니다. 이 부분은 Firebase와 함께 사용하는 것이 가장 쉽습니다.
추가
JOIN 등을하는 방법을 기사로했습니다. ( htps : // 코 m / 타카 오나리 카와 / )
참고
이 상태에서는 데이터베이스에 아무것도 데이터가 없는 상태이므로 더미 데이터를 넣어 보겠습니다.
데이터는 무엇이든 좋지만 이 리포지토리 의 load_employees.dump 에서 일부 데이터를 가져왔습니다.
Create Table에서 테이블 유형을 결정합니다. 이번에는 다음과 같이 했습니다.
테이블 유형을 결정한 후 Insert Row에서 데이터를 넣습니다.
결국 다음과 같이 되었습니다.
데이터 입력이 완료되면 맨 위 페이지에서 GraphQL 쿼리를 시도할 수 있습니다.
쿼리 구문을 기억하지 않아도 Explorer에서 선택하는 것만으로 자동으로 쿼리가 생성되므로 꽤 쉽지 않을까요?
React 애플리케이션 만들기
위에서 제공한 GraphQL 서버를 React+Apollo Client에서 호출해 봅니다.
GitHub도 공개하고 있으므로 좋으면 복제하고 시도해보십시오.
Client를 만들고 Provider에게 제공
React hooks에서 GraphQL을 호출 할 수 있도록 작성한 client
를 Provider에서 지정하십시오.
index.tsximport { ApolloProvider } from "@apollo/client";
import { ApolloClient, InMemoryCache } from "@apollo/client";
const client = new ApolloClient({
uri: process.env.REACT_APP_SERVER_URL,
cache: new InMemoryCache(),
});
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById("root")
);
구성 요소 측면에서 useQuery
를 사용하여 쿼리를 실행합니다.
App.tsximport { useQuery, gql } from "@apollo/client";
const GET_EPLOYEES = gql`
query GetEmployees {
employees {
birth_date
emp_no
first_name
hire_date
last_name
}
}
`;
function App() {
const { data } = useQuery(GET_EPLOYEES);
return (
<Container>
<Pre>{JSON.stringify(data, null, 2)}</Pre>
</Container>
);
}
이것을 보면 다음과 같습니다.
이전에 Hasura에서 등록한 내용을 표시할 수 있음을 알 수 있습니다.
취득하는 데이터를 형태 안전하게 한다
여기에서 TypeScript를 사용하는 사람들을위한 것입니다.
방금 취득한 data
는 any
형이 되고 있습니다. apollo-tooling 을 사용하면 쿼리 문에서 형식을 생성할 수 있습니다.
먼저 Apollo Tooling을 설치합니다.
yarn global add apollo
그런 다음 React 프로젝트의 루트에 apollo.config.js
를 만듭니다.
GraphQL의 URL도 이 안에 지정합니다.
module.exports = {
client: {
name: "client",
includes: ["src/**/*.ts", "src/**/*.tsx"],
tagName: "gql",
addTypename: true,
service: {
// remote endpoint
name: "sever",
url: "https://xxxxxxxxxxxxxxxxx/graphql",
},
},
};
그리고 client:codegen
명령으로 형식 정의 파일을 생성합니다.
apollo client:codegen --target typescript types
완료되면 src/types/xxxx.ts
에 생성된 파일이 저장됩니다.
export interface GetEmployees_employees {
__typename: "employees";
birth_date: any;
emp_no: number;
first_name: string;
hire_date: any;
last_name: string;
}
export interface GetEmployees {
/**
* fetch data from the table: "employees"
*/
employees: GetEmployees_employees[];
}
useQuery
의 제네릭스에 이 생성된 형태를 지정하면(자), data
에 형태가 붙습니다. 🎉
const { data } = useQuery<GetEmployees>(GET_EPLOYEES);
결론
DB 서버 준비부터 React 사용까지 상상보다 훨씬 쉽게 할 수 있었습니다.
게다가 TypeScript 의 형식화도 자동으로 실시할 수 있어 꽤 DX 가 향상한다고 생각합니다.
또, Hasura에서는 데이터베이스내의 액세스 권한등의 관리는 할 수 있는 것 같습니다만, 인증등은 탑재하고 있지 않는 것 같습니다. 이 부분은 Firebase와 함께 사용하는 것이 가장 쉽습니다.
추가
JOIN 등을하는 방법을 기사로했습니다. ( htps : // 코 m / 타카 오나리 카와 / )
참고
import { ApolloProvider } from "@apollo/client";
import { ApolloClient, InMemoryCache } from "@apollo/client";
const client = new ApolloClient({
uri: process.env.REACT_APP_SERVER_URL,
cache: new InMemoryCache(),
});
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById("root")
);
import { useQuery, gql } from "@apollo/client";
const GET_EPLOYEES = gql`
query GetEmployees {
employees {
birth_date
emp_no
first_name
hire_date
last_name
}
}
`;
function App() {
const { data } = useQuery(GET_EPLOYEES);
return (
<Container>
<Pre>{JSON.stringify(data, null, 2)}</Pre>
</Container>
);
}
yarn global add apollo
module.exports = {
client: {
name: "client",
includes: ["src/**/*.ts", "src/**/*.tsx"],
tagName: "gql",
addTypename: true,
service: {
// remote endpoint
name: "sever",
url: "https://xxxxxxxxxxxxxxxxx/graphql",
},
},
};
apollo client:codegen --target typescript types
export interface GetEmployees_employees {
__typename: "employees";
birth_date: any;
emp_no: number;
first_name: string;
hire_date: any;
last_name: string;
}
export interface GetEmployees {
/**
* fetch data from the table: "employees"
*/
employees: GetEmployees_employees[];
}
const { data } = useQuery<GetEmployees>(GET_EPLOYEES);
DB 서버 준비부터 React 사용까지 상상보다 훨씬 쉽게 할 수 있었습니다.
게다가 TypeScript 의 형식화도 자동으로 실시할 수 있어 꽤 DX 가 향상한다고 생각합니다.
또, Hasura에서는 데이터베이스내의 액세스 권한등의 관리는 할 수 있는 것 같습니다만, 인증등은 탑재하고 있지 않는 것 같습니다. 이 부분은 Firebase와 함께 사용하는 것이 가장 쉽습니다.
추가
JOIN 등을하는 방법을 기사로했습니다. ( htps : // 코 m / 타카 오나리 카와 / )
참고
Reference
이 문제에 관하여(React+GraphQL을 Heroku+Hasura로 설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TakaoNarikawa/items/38089c61eff71e085182텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)