
1주차 구현 기능
입력 문자열에서 숫자를 추출해 더하는 계산기
- 문자열 분리
- 쉼표(,) 또는 콜론(:) 을 기준으로 분리
- 커스텀 구분자 지정 가능: "//"와 "\n" 사이에 위치시키는 문자가 커스텀 구분자가 됨
- 분리된 문자를 숫자로 변환 후 각 숫자의 합을 반환
- 잘못된 값이 들어오면 IllegalArgumentException을 발생시키고 애플리케이션 종료
- 입력은 구분자와 양수로 이루어짐
우테코에 맞는 코드 스타일과 환경에 적응을 위한 주간이다 보니 생각보다 과제 난이도는 많이 낮았다.
하지만 간단하고 주어진 제약이 많이 없는 만큼 스스로 제약을 만들어야 하다 보니 생각이 점점 깊어졌다. 그래서 일단 간단하게 구현하고 새로운 코드 스타일과 환경에 적응하자는 목표를 가지고 과제를 시작했다.
목표
- Google Java Style Guide에 익숙해지기
- AngularJS Git Commit Message Convention에 대해 학습
- 내가 생각한 예제 테스트는 모두 통과하게 만들기
Google Java Style Guide
평소에는 코드 작성 스타일을 신경 안쓰고 막 작성하다보니 특정 스타일을 지키면서 작성하는 것이 생각보다 힘들었다. 특히 변수나 메서드 네이밍을 할 때 최근에는 코테 준비를 위한 알고리즘 문제만 풀다 보니 네이밍을 대충하는 경향이 있어서 더 어려웠던 것 같다. 이 외에도 수직/수평 공백이나 들여쓰기, import문 위치 등등 지킬 것이 많아서 새로운 코딩 스타일을 배울 수 있었다.
AngularJS Git Commit Message Convention
Git을 사용하면서 커밋 메시지에 대해 딱히 신경을 썼던 적이 없없다. 게다가 우테코에서는 커밋을 README.md에 적힌 기능 단위로 하라고 했는데 나는 평소에 한번에 다만들고 한번의 커밋으로 모든 변경 사항을 적용하다보니 커밋이나 커밋 메세지에 중요성을 크게 느끼지 못했던거 같다. 하지만 이번 기회에 작은 기능 단위로 커밋을 진행하면서, 협업을 하며 개발을 할 때 작은 단위로 커밋을 하는 습관이나 이때 작성하는 커밋 메세지가 다른 팀원에게 얼마나 효과적일지 간접적으로나마 느꼈다.
확실히 혼자서 개발을 할 때와는 다르게 다른 사람이 코드와 커밋 메세지만 보고도 내가 어떤 의도를 가지고 어떤 기능을 만들었는지 알아야 한다는 점에서 커밋 메세지의 중요성을 배웠다.
기능 구현
문자열 덧셈 계산기에서 가장 큰 기능을 검증, 계산 2가지로 생각했다. 그 중에서도 검증이 먼저이기 때문에 validation 클래스를 먼저 만들었다. 검증 클래스에서 다양한 오류들을 생각해서 오류 발생 시 모두 IllegalArgumentException을 던지도록 만들었다. 여기서 고민을 했던 것은 커스텀 구분자가 있을 때 //와 \n 사이에 여러 문자가 있으면 이것을 모두 하나의 구분자로 봐야 하나, 아님 기본 구분자와 같이 각각 다른 구분자로 봐야하냐 라는 것이다. 고민한 끝에 기본 구분자가 2개로 이루어져 있으므로 커스텀 구분자에서도 여러 문자가 있을 시 각각 다른 구분자로 사용되도록 했다.
그 다음은 계산 클래스를 만들었다. 사실 계산에는 문자열 분리와 숫자 계산 2가지 기능(여기서 SRP위반...)이 들어가있다. 검증 클래스에서 반환된 구분자를 가지고 그대로 문자열 분리를 한 후 Double.parsedouble()을 가지고 문자열을 숫자로 만들어 합산을 했다. 그리고 여기서 검증 클래스에서 하지 않은 문자열 자체에 대한 검증이 들어가는 셈인데, 바로 parsedouble()에서 숫자가 아닌 다른 문자가 있으면 특정 오류를 반환하기 때문에 나는 검증 클래스에서 따로 검증을 하지 않고 문자열 -> 숫자 변환시에 이를 맡겼다.
문제점
결과적으로 내가 생각한 테스트는 모두 통과를 했다. 하지만 push를 하고 예제 테스트를 하는데 자꾸만 1개의 테스트를 통과하지 못했다. 아무리 생각하고 코드를 바꿔봐도 예제 테스트를 통과하지 못했다. 그러다 프로그래밍 요구 사항 중 패키지나 클래스의 이동, 변경 없이 하라는 조건이 있어서 혹시나 싶은 마음에 분리 했던 클래스를 Application 파일로 모두 메서드를 모아서 push를 하니 모든 예제를 통과했다.
다음 과제 목표
이번 2주차 과제가 나왔는데 2주차 과제를 하면서 내가 지킬 목표는 다음과 같다.
- 객체 지향에 맞게 코드를 작성하자(SRP 준수)
- 너무 절차 지향적으로 작성했던 기존 습관에서 벗어나 객체 지향적으로 생각하며 코드를 만들어 볼 것이다.
- MVC 패턴이든 여러 방법으로 확장성에 대해 고민하며 코드를 만들자
- 비록 과제를 위한 코딩이지만, 확장성을 고려하며 코딩을 하다보면 실무에서 코딩을 할 때 도움이 될 것 같다.
- 기능 단위 코딩을 하며 기능 테스트를 매번하자
- 1주차 과제에서는 기능 단위로 만들긴 했지만 단위 테스트는 하지 못했다. 그래서 이번에는 작은 기능 단위로 코드를 작성하고, 테스트를 해보며 과제를 완성시킬 생각이다.
느낀점
1주차가 끝나고 본격적으로 프리코스 커뮤니티가 활성화 되었다. 다른 사람의 코드를 보다 보니 내가 어떤 부분을 놓치고 부족한지 확실하게 알게 되었다. 특히 Java와 객체 지향에 맞게 코드를 작성하는 이해도가 많이 부족한 것 같았다.
다른 분들은 MVC패턴이나 다른 패턴을 적용하면서 확정성 까지 챙기면서 코드를 작성했지만, 나는 그런 부분까지는 생각하며 코드를 작성하지 못했다. 거기에 계산 단계에서 SRP를 제대로 지키지 못하면서 하나의 객체에 2개의 기능이 들어가버렸다.
이 외에도 다른 분들의 코드를 보고 리뷰 받으며 Java에 대해 다시 공부를 할 필요성을 느꼈다. 그동안 Spring Boot나 JPA등 기술에 대해 관심이 많아 공부를 하면서 정작 기본인 Java에 대해 공부가 많이 부족했던 것 같다.
이번 프리코스에 참여하며 최종 합격을 하든 안하든 한달간의 기간동안 내가 배울 것이 많고, 다시 나를 돌아보는 시간이 될거 같아서 기분이 좋은 만큼 최선을 다해 과제를 해결하며 많이 배울 수 있도록 노력해야겠다는 생각이 들었다.
'기타' 카테고리의 다른 글
| [우테코 프리코스] 3주차 과제 회고록 - 로또 (2) | 2024.11.07 |
|---|---|
| [우테코 프리코스] 2주차 자동차 경주 회고록 (3) | 2024.10.30 |