React
boilerplate(client) - 로그인 기능 만들기(2)
_sweep
2021. 6. 21. 23:15
따라하며 배우는 노드, 리액트 기본 강의를 듣고 정리한 내용입니다.
로그인 기능 구현하기
1. UI 만들기
src > components > views > LoginPage 폴더 안에 LoginPage.js를 생성한다.
이후 원하는 UI를 구현 후 return 시키면 된다.
import React from 'react'
function LoginPage() {
return (
<div style={{display: 'flex', justifyContent: 'center', alignItems: 'center', width: '100%', height: '100vh'}}>
<form style={{display: 'flex', flexDirection: 'column'}} onSubmit={onSubmitHandler}>
<label>Email</label>
<input type="email" value={Email} onChange={onEmailHandler}/>
<label>Password</label>
<input type="password" value={Password} onChange={onPasswordHandler}/>
<br />
<button type="submit">Login</button>
</form>
</div>
);
}
export default LoginPage
위의 구현 내용을 확인해보면 다음과 같다.
2. state 만들기
input 태그에 입력한 값을 받기 위해서는 useState이 필요하다.
useState을 통해 각 state을 생성하고 setState을 통해 state에 값을 넣는 형식이다.
import React, { useState } from 'react'
function LoginPage() {
const [Email, setEmail] = useState("");
const [Password, setPassword] = useState("");
const onEmailHandler = (event) => {
setEmail(event.currentTarget.value);
}
const onPasswordHandler = (event) => {
setPassword(event.currentTarget.value);
}
return (
<div style={{display: 'flex', justifyContent: 'center', alignItems: 'center', width: '100%', height: '100vh'}}>
<form style={{display: 'flex', flexDirection: 'column'}} onSubmit={onSubmitHandler}>
<label>Email</label>
<input type="email" value={Email} onChange={onEmailHandler}/>
<label>Password</label>
<input type="password" value={Password} onChange={onPasswordHandler}/>
<br />
<button type="submit">Login</button>
</form>
</div>
);
}
export default LoginPage
useState을 쉽게 사용하기 위해서는 VSCode의 확장프로그램인 ES7 React/Redux/GraphQL/React-Native snippets을 설치하면 된다.
3. dispatch 설정
dispatch를 통해 action을 전달한다.
서버로부터 받은 응답의 상태에 따라 로그인을 성공했다면 LandingPage로 보내는 작업을, 로그인에 실패했다면 실패했다는 안내 메세지를 출력한다.
import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { loginUser } from '../../../_actions/user_action';
function LoginPage(props) {
const dispatch = useDispatch();
const [Email, setEmail] = useState("");
const [Password, setPassword] = useState("");
const onEmailHandler = (event) => {
setEmail(event.currentTarget.value);
}
const onPasswordHandler = (event) => {
setPassword(event.currentTarget.value);
}
const onSubmitHandler = (event) => {
// 새로고침방지
event.preventDefault();
let body = {
email: Email,
password: Password
}
dispatch(loginUser(body))
.then(response => {
if(response.payload.loginSuccess) { props.history.push('/'); }
else alert("Login Error");
});
}
return (
<div style={{display: 'flex', justifyContent: 'center', alignItems: 'center', width: '100%', height: '100vh'}}>
<form style={{display: 'flex', flexDirection: 'column'}} onSubmit={onSubmitHandler}>
<label>Email</label>
<input type="email" value={Email} onChange={onEmailHandler}/>
<label>Password</label>
<input type="password" value={Password} onChange={onPasswordHandler}/>
<br />
<button type="submit">Login</button>
</form>
</div>
);
}
export default LoginPage;
결과
서버 구현시 로그인에 성공하면 loginSuccess: true, 해당 user의 userId를 반환하도록 구현했다.
프로그램을 실행시킨 후 http://localhost:3000/login으로 들어가 email과 password를 입력한 후 login 버튼을 클릭했다.
로그인이 정상적으로 실행되자 LandingPage로 이동한 것을 확인할 수 있었고 이를 Redux DevTools로 살펴보았다.
action에 type과 서버로부터 받은 응답이 제대로 저장된 것을 볼 수 있었다.