Skip to content

Conversation

@JangYEhoon00
Copy link

javascript-lotto-precourse

프리코스-로또

이번 미션에서는 도전하고 싶은 부분

  1. MVC 패턴 숙지
  2. Airbnb js 코드 컨벤션 적용
  3. 메서드의 책임 최소화
  4. 테스트 코드 원칙에 의거한 테스트 코드 구현

1. 모델 (Model): 데이터 관리의 핵심

  • 모델의 역할:
    • 데이터 저장 및 관리: 애플리케이션에서 사용하는 데이터를 데이터베이스에 저장하고, 필요할 때 데이터를 가져오거나 수정, 삭제하는 역할을 합니다.
    • 데이터베이스와 상호작용: 데이터베이스와 직접 통신하여 데이터를 처리합니다. (예: 테이블 생성, 데이터 검색, 데이터 삽입 등)
    • 데이터 유효성 검증: 데이터가 올바른 형식인지 확인하고, 잘못된 데이터가 저장되지 않도록 합니다. (예: 이메일 형식 검사, 필수 입력 필드 확인)
    • 비즈니스 로직 처리: 데이터와 관련된 복잡한 규칙이나 계산을 처리합니다. (예: 할인율 계산, 사용자 등급 계산 등)

2. 뷰 (View): 사용자 인터페이스 담당

  • 뷰의 역할:
    • 사용자 인터페이스 생성: 웹 페이지를 구성하는 HTML, CSS, JavaScript 코드를 작성하여 사용자에게 보여지는 화면을 만듭니다.
    • 데이터 출력: 모델에서 가져온 데이터를 사용자에게 보기 좋게 출력합니다.
    • 템플릿 사용: HTML에 Ruby 코드를 추가하여 동적인 웹 페이지를 만듭니다. (ERB, Haml 등의 템플릿 엔진 사용)
    • 사용자 입력 처리: 사용자가 입력한 데이터를 화면에서 처리하고, 컨트롤러에 전달합니다.
  • 뷰의 예시 (Rails):
    • app/views 폴더에 있는 파일 (예: users/index.html.erbposts/show.html.erb)
    • ERB(Embedded Ruby) 문법을 사용하여 HTML 코드 안에 Ruby 코드를 작성할 수 있습니다.
  • 뷰의 특징:
    • 웹 브라우저에 보여지는 HTML, CSS, JavaScript 코드를 포함합니다.
    • 모델에서 가져온 데이터를 예쁘게 표현합니다.
    • 사용자의 입력에 따라 동적으로 웹 페이지를 변경합니다.

뷰를 쉽게 이해하는 방법:

  • 무대 디자이너: 뷰는 마치 무대 디자이너와 같습니다. 사용자에게 보여지는 화면을 디자인하고 꾸밉니다.
  • 프레젠테이션 전문가: 뷰는 데이터를 프레젠테이션하는 전문가입니다. 데이터를 보기 좋게 정리하여 보여줍니다.

3. 컨트롤러 (Controller): 모델과 뷰 연결 담당

  • 컨트롤러의 역할:
    • 사용자 요청 처리: 웹 브라우저에서 온 사용자 요청을 분석하고, 어떤 모델을 사용해야 하는지, 어떤 뷰를 보여줘야 하는지 결정합니다.
    • 모델 호출: 모델을 사용하여 데이터를 가져오거나 변경합니다.
    • 뷰 호출: 데이터를 뷰에 전달하고, 뷰를 실행하여 사용자에게 웹 페이지를 보여줍니다.
    • 흐름 제어: 웹 애플리케이션의 흐름을 제어합니다. (예: 로그인 여부 확인, 사용 권한 확인 등)
    • 데이터 전달: 모델에서 가져온 데이터를 뷰에 전달합니다.
  • 컨트롤러의 예시 (Rails):
    • app/controllers 폴더에 있는 파일 (예: UsersController.rbPostsController.rb)
    • 액션(action)이라고 불리는 메서드를 사용하여 요청을 처리합니다.
  • 컨트롤러의 특징:
    • 모델과 뷰 사이의 중개자 역할을 합니다.
    • 사용자의 요청에 따라 적절한 모델과 뷰를 선택합니다.
    • 웹 애플리케이션의 논리적인 흐름을 제어합니다.

컨트롤러를 쉽게 이해하는 방법:

  • 교통 경찰관: 컨트롤러는 마치 교통 경찰관과 같습니다. 교통 흐름을 제어하고, 필요에 따라 차량(데이터)을 목적지(뷰)로 안내합니다.
  • 매니저: 컨트롤러는 웹 애플리케이션의 매니저와 같습니다. 사용자의 요청을 처리하고, 필요한 작업을 수행합니다.

