-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[클린코드 6기 홍석주] 로또 미션 STEP 3 #287
base: hsju0202
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,7 +12,19 @@ export const checkMoney = (money) => { | |
} | ||
}; | ||
|
||
export const checkLottos = (lottos) => { | ||
if (!lottos) { | ||
throw new Error("로또를 구입해주세요."); | ||
} | ||
}; | ||
|
||
export const checkNumbers = (numbers) => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 지난 미션에서 놓친 부분같은데요, winningNumbers와 bonusNumbers에 중복된 번호가 있을 때 중복체크가 되지 않고 있어 수정 및 테스트 코드 추가가 필요해 보입니다 |
||
if (numbers.some((e) => !Number.isInteger(e))) { | ||
throw new Error( | ||
`로또(당첨) 번호는 ${LOTTO_MIN_NUMBER}~${LOTTO_MAX_NUMBER} 사이의 수입니다.` | ||
); | ||
} | ||
|
||
if (numbers.length !== LOTTO_DIGITS) { | ||
throw new Error(`로또(당첨) 번호의 자리수는 ${LOTTO_DIGITS}자리입니다.`); | ||
} | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,17 @@ | ||
const $showResultButton = document.querySelector('.open-result-modal-button') | ||
const $modalClose = document.querySelector('.modal-close') | ||
const $modal = document.querySelector('.modal') | ||
const $showResultButton = document.querySelector(".open-result-modal-button"); | ||
const $modalClose = document.querySelector(".modal-close"); | ||
const $modal = document.querySelector(".modal"); | ||
const $lottoNumbersToggleButton = document.querySelector( | ||
'.lotto-numbers-toggle-button' | ||
) | ||
".lotto-numbers-toggle-button" | ||
); | ||
|
||
const onModalShow = () => { | ||
$modal.classList.add('open') | ||
} | ||
export const onModalShow = () => { | ||
$modal.classList.add("open"); | ||
}; | ||
|
||
const onModalClose = () => { | ||
$modal.classList.remove('open') | ||
} | ||
$modal.classList.remove("open"); | ||
}; | ||
|
||
$showResultButton.addEventListener('click', onModalShow) | ||
$modalClose.addEventListener('click', onModalClose) | ||
// $showResultButton.addEventListener("click", onModalShow); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이 주석은 어떤 의미일까요? |
||
$modalClose.addEventListener("click", onModalClose); |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,5 +2,131 @@ | |||||||||||||||||||||||||||||||||||||||||
* step 3의 시작점이 되는 파일입니다. | ||||||||||||||||||||||||||||||||||||||||||
* 노드 환경에서 사용하는 readline 등을 불러올 경우 정상적으로 빌드할 수 없습니다. | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
import "./css/index.css"; | ||||||||||||||||||||||||||||||||||||||||||
import "./js/index"; | ||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||
buyLottos, | ||||||||||||||||||||||||||||||||||||||||||
calculateProfitRate, | ||||||||||||||||||||||||||||||||||||||||||
getLottoRanks, | ||||||||||||||||||||||||||||||||||||||||||
} from "./js/domain/LottoService"; | ||||||||||||||||||||||||||||||||||||||||||
import { LottoStats } from "./js/domain/LottoStats"; | ||||||||||||||||||||||||||||||||||||||||||
import { LottoRank } from "./js/domain/enum/LottoRank"; | ||||||||||||||||||||||||||||||||||||||||||
import { onModalShow } from "./js/index"; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
console.log("Web Browser!"); | ||||||||||||||||||||||||||||||||||||||||||
const $buyButton = document.getElementById("buyButton"); | ||||||||||||||||||||||||||||||||||||||||||
const $moneyInput = document.getElementById("moneyInput"); | ||||||||||||||||||||||||||||||||||||||||||
const $totalCountLabel = document.getElementById("totalCountLabel"); | ||||||||||||||||||||||||||||||||||||||||||
const $lottosDiv = document.getElementById("lottosDiv"); | ||||||||||||||||||||||||||||||||||||||||||
const $numbersToggle = document.getElementById("numbersToggle"); | ||||||||||||||||||||||||||||||||||||||||||
const $winningNumberInputs = document.getElementsByClassName("winning-number"); | ||||||||||||||||||||||||||||||||||||||||||
const $bonusNumberInput = document.getElementsByClassName("bonus-number")[0]; | ||||||||||||||||||||||||||||||||||||||||||
const $resultButton = document.getElementById("resultButton"); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const $fifthRankCountSpan = document.getElementById("fifthRankCount"); | ||||||||||||||||||||||||||||||||||||||||||
const $fourthRankCountSpan = document.getElementById("fourthRankCount"); | ||||||||||||||||||||||||||||||||||||||||||
const $thirdRankCountSpan = document.getElementById("thirdRankCount"); | ||||||||||||||||||||||||||||||||||||||||||
const $secondRankCountSpan = document.getElementById("secondRankCount"); | ||||||||||||||||||||||||||||||||||||||||||
const $firstRankCountSpan = document.getElementById("firstRankCount"); | ||||||||||||||||||||||||||||||||||||||||||
const $profitRateSpan = document.getElementById("profitRate"); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const $restartButton = document.getElementById("restartButton"); | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+16
to
+32
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. DOM 조작, 접근, 브라우저 이벤트와 관련한 로직들은 index 파일에 작성하는 것보다는 view로 분리해버리면 좋을 것 같습니다 😄 |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
let lottos = null; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$buyButton.addEventListener("click", buyLottosEvent); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$moneyInput.addEventListener("keydown", (event) => { | ||||||||||||||||||||||||||||||||||||||||||
if (event.key === "Enter") { | ||||||||||||||||||||||||||||||||||||||||||
event.preventDefault(); | ||||||||||||||||||||||||||||||||||||||||||
buyLottosEvent(); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+36
to
+43
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. buyLottosEvent가 클릭 이벤트와 엔터키 입력 이벤트에 중복으로 등록되고 있네요. html form 요소를 사용하시면 엔터키 입력 시 자동으로 submit 이벤트가 발생해 직접 엔터키 입력이나 클릭 이벤트에 리스너를 달지 않아도 제출 로직을 구현할 수 있어요 😄
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$numbersToggle.addEventListener("change", (event) => { | ||||||||||||||||||||||||||||||||||||||||||
const display = event.currentTarget.checked ? "" : "none"; | ||||||||||||||||||||||||||||||||||||||||||
$lottosDiv.style.display = display; | ||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$resultButton.addEventListener("click", showLottoStats); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
[...$winningNumberInputs].forEach((e) => { | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 요소에 대한 인자명을 e로 하게 되면 event, error와 혼동될 여지가 많아 보여요 |
||||||||||||||||||||||||||||||||||||||||||
e.addEventListener("keydown", (event) => { | ||||||||||||||||||||||||||||||||||||||||||
if (event.key === "Enter") { | ||||||||||||||||||||||||||||||||||||||||||
showLottoStats(); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$bonusNumberInput.addEventListener("keydown", (event) => { | ||||||||||||||||||||||||||||||||||||||||||
if (event.key === "Enter") { | ||||||||||||||||||||||||||||||||||||||||||
showLottoStats(); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$restartButton.addEventListener("click", () => location.reload()); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 참고) 새로고침으로 앱을 초기화하는게 간단하고 좋은 방법이지만 사용자 경험에는 좋지 않습니다 이번 미션에서 수정하실 필요는 없습니다! |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function buyLottosEvent() { | ||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||
const money = getMoney(); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 정수가 아닌 수를 입력해도 구매가 가능하네요 (1234.567) |
||||||||||||||||||||||||||||||||||||||||||
lottos = buyLottos(money); | ||||||||||||||||||||||||||||||||||||||||||
setTotalCountLabel(lottos.length); | ||||||||||||||||||||||||||||||||||||||||||
setLottosDiv(lottos.map((e) => e.numbers)); | ||||||||||||||||||||||||||||||||||||||||||
$winningNumberInputs[0].focus(); | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+70
to
+74
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 자동 포커스 이동을 구현하셨군요 👍 |
||||||||||||||||||||||||||||||||||||||||||
} catch (err) { | ||||||||||||||||||||||||||||||||||||||||||
alert(err.message); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+68
to
+78
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이벤트에 대한 핸들러 함수명을 지을 때, 만일 구입금액과 구입 버튼을 form으로 감싸고 submit 이벤트를 활용한다면 아래와 같은 네이밍이 되겠네요.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function showLottoStats() { | ||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||
const winningNumbers = getWinningNumbers(); | ||||||||||||||||||||||||||||||||||||||||||
const bonusNumber = getBonusNumber(); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const lottoRanks = getLottoRanks(lottos, winningNumbers, bonusNumber); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const { rankCount, totalCount, totalReward } = new LottoStats(lottoRanks); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$fifthRankCountSpan.innerHTML = rankCount.get(LottoRank.FIFTH.rank) ?? 0; | ||||||||||||||||||||||||||||||||||||||||||
$fourthRankCountSpan.innerHTML = rankCount.get(LottoRank.FOURTH.rank) ?? 0; | ||||||||||||||||||||||||||||||||||||||||||
$thirdRankCountSpan.innerHTML = rankCount.get(LottoRank.THIRD.rank) ?? 0; | ||||||||||||||||||||||||||||||||||||||||||
$secondRankCountSpan.innerHTML = rankCount.get(LottoRank.SECOND.rank) ?? 0; | ||||||||||||||||||||||||||||||||||||||||||
$firstRankCountSpan.innerHTML = rankCount.get(LottoRank.FIRST.rank) ?? 0; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const profitRate = calculateProfitRate(totalCount, totalReward); | ||||||||||||||||||||||||||||||||||||||||||
$profitRateSpan.innerHTML = profitRate; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
onModalShow(); | ||||||||||||||||||||||||||||||||||||||||||
} catch (err) { | ||||||||||||||||||||||||||||||||||||||||||
alert(err.message); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+80
to
+102
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function getWinningNumbers() { | ||||||||||||||||||||||||||||||||||||||||||
return [...$winningNumberInputs].map((e) => parseInt(e.value)); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. parseInt에서 radix 생략 시 주의해주세요 |
||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function getBonusNumber() { | ||||||||||||||||||||||||||||||||||||||||||
return parseInt($bonusNumberInput.value); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function getMoney() { | ||||||||||||||||||||||||||||||||||||||||||
return parseInt($moneyInput.value); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function setTotalCountLabel(length) { | ||||||||||||||||||||||||||||||||||||||||||
$totalCountLabel.innerHTML = `총 ${length}개를 구매하였습니다.`; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function setLottosDiv(numbersList) { | ||||||||||||||||||||||||||||||||||||||||||
const spans = numbersList.map(generateLottoNumbersSpan); | ||||||||||||||||||||||||||||||||||||||||||
$lottosDiv.replaceChildren(...spans); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
function generateLottoNumbersSpan(numbers) { | ||||||||||||||||||||||||||||||||||||||||||
const span = document.createElement("span"); | ||||||||||||||||||||||||||||||||||||||||||
span.classList.add("mx-1"); | ||||||||||||||||||||||||||||||||||||||||||
span.classList.add("text-4xl"); | ||||||||||||||||||||||||||||||||||||||||||
span.value = numbers; | ||||||||||||||||||||||||||||||||||||||||||
span.innerHTML = `🎟️ ${numbers}`; | ||||||||||||||||||||||||||||||||||||||||||
return span; | ||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
로또 번호 input에 세자리 이상의 수도 입력이 가능한데 제한할 수 없을까요?