Skip to content

[1단계 - 로또 미션] 도비(김정혁) 미션 제출합니다.#5

Merged
wow9144 merged 46 commits intowoowacourse:zereightfrom
zereight:zereight-step1
Feb 23, 2021
Merged

[1단계 - 로또 미션] 도비(김정혁) 미션 제출합니다.#5
wow9144 merged 46 commits intowoowacourse:zereightfrom
zereight:zereight-step1

Conversation

@zereight
Copy link

@zereight zereight commented Feb 17, 2021

안녕하세요. 리뷰어님!
이번에 리뷰요청 드리는 도비(김정혁) 입니다.
구현한 페이지는 실습 페이지 에서 확인하실 수 있습니다!
구조나 변수명, 성능 등의 다양한 관점에서 피드백 부탁드립니다. 감사합니다!

🎯 step1 구입 기능

  • 로또 구입 금액을 입력하면, 금액에 해당하는 로또를 발급해야 한다.
    • 정상적인 구매가 완료되면 구매 안내 메시지를 보여준다 ex) 로또 N개 구매 완료. 거스름돈 : M원
    • 금액은 최소 1000원 부터 입력이 가능하다. => 1000원 이하일 경우 alert
    • 금액은 정수여야 한다.
  • 로또 1장의 가격은 1,000원이다.
  • 소비자는 자동 구매를 할 수 있어야 한다.
    • 로또 번호는 1부터 45까지의 숫자 중 중복되지 않은 6개의 숫자로 이루어져있다.
  • 복권 번호는 번호보기 토글 버튼을 클릭하면, 볼 수 있어야 한다.
  • 구매한 복권의 총 개수를 화면에 표시한다.

질문 있어요!

  • DOM 객체를 가져올일이 이리저리 많은경우, 유지보수를 위해서 각각의 태그에 id 를 많이 쓰면 좋은 것인가요? 태그에 id를 넣는 일이 많아지니까 id를 남용하는 것 같아서 고민됩니다!
  • 컴포넌트 기반 아키텍처로 프로그래밍을 했는데요! 컴포넌트를 최대한 작게 나누는 것이 좋을까요? 1개의 컴포넌트가 담당하는 역할이 많아지니 가독성도 떨어지고 단일 책임의 원칙(?)에도 맞지 않는 것같아서 고민됩니다!

2SOOY and others added 29 commits February 16, 2021 14:46
- 로또 구매 결과에 대한 안내 메시지 기능 변경
- 로또 1장의 가격은 1,000원이다
- 로또 번호는 1부터 45까지의 숫자 중 중복되지 않은 6개의 숫자로 이루어져있다.
@zereight zereight changed the title Zereight step1 [1단계 - 로또 미션] 브콜(오태은) 미션 제출합니다. Feb 17, 2021
@zereight zereight changed the title [1단계 - 로또 미션] 브콜(오태은) 미션 제출합니다. [1단계 - 로또 미션] 도비(김정혁) 미션 제출합니다. Feb 17, 2021
@zereight
Copy link
Author

zereight commented Feb 17, 2021

[아키텍처] Component-Based-Architecture - 10

내용

  • 구현해야할 화면을 각각의 컴포넌트로 나누어서, React처럼 각 컴포넌트가 각자의 책임(view, state 등)을 가지도록 구현.
  • 최상위 컴포넌트인 App에서는 다른 컴포넌트들 간의 상호작용을 중재하도록 구현.
  • 기능 구현을 각각의 컴포넌트에 대한 책임으로 돌려서 MVC를 설계할 때 보다, 구조 설계에 대한 비용을 줄일 수 있었음.
  • 각 컴포넌트에 책임이 많아질 수록 가독성이 저하되고, 오버엔지니어링되는 경향이 있다는 것을 깨달음.

링크

[렌더링] Reflow vs Repaint - 8

내용

  • reflow, repaint가 성능을 저하시킨다는 것을 알고, 최대한 비용을 줄이기 위해, 보이지 않는 element는 css opacity 속성을 사용하여 repaint, reflow가 발생하지 않게 구현.
  • 이미 존재하는 엘리먼트의 값을 변경하는 경우에는 reflow가 일어나도 최대한 DOM사용을 줄이기 위해, innerHTML에 문자열을 활용하여 단 한번의 DOM 객체 접근으로 element를 추가하는 방식으로 구현 (비록 문자열 파싱 작업이 추가되긴 하지만..).

링크

[클래스] static 사용 - 7

내용

  • 클래스와 관련된 유틸성 함수를 static method로 구현하려고 했으나, OOP를 해친다는 이유로 권장하지 않는다는 의견이 더 많아 static method 없이 구현.
  • 하지만, class와 관련되고 인스턴스 변수를 사용하지 않으면 static method 선언하는 것이 가독성은 증가하지 않을까라는 생각이 여전히 듦.

링크

Copy link