미션에 따른 역할 구분

  • 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
    중복되지 않는 6개의 숫자는 화면에 보여주는 역할만 담당하므로 뷰에 해당
  • 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
    화면에 보여주는 역할만 담당하므로 뷰에 해당
  • 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
    • 1등: 6개 번호 일치 / 2,000,000,000원
    • 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
    • 3등: 5개 번호 일치 / 1,500,000원
    • 4등: 4개 번호 일치 / 50,000원
    • 5등: 3개 번호 일치 / 5,000원
      등수에 대한 데이터는 상수화 번호를 확인한 다음 일치하는 번호에 따른 값을 출력
  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
    입력된 값에 따라 데이터를 뷰로 보내기 때문에 있으므로 컨트롤러에 해당
  • 로또 1장의 가격은 1,000원이다.
    이건 상수로 묶어서 처리
  • 당첨 번호와 보너스 번호를 입력받는다.
    입력된 값에 따라 데이터를 뷰로 보내기 때문에 있으므로 컨트롤러에 해당
  • 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
  • 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 해당 지점부터 다시 입력을 받는다.

  • 입력값 숫자로 변경
  • 시행횟수가 0보다 작을경우 또는 0일경우 예외처리
  • 입력금액보다 게임 하는 금액이 클 경우 예외처리
  • 에러 메시지 상수화

Money 클래스에서 해야할일

  • 입력받은 금액을 문자열에서 숫자로 변경
  • 일어날 수 있는 문제에 대한 예외처리
  • 최대 가능 횟수 계산
  • 거스름돈 계산

Lotto 클래스 해야할일

  • 생성된 번호 정렬 -> 컨트롤러에서 제공
  • 매직넘버와 생성된 번호를 비교후 불리언 값으로 비교 -> 계산기에서 비교
  • 입력받은 배열을 숫자 배열로 변경 ->

LottoGenerator 클래스의 역할

  • 랜덤 번호 생성
  • 티켓 구매 수 만큼 랜덤 번호 시행 회수

Calculator 클래스의 역할

  • 배열수를 확인
  • 배열에 맞게 맞는 수가 있다면 카운트 증가
  • 카운트를 배경으로 등수를 매김

JangYEhoon00 and others added 30 commits October 30, 2025 13:28
로또 번호 입력하는 기능이 필요없는것으로 판단해서 제거하였습니다
시행횟수를 받는 부분에서 금액을 입력하라고 있던 오타를 기능에 맞게 수정하였습니다.
시행횟수가 0이거나 0보다 작을경우 예외처리를 했습니다. 추가적으로 게임 금액이 투입 금액보다 클 경우 예외처리 했습니다
에러 메세지를 상수화 시켜서 에러 메세지를 더  간소하고 수정을 더 용이하게할 수 있도록 정리했습니다
변경된 내용을 리드미 파일에 반영하였습니다
입력받은 금액과 게임하는게 필요한 금액을 계산하여 최대로 가능한 게임 횟수를 알려줍니다
해당 객체의 생성자로 이미 금액을 입력받기 때문에 따로 파라미터를 받는게 아닌 해당 객체의 값을 그대로 가져오는 방식을 선택했습니다
요구사항에 따라 구매 가능 금액을 입력받습니다
게임 구매 입력에 따른 거스름돈 반환함수 (restMoney) 수정
등수에 맞게 나오는 안내메세지를 상수화 시켰습니다
좀더 안전성을 확보하기 위해 객체를 통한 상수화를 거쳐 매직넘버를 표현했습니다
랜덤으로 생성한 번호를 정렬시키고 정렬시킨 값과 입력값을 비교하는 기능을 구현했습니다
pc에서 작업하기위한 PR
로또 클래스에서 너무 많은 책임을 가지고 있는것 같아 따로  클래스를 분리했습니다
mvc패턴에 맞게 데이터의 흐름을 변경했습니다 또한 위반가능성이 있는 부분은 클래스를 새롭게 만들어서 처리했습니다
generateTicket 함수가 단일 책임을 위반하여 따로 메서드를 분리했습니다
안전한 정보의 전달을 위해 게터함수의 리컨값을 스프레드 연산자를 통해 복사하였습니다.
등수를 구별하기 위해서 불린값을 가지는 배열을 리턴하는 메서드를 구햔하였습니다
배열에 입력값에 맞게 등수를 확인시키는 기능을 추가하였습니다
테스트 코드가 요구하는 사항에 맞게 코드를 수정하였습니다  잘못된 참조 수정 및 잘못된 유틸리티 호출 수정, money 생성자 파라미터 1개로 변경
계산 기능의 테스트 코드를 작성하였습니다
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.

1 participant