드디어 고대하던 우아한테크코스 8기의 프리코스가 시작되었습니다..!
이미 1주차 시작도 전에 활발한 디스코드를 보며 걱정 반 설렘 반으로 나름 열심히 커뮤니티를 활보(?) 하고 다녔습니다만..
이런 개발 커뮤니티의 참여는 처음이라, 생각보다 쉽게 참여하거나 섞이지 못했던 것 같은 아쉬움이 남았습니다,,
좀 더 노력해서, 얼른 저도 열정적인 사람들 사이에 옮겨붙은 장작처럼 열심히 타올라야겠습니다🔥
첫 회고록은 스스로 이번 주차의 목표라고 생각했던 '설계'를 중점적으로 작성해 보려 합니다.
Keyword : 설계
우선, 본격적인 개발 시작 전에 프리코스 요구사항 및 커뮤니티에서 얻은 내용을 바탕으로 좋은 코드를 작성하기 위한 원칙/규칙들을 개인 노션 한 곳에 정리하였습니다.
너무 처음부터 완벽하게, 잘 하려고 한 탓인지 개발 시작도 전에 너무 많은 시간을 보내버린 것 같아 아쉬움이 좀 남았습니다.
하지만, 언젠간 짚고 넘어가야 할 부분이었기에 나아질 미래를 생각하며 좀 더 부지런히 노력해야겠다는 생각이 들었습니다.
프리코스 커뮤니티에서 지원자 mia님의 주도로 시작된 '러다이트 챌린지'에 동참하며, 프리코스 과제 해결에 LLM을 사용하지 않는 것을 목표로 하였습니다.
그동안 프로젝트를 진행하면서 높은 AI 의존도가 스스로도 걱정되는 부분이기도 하였기에, 프리코스 최종 코딩 테스트 준비도 할 겸 해당 챌린지 또한 이번 프리코스 목표로 삼았습니다.
이번 주차 키워드 '설계'를 기반으로 계속 진행해보겠습니다.
참고로, 설계 흐름과 순서는 이전에 학과 소모임 스터디에서 다뤘던 『객체지향의 사실과 오해』라는 책 내용을 바탕으로 진행하였습니다.
기능 명세 작성은 이전에 벨로그 포스팅에서도 다뤘듯이, "구현해야 할 기능들을 세분화하여 정리"하는 것입니다.
기능 명세를 잘 작성해놓으면,
빠뜨리는 것도 줄고 우선순위도 명확해집니다.
덕분에, 해당 기능 구현 시에 그것에만 몰두할 수 있습니다.
커밋이나 테스트의 기준이 생깁니다.
리뷰어 입장에서 피드백이 용이해집니다. (중요!)
사실 이전 포스팅을 작성하면서, 나름대로 기능 명세를 잘 작성하는 쪽으로 성장하고 있다고 생각했습니다.
포스팅 참고 : yim0327 | [개발] 기능 목록 작성
그런데 이번 프리코스를 진행하면서 여러 지원자 분들의 깃허브를 보고, '나는 기능 명세에 대해 정말 모르고 있구나'라는 생각이 들었습니다. (진정한 커뮤니티의 순기능..)
이번 주차를 통해 알 수 있었던 점은, 기능 명세는 사용자/리뷰어의 입장에서 해당 기능이나 서비스에 대해 빠르게 이해할 수 있어야 한다는 것입니다.
협업이나 소통이 매우 중요한 개발 직군에서 리뷰와 피드백은 매우 중요하기 때문입니다.
→ 그동안 저는 개발자(본인)의 입장에서, 개발 전 체크리스트 정도로만 생각했던 것 같습니다.
[1주차 기능 명세 작성]
# 📝 기능 목록 정리
### 입력
- [x] 사용자는 문자열을 입력할 수 있다.
### 출력
- [x] 프로그램 시작 시 문자열 입력 안내 메시지를 출력한다. (ex. `"덧셈할 문자열을 입력해 주세요."`)
- [x] 계산 결과에 따른 결과값을 형식에 맞춰 출력한다. (ex. `"결과 : 6"`)
### 계산 진행
- [x] 문자열 내의 숫자들은 구분자를 기준으로 구분하여 숫자를 추출한다.
- [x] 추출하여 나온 숫자들을 모두 합한다.
### 구분자 규칙
- [x] 쉼표(`,`)나 콜론(`:`)을 구분자로 하는 경우, 구분자를 기준으로 분리한다.
- [x] 커스텀 구분자의 경우, 문자열 앞부분에 `"//"`와 `"\n"` 사이에 위치한 문자를 구분자로 사용한다.
### 도메인 규칙/검증
- [x] 커스텀 구분자가 알맞은 형식인지 확인한다.
- [x] 숫자가 양수인지 확인한다.
### 예외/엣지 케이스
- [x] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨다.
- [x] 구분자로 추출된 문자가 숫자가 아닐 시 `NumberFormatException`을 발생시킨다.
- [x] 구분자로 추출된 문자가 너무 큰 숫자일 경우 `NumberFormatException`을 발생시킨다.
- [x] 숫자들을 모두 합한 값이 너무 클 때 `ArithmeticException`을 발생시킨다.
### 추가 요구사항
- 추출된 숫자들은 오로지 정수만 허용한다.
- 커스텀 구분자가 여러 개일 땐 `"//"`와 `"\n"` 사이에 모두 기입한다.
[2주차 목표+]
기능 명세 작성 시 기능/행동 별 분리를 더욱 명확히 하여, 커밋이나 테스트의 기준이 될 수 있도록 한다.
사용자 친화적인 작성으로 가독성을 높이고 원활한 리뷰를 가능하도록 한다.
도메인 모델링은 특히나 신경을 많이 썼던 단계였습니다.
객체지향적인 설계를 위해 객체를 찾고 책임을 정해야 했기에 중요한 것도 있었지만,
그 이후에 그리는 도메인 모델링 다이어그램이 구현 단계에서 개인적으로 큰 도움이 되었기 때문입니다.
[도메인 모델링 흐름 및 1주차 진행 사항]
개발을 하면서, 그동안은 유스케이스와 각 시나리오를 작성하는 것에 대해 감이 잘 오지 않았었습니다..
그런데 프리코스를 진행하던 중에, 우연히 발견한 어느 벨로그 포스팅 덕분에 유스케이스에 대한 감을 어렴풋이나마 잡을 수 있었습니다.
포스팅 참고 : hyunn00 | [졸업작품] 프로젝트 분석 2
[1주차 유스케이스 작성]
특히, 서비스의 종류나 규모에 따라 일차 액터가 사용자, 관리자 등으로 분리되며 각각의 유스케이스나 시나리오가 더욱 분산될 수 있다는 것을 알 수 있었습니다.
위의 1️⃣단계에서 '도메인 모델링 다이어그램'을 그리고 나면 인터페이스 정리는 쉽게 끝나는 것 같습니다.
여기서 말하는 인터페이스는 자바 클래스에서의 인터페이스만을 지칭하는 것과는 다릅니다.
『객체지향의 사실과 오해』- 05 / 책임과 메시지 중.
- 객체 인터페이스
- 일반적으로, 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 방법이나 장치를 의미한다.
- 세계의 존재하는 그 어떤 대상과 상호작용하고 싶다면 그 대상이 제공하는 인터페이스의 사용법을 익혀야 한다.
여러 시행착오를 거쳐 마무리된 1주차 패키지 구조입니다.
나름 MVC+Service 패키지 구조를 적용하고, ArithmeticOperation을 인터페이스로 빼는 등의 시도를 해보았습니다.
평소에는 chatGPT에 의존하여 개발했기에, 뭐 하나 걸린다 싶으면 바로 질문하거나 리팩터링할 부분을 그저 '찾아줘'만 했었습니다.
그러다보니 이번 과제를 진행하는 동안에는 스스로의 코드에 자신이 없어지고 괜한 불안감마저 들었습니다.
하지만 반대로, AI의 도움 없이 코드를 모두 작성하다 보니 나 혼자서도 이렇게 생각하며 작성할 수 있구나 라는걸 느꼈습니다.
또, 모르는 부분에 대해서는 웹 서칭을 통해 해결을 하다보니 블로그나 github 등을 통해 '서로 배운 것을 공유하며 성장'하는 것의 중요성을 깨달았습니다.
코드에 대한 더 많은 정보 : yim0327 - 1주차 과제 레포지토리(java-calculator-8)
과제를 수행하면서 생겼던 자잘자잘한 문제나 고민들을 기록하였습니다.
이번 구현 과정을 통해, 정규 표현식(Regular Expression)이나 여러 예외 처리(Exception Handling)에 대한 고민들을 더욱 하게 됐던 것 같습니다.
해당 부분과 관련된 내용은 추후에 포스팅을 통해 공유해드리겠습니다.
TDD(Test-Driven-Development) 제대로 적용 해봐야겠다.
이번 주차는 코드를 '구현'하는데에만 매달리다가 TDD를 적용하지 못한 것에 대한 아쉬움이 있었습니다.
2주차 부터는 TDD에 대한 공부 및 적용, import camp.nextstep.edu.missionutils.test에 대해 알아보는 것을 목표로 추가하겠습니다.
밀어주고 끌어주는 프리코스 커뮤니티
프리코스 과정에서 느낄 수 있는 가장 큰 장점이자 도움이 많이 되는 것은 아무래도 '커뮤니티'의 존재이지 않을까 싶습니다.
여러 사람들이 이런저런 정보나 토론 주제들을 공유하며 서로 성장할 수 있는 것과 더불어, 열정적인 커뮤니티를 보는 것만 해도 '나도 멈춰있을 수 만은 없다', '더욱 더 열심히 해야지'라는 생각이 절로 드는 것 같습니다.
2주차 부터는 커뮤니티 활동에 더욱 정진하며 여러 사람들과 공유하는 기회를 많이 얻을 수 있었으면 좋겠습니다.
글 잘 읽었습니다 !
저는 저는 "도전", "느낌"에 관련한 주제를 많이 넣었습니다.
게시글 자체에 개발 내용을 추가하니 나중에 확인했을 때도 코드를 이해할 때 좋을 것 같습니다 !
좋은 글 잘 읽고 갑니다~