프리코스 참가와 1주차
우아한테크코스에 한 번은 도전해보고 싶다고 생각하던 차에 동아리에서 하는 사람들도 많이 보여서 같이 스터디하며 성장히기 위해 지원했다.
다른 부트캠프들과 다르게 프리코스를 다함께 풀어나가면서 더 좋은 코드에 대해 고민할 수 있는 시간을 가질 수 있다는 것이 좋아 보였다. 하지만 그만큼 시간이 많이 들어서 학기와 병행하는 건 매우 힘들다..
자기소개서 작성
- 프로그래머가 되려는 이유와 지원 동기 2000자
- 오랜 시간 몰입했던 경험 그리고 도전 2000자
- 프리코스 목표 설정 1000자
도합 5000자에 달하는 자소서를 쓰면서 생각보다 글로 녹여내 쓸만한 경험이 많이 없다는 것을 느꼈다. 블로그를 좀 더 열심히 쓰면서 글을 많이 모아두어야겠다.
요구사항
- 요구사항은 기능 요구사항, 입출력 요구 사항, 프로그래밍 요구 사항으로 나뉘며 이를 모두 만족해야 한다.
- 1주차 미션은 “입력한 문자열에서 숫자를 추출하여 더하는 계산기”이다.
- 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
- 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6
- 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다.
- 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다.
- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다.
- 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
- 입출력 요구 사항은 다음과 같다.
- 입력 : 구분자와 양수로 구성된 문자열
- 출력 : 덧셈 결과
- 실행 결과 예시
덧셈할 문자열을 입력해 주세요. 1,2:3 결과 : 6
설계한 기능 목록
1주차라 그런지 생각보다 문제가 간단해서 기능 설계도 적게 가능했다. 오히려 리팩토링 할 때 시간이 더 많이 걸렸다.
- 사용자 입출력
- 기본 구분자 (,:) 인식
- 커스텀 구분자 인식
- 사용자가 잘못된 값을 입력할 경우 예외 처리
Test Cases 및 예외처리
나중에 다른 사람들을 보니 소수점 예외 처리와 정수형 오버플로우 예외 처리까지 고려해서 해준 사람들이 있었다.
- 음수 예외
- 문자 예외
- 기본 구분자 사용
- 빈 문자열 0 출력 확인
- 커스텀 구분자 사용
- 커스텀 구분자 사용 여러 문자
- 커스텀 구분자 사용 공백
- 커스텀 구분자가 숫자인 예외
- 커스텀 구분자 없는 예외
리팩토링
class App {
async run() {
}
}
위와 같은 class를 주고, run()을 작동시키면 기본적인 동작을 하도록 구성되어 있었다.
처음에 함수로 분리할 생각을 안하고 일단 기능을 다 담아서 짜보자는 생각으로 짰더니 나중에 분리하기가 더 힘들었다.
- run() 안에서 여러 일을 하던 것을 메서드로 분리
- stringSplitSumCalc(string, customSeparator)
- 커스텀 구분자가 없거나 있는 것에 상관없이 문자열을 분리하고 더하는 작업은 하나의 기능이라 생각해서 하나의 메서드로 구현했다.
- 커스텀 구분자가 없으면 customSeparator 인자에 null이 들어오게 된다. 다시 보면 null일수도 있다는 사실이 명시적으로 드러나지 않는 것 같아 개선이 필요할지 고민된다.
- throw new Error 하는 부분을 validateNumber() , validateSeparator() 메서드로 분리
- hasCustomSeparator() 메서드 분리
새로 알게 된 것
- node.js 버전이 맞지 않아 업데이트 해야 했었다. window에선 node.js를 아예 새로 설치하거나, nvm을 통해 node 버전 관리하는 방법이 있었는데 nvm 버전 관리가 더 간편해서 이를 이용했다.
- split() 함수 안에서 /[,:]/와 /[,:]/g 두 정규표현식을 사용했을 때 결과가 같은 이유
- split() 함수 자체가 문자열을 “전부 탐색”하여 “분리”하는 작업을 하기 때문에 정규표현식 g 플래그가 없어도 split()에서 전체 문자열을 탐색해준다.
- JavaScript에서 숫자인지 판단하는 방법
- isNaN() 사용 : true, false, 문자열 등도 숫자로 암시적 형변환 후 검사하기 때문에 숫자라고 판단될 수 있다. 한 번 더 조건문을 세워 걸러주어야 한다.
- 정규표현식 사용 : 음수 처리를 따로 해주어야 하지만 소수점, 숫자만 포함 등 더 엄밀한 조건을 세워 걸러줄 수 있다. 다만 코드가 알아보기 힘들어 질 수 있고, 엄밀하게 조건을 직접 다 넣어주어야 한다.
1주차 이후 공통 피드백
- 요구사항 정확히 준수 : 과제 요구 사항, 기능 요구 사항, 프로그래밍 요구 사항
- 기본적 Git 명령어 숙지
- Git으로 관리할 자원 고려
- .gitignore
- package-lock.json 역할 이해
- commit 메시지를 의미있게 작성
- https://meetup.nhncloud.com/posts/106
- commit 메시지에 이슈나 PR 번호를 포함하지 않기 : 원본 저장소의 관련 없는 이슈 또는 PR에 영향을 미칠 수 있어, fork로 작업하는 과정에서는 번호 포함하지 않는다.
- PR을 만든 후 닫지 않고 추가 커밋 하기
- 오류를 찾을 때 출력 함수 대신 디버거 사용하기 : vscode에서 node.js 디버깅하는 법 알아보기
- 이름을 통해 의도를 드러내기 : 변수명, 함수명, 클래스명
- 축약하지 않기 : 의도를 드러낼 수 있다면 이름이 길어져도 된다. 문맥 상 중복되는 이름은 제거하자.
- if, for, while, 변수 선언문 사이의 공백도 코딩 컨벤션
- 공백 라인을 의미 있게 사용
- 스페이스와 탭을 혼용하지 않기
- 의미 없는 주석을 달지 않기
- 코드 포매팅을 사용하기
- JavaScript에서 제공하는 함수, API를 적극 활용
- 문자열 관리 시 함수를 직접 만들기보다 join() 등을 사용해 간결하게 구현
소감 및 후기
넘침과 부족함 사이 적당함을 찾기 어려웠다.
리팩토링을 하려 해도 스스로 기준이 잡혀있지 않다는 것을 느꼈다. 함수가 하는 “하나의 일”의 기준이 무엇인지, 다른 사람들도 읽기 좋은 코드의 기준이 무엇인지 등 특히 객체 지향에 대한 공부를 더 해야겠다.
앞으로의 목표
공통 피드백 사항 중, 다음주차 부터는 디버거 사용하기와 이름을 통해 의도 드러내기를 중점적으로 해야겠다.