우아한 테크코스 7기_프리코스 4주차 회고(마무리)
드디어.... 우아한 프리코스가 끝났다... 이 시원섭섭함 대학교 졸업작품 끝나고 간만에 느껴보는 것 같다.
정말 4주가 어떻게 흘러갔는지 모를정도로 빠르게 지나간 것 같다.
4주차는 진짜... 과제를 보고 이걸 어케해.... 라는 생각과 함께 내가 완성할 수 있을까? 라는 생각이 함께 들었다.
3주차에 정한 4주차 목표!
- 테스트 코드 작성하기!! (중요)
- git desktop 마스터하기
- 나만의 언어로 우아한 프리코스 최종 회고록 작성하기
- 우아한 프리코스 잘 마무리하기
전체적으로 잘 지켜진 것 같은데. 나만의 언어로 회고록 작성하기는 좀 더 고민을 해봐야겠다. 아직 나만의 언어가 뭔지 생각이 나지 않는다....
그래서 이번 통곡의 4주차 주제는 편의점 시스템을 구현하는 것! (요구사항을 읽고, 구현하다가 캡쳐는 까먹었다...)
4주차 기능 요구사항
- 사용자가 입력한 상품의 가격과 수량을 기반으로 최종 결제 금액을 계산한다.
- 최종 결제 금액은 상품별 가격과 수량을 곱하여 나온 총 구매액에서, 프로모션 및 멤버십 할인 정책을 반영한다.
- 구매 내역과 산출한 금액 정보를 영수증으로 출력한다.
- 영수증 출력 후 추가 구매를 진행할지 / 종료할지 선택할 수 있다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
재고관리 요구사항
- 재고 관리 각 상품의 재고 수량을 고려하여 결제 가능 여부를 확인한다.
- 고객이 상품을 구매할 때마다, 결제된 수량만큼 해당 상품의 재고에서 차감하여 수량을 관리한다.
- 재고를 차감함으로써 시스템은 최신 재고 상태를 유지하며, 다음 고객이 구매할 때 정확한 재고 정보를 제공한다.
프로모션 요구사항
- 프로모션 할인은 오늘 날짜가 프로모션 기간 내에 포함된 경우에만 할인을 적용한다.
- 프로모션은 N개 구매 시 1개 무료 증정(Buy N Get 1 Free)의 형태로 진행된다. 1+1 또는 2+1 프로모션이 각각 지정된 상품에 적용되며, 동일 상품에 여러 프로모션이 적용되지 않는다.
- 프로모션 혜택은 프로모션 재고 내에서만 적용할 수 있다. 프로모션 기간 중이라면 프로모션 재고를 우선적으로 차감하며, 프로모션 재고가 부족할 경우에는 일반 재고를 사용한다.
- 프로모션 적용이 가능한 상품에 대해 고객이 해당 수량보다 적게 가져온 경우, 필요한 수량을 추가로 가져오면 혜택을 받을 수 있음을 안내한다.
- 프로모션 재고가 부족하여 일부 수량을 프로모션 혜택 없이 결제해야 하는 경우, 일부 수량에 대해 정가로 결제하게 됨을 안내한다.
멤버십 요구사항
- 멤버십 할인 멤버십 회원은 프로모션 미적용 금액의 30%를 할인받는다.
- 프로모션 적용 후 남은 금액에 대해 멤버십 할인을 적용한다. 멤버십 할인의 최대 한도는 8,000원이다.
영수증 요구사항
- 영수증은 고객의 구매 내역과 할인을 요약하여 출력한다. 영수증 항목은 아래와 같다.
- 구매 상품 내역: 구매한 상품명, 수량, 가격
- 증정 상품 내역: 프로모션에 따라 무료로 제공된 증정 상품의 목록 금액 정보
- 총구매액: 구매한 상품의 총 수량과 총 금액
- 행사할인: 프로모션에 의해 할인된 금액
- 멤버십할인: 멤버십에 의해 추가로 할인된 금액
- 내실돈: 최종 결제 금액 영수증의 구성 요소를 정렬하여 고객이 쉽게 금액과 수량을 확인할 수 있게 한다.
프로그래밍 요구 사항
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- JUnit 5와 AssertJ를 이용하여 정리한 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인한다. 테스트 도구 사용법이 익숙하지 않다면 아래 문서를 참고하여 학습한 후 테스트를 구현한다.
- else 예약어를 쓰지 않는다.
- Java Enum을 적용하여 프로그램을 구현한다.
- 구현한 기능에 대한 단위 테스트를 작성한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
- 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다. 함수가 한 가지 일만 잘 하도록 구현한다.
- 입출력을 담당하는 클래스를 별도로 구현한다.
내가 구현한 코드 ↓ ↓ ↓ ↓
https://github.com/ldus0502/java-convenience-store-7-ldus0502/pull/8
- 저번주 코드리뷰에서 피드백을 받아 패키징을 해 MVC패턴이 더 두드러지도록 설계했다.
- 그리고 최대한 요구사항을 지키도록 노력하며 구현했다.
- 테스트 코드를 추가하여 구현한 코드의 안정성을 확인했다.
(개인적으로 구현과 완성 후 제출에 급급해서 놓친게 많아 너무나 아쉬운 코드다.)
이번 4주차는 진짜 구현하고 제대로 실행되는지 확인하는 부분에서 주말을 쏱아 부은 것 같다...
테스트 코드를 더 구체적으로 작성하고 싶었지만, 하나하나 추가를 하면 해결을 하는데 4시간..? 하루내내 해도 2개밖에 추가를 못하는 내가 너무 미웠다.
정말 사람이 4시간만 자도 살 수 있구나를 다시금 깨달았다. ㅎㅎㅎ...
마지막 4주차를 제출할때는 과제 제출 소감에 회고도 같이 적으라고 질문이 있었다.
- 지원서나 중간 회고에서 현실적인 목표를 설정하고 이를 달성했다고 생각하나요? 그 이유는 무엇인가요?
- 중간 회고에서 조정한 목표가 실제 목표 달성에 도움이 되었나요? 목표를 달성하는 데 어떤 점이 효과적이었다고 생각하나요?
- 각 미션의 목표를 달성하기 위해 세운 계획을 잘 이행했나요? 그 과정에서 어떤 전략이 효과가 있었나요?
- 몰입하고 함께 성장하는 과정을 통해 인상 깊었던 경험이나 변화가 있었나요?
각 질문에 대한 나의 답은
- 지원서나 중간 회고에서 현실적인 목표를 설정하고 이를 달성했다고 생각하나요? 그 이유는 무엇인가요?
- 지원서에서 설정한 목표인 실력 점검 및 향상을 비롯해 5가지 세부목표(학습내용 정리, 수준 파악 및 보완점 설정, 나만의 기술 노트 작성, 어려움 및 부족한 부분 목록화, 상호 피드백 공유)를 모두 달성했다고 생각한다. 내가 설정한 목표에 달성하기 위해 매주 과제가 끝난 후 작성한 회고록은 학습 내용을 정리하고 부족한 부분을 목록화하는 것에 아주 큰 도움이 되었다.
그리고 다른 사람들에게 받은 코드리뷰와 다음 주차에 제시된 공통 피드백은 내 설계와 코드의 부족한 점을 발견해 추가 학습을 진행할 수 있었다. 매주 과제를 구현하며 학습한 것을 나만의 기술 노트를 티스토리에 작성하며 학습 내용을 정리한 것이 최종 목표달성에 중요한 포인트가 되었다.
- 지원서에서 설정한 목표인 실력 점검 및 향상을 비롯해 5가지 세부목표(학습내용 정리, 수준 파악 및 보완점 설정, 나만의 기술 노트 작성, 어려움 및 부족한 부분 목록화, 상호 피드백 공유)를 모두 달성했다고 생각한다. 내가 설정한 목표에 달성하기 위해 매주 과제가 끝난 후 작성한 회고록은 학습 내용을 정리하고 부족한 부분을 목록화하는 것에 아주 큰 도움이 되었다.
- 중간 회고에서 조정한 목표가 실제 목표 달성에 도움이 되었나요? 목표를 달성하는 데 어떤 점이 효과적이었다고 생각하나요?
- 중간 회고에서 기존 목표를 새롭게 조정하는 것 보다는, 목표를 세분화하여 더욱 구체적으로 접근하였다. 코드리뷰와 공통 피드백을 참고하여, 매주 학습 계획을 조정했다. 이렇게 세분화된 목표 설정은 최종 목표 달성을 체계적으로 이끌어주는 기반이 된 것 같다.
- 각 미션의 목표를 달성하기 위해 세운 계획을 잘 이행했나요? 그 과정에서 어떤 전략이 효과가 있었나요?
- 우아한 프리코스를 시작할 당시, 자바를 공부한 지 2달이 채 안됐을 때였다. 그래서 내가 계획을 세워도 과연 내 생각대로 흘러갈까? 라는 생각이 들어 명확한 계획을 세우지 않고 프리코스를 시작했다.
하지만 일주일을 어림잡아 나눠 과제가 나오는 화요일부터 과제를 제출하는 월요일까지 어떤 식으로 해야 효율적으로 실력향상과 과제 구현에 도움이 될지 고민을 하고 대략적인 루틴을 세웠다.
-> 화-수 : 과제에 필요한 지식을 학습하고 정리
-> 목-금 : 기능 설계 및 README 작성
-> 금-일 : 설계와 README를 기반으로 구현
-> 월 : 과제 검토 및 제출, 회고 작성
-> 화 : 코드리뷰 반영 및 학습 목표 추가/수정
이런 식으로 계획을 세세하기 짜지 않고 유연하게 진행한 점이 한달이라는 나름대로 긴 기간의 프리코스를 완주할 수 있었던 것 같다. 이를 통해 피드백을 빠르게 반영해 학습 내용을 추가할 수 있었다. 또한, 스터디원과 온라인으로 함께 학습하며 화면 공유를 통해 집중력을 높인 전략은 학습 효율을 크게 향상할 수 있었다.
- 우아한 프리코스를 시작할 당시, 자바를 공부한 지 2달이 채 안됐을 때였다. 그래서 내가 계획을 세워도 과연 내 생각대로 흘러갈까? 라는 생각이 들어 명확한 계획을 세우지 않고 프리코스를 시작했다.
- 몰입하고 함께 성장하는 과정을 통해 인상 깊었던 경험이나 변화가 있었나요?
- 가장 인상 깊었던 경험은 코드리뷰를 하고 받는 과정이었다. 내가 시작한 지 얼마 안돼서 다른 분들에 비해 실력이 부족했다. 그래서 코드리뷰를 받을 때에는 마치 많은 선생님께 개인 과외를 받는 듯한 느낌을 받았고, 개선점을 빠르게 파악할 수 있었다. 그리고 다른 분들의 코드 리뷰에서는 같은 요구사항을 설계하는 다양한 관점과 의견을 접하며, 프로그래밍에서 정답이 없음을 깨달았다.
프리코스 기간 동안의 가장 큰 변화는 실력의 성장이다. 1주차에서는 SOLID 원칙조차 지키지 못했는데, 2주차에서는 SOLID 원칙을 지키고 예외 클래스도 따로 생성했다. 3주차에는 Enum과 MVC 패턴을 적용해 구현했고 Commit 메시지도 공부하고 구체적으로 분할해서 추가했다. 마지막 4주차에는 git desktop을 학습하고 이용해 clone, push를 하고 테스트 코드도 작성했다.
한 달의 모든 경험이 백엔드 개발자로서의 자신감을 심어주었고, 나의 성장 가능성을 확인하는 계기가 되었다.
- 가장 인상 깊었던 경험은 코드리뷰를 하고 받는 과정이었다. 내가 시작한 지 얼마 안돼서 다른 분들에 비해 실력이 부족했다. 그래서 코드리뷰를 받을 때에는 마치 많은 선생님께 개인 과외를 받는 듯한 느낌을 받았고, 개선점을 빠르게 파악할 수 있었다. 그리고 다른 분들의 코드 리뷰에서는 같은 요구사항을 설계하는 다양한 관점과 의견을 접하며, 프로그래밍에서 정답이 없음을 깨달았다.
- 소감
- 4주간의 프리코스는 단순히 실력 향상을 넘어, 개발자로서의 태도와 사고방식까지 성장할 수 있었던 매우 값진 시간이었다. 특히, 코드리뷰와 피드백 과정을 통해 학습과 협업/소통의 중요성을 깊이 깨달았고, 앞으로도 배움에 열린 자세로 임하고자 다짐하게 되었다. 이번 과정을 발판 삼아 더 나은 개발자로 성장할 것이다.
4주,, 아주 많은 것을 배우고 많은 개발자와 소통하고 정말 우테코에 떨어진다 하여도 지원한 것이 후회되지 않도록 열심히 하고 그만큼 성장한 4주였던 것 같다.
(가끔 많은 도움을 주시는 분들을 실제로 만나고 싶다는 생각도 했다. ㅋㅋㅋㅋ)
프리코스 안녕~~~
