Written by coh at home

[프리코스 2주차] 본문

Etc/Et cetera

[프리코스 2주차]

och 2024. 10. 28. 18:01

먼저 중간회고를 하고 이어서 이번 미션에 대한 이야기를 해보겠습니다.

# 중간회고
- 지원서에 작성한 목표를 얼마나 달성하고 있다고 생각하나요? 그 이유는 무엇인가요?
지원서에 작성한 목표의 80퍼를 달성하고 있다고 생각합니다! 3명 이상의 코드리뷰를 진행하고 있고 자바를 다시 탄탄히 학습하고 있습니다. 또한 커뮤니티를 통해 다양한 의견을 나누며 성장하고 있다고 느끼고 있기 때문입니다. 20%가 빠진 이유는 갑자기 생긴 개인사정으로 이번주 제 코드에 대한 리뷰를 진행하지 못했기 때문입니다.. ㅜㅜ 늦었지만 제 코드에 달린 리뷰들을 보고 학습하고 코드 리뷰를 해달라고 부탁하신 분들의 코드를 마저 리뷰를 하려고 합니다!!

- 지원서에 작성한 목표를 변경해야 한다고 생각하시나요? 그렇다면 그 이유와 어떤 목표로 변경하고 싶으신가요?
기존 목표에 추가하고 싶은 것이 있습니다. 우테코에서 코드 리뷰를 한 명에게도 못 받는 사람들을 봤습니다. 그런 사람들에게도 코드리뷰를 해주고 싶습니다. 이를 통해 함께 성장하는 공간을 만들고 싶습니다. 이를 위해 늦게라도 코드리뷰를 부탁한다는 글이 올라오면 시간을 내어 해보려고 합니다.

- 프리코스를 진행하면서 눈에 띄는 변화나 깨달은 점이 있나요?
코드리뷰를 하면서 제가 부족했던 점을 깨달을 수 있었습니다. 특히, 예외처리가 그렇습니다. 이전에는 그냥 구현에 집중했다면 지금은 예외처리를 더 깊이있게 생각하고 구현하고 있습니다. 그 예시로 이번에는 시간 복잡도를 고려하여 StringBuilder의 heap메모리와 실행시간을 고려했습니다.

# 미션
이번 주에는 자동차 경주 미션을 구현해봤습니다.
특히, 각 객체별 역할과 책임에 대해 고민하고 SRP를 지키기 위해 메서드 분리에 대해 노력했습니다.
또한 구현하면서 유지보수하기 좋은 코드를 작성하기 위해 노력했습니다.
총 5가지 노력과 고민을 한 것 같습니다.

첫째, Car 도메인 객체에서 이름의 길이를 검증할지 VS 서비스 객체에서 에러를 검증할지 고민했습니다.
입력받은 문자열을 검증하는 객체에서 이름의 길이가 5글자 초과일 때도 검증해도 괜찮을 것이라고 생각했습니다. 역할과 책임을 어디까지 분리해야할지 고민이라 이 부분을 리뷰어들과 토의를 나눠보려고 합니다. ㅎㅎ

둘째, inputView, outputView가 필요한지도 고민이 많이 되었습니다.
마지막까지 쓸지 말지 고민을 많이 했는데 너무 controller객체에서 하는 역할이 많아진다고 생각해서 분리했습니다. 
근데 비지니스 로직에만 집중하게 하려고 분리를 했으나 오히려 너무 많은 클래스를 생성하는 것이 아닌가 고민되었습니다. 또한 클래스가 많아지면서 오히려 읽기 어려운 코드가 되는 게 아닐까? 고민이 되었습니다. 해당 부분도 토의를 나눠보려고 합니다 ㅎㅎ

셋째, 테스트 코드를 작성하려고 노력했습니다. TDD로 구현하며 느낀점을 적어볼까 합니다. TDD로 구현했을 때 장점은 해당 단위 기능이 동작한다는 것을 보장하고 이후 코드를 작성하기 때문에 에러가 발생할 가능성이 없는 것 같습니다. 다만, 이후에 해당 코드를 수정하고 싶을 때 테스트코드를 모두 바꿔야한다는 불편함이 있었습니다.

넷째, 사용자가 입력하며 발생할 수 있는 예외에 대해 많은 생각을 했습니다.
기본적인 제한 사항 외에도 소수입력, 음수 또는 0, 공백입력 등등을 고려했습니다.
살짝 고민 중인 것은 자동차 갯수에 대한 제한과 입력 횟수에 대한 제한을 더 낮출지 고민 중입니다.
시간복잡도가 O(mn)이기 때문에 최악의 경우 O(n^2)가 될 것입니다. 좋은 성능을 제공하기 위해서는 입력값을 제한하는 것도 필요하다고 생각하고 있습니다. 현재는 입력값만 INTEGER.MAX_VALUE를 넘기지 않도록 제한했습니다. 특히 StringBuilder에서 OutOfMemoryError가 뜰 수도 있기때문에 고민하는 중입니다.

처음엔 몇개로 제한해야할지 감이 안 섰습니다. 자동차 갯수가 2개일 때 10만번을 테스트했을때 테스트코드는 1분 40초에 통과했다고 나오지만 출력문은 전부 출력하는 데에 시간이 30초가량 걸리는 것 같아요. StringBuilder가 터질수도 있겠다는 생각이 들고 제한을 걸어야할 것 같은데 몇 개로 설정하는 것이 좋을지 고민중입니다. 찾아보고 마무리 커밋해야겠습니다! + 테스트해본 결과 약 100만개 이상의 데이터에서 테스트가 제대로 동작하지 않는다는 사실을 파악할 수 있었고 연산횟수가 100만이 넘어가면 제한하도록 했습니다.
다섯째, 다양한 에러 메시지를 관리하기 위해 enum을 사용했습니다. 프로그램에서 이름과 숫자의 입력을 받으면서 겹치는 에러메세지가 있었습니다. 따라서 이를 문자열 상수로 관리하면 좋겠다는 생각이 들었습니다. enum을 사용하니 에러메시지를 관리하기 편해진 것 같습니다.