
마찬가지로 짧은 문제라 리뷰도 짧고 코드도 짧다~
1,2번 문제와 마찬가지로 MVC로 분리할 예정 🐳
[ 기능 ]
- [ ] 3, 6, 9 개수 세기
[ 예외 ]
- [ ] number가 1 ~ 10,000의 범위를 벗어나는 경우
사용자 입력을 input으로 받도록 구현했다.
private Number getUserNumber(){
while(true){
try{
int userNumber = inputView.getUserNumber();
return new Number(userNumber);
} catch (IllegalArgumentException e){
System.out.println(e.getMessage());
}
}
}
기존 온보딩 미션에서 구현했던 것처럼, int number로 관리를 하려다가, MVC 패턴을 그대로 가져가보고 싶어서 Number 엔티티를 만들었다.
public class Number {
private final int number;
public Number(int number) {
Validator.validateRange(number);
this.number = number;
}
public int getNumber() {
return number;
}
}
원래는 해당 엔티티 내에서 1 ~ number까지의 수에서 박수를 치는 횟수를 카운트하는 메소드를 구현하고자 했는데, (어찌됐든 number를 건드리는 로직이니까)
그렇게 되면 number = 3일 경우 for문을 통해 1,2,3의 카운트를 다 확인하게 되는데 이 로직에서의 1,2도 Number라는 엔티티로 관리해야하나?는.. 무한 굴레에 빠져서🙄 그냥 생성자, getter가 있는 단순한 클래스로 만들었다.
그리고 엔티티 내부에 배치하려는 로직을 NumberService로 만들어 구현했다!
package onboarding.problem3.service;
import static onboarding.problem3.util.Constants.*;
public class NumberService {
public int countThreeSixNine(int number){
int count = 0;
String numberString = String.valueOf(number);
for(int index = 0; index < numberString.length(); index++){
count += getDigitNumberCount(numberString.charAt(index));
}
return count;
}
private int getDigitNumberCount(char numberInput){
int number = numberInput - '0';
if (isThreeSixNine(number)){
return 1;
}
return 0;
}
private boolean isThreeSixNine(int number){
return number == FIRST_COUNT_INT || number == SECOND_COUNT_INT || number == THIRD_COUNT_INT;
}
}
해당 Service 엔티티는 넘어 온 숫자의 각 자릿수를 체크하면서 3,6,9,가 몇 개 있는지 count를 반환하는 로직을 갖고 있다.
이 로직을, Model View Service 모두 접근 가능한 Controller에서 사용하도록 만들어서
private int getResultCount(int number){
int count = 0;
for(int n=1; n<=number; n++){
count += numberService.countThreeSixNine(n);
}
return count;
}
컨트롤러에서 Model의 number에 접근하고, 그 number를 for문으로 돌리면서, 그 과정에서 만나는 숫자들을 서비스 로직을 활용해 각각 count하는 방식으로..! 구현했다
Service 클래스를 처음으로 도입해봤다!
항상 컨트롤러가 하는 역할과, 서비스가 하는 역할이 분리가 잘 되지 않아서 Service클래스는 구현하지 않고 controller에서 처리하도록 만들었는데,
위의 케이스처럼
유의미한 기능을 하고, Model의 값을 활용하지 않아도 되는 로직이 있으면 Service 로직으로 만들어서 Controllerr에서 활용하도록 만들면 되겠구나! 라는 인사이트를 얻을 수 있었다
혼자하는 리팩토링에서도 많은 것을 배우는 것 같다 🙃