장's 개발생각

[개발생각] 우테코 문제 풀어보기 - 자동차 경주 게임

장아장 2022. 12. 13. 17:02

이양야야야야야야야야야야ㅑ야야야야야야ㅑ!

 

Source Code : https://github.com/JangAJang/WoowaCourse_Preview/tree/main/자동차%20경주%20게임

 

조금 더 정리된 알고리즘 문제 같다는 생각이 든다. 

그리고, 이 문제를 통해 더욱 새로운 생각이 들기 시작했다. 

 

전체적으로 코드를 만드는 하나의 과정을 이 프로젝트를 통해 최종적으로 만든 것 같다. 

  1. 기능 목록을 작성한다(여기에서 시간을 30~50%쓰는 것 같다. 그만큼 생각하고 작성해야 더 효율적이고 정확한 코드가 나오는 것 같은 기분이다. 도메인의 작동방식, 예외가 되는 부분들, 그리고 컨트롤러에서 이를 모아 어떻게 동작할지 생각한다. )

  2. 도메인 클래스를 생성한다 : 클래스의 메서드는 그저 출력형식, 입력변수만 존재한다. 테스트를 하면 무조건 실패하는 구조이다. 

  3. 테스트 코드를 작성한다 : 위에서 작성한 도메인의 동작이 어떻게 될지 생각하며 테스트를 정리한다. 내 생각에 대해 다시 검증하게 된다. 여기에서 기능 목록에서 해당 기능이 빠질 수도, 다른 기능이 추가될 수도 있다. 

  4. 도메인 로직을 작성한다 : 도메인 로직이 무엇일까를 생각했을 때 내가 내린 결론은, 이러한 과정이 입력이 이미 존재한다면, 출력을 어떻게 해야 할까 이다. 그 사이 사이 지나가는 과정들을 테스트 하는 것이다. 
    또한, 도메인들을 묶어 다시 기능을 만들게 될 때가 있다. 이럴 때 사용하는 도메인들의 기능을 보고, 이들을 활용해 새로운 기능을 만들게 된다(기능 목록을 작성하며 해당 기능들에 대한 방식을 한번씩 생각하고, 테스트코드를 쓰며 다시 생각해보며, 도메인 로직을 작성하며 이를 검증하게 되는 느낌이다)

  5. Validator를 작성한다 : Validator는 입력이 올바른지, 그리고 도메인에 가서 그 입력을 가지고 조작할 수 있는지 확인하는 부분이다. 이를 확인해 문제가 있을 경우 Exception으로 예외처리해주고, 없을 경우 도메인에서 입력으로 받았을 때 제일 활용하기 좋은 형태로 변환해 반환해준다. 

  6. View를 작성한다 : 뷰는 기본적으로 입력에 대한 뷰, 출력에 대한 뷰로 나누어 생각해 만들게 된다. 
    InputView : 기본적으로 입력은 문자열로 받게 된다. 이를 Validator를 통해서 형변환 해주고 결과를 반환하는 방식으로 처리하게 된다. Validator가 잘 만들어질 때 입력 뷰 만큼 만들기 간단한게 없던 것 같다. 

    OutputView : 입력 뷰 보다는 작성할 때 고민해야 할 경우가 많아진다. MVC를 기준으로 생각하자면, Model에서 받아오는 데이터의 구조는 다양하다. 어떨 땐 간단한 변수 하나만 올 수 있지만, 복잡한 경우에는 HashMap, List<List<String>>으로 오는 경우도 있다. 이를 어떻게 출력 형태로 만들지 로직을 생각하게 된다(물론 이런 형태로 나오게 할 것이다는 기능 목록을 작성하며 정리하려고 하는 편이다)

  7. Controller를 작성한다 : 위에서 어떻게 보면 간단한 기능들을 만들었다. 이들을 이용해
    '하나의 입력을 받으면 연산을 하고 하나의 결과를 출력해준다'를 만든다. 그리고 이들이 큰 흐름에서 어떻게 동작할지 생각해 최종적인 흐름을 만들어준다. 

 

사실 이걸 머리속으로 최종적으로 정규화(?)하면서 드래곤볼같은 우주의 정기가 내게 힘을 주는(?) 느낌을 받았다. 

물론 정답이 존재한다면 이게 틀린 방식일지도, 맞는 방식일지도 나는 모르겠다. 

Down-Up방식이기 때문에 다른 흐름으로 갈 수 있다는 문제도 존재한다. 

 

근데, 반대의 Top-Down방식으로 했을 때, 나는 그 모든 것을 하나씩 체크하며 처리하는 방법에 대해서 잘 모르겠다는 생각이 든다. 

그리고, TDD에서의 방식을 보면 단순한 로직들을 테스트하며 점점 더 큰 흐름을 코드로 정리하게 된다. 

 

이런 상황에서 Top-Down방식을 사용하면? 

상위 흐름부터 하위 흐름까지 다 작성을 하고, 하위 단위들을 테스트를 하고, 테스트에서 틀리면?

읏되~버릴거같다

 

물론 내 생각이다. 반박시 다맞음ㅎㅎ