노마드코더 인스타그램 클론코딩 바로가기 https://nomadcoders.co/instaclone
Backend & Frontend의 연결 후 Login SignUp 기능 구현
FrontEnd와 BackEnd의 연결을 위해 사용할 Apollo Client
// apollo.js
export const client = new ApolloClient({
uri:"http://localhost:4000/graphql",
cache:new InMemoryCache(),
})
uri는 현재 내가 구동한 backend 서버의 주소를 뜻하고
cache는 apollo client는 local에서 data를 가져오는데 같은 정보를 매번 가져오는 것을 방지 하기 위한 방법이다.
Provider로 App을 감싸줘야지 App과 Backend Client와 연결이 된다.
// App.js
return(
<ApolloProvider client={client}>
<HelmetProvider>
<ThemeProvider theme={darkMode?darkTheme:lightTheme}>
<GlobalStyles/>
<Router>
...
</ApolloProvider>
)
apolloclient로 frontend와 backend를 연결했으므로 우리가 구현한 backend 서버를 frontend에서 이용 가능
const LOGIN_MUTATION = gql`
mutation Login($username:String!,$password:String!){
login(username:$username,password:$password){
ok
token
error
}
}
`
useMutation이라는 ReactHook을 이용해 graphql mutation을 이용할 수 있다.
const onCompleted = (data)=>{
const {login:{ok,error,token}} = data;
if(!ok){
setError("result",{
message:error,
})
}
if(token){
logUserIn(token);
}
}
const [login,{loading:mutationLoading}] = useMutation(LOGIN_MUTATION,{onCompleted,})
const onSubmitValid = (data)=>{
if(mutationLoading){
return;
}
const {username,password} = getValues();
login({
variables:{
username,
password,
}
})
}
const clearLoginError =() =>{
clearErrors("result");
};
onCompleted 함수는 useMutation에서 전달받은 LOGIN_MUTATION이 성공적으로 완료 되었을 때 실행되는 콜백함수이다.
useMutation에서 options으로 들어가는 것을 볼 수 있고 성공적으로 완료되었을때 호출되는 onCompleted 함수는 data를 전달 받고 그 data에는 login mutation의 result object가 들어있다.
이를 이용해 로그인 실패했을 경우의 UI를 setError를 통해서 구현하고
로그인 성공했을 경우에는 token이 존재 할 것이고 이 token을 localStorage에 저장하는 login util 함수(logUserIn)를 구현해 주었다.