Skip to content

Conversation

@tmdcheol
Copy link

No description provided.

- 기능목록 작성
- 추가 예외케이스 작성

- 기능목록은 요구사항 충족 내에서 작성
- 추가 예외케이스는 요구사항 이외에 스스로 생각한 예외로, 개발하면서 계속 추가할 예정
- Controller 클래스에서 가이드 메세지를 넣어서 OutputView에게 전달 수행
- OutputView 클래스에서 출력 기능을 담당하며, console에 메시지 출력 및 개행을 수행
- OutputViewTest에서 OutputView의 println 메서드 테스트를 진행
  - System.out을 셋팅하고 출력된 메시지가 예상과 일치하는지 검증
- println 메서드의 message 파라미터에 final 키워드를 추가
- 파라미터의 불변성을 명시적으로 선언하여 코드의 안정성 및 가독성 향상
- InputView 클래스에 자동차 이름을 입력받는 read 메서드 추가
- Controller 클래스는 사용자가 입력한 자동차 이름들을 읽어옴

- 입력을 미리 셋팅한 InputStream을 주입하고 inputView.read 메서드를 실행해 셋팅한 값과 일치하는지 테스트
- CarArgumentResolver 클래스에서 입력받은 자동차 이름 문자열을 쉼표(,) 기준으로 분리하는 기능 추가
- CarConverter 클래스에서 문자열 리스트를 Car 객체 리스트로 변환하는 기능 추가
- Controller 클래스에서 자동차 이름을 입력받고 변환하는 전체 흐름 구현

- CarArgumentResolverTest와 CarConverterTest에서 정상 동작 검증
- SizeValidator 에서 자동차 이름의 최대 길이를 5자로 제한하는 유효성 검사 기능 추가
- Controller 클래스에서 입력된 자동차 이름 리스트에 대해 SizeValidator를 사용해 유효성 검사
- 유효하지 않은 경우 IllegalArgumentException을 발생시켜 비정상 종료

- SizeValidatorTest에서 5글자를 초과 시 IllegalArgumentException 발생하는 테스트 코드 작성
- Controller 클래스에서 OutputView를 재활용 해 시도 횟수 입력 안내문구 출력 기능 추가
- InputView 클래스에서 Console.close() 함수 주석 처리
- Controller 클래스에서 이동 횟수를 입력받는 로직 추가

- System.in이 한번 닫히면 다시 여는 것이 불가능
- RandomNumberGenerator 클래스에서 0부터 9까지의 범위에서 랜덤 숫자를 생성하는 기능 추가

- RandomNumberGeneratorTest에서 랜덤 숫자가 0부터 9 사이의 값으로 생성되는지 검증하는 테스트 작성
- CarMover 클래스에서 RandomNumberGenerator를 사용해 무작위 숫자를 생성하고, Car 객체를 움직이는 기능 추가
- Car 클래스 변동
  - record -> 일반 객체로 변경
  - moveCount -> 필드 추가
  - 이동 조건을 상수(MOVE_LIMIT)로 상수화하여 4 이상일 경우 전진하도록 구현
  - move() 메소드를 통해 움직임 수행
  - getter 메소드 생성

- Car 테스트 코드 추가
  - 4를 기준으로 전진/정지 테스트
  - 자동차 이름 조회 및 초기 moveCount 값 검증 테스트
  - 실제 움직임이 반영된 moveCount 검증
- CarMover 테스트 코드 추가
  - 추후 RandomNumberGenerator를 Mocking하여 테스트할 계획을 주석으로 추가
  - 의존성 주입 방식으로 리펙토링하여 수행할 예정
- AllCarMover 클래스에서 CarMover를 사용해 List<Car>에 있는 모든 자동차를 이동시키는 기능 구현
- CarMover의 run 메서드를 각 자동차에 대해 호출하여 이동 처리

- AllCarMoverTest 클래스에서 모든 자동차의 이동을 시도하는 테스트 코드 작성
  - 향후 CarMover 및 RandomNumberGenerator를 Mocking하여 테스트할 계획을 주석으로 추가
