Skip to content

[🚀 사이클1 - 미션 (블랙잭 게임 실행)] 맥스 미션 제출합니다#1016

Open
simhokyung wants to merge 55 commits intowoowacourse:simhokyungfrom
simhokyung:simhokyung
Open

[🚀 사이클1 - 미션 (블랙잭 게임 실행)] 맥스 미션 제출합니다#1016
simhokyung wants to merge 55 commits intowoowacourse:simhokyungfrom
simhokyung:simhokyung

Conversation

@simhokyung
Copy link

개요

안녕하세요, 제이미!
이번 블랙잭 미션을 수행한 맥스입니다.

이번 미션은 처음으로 페어 프로그래밍을 진행하며 구현해본 과제라, 부족한 점이 많았을 것이라 생각합니다.
마구마구 피드백을 해주시면 감사하겠습니다!

체크 리스트

  • 미션의 필수 요구사항을 모두 구현했나요?
  • Gradle test를 실행했을 때, 모든 테스트가 정상적으로 통과했나요?
  • 애플리케이션이 정상적으로 실행되나요?

어떤 부분에 집중하여 리뷰해야 할까요?

1. TDD를 실제 개발 흐름에 적용하는 방식에 대한 고민

과제 요구사항에 맞춰 테스트를 먼저 작성하면서 개발해보려고 했지만, 실제로는 TDD를 어떻게 시작해야 하는지 고민이 되었습니다. 막상 테스트부터 작성하려고 하면 어떤 객체가 필요한지, 외부에 어떤 메서드를 제공해야 하는지를 먼저 정해야 했고, 그 과정에서 자연스럽게 설계에 대한 고민이 먼저 커졌습니다.

그러다 보니 실제 흐름은 객체의 책임과 구조를 어느 정도 정리한 뒤 그에 맞는 테스트를 작성하는 쪽에 가까웠습니다.
이 과정에서 들었던 고민은, 어차피 설계를 먼저 충분히 고민한 뒤 테스트 코드를 작성하게 된다면, 그 상태에서 바로 구현을 시작하는 것이 시간적으로 더 효율적인 것은 아닌가 하는 점이었습니다.

질문

  • 지금처럼 설계를 먼저 고민한 뒤 테스트를 작성하는 흐름도 TDD를 적용하는 자연스러운 방식으로 볼 수 있는지 궁금합니다.
  • 구현으로 바로 넘어가지 않고 테스트를 먼저 작성하는 것이 어떤 점에서 더 의미가 있는지 알고 싶습니다.
  • 제이미만의 TDD 적용 팁이 있다면 함께 듣고 싶습니다.

2. 인스턴스 변수 개수 제한을 맞추기 위한 객체 분리에 대한 고민

GameController가 게임 진행 규칙까지 너무 많이 알고 있다고 판단해서, 컨트롤러의 책임을 줄이기 위해 BlackjackGame 도메인을 만들었습니다.
이 객체는 기존에 컨트롤러에서 수행하던 초기 카드 분배, 딜러 생성, 플레이어 생성, 카드 추가와 같은 게임 진행 로직을 담당하도록 설계했습니다.

처음에는 BlackjackGame의 필드를 Deck, Dealer, Players로 두어 게임 상태를 직접 가지도록 구성했습니다.
하지만 과제 요구사항에 따라 인스턴스 변수 개수를 2개 이하로 제한해야 했고, 이 제약을 맞추기 위해 DealerPlayersGameParticipants라는 별도 객체로 묶었습니다.

이 과정에서 요구사항은 충족할 수 있었지만, 한편으로는 제약을 맞추기 위해 객체를 계속 분리하다 보면 클래스 수가 많아지고 구조가 오히려 복잡해질 수 있겠다는 고민이 들었습니다.

질문

  • 이런 방식의 객체 분리가 도메인적으로 자연스러운 설계인지 궁금합니다.
  • 아니면 단순히 요구사항을 맞추기 위한 과한 분리로 볼 수 있는지도 피드백 받고 싶습니다.

3. 인덴트 depth 1 제한을 맞추기 위한 메서드 분리에 대한 고민

과제 요구사항에서 인덴트 depth를 1까지만 허용하고 있어, 중첩된 제어문을 줄이기 위해 메서드를 적극적으로 분리했습니다.
예를 들어 ScoreCalculator를 리팩토링하는 과정에서 for문 안에 if문이 들어가면 depth 2가 되기 때문에, 이를 피하기 위해 계산 단계를 나누고 일부 조건문을 별도 메서드로 추출했습니다.

이렇게 하면 요구사항은 만족시킬 수 있고, 각 메서드의 역할도 더 분명해지는 장점이 있다고 느꼈습니다.
다만 한편으로는 인덴트 depth를 줄이기 위해 메서드를 지나치게 잘게 나누면, 오히려 전체 흐름을 한 번에 파악하기 어려워질 수도 있겠다는 고민이 들었습니다.

질문

  • 인덴트 depth 1 제한을 지키기 위한 메서드 분리가 실제로도 가독성과 유지보수성에 도움이 되는 방향인지 궁금합니다.
  • 아니면 요구사항을 맞추기 위한 과한 분리로 이어질 수도 있는지 의견을 듣고 싶습니다.

4. 상수 분리 기준에 대한 고민

매직 넘버를 줄이고 의미를 명확하게 하기 위해 일부 값을 상수로 분리했습니다.
이 과정에서 상수를 각 클래스 내부 상단에 두는 방식과, 별도의 상수 클래스로 분리하는 방식 중 어떤 기준으로 선택해야 하는지 고민이 들었습니다.

