31_Password Generator
๐ป์ฃผ์ : ์๋ ๋น๋ฐ๋ฒํธ ์์ฑ๊ธฐ
- ๋น๋ฐ๋ฒํธ ๊ธธ์ด
- ๋๋ฌธ์ ํฌํจ
- ์๋ฌธ์ ํฌํจ
- ์ซ์ ํฌํจ
- ๊ธฐํธ ํฌํจ
๐๐ป ๋ค์ฏ๊ฐ์ง ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฌด์์๋ก ๋น๋ฐ๋ฒํธ๊ฐ ์์ฑ๋จ.
function getRandomLower() {
return String.fromCharCode(Math.floor(Math.random()*26) + 97)
}
function getRandomUpper() {
return String.fromCharCode(Math.floor(Math.random()*26) + 65)
}
function getRandomNumber() {
return String.fromCharCode(Math.floor(Math.random()*10) + 48)
}
function getRandomSymbol() {
const symbols = '!@#$%^&*(){}[]=<>/,.'
return symbols[Math.floor(Math.random() * symbols.length)]
}
const randomFunc = {
lower: getRandomLower,
upper: getRandomUpper,
number: getRandomNumber,
symbol: getRandomSymbol
}
clipboardEl.addEventListener('click', () => {
const password = resultEl.innerText;
if (!password) {
return;
}
navigator.clipboard.writeText(password);
alert('ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ๋์์ต๋๋ค!')
})
generateEl.addEventListener('click', () => {
const length = +lengthEl.value //+๋ฅผ ๋ถ์ฌ ์ซ์๋ก ๋ณํ
const hasLower = lowercaseEl.checked
const hasUpper = uppercaseEl.checked
const hasNumber = numbersEl.checked
const hasSymbol = symbolsEl.checked
resultEl.innerText = generatePassword(hasLower, hasUpper, hasNumber, hasSymbol, length)
})
function generatePassword(lower, upper, number, symbol, length) {
let generatedPassword = ''
//์ฒดํฌํ์ ๋๊ฑฐ ์๋ ์ธ๊ธฐ
const typesCount = lower + upper + number + symbol
const typesArr = [{lower}, {upper}, {number}, {symbol}]
//false๊ฐ์ ๊ฑธ๋ฌ๋
.filter(item => Object.values(item)[0])
if(typesCount === 0) {
return ''
}
for(let i=0; i<length; i+=typesCount) {
typesArr.forEach(type => {
const funcName = Object.keys(type)[0]
generatedPassword += randomFunc[funcName]()
})
}
const finalPassword = generatedPassword.slice(0, length)
return finalPassword
}
randomFunc ๊ฐ์ฒด๋ ๋ค ๊ฐ์ง ์์ฑ(lower, upper, number, symbol)๊ณผ ํด๋น ์์ฑ์ ์ฐ๊ฒฐ๋ ํจ์(getRandomLower, getRandomUpper, getRandomNumber, getRandomSymbol)๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด ๊ฐ์ฒด๋ ๊ฐ ์์ฑ์ ํตํด ๋ฌด์์ ๋ฌธ์๋ฅผ ์์ฑํ๋ ํจ์์ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
clipboardEl ์์๋ ํด๋ฆฝ๋ณด๋ ๋ฒํผ์ ๋ํ๋ด๋ฉฐ, ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ฑ๋ก๋์ด ์๋ค.
ํด๋ฆญ ์, resultEl์ ๋ด์ฉ์ ๊ฐ์ ธ์ ๋น์ด ์์ง ์์ ๊ฒฝ์ฐ ํด๋น ๋น๋ฐ๋ฒํธ๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ 'ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ๋์์ต๋๋ค!'๋ผ๋ ์๋ฆผ์ ํ์ํ๋ค.
generateEl ์์๋ ์์ฑ ๋ฒํผ์ ๋ํ๋ด๋ฉฐ, ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ฑ๋ก๋์ด ์๋ค.
ํด๋ฆญ ์, ์
๋ ฅ๋ ์ต์
์ ๋ฐ๋ผ length์ ๊ธธ์ด๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ค.
hasLower, hasUpper, hasNumber, hasSymbol ๋ณ์๋ ๊ฐ๊ฐ ์๋ฌธ์, ๋๋ฌธ์, ์ซ์, ํน์ ๋ฌธ์ ํฌํจ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ์ฒดํฌ๋ฐ์ค ์์์ ์ํ๋ฅผ ๊ฐ์ ธ์จ๋ค.
generatePassword ํจ์๋ฅผ ํธ์ถํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ resultEl ์์์ ๋ด์ฉ์ผ๋ก ์ค์ ํ๋ค.
generatePassword ํจ์๋ ์ฃผ์ด์ง ์ต์
์ ๋ฐ๋ผ length ๊ธธ์ด์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ค.
์ฒดํฌ๋ ์ต์
์ ๊ฐ์๋ฅผ typesCount ๋ณ์์ ์ ์ฅํ๋ค.
typesArr ๋ฐฐ์ด์ ์๋ฌธ์, ๋๋ฌธ์, ์ซ์, ํน์ ๋ฌธ์๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด๋ฅผ ๋ด๋๋ค. ์ด๋, ์ฒดํฌ๋ ์ต์
๋ง ํํฐ๋งํ์ฌ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค.
์ต์ ์ด ํ๋๋ ์ ํ๋์ง ์์ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด length๋งํผ ๋ฐ๋ณตํ๊ณ , typesArr ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์ํํ๋ค.
๊ฐ ์์์์ ํจ์ ์ด๋ฆ์ ๊ฐ์ ธ์ randomFunc ๊ฐ์ฒด์์ ํด๋น ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฌด์์ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , generatedPassword์ ์ถ๊ฐํ๋ค.
์ต์ข ๋น๋ฐ๋ฒํธ๋ ์์ฑ๋ ๋น๋ฐ๋ฒํธ์์ length๋งํผ ์๋ผ๋ด์ด ๋ฐํ๋๋ค. (default๊ฐ 20์ด๋ฉด, ๊ธด ๋ฌด์์ ๋ฌธ์์ด์์ 20๋ง ์๋ผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค๋ ๊ฒ.)
.result-container #result {
word-wrap: break-word;
/* 100%๋ ๋ถ๋ชจ์์, 40px๋ ๋ฒํผ์ ์์์
๋น๋ฐ๋ฒํธ ๊ฒฐ๊ณผ๊ฐ์ด ๋ถ๋ชจ์์์์ ๋ฒํผ์ ๋บ ๊ธธ์ด ์์์ ์์ฑ๋์ด์ผ ํจ. */
max-width: calc(100% - 40px);
}
๐๐ป์ฐธ๊ณ ๋ก, word-wrap ์์ฑ์ CSS3์์๋ overflow-wrap์ผ๋ก ๋์ฒด๋์๋ค. overflow-wrap์ word-wrap๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋ฉฐ, ๋ ์ดํดํ๊ธฐ ์ฌ์ด ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค.