본문 바로가기
우아한테크코스/공부

[자동차 경주 미션] 피드백 반영

by 자바지기 2022. 2. 13.
반응형

1. Car 생성자 수정

 

1차 완성한 코드에는 다음과 같이 Car 클래스에 2개의 생성자를 작성하였다.

position을 초기화하는 생성자는 프로덕션 코드에서는 사실 필요없었지만 테스트를 위해서 추가한 코드였다. 

그래서 위와 같은 피드백을 받게 되었다.

테스트만을 위한 코드를 프로덕션 코드에 만드는 것이 괜찮을까? 라는 의구심이 있었는데

닉께서 피드백으로 확실하게 정리해주었다.

 

기존에는 필드 변수 position을 미리 0으로 선언할 때 초기화하였지만 

추천해주신 방법으로 다음과 같이 생성자를 만들어 두 생성자를 모두 의미있게 사용할 수 있었다.

이 방법을 알고는 있었지만 생각해내지 못한 방법이라 더 깊이 생각하지 못한 점에 대해 반성을 하였다.

아직 노오력이 부족하다.

 

이 방법을 통해 position을 의도적으로 변경하여 우승자가 누구인 지 알아보는 테스트를 스무스하게 진행할 수 있었다.

 

2. 객체의 유효성 검사는 해당 객체에서 진행

기존에는 컨트롤러 클래스에 다음과 같이 입력받은 이름을 검증하고

에러가 발생한다면 다시 이름을 입력받도록 구현하였다.

 

이에 대한 피드백은 다음과 같다.

기존에는 테스트를 하기 위해 크기가 큰 컨트롤러 객체를 테스트하였다.

또한 피드백처럼 검증 로직 때문에 컨트롤러의 로직이 길어지는 현상이 발생했다.

따라서 다음과 같이 Car 객체 내부에 검증 로직을 작성하였다.

이렇게 하고 보니 Car 이름에 대한 검증은 Car 객체가 해야한다. 라는 생각이 들었다.

그것이 객체의 역할...

내 이름을 검증하는데 왜 남이 해주고 있었나..  싶다.

 

마찬가지로 GameTurn 클래스의 입력에 대한 검증을 GameTurn에 작성하는 것으로 변경하였다.

그런데 여기서 한 가지 문제가 발생했다.

검증을 GameTurn 내부에서 진행하는 것이 GameTurn 객체의 역할인 것 같다.
그러나 GameTurn은 숫자인지 확인을 해봐야합니다.
그런데 입력을 받은 값을 gameTurn 생성자로 그대로 넘기게 되면

public GameTurn(String gameTurn) {
	checkGameTurnNumber(gameTurn);
	this.gameTurn = Integer.parseInt(gameTurn);
}

위와 같이 작성을 하게 된다.

this.gameTurn의 자료형은 int형이기 때문에
생성자의 인자로 String 자료형이 들어가는 것에 대해서 어색함을 느낀다.
이렇게 된다면.. 그냥 원래처럼 컨트롤러에서 gameTurn 입력에 대한 검증을 하는 것이 맞을까?
아니면 GameTurn 내부에서 검증을 하는 것이 맞을까? 

 

이 부분에 대한 질문의 답으로 다음과 같은 피드백을 받을 수 있었다.

 

요약하자면 도메인에서 검증을 해야하는 부분과 다른 영역에서 검증해야하는 부분을 나누어야한다.

또한 위에서 처럼 GameTurn 생성자를 만들 때 매개변수로 String을 받게 작성한다면 사용하려는 클라이언트가 어떤 값을 넣어야할 지

명확하게 알 수 없다.

따라서 다음과 같이 코드를 수정하였다.

 

GameTurn 을 생성할 때 

1. view에서 입력받은 문자열이 숫자인지 확인한다. 그리고 숫자를 정수의 형태로 반환한다.

2. GameTurn이 1 이상이어야 하는 것은 핵심 도메인 로직이기 때문에 생성자에서 검증을 한다.

 

Cars를 생성할 때 

1. view에서 입력받은 문자열을 "," 구분자를 기준으로 나눠서 반환한다.

2. Cars에서 구분된 이름들을 통해 Car 객체를 생성한다.

 

반응형

댓글