- 모든 차의 이동수행을 마치고, 최종 실행결과를 출력하는 기능명세를 추가
- OutputView 클래스에 자동차 상태를 출력하는 printCar, printCars 메서드 추가
  - carName과 moveCount를 형식에 맞게 출력
  - 차 이름과 이동횟수를 출력하는 함수 분리

- OutputViewTest 클래스에서 자동차 상태 출력 테스트 코드 작성
  - 단일 자동차의 상태를 출력하는 printCar 테스트
  - 여러 자동차의 상태를 출력하는 printCars 테스트
- AttemptCountArgumentResolver 클래스 추가: 입력된 시도 횟수를 파싱하여 정수로 변환하는 기능 구현
- Controller 클래스에서 시도 횟수를 입력받고 해당 횟수만큼 이동시도 수행
- OutputView 클래스에서 println() 메소드를 분리
  - 개행하는 메소드를 분리하고, 외부에서 사용할 수 있도록 변경

- Controller 클래스에서 실행 결과 출력
  - 모든 차를 이동시도
  - 시도할 때마다 자동차들의 상태 출력
  - 개행 수행
  - 위의 3가지 행동을 입력받은 시도 횟수만큼 반복
- WinnersDecider 클래스에서 최종 우승자 판별
  - getMaxMoveCount 메서드를 통해 max moveCount 값을 추출
  - max moveCount 값과 동일한 Car 들을 필터링해서 리턴
  - 따라서 동점자가 있다면 여러 명의 우승자 반환

- WinnersDeciderTest에서 동점자가 있을 때와 없을 때의 우승자 결정 테스트
  - 동점자가 있을 경우 여러 명의 우승자를 반환하는지 검증
  - 동점자가 없을 경우 한 명의 우승자를 반환하는지 검증
- OutputView 기능 추가 및 수정
  - 우승자들의 이름을 출력하는 printNames 메서드 추가
  - OutputView 클래스에 메서드명 구체화
    - 자동차의 상태를 출력하는 메서드는 Status를 붙임
    - 자동차의 이름을 출력하는 메서드는 Name을 붙임

- Controller 클래스에서 최종 우승자들 출력 로직 추가
  - WinnersDecider를 우승자들 판별
  - CarConverter를 통해 우승자 목록을 자동차 이름으로 변환
  - CarConverter 메서드명 구체화
- AttemptCountArgumentResolver 클래스에서 시도 횟수 입력을 파싱할 때 숫자로 변환 불가능한 경우 IllegalArgumentException 발생
  - 숫자가 아닌 입력, int overflow 모두 검증 가능
- RangeValidator 클래스 추가: 시도 횟수가 0 이상인지 확인
  - 음수일 경우 IllegalArgumentException 발생
- Controller run 메소드 수정
  - RangeValidator와 AttemptCountArgumentResolver를 활용하여 시도 횟수 검증

- AttemptCountArgumentResolverTest에서 숫자로 변환 불가능한 입력, overflow 입력, 정상 입력에 대한 테스트
- RangeValidatorTest에서 시도 횟수가 음수일 경우와 정상일 경우의 테스트
- isBlank: 빈 문자열과 공백 문자열은 true이며 null일 경우 에러발생
- isEmpty: 빈 문자열은 true, 공백 문자열은 false, null일 경우 에러발생
- splitTest: 일반 split과 limit 인자를 추가한 split 동작을 출력하여 확인
- 입력값이 null이거나 비어 있을 경우 예외 발생하도록 checkBlank 메서드 추가
- splitWithBlankAndTrim 메서드에서 입력 문자열을 ','로 분리하고, 각 항목의 공백을 제거하여 리스트 반환하도록 수정
- 구분자가 앞 뒤에 있는 경우는 빈 문자열을 포함하여 리턴하도록 작성
  - 빈 문자열은 다른 클래스에서 예외 처리

