본문 바로가기
Notation/회고

[우테코 7기 프리코스] 1주차 회고

by mixxeo 2024. 10. 25.

우아한 테크코스 7기 프리코스 1회차 과제가 끝났다!

 

2년 전 Spring Boot로 서비스 MVP를 개발한 이후, 정말 오랜만에 Java 프로젝트를 경험하고 있다.

처음에 과제를 열어봤을 때, 프로그래밍 요구 사항과 기능 요구 사항이 생각보다 간단해서 의외였다. 조금 안일하게도 나는 “이렇게 간단한 프로그램에 설계가 필요할까?”라고 생각하며 설계보다는 기능 구현을 먼저 시작했다. 올해 인프콘에서 발표된 지속 성장 가능한 설계를 만들어가는 방법 세션에서 인상 깊었던 “가장 좋은 설계는 설계를 하지 않는 것이다”라는 말도 떠올라, 우선 기능 구현에 집중할 수 있었다.

결과적으로는 기능 구현을 하다보니 설계의 필요성을 느낄 수 있었고 좋은 구조와 코드에 대해 고민해볼 수 있는 기회가 되었다. 그리고 요구 사항이 단순해서 오히려 다른 부분까지 더 깊이 고민할 수 있는 시간이었던 것 같다.

 

1주차에는 Java 코드 컨벤션이나 요구 사항 분석, 설계에 대한 고민 등 처음이라 어려운 부분이 많았는데 과제를 진행하고 코드리뷰를 주고 받으며 조금씩 기준들이 잡혀서 2주차는 좀 더 잘할 수 있을 것 같다!

 

1주차 과제 요구 사항

[문자열 덧셈 계산기]

입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.

  • 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
    • 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6
  • 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다.
    • 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.
  • 입력: 구분자와 양수로 구성된 문자열

 

목표

주어진 학습 목표는 <Java를 사용하여 간단한 문제를 해결한다> 였다.

나는 2년 넘게 TypeScript를 위주로 다뤄왔기 때문에 Java스럽게 코드를 작성하는 것을 목표로 잡았다.

  • Java스럽게 코드를 작성하기
    • 객체지향 SOLID 원칙 중, 단일 책임 원칙(SRP)을 지키며 코딩하기
      • 역할에 따라 클래스 분리만 잘 되어도 가독성과 유지보수성을 높일 수 있다고 생각해서 SRP 원칙을 지키는 것을 목표로 진행했다.
    • Java의 기본 API를 최대한 활용하기
  • 작성하는 모든 코드의 의도와 이유를 설명할 수 있도록 하기
    • 이건 프리코스 참여 목표이기도 한데, 관습적으로 어딘가에서 들은대로 코딩하는 것이 아니라 왜 그렇게 구현하는지 계속 생각하며 진행하기 위해 노력했다.

 

과제를 진행 하며

  • 디자인 패턴의 필요성을 진행 과정에서 깨달았다
    • 디자인 패턴, 객체를 분리하고 적용하는 등의 설계를 처음부터는 하지 않았다. 우선 기능 목록을 구현하다보니 프로그램의 주요 역할들이 정리가 되어서 그것을 기반으로 객체를 나누었다. 그리고 나누어진 클래스 파일을 들여다보니 UI 담당, 비즈니스 로직 담당, UI와 비즈니스 로직을 연결하는 부분 이렇게 분류가 되어 MVC 패턴을 적용하는 리팩토링을 진행했다. 클래스의 레이어가 나뉘어지니 각 객체의 역할이 더 뚜렷해지고 코드 가독성이 향상되는 것을 체감할 수 있었다.
    • 과제 제출 후, 코드리뷰를 하면서 느꼈던 것은 객체의 책임 분리에 대한 고민이 부족했다는 것이다. 목표로 했던 “단일 책임 원칙”을 지키는 것보다 평소의 습관대로 간결한 구조와 코드를 유지하는 방식으로 개발을 한 것 같다. 부끄럽게도, 이 과정에서 그동안 객체지향에 대해 공부하는 것을 미뤄왔고 한번도 제대로 공부해본 적이 없다는 것도 깨달았다..
  • <기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다>
    • 과제에 제시되어있는 가이드인데, 이번 과제의 요구사항을 봐도 각자가 판단해야 할 기능이 많다.
      • 구분자가 연속되어 나왔을 때(1:2::3)는 에러 처리를 할 것인가
      • 커스텀 구분자를 지정하면 커스텀 구분자만 구분자로 사용되는 것인가
      • 공백 문자(” “)도 유효한 커스텀 구분자인가 등
    • 과제를 할 때는 이 부분들에 대해 “정답”을 찾으려고 노력했는데 제출 후에 보니 정해진 정답을 찾는게 아니라 각자의 논리로 유의미한 규칙들을 정해가면 되는 것 같다는 생각이 들었다.
  • 디스코드 참가자 커뮤니티에서 많은 도움을 받았다.
    • node.js로 개발할 때는 VSCode를 주로 사용하니 인텔리제이도 익혀가며 개발을 해야했는데 정말 감사하게도 커뮤니티에서 커밋 메세지 템플릿 플러그인, 코드 스타일 설정 등 꿀팁들을 나눠주셔서 도움을 많이 받았다.
    • 과제를 진행할 때 도움이 될 좋은 습관들도 배웠다. 특히, “왜 빈 문자열의 결과값은 0일까, 왜 사용자 입력을 받을 때 주어진 라이브러리를 사용하도록 강제했을까” 등 과제 요구사항의 의도에 대해서도 고민해보고 또 그 과정에서 좋은 아이디어들을 도출하는 분들이 인상적이어서 다음 과제에서는 이런 부분도 더 신경써봐야겠다는 생각이 들었다.

 

2주차 액션 아이템

  • 요구사항 의도에 대해 더 고민하기
  • 커밋 메시지 더 자세하게 작성하기
    • 본문은 어떻게 보다 무엇을 ,에 맞춰 작성하기
    • 제목에 수정 범위 표시하기
  • Readme 더 자세히 작성하기
  • 오류를 찾을 때 출력 함수 대신 디버거를 사용하기
    • system.out.print() → 비효율적이며 불필요한 코드가 남을 수도 있다
  • 객체는 단 하나의 책임만 갖도록 더 고민하기
  • MVC 패턴에서 각 레이어의 역할 다시 공부하기
    • view, model, controller 각각 테스트 코드 작성하기

 

1주차 PR 링크

https://github.com/woowacourse-precourse/java-calculator-7/pull/1056