반응형
[인프런 강의] zerocho Slack 클론 코딩 (11) - 로그인 페이지 만들기
이번 시간에는 로그인 페이지를 구현 하도록 한다.
SPA상에서 <a> 태그를 사용하면 화면이 새로고침이 되는 문제가 발생한다.
따라서 React-router의 Link 태그를 사용하면 SPA가 유지된다.
로그인하는 컴포넌트를 다음과 같이 작성한다
/aleacture/Login/index.tsx
import useInput from '@hooks/useInput';
import { Success, Form, Error, Label, Input, LinkContainer, Button, Header } from '@pages/SignUp/styles';
import fetcher from '@utils/fetcher';
import axios from 'axios';
import React, { useCallback, useState } from 'react';
import { Link, Redirect } from 'react-router-dom';
import useSWR from 'swr';
const LogIn = () => {
const { data, error, revalidate, mutate } = useSWR('/api/users', fetcher);
const [logInError, setLogInError] = useState(false);
const [email, onChangeEmail] = useInput('');
const [password, onChangePassword] = useInput('');
const onSubmit = useCallback(
(e) => {
e.preventDefault();
setLogInError(false);
axios
.post(
'/api/users/login',
{ email, password },
{
withCredentials: true,
},
)
.then((response) => {
revalidate();
})
.catch((error) => {
setLogInError(error.response?.data?.statusCode === 401);
});
},
[email, password],
);
// if (data === undefined) {
// return <div>로딩중...</div>;
// }
// if (data) {
// return <Redirect to="/workspace/sleact/channel/일반" />;
// }
// console.log(error, userData);
// if (!error && userData) {
// console.log('로그인됨', userData);
// return <Redirect to="/workspace/sleact/channel/일반" />;
// }
return (
<div id="container">
<Header>Sleact</Header>
<Form onSubmit={onSubmit}>
<Label id="email-label">
<span>이메일 주소</span>
<div>
<Input type="email" id="email" name="email" value={email} onChange={onChangeEmail} />
</div>
</Label>
<Label id="password-label">
<span>비밀번호</span>
<div>
<Input type="password" id="password" name="password" value={password} onChange={onChangePassword} />
</div>
{logInError && <Error>이메일과 비밀번호 조합이 일치하지 않습니다.</Error>}
</Label>
<Button type="submit">로그인</Button>
</Form>
<LinkContainer>
아직 회원이 아니신가요?
<Link to="/signup">회원가입 하러가기</Link>
</LinkContainer>
</div>
);
};
export default LogIn;
전체적인 포맷은 회원가입 컴포넌트와 동일하다.
아이디와 패스워드를 입력 후 로그인 버튼을 누르게되면, 정상적으로 로그인이 될 시 200 ok가 뜨게 된다.
혹시 요청이 백엔드로 가지 않는다면 , webpack.config.ts 의 proxy 설정을 확인해 봐야한다.
devServer: {
historyApiFallback: true, // react router
port: 3090,
devMiddleware: { publicPath: '/dist/' },
static: { directory: path.resolve(__dirname) },
// proxy 설정
proxy: {
'/api/': {
target: 'http://localhost:3095',
changeOrigin: true,
},
},
},
만약 프록시 세팅을 하지 않을 경우에는 axios에 url 전 영역을 보내 주어야한다.
axios.post(
'http://localhost:3095/api/users/login',
{ email, password },
{
withCredentials: true,
},
)
.then((response) => {
revalidate();
})
.catch((error) => {
setLogInError(error.response?.data?.statusCode === 401);
});
반응형
'개발 공부 시리즈 > Slack클론코딩' 카테고리의 다른 글
[인프런 강의] zerocho Slack 클론 코딩 (10) - axios로 요청보내기 CORS, proxy (0) | 2022.11.06 |
---|---|
[인프런 강의] zerocho Slack 클론 코딩 (9) - 커스텀 훅 만들기 (1) | 2022.10.26 |
[인프런 강의] zerocho Slack 클론 코딩 (8) - 회원가입 페이지 만들기 (2) | 2022.10.24 |
[인프런 강의] zerocho Slack 클론 코딩 (7) - 코드 스플리팅과 이모션 (0) | 2022.10.20 |
[인프런 강의] zerocho Slack 클론 코딩 (6) - 폴더 구조와 리액트 라우터 (0) | 2022.10.19 |
댓글