- CarArgumentResolverTest 테스트 코드 작성
  - null 및 빈 문자열 입력 시 예외 발생 테스트
  - 일반적인 ',' 구분자 기준 파싱, 앞뒤 공백 제거 후 파싱, 구분자가 앞/뒤에 있는 경우의 파싱 테스트
- CarName의 길이 제한(최대 5자 이하, 최소 0자 이상)을 검사하는 SizeValidator 구현

- SizeValidatorTest에 각 자동차 이름이 비어있는 경우 예외 발생 테스트 추가
- CarNameIntegrationTest에서 자동차 이름 검증 통합 테스트 작성
  - SizeValidator와 CarArgumentResolver의 예외 발생 테스트 작성
  - 구분자 위치에 따른 다양한 예외 상황 검증
  - 자동차의 각 이름이 비어있을 때 검증
… ArgumentResolver 적용

- ArgumentResolver<T> 인터페이스 생성하여 제네릭 타입을 활용해 공통 parse 메서드 정의
- CarArgumentResolver가 ArgumentResolver<List<String>>을 구현하도록 수정
- AttemptCountArgumentResolver가 ArgumentResolver<Integer>을 구현하도록 수정
- 코드의 일관성과 확장성을 위해 공통 인터페이스 적용
- 데이터 유효성 검사를 위한 Validator<T> 인터페이스 생성 및 check 메서드 정의
- RangeValidator가 Validator<Integer> 구현하도록 수정
- SizeValidator가 Validator<List<String>> 구현하도록 수정
- 공통 인터페이스 적용을 통해 코드 일관성 및 확장성 강화
- CarConverter를 final 클래스로 변경하여 상속 불가하도록 설정
- 생성자를 private으로 설정하여 인스턴스화 방지
- toCars 및 toNames 메서드를 static으로 변경하여 객체 생성 없이 호출 가능하도록 개선
- CarMover에서 이동 정책을 MovePolicy 인터페이스로 분리하여 다양한 이동 정책 적용 가능
- Car 클래스의 move 메서드에 있었던 이동 여부 판단 책임 분리
- RandomMovePolicy 클래스 추가하여 랜덤 숫자 기반 이동 정책 구현
- 이동 정책을 분리함으로써 코드의 확장성과 유지 보수성 강화
- Mocking 가능

- CarMoverTest 수정: TrueMockMovePolicy와 FalseMockMovePolicy 클래스 생성하여 테스트에서 이동 정책을 모의(Mock) 객체로 주입
- CarMover 수정에 따른 코드 수정
- WinningPolicy 인터페이스 추가하여 우승자 결정 정책이 바뀔 경우 쉽게 대응 가능
- 우승 결정 정책을 분리함으로써 코드의 확장성과 유지 보수성 강화
- WinnersDecider에서 WinningPolicy를 주입받아 유연한 우승자 결정 방식 사용 가능하도록 수정
- TrueMockMovePolicy, FalseMockMovePolicy Mock 클래스 추가
- AllCarMover가 CarMover에 주입된 Mocking 정책에 따라 자동차의 이동을 정확히 수행하는지 검증
- ControllerConfig 클래스 생성하여 Controller와 종속 객체 생성 및 주입 담당
- Controller 클래스에서 직접 객체를 생성하지 않고 ControllerConfig에서 의존성 주입
- Application 클래스에서 ControllerConfig를 사용해 Controller 초기화
- 클래스 역할에 따라 패키지 구조를 개선하여 가독성과 관리 용이성 향상
- getCarsFromInput(): 사용자 입력을 받아 자동차 객체 리스트를 생성
- getAttemptCountFromInput(): 사용자 입력을 받아 시도 횟수를 검증 후 반환
- runRace(): 주어진 시도 횟수 동안 경주를 수행하고 각 라운드 결과 출력
- printWinners(): 최종 우승자 판별 및 우승자 이름 출력

run 메서드의 가독성을 높이고 책임을 분리하여 코드 유지보수성 향상
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