현재는 상수를 사용하는 클래스 내부 상단에 선언해두면, 해당 값을 어디서 사용하는지와 어떤 의미인지 한눈에 같이 볼 수 있어서 가독성 측면에서 더 편하다고 느꼈습니다.
반면 별도의 상수 클래스로 분리하면 공통으로 사용하는 값을 한곳에서 관리할 수 있고, 수정이 필요할 때는 더 편리하다는 장점이 있다고 생각했습니다.

질문

  • 이런 경우 상수를 클래스 내부에 두는 것이 더 적절할지, 혹은 별도의 상수 클래스로 분리하는 것이 더 나은지 알고 싶습니다.
  • 상수 위치를 결정할 때 어떤 기준으로 판단하면 좋을지도 피드백 부탁드립니다.

감사합니다!

simhokyung and others added 30 commits March 5, 2026 12:52
- 딜러 카드 16이하 여부 확인 테스트 구현
- 카드 추가 확인 테스트 구현
- 플레이어의 카드 추가 여부 확인 테스트
- 플레이어의 버스트 여부 확인 테스트
- 모든 플레이어들의 버스트 여부 확인 테스트 작성
- 플레이어 이름 길이가 20자를 초과할 경우 예외 발생 테스트 작성
- Null 혹은 빈 값 입력 시 예외 발생 테스트
minzzun99 and others added 25 commits March 7, 2026 16:08
- 기존 21 미만일 경우에만 더했던 로직은 21 이하로 변경
Copy link

@jamie9504 jamie9504 left a comment

Choose a reason for hiding this comment

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

안녕하세요, 맥스. 리뷰어 제이미입니다.

만나서 반갑습니다.

코멘트 남겨두었습니다.

@@ -0,0 +1,65 @@
package controller;

Choose a reason for hiding this comment

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

  1. TDD
    • 맥스가 생각하는 TDD란 무엇인가요?
    • TDD는 어떠한 장/단점이 있는지 알아보고 간략하게 정리해주세요.
  2. 인스턴스 변수 개수 제한 / 객체 분리
    • 객체가 분리되었을 때, 해당 객체의 의미가 적다고 느껴진다면 해당 객체에게 조금 더 역할과 책임을 부여해주는 것도 좋겠네요.
    • 맥스의 생각엔 어떠한 객체들이 현재 별로 역할이 없나요? 그 객체들이 가지고 올 수 있는 역할들이 있을까요?
  3. 인덴트 depth 1 제한
    • 분리를 했을 때, 가독성이 더 좋아졌다고 느껴진 부분과 가독성이 안좋아졌다고 느껴진 부분을 각각 한~두 부분 골라주세요.
    • 그렇게 느껴진 이유에 대한 맥스의 생각을 각각 정리해봐주세요.
  4. 상수 분리
    • 정답이 있진 않고, 그 상황과 각자의 선호에 따라 다를 것 같은데, 적어줬던 장점 외에 추가적으로 단점들도 정리해봐주세요.


public class GameController {

public void start() {

Choose a reason for hiding this comment

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

맥스의 애플리케이션에서 Controller의 역할은 무엇인가요?
controller를 start한다는 것은 어떠한 의미인가요?

Comment on lines +48 to +51
if (blackjackGame.shouldDealerDraw()) {
OutputView.printAddDealerCardMessage();
blackjackGame.playDealerTurn();
}

Choose a reason for hiding this comment

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

blackjackGame을 다른 누군가가 가져다가 쓴다면, 위와 같은 순서/방법으로 호출을 해야하는 것을 짐작할 수 있을까요?


OutputView.printTotalResult(dealerFinalResultDto, totalFinalResultsDto);
}
} No newline at end of file

Choose a reason for hiding this comment

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

아래 빨간 (-) 표시가 왜 생기는지 찾아보고, 제거해보세요.

Comment on lines +4 to +5
private CardNumber cardNumber;
private CardShape cardShape;

Choose a reason for hiding this comment

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

final을 사용하지 않은 이유는 무엇인가요?

Comment on lines +12 to +13
@DisplayName("게임 시작 시 딜러와 모든 플레이어는 처음 카드 2장을 받는다")
void 게임_시작시_딜러와_플레이어에게_카드2장_배분() {

Choose a reason for hiding this comment

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

DisplayName과 한국어 메서드명을 같이 사용하면 어떠한 이점이 있나요?

@DisplayName("덱의 카드 개수 확인 테스트 - 52장")
@Test
void 생성된_덱의_카드_개수_확인() {
Deck deck = Deck.createDeck();

Choose a reason for hiding this comment

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

덱 도메인은 해당 테스트들만 있으면 충분한가요?

Comment on lines +38 to +40
private static String getDealerCardStatus(ResultDto resultDto) {
return resultDto.cards().getFirst();
}

Choose a reason for hiding this comment

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

이건 뷰 로직일까요?
만약 해당 뷰를 다른 개발자가 다른 뷰로 대체한다면, 블랙잭 게임은 잘 동작할 수 있을까요?

import util.NameParser;

public class InputView {
private static final Scanner scanner = new Scanner(System.in);

Choose a reason for hiding this comment

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

상수인데 소문자로 선언하는 이유가 무엇인가요 ?


import java.util.List;

public abstract class Participant {

Choose a reason for hiding this comment

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

해당 애플리케이션에서 상속을 사용했을 때 어떠한 장/단점이 있었나요?

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