@wow9144 wow9144 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체적으로 코드도 깔끔하고 역할 분리에도 신경을 쓰신듯 하여 읽기 쉬운편이었습니다.
리액트를 써보신듯한데 비슷한 패턴으로 구현하려고 노력 하신것 같습니다.
모델에 로또 발행기 같은 역할이 하나 더 추가 되면 더 명확해질 것 같습니다.
로또 발행기는 무엇을 알고 있어야 하는지(어떤 책임을 갖는 역할인지)를 중점적으로 고민해보시면 좋을 것 같습니다.

질답
DOM 객체를 가져올일이 이리저리 많은경우, 유지보수를 위해서 각각의 태그에 id 를 많이 쓰면 좋은 것인가요? 태그에 id를 넣는 일이 많아지니까 id를 남용하는 것 같아서 고민됩니다!
-> 페이지의 유일한 엘리먼트라면 id를 하시면 되고 비슷한 성격의 것들 이라면 data-* 로 하시면 좋습니다. data-section=lottoContainer, data-section=amountContainer 같은 식으로 하시면 각 섹션을 한 번에 가져올 수도, 가져온것을 세부적으로 구분하기도 쉽습니다.
class는 스타일을 위한 것이므로 class 로 여러개를 가져와서 조작하는것은 깨지기 쉽습니다. (스타일이 바뀌어 html 에서 클래스 이름을 바꿨는데 기능이 깨질 수 있는...)

컴포넌트 기반 아키텍처로 프로그래밍을 했는데요! 컴포넌트를 최대한 작게 나누는 것이 좋을까요? 1개의 컴포넌트가 담당하는 역할이 많아지니 가독성도 떨어지고 단일 책임의 원칙(?)에도 맞지 않는 것같아서 고민됩니다!
-> 네 최대한 작게 나누는것이 좋습니다. 컴포넌트 기반 아키텍쳐가 재사용 가능한 컴포넌트로 만들어 가는 것이니까요. 재사용 가능하려면 결국 단일 책임원칙이 중요하게 작용합니다.

index.html Outdated
<div class="w-100">
<h1 class="text-center">🎱 행운의 로또</h1>
<form class="mt-5">
<form id="lotto-perchase-input-container" class="mt-5">
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lotto-perchase-input-container 아이디는 추가하신걸 보면 처리 할려고 하셨던 것인지는 모르겠으나
인풋에 구입 금액을 입력하고 엔터를 치면 새로고침이 되네요.
form 이벤트 preventDefault() 를 해주는 부분도 있으면 좋을 것 같습니다.
로또 미션의 요구사항과 크게 관련은 없지만 프론트개발 실무의 기본이긴 하니까 기왕이면 처리 되면 좋을 것 같습니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 그렇게 수정하겠습니다!


export const mod = (a, b) => a % b;

export const generateLottoNumbers = () => {
Copy link

@wow9144 wow9144 Feb 21, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lotto.js 는 유틸이라고 보기 어려운 것 같습니다.
generateRandomNumber, divide, mod 는 숫자를 다루는 유틸이라는 하나의 역할로 묶을 수는 있으나 generateLottoNumbers 는 로또라는 특정 도메인의 문제를 해결하기 위함이므로 유틸로 보기 어렵고 isValidLottoNumbers 역시 마찬가지 입니다.

실세계에서의 상황을 생각해보시면 역할 분리에 좀 도움이 되실것 같습니다.
로또발행기한테 돈 넣고 로또 발행을 요청하면 로또를 반환하는 식으로 하셔서 책임을 나누면 어떨까 싶습니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 로또 발행기 역할의 LottoManager를 만들어서 로또와 관련된 함수들을 가지도록 수정했습니다.
피드백 감사합니다!

this.lottoDisplay = new LottoDisplay({ lottos: this.lottos });
}

createLottos(lottoCount) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로또 App이긴 하지만 App 그 자체가 직접 로또를 발행(createLottos)하는것보다는 로또를 발행하는 모듈은 따로 있고 그걸 관리하고 뷰와 연결하고 하는 역할을 App 이 맡는게 좋을 것 같습니다.
요약하면 App 이 createLottos 를 하는것은 다소 과다한 책임을 맡고 있는 것 같습니다.

Copy link
Author

@zereight zereight Feb 21, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네 정확한 피드백이십니다! 이 문제로 많은 고민을 했었는데요!
이번엔 옵저버 패턴과 Pub-Sub 패턴을 이용하여 최대한 App의 책임을 덜어주도록 수정했습니다!

2SOOY and others added 5 commits February 21, 2021 12:57
- code depth를 줄여 가독성을 높이기 위함
- App.prototype.excute : state초기화 및 하위 컴포넌트 등록
- PubSub 구조를 활용하여 로또 상태 관리
- 로또 매니저는 로또 생성 및 검증에 대한 역할을 담당하도록 설계
- 로또 매니저 설계에 따른 테스트 내용 수정
Co-authored-by: zereight <zereight@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants