๋ก๊ทธ์ธ ๊ตฌํํ ์๊ฐ์ผ๋ก ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ฐธ ์ฐพ์๋ณด๋ค๊ฐ ์์ฐจ ํ๋ค. ์ ํจ์ฑ ๊ฒ์ฌ๋ ํ์๊ฐ์ ํ ๋ ์ํํ๋ค.. ๊ฒฐ๊ตญ ํ์๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ ๋จผ์ ํด๋ณด๊ธฐ๋ก.
์ ์ ์ ํ์๊ฐ์ ํผ์ ์ฌ๋ฌ ์ ๋ณด(ex. ์์ด๋, ๋น๋ฐ๋ฒํธ, ์ด๋ฉ์ผ ๋ฑ)๋ฅผ ํ์๋ก ํ๋ค. ๊ทธ๋งํผ ๊ด๋ฆฌํด์ผ ํ ๋ณ์๊ฐ ๋ง์์ง๋ค๋ ์๋ฏธ์ด๋ค. ์ด๋ฅผ ํ๋ํ๋ state๋ก ๋ง๋ค๋ฉด ์ ๋ ฅ๊ฐ๋ง๋ค ๋ฐ๋ก ๊ด๋ฆฌํ๋ ๋ฒ๊ฑฐ๋ก์์ด ๋ฐ์ํ๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ฉด ๋ง์ input์ ์ ๊ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์์๊น?
๋ฆฌ์กํธ๋ ์์ ๋๊ฐ ๊ฝค ๋์ ๊ฒ ๊ฐ๋ค. ๋ฆฌ์กํธ ํ๋ฉด์ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์๊ฐ ์ ์ํ ํ๊ทธ๋ก ๋ง๋๋๋ฐ, hook๋ง์ ์ฌ์ฉ์ ๋ง์๋๋ก ๋ง๋ค ์ ์๋ค.
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ ๋ฆฝ์ฑ ์ ๋ฌด๋ค. props๋ ํ์ฐ์ ์ผ๋ก ์์์์ ํ์๋ก๋ง ์ ๋ฌํ ์ ์๊ณ , ๋ฐ๋์ '์ ๋ฌ'์ ํตํด์๋ง ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ปค์คํ ํ ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ฌด๊ดํ๊ฒ ๊ฐ ์ปดํฌ๋ํธ ๋ด์์ state๋ฅผ ๋ง๋ ๋ค.
export default function ValidCheck () {
const [isValid, setValid] = useState({
isEmail: false,
isPw: false
});
useEffect(() => {
// ์ ๊ทํํ์์ผ๋ก ์ด๋ฉ์ผ ์ ํจ์ฑ ํ์ธ})
}, [์ด๋ฉ์ผ ๋ํ๋์]);
useEffect(() => {
// ์ ๊ทํํ์์ผ๋ก ๋น๋ฐ๋ฒํธ ์ ํจ์ฑ ํ์ธ
}, [๋น๋ฐ๋ฒํธ ๋ํ๋์]);
import useValid from '๊ฒฝ๋ก'
function SignUp () {
const [inputs, setInputs] = useState({
email: '',
emailValid: false,
pw: '',
pwValid: false
}
const {isValid} = useValid(inputs);
}
๊ทธ๋ฐ๋ฐ ๊ตฌํ ๊ณผ์ ์์ ์๊พธ ๋งํ๋ค. useEffect๋ ํน์ ์์ ์ ํน์ state ํจ์ ์คํ ์์ ๋์ํ๊ฒ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๊ฑธ๋ก ์๋ค. ์ด ๋ชฉ์ ์ ๋ถํฉํ๋ ์ฐ์์ด๊ธด ํ๋ฐ ์์ด๋ณด์๊ฒ ์ฒ์๋ถํฐ ํ์ผ์ ๋๋ ์ ๊ทผํ๋ ๊ฒ ๋ฒ๊ฑฐ์ ๋ค.
์ฐธ๊ณ ํ ํฌ์คํ ์ ๋ชฉ์ ์ ๋ ๊น๋ํ๊ฒ ์ ํจ์ฑ ๊ฒ์ฌ ํ๋ ๊ฑฐ์์ผ๋ ์ง๊ธ ๋์๊ฒ ๋ง์ง ์๋ ๋ฐฉ๋ฒ์ด๋ ์๊ฐ์ด ๋ค์๋ค.
๋ชฉํ ์์ !
๋ฆฌ์กํธ๋ ์ํ ๊ด๋ฆฌ ํด๋ก redux๋ฅผ ์ค๊ณง ์ฌ์ฉํด์๋ค๋ ๋ง์ ๋ดค๋๋ฐ, ์ํ ๊ด๋ฆฌ๊ฐ ๋ญ์ง ์๋ฆฌ์กํ๋ค. ๊ทธ๋ฌ๋ค ์ด๋ค ํฌ์คํ ์ ์ฝ๋ ์ค ์ํ๋ ๋จ์ํ state๋ฅผ ๋ฒ์ญํ ๋ง์ผ ์ ์๊ฒ ๋ค๊ณ ๊นจ๋ฌ์๋ค. ๋ฐฐ์ฐ์ง ์์ ์๋ก์ด ๊ฐ๋ ์ด ์๋๋ผ.
๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ํ๋ฉด์์ ๋ฐ๊ฟ์ผ ํ๋ ๋ด์ฉ์ด ์ฆ์์ง ํ ๊ณ , ๊ทธ๋งํผ state ์ฌ์ฉ์ด ๋ง์ผ๋ฉด ๋ญ๊ฐ ๋ญ์ง ํ๋์ ํ์ ํ๊ธฐ ์ด๋ ค์ธ ๊ฑฐ๋ค. ๋ณ์ ์ ์ธ๋ง ํ์ฐธ ๋ณด์์ผ ํ ์ง๋.. ๊ทธ ๊ด๋ฆฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ redux์ผ๊น ๊ทธ๋ผ?
๊ด๋ จ ๋ด์ฉ์ ์์ง์ ์ฐพ์๋ณด์ง ์์๋ค. ์ง์ง ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฐพ์๋ณด๊ณ ์ ์ฉํด์ผ ๋น๋ก์ ํ์ ์ด ๋จ๋ ๋ฏํ๋ค. ๊ทธ๋ฅ ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ ๋ฌผ๋ฏ ์ฐพ๋ ๊ฑด ๊ฒฝํ ์ถ์ ์ ํฐ ๋์์ด ๋ ์ ์๋ค๊ณ ๋๋๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ์ด๋ฉ์ผ๋ก๋ง ๊ฐ์ ํ์ฉ
์ ์ ๊ฐ ์ด๋ฉ์ผ input์ ์ ๋ ฅํ ๊ฐ์ด ์ด๋ฉ์ผ ํ์์ ๋ง์ง ์์ผ๋ฉด ์ ๋๋ก ์ ๋ ฅํ๋ผ๋ ์์๋ฆฌ๋ฅผ ๋ด์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ๋์์ค๋ค. ํ์์ ๊ฐ์ถ๋ฉด ํด๋น ๋ฌธ๊ตฌ๊ฐ ์ฌ๋ผ์ง๊ณ ํ์๊ฐ์ ๋ฒํผ์ด ํ์ฑํ๋๋ค.
์ด๋ฒ ๊ธฐํ์ ์ ๋๋ก ์ง๊ณ ๋์ด๊ฐ ์ ๊ท ํํ์์ ์ดํด๋ณด์.
์ ๊ทํํ์์ ์ฌ๋์(/) ์ฌ์ด์ patern์ ์์ฑํ๋ค. ๋งค์นญ ํจํด, ๊ฒ์ ํจํด ๋ฑ ๋ค์ํ ๋ด์ฉ์ ํ๋ก ์ ๋ฆฌํ ์ ์๋ค์ง๋ง, ๊ทธ๊ฑธ ๋ง๋ฅ ์ฝ๊ณ ์ธ์ฐ๋ ๊ฑด ์๋ฌด ์๋ฏธ ์๋ ๊ฒ ๊ฐ์์ ์ด๋ฉ์ผ ์ ๊ท ํํ์์ ์๋ก ํ๋์ฉ ๋ฏ์ด๋ณด์.
const emailReg = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/
์์ ๋งํ ๋๋ก ์ฌ๋์๊ฐ ์์๊ณผ ๋์ ๋์๋ค.
^
: ๋ฌธ์์ด ์์์ ๋ํ๋ธ๋ค.$
: ๋ฌธ์์ด ๋์ ๋ํ๋ธ๋ค.[A-Za-z0-9._%+-]+
๋๊ดํธ ์์ ๋ฌธ์ ์
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋๊ดํธ์ ๋ค์ด๊ฐ ๋ชจ๋ ๋ฒ์ฃผ๋ฅผ ์์ฑํ ์ ์๋ค. ์ํ๋ฒณ ๋๋ฌธ์, ์ํ๋ฒณ ์๋ฌธ์, ์ซ์, ๊ทธ๋ฆฌ๊ณ ํน์๋ฌธ์๋ค ๋ช๋ช(._%_-
)์ ํ์ฉํ๋ค.
๋ง์ง๋ง์ ๋ฌ๋ฆฐ ํ๋ฌ์ค ๊ธฐํธ๋ 1๊ฐ ์ด์์ ๋ํ๋ธ๋ค. ์ฆ [~~] ๋๊ดํธ ์์ ์๋ ๋ฌธ์๋ฅผ 1๊ฐ ์ด์ ์์ฑํด์ผ ํ๋ค๋ ์๋ฏธ๋ค.
@[A-Za-z0-9.-]+
์ด๋ฉ์ผ์ ๋น์ฐํ @๊ฐ ๋ค์ด๊ฐ์ผ ํ๋๊น ์ ์ด์คฌ๋ค. ๊ทธ ๋ท๋ถ๋ถ์ ๊ฑฐ์ ์ค๋ช
ํ๋ค. ์์ด ๋๋ฌธ์, ์์ด ์๋ฌธ์, ๋ฌธ์์ ๋ง์นจํ(.) ํ์ดํ(-)์ 1๊ฐ ์ด์ ์์ฑํด์ผ ํ๋ค.
\.[A-Za-z]{2,}
๋๋ฉ์ธ์์ ๋ง์นจํ๋ @์ฒ๋ผ ํ์ ์์๋ค. ๊ทธ๋ฐ๋ฐ ๋
๋ค .์ ์์ฑํ๋ฉด ํน์๋ฌธ์๋ฅผ ์
๋ ฅํ ์ค ์๋ค. ๊ทธ๊ฒ ์๋๋ผ, ๋ฌธ์๋ผ๋ ๊ฑธ ํฐ๋ด๊ธฐ ์ํด ๋ฐฑ์ฌ๋์()๋ฅผ ์์ ๋ฌ์์ฃผ์๋ค. ์ค๊ดํธ{}
์์๋ ์ต์ ๊ฐ์์ ์ต๋ ๊ฐ์๋ฅผ ์
๋ ฅํ ์ ์๋ค. ์์ฒ๋ผ ์ต์ ๊ฐ์๋ง ์ ์ํ ์๋ ์๋ค. ์ต๋ ๊ฐ์๋ง ์ฐ๊ณ ์ถ์ผ๋ฉด ๊ฑฐ๊พธ๋ก ์
๋ ฅํ๋ฉด ๋๋ค. ex. {,10}
์ ํด๋ ๋๋ค. A-Z a-z ๋ฑ ํ์ดํ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ํ ๋ญ์น๋ก ์ธ์งํ๋์ง ๋๊ดํธ ๋ด๋ถ๋ผ๋ฉด -๋ง ์ ์ด์ฃผ์ด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๋จ, ๋๊ดํธ ๋ฐ์ด๋ผ๋ฉด ์ด๋ฉ์ผ ๋๋ฉ์ธ ์ฒ๋ฆฌํ ๋์ฒ๋ผ (๋ฐฑ์ฌ๋์) ํ์ํ๋ค.
๋ง๋ค. ๊ทธ๋ฐ๋ฐ \d๋ ์ซ์ ํ๋๋ฅผ ๋ํ๋ธ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฉ์ผ ์ฃผ์์ ์ซ์๊ฐ ์ฌ๋ฟ ๋ค์ด๊ฐ ์๋ ์์ผ๋ ๋ฒ์ฃผ๋ก ์์ฑํ๋ค.
๋น๋ฐ๋ฒํธ๋ ์กฐ๊ธ ๋ด์ฉ์ด ๊ธธ์ด์ง๋ค. ์์ด ์๋ฌธ์, ์ซ์, ํน์๋ฌธ์๋ฅผ ์ต์ 1๊ฐ ํฌํจํ์ฌ 8์ ์ด์ 20์ ์ดํ๋ก ์กฐ๊ฑด์ ๊ฑธ์ด๋ณด์.
const pwReg =
/^(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*])[a-z\d!@#$%^&*]{8,20}$/
์ฌ ์๊ดํธ์ ๋์ด์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋๊ฐ์ ๋ชจ์์ด ๋ฐ๋ณต ์ค์ด๋ค. ๋๊ดํธ ์์ ๋ฒ์๋ง ๋ค๋ฅผ ๋ฟ์ด๋ค.
(?=.*[๋ฒ์])
?=
: Positive Lookahead๋ผ๋ ๋ณ์นญ์ด ์๋ค. ๊ณ ๋ก ํ๋์ ํจํด์ผ๋ก ์์ฃผ ์ฐ์ธ๋ค๋ ์๋ฏธ์ผ ํ
๋ค. ์์ด์ ์์ด ๊ฐ์. ํจํด1?=ํจํด2
๋ผ๋ฉด ํจํด1์ด ํจํด2์ ๋์ผํด์ผ ํ๋ค๋ ๋ป.
.*
: ์์์ ๋ฌธ์ 0๊ฐ ์ด์ => ์ด๋ค ๋ฌธ์์ด์ด๋ ํฌํจํ ์ ์๋ค.
์ด ๋์ ํฉ์ณ ๋งํ๋ฉด '์์ผ๋ก ๋์ฌ ๋ฌธ์์ด์ ์ ์ด๋ ํ๋์ [๋ฒ์]
๋ฅผ ํฌํจํด์ผ ํ๋ค'๋ ์๋ฏธ๊ฐ ๋๋ค.
[a-z\d!@#$%^&*]
โญ๏ธ ๊ทธ๋ฆฌ๊ณ ์ ์ฒด ๋ฒ์๋ฅผ ์์ฑํด์ค์ผ ํ๋ค.
์์๋ ๋ค ์กฐ๊ฑด๋ค์ด๋ผ์ ์ด ๋ถ๋ถ์ ์์ฑํ์ง ์์ผ๋ฉด ๊ทธ๋ฅ ์กฐ๊ฑด๋ง ์๊ณ ์ฌ์ฉํ ์ ์๋ ๋ฒ์๋ ์ฃผ์ด์ง์ง ์์, ๊ทธ๋์ ์๋ฌ๋ ์์ด๋ ๋์ํ์ง ์๋ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๋๋ค.
(?!.*\s)
?!
: Negative Lookahead. ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์์ผ ํ ๋ ๊ฒ์ํ๋ ์กฐ๊ฑด์ด๋ค.\s
: ๊ณต๋ฐฑ๊ณ ๋ก ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ด ์์ด์ผ ํจ์ ๋ํ๋ธ๋ค.
์ปดํฌ๋ํธ๋ณ๋ก jsํ์ผ์ ๋ง๋ค๋ฉด Name.module.css
๋ก ํ์ผ ์์ฑ ์ ํน์ ์ปดํฌ๋ํธ์๋ง css๋ฅผ ์ ์ฉํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๋๋ ์ฐจ๊ทผ์ฐจ๊ทผ ํด๊ฐ๋ฉด์ ๋ถ๋ฆฌํ ์๊ฐ์ด๋ผ ์ฐ์ index.css์ ๋ชจ๋ ๋ด์ฉ์ ๋ฃ์๋ค. ํ์ผ์ ๋ฐ๋ก ์์ฑํ์ผ๋ ๋น์ฐํ ์ ์ฉ์ ํด์ผ๊ฒ ๋ค.
import '../assets/index.css';
์ด๊ฐ๋จ.
๊ทผ๋ฐ ํน์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฒ ๋๋ฉด ํด๋์ค/id ๋ฑ ์์ฑ๋ ๋ถ๋ถ์ ๊ฐ์ฒด์ฒ๋ผ ์ ๊ทผํด์ ์ ์ฉํ ์ ์๋ ๋ชจ์์ด๋ค.
import styles from 'css ์๋์ฃผ์';
// ์ปดํฌ๋ํธ์ return ์
<button>
{
(true์ธ์ง ํ์ธ) ? <div className={styles.btn๋
ธ๋์} : {styles.btn๊ฒ์ ์}
}
</button>
ํด๋์ค ์ด๋ฆ์ผ๋ก๋ค๊ฐ ํ ๊ธ์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๊ฒ ๋ค.
์ด๋ป๊ฒ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ ๊ตฌํํด๋ธ ๊ฒ ์ ๊ธฐํ๋ค. ๋ด ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋๋ฐ ์ด๋ค ๋ฉด์์๋ ๋ ๋น ๋ฅด๊ณ ..
ํ๋ฉด ํ ์๋ก ์ํ ๊ณต๋ถ๋ ๋น์ทํ ๊ฒ ๊ฐ๋ค.
1) ๊ณต๋ถํ ์ง ๊ฑฐ์ 3๋ฌ ์ฐจ์ธ๋ฐ ๋งค์ผ ํด๋ ์๋ฌด ๋ณํ๊ฐ ์๋ค๊ณ ๋๊ผ๋ค. ๋ฉฐ์น ์ ๋ถํฐ ์ฌ์ฌ ์ฒซ ๊ฐ๋ฅ์ ์ก์ ๊ฒ ๊ฐ๋จ ๊ธฐ๋ถ์ด๋ค.
2) ๋ต์ง ๋ณด๊ณ ๋ฒ ๋ผ๊ธฐ(์ฝ๋ ๋ณต๋ถ) ์๋ฌด ์๋ฏธ ์๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐฐ์ ๋ค๊ณ ๋งํ ์ ์๋ ๊ฑด ์ค์ค๋ก์๊ฒ ํน์ ํ์ธ์๊ฒ ์ค๋ช
ํ ์ ์์ด์ผ ํ๋ค. ๋๋ ๋ด ๊ฒ๋ง์ ๋ด ์ธ์ด๋ก ํํํ ์ ์๋ค.
์ด์ฐ๋ณด๋ฉด ๊ณต๋ถ๋ ์์ฃผ ์ ์งํ๋ค. ๋ด๊ฐ ์๋ ๊ฒ์ ๋งํ ์ ์๊ณ , ๋ชจ๋ฅด๋ ๊ฒ์ ์๋ ์ฒ ํ ์ ์์ผ๋๊น.
์ซ๋ ธ๋ค. 2์ฃผ๋ก ๊ธฐํ ์ ํด์ ๋๋ฑ ํ๋ก์ ํธ ์์ฑํ๊ณ ์ด๋ฌ๋๋ฐ, ๋๋ ๊ทธ๋ ๊ฒ ํ ์ ์์์ง.. ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋๊น. ๊ทธ๋ฐ๋ฐ ๋๊ฐ ์ด๋ฐ ๋ง์ ํ๋ค์ง. '๋๋ ๊ฒ์ ์ผ๋ ค์น ๋ง๊ณ , ๋ฉ์ถ ๊ฒ์ ์ผ๋ คํ๋ผ.' ์ง์ ์ด ์๋ค๋ ๋๋์ด ๋ค ๋ ์ผ๋ คํ ๊ฒ ์๊ฒ ๋ค.
์ ์ง ํ ์ ๐ข