📖 우테코 7기 프리코스 4주차 회고

ByEunwoo
woowacourse

우아한테크코스 프리코스에서 제가 설정했던 세 가지 목표인 '클린 코드 작성', '소프트 스킬 향상', 'JavaScript의 심층적 이해'는 매우 현실적이고 구체적인 목표였으며, 이를 모두 달성했다고 스스로 생각합니다.
프리코스 이전에는 메소드와 변수의 네이밍이 코드 품질에 미치는 영향을 깊이 인식하지 못했습니다.
하지만 다른 크루들의 피드백을 통해, 좋은 네이밍이 코드의 가독성과 유지보수성을 크게 향상시킨다는 것을 깨달았습니다. 예를 들어, 4주차 미션에서는 단순히 수량을 감소시키는 메소드의 경우, 일반 상품의 수량을 감소시키는 것인지, 프로모션이 적용된 상품의 수량을 감소시키는 것인지 명확히 구분되도록 메소드명을 짓기 위해 노력했습니다.
각 메소드가 하나의 명확한 책임만을 가져야 한다는 단일 책임 원칙은 제가 가장 크게 깨달은 원칙입니다. 예를 들어, 4주차 미션의 초기 버전에서는 상품의 수량을 감소시키는 메소드가 프로모션 적용 여부 확인부터 수량 계산, 실제 감소까지 모든 책임을 가지고 있었습니다. 이를 세 가지 별도의 메소드로 분리하여 각각 프로모션 확인, 수량 계산, 수량 감소라는 단일 책임을 갖도록 개선했습니다.
이렇게 각 책임을 분리함으로써 코드의 가독성과 유지보수성이 크게 향상되었습니다.
MVC 패턴을 기본 뼈대로 하되, 각 계층 내에서도 책임에 따라 클래스를 세분화했습니다.
특히 4주차 미션에서는 Model 계층에서 일반 상품과 프로모션 상품을 별도의 클래스로 분리하고, Service 계층에서는 주문 처리와 상점 관리를 별도의 서비스로 분리했습니다. 이러한 구조적 분리는 각 클래스의 책임을 명확히 하고, 코드의 확장성과 테스트 용이성을 크게 향상시켰습니다. 예를 들어, 새로운 종류의 프로모션을 추가할 때도 기존 코드의 수정 없이 새로운 클래스만 추가하면 되는 구조를 만들 수 있었습니다.
반복되는 패턴을 발견하면 이를 재사용 가능한 형태로 추상화했습니다. 입력값 검증 로직의 경우, 처음에는 각 메소드마다 비슷한 검증 코드가 중복되어 있었지만, 이를 별도의 검증 클래스로 분리하여 여러 곳에서 재사용할 수 있게 했습니다. 또한, 자주 사용되는 상수와 에러 메시지를 별도의 파일로 분리하여 코드의 일관성을 유지하고 변경을 용이하게 했습니다.
이러한 노력의 결과로, 초기에는 단순히 작동하는 코드를 작성하는 데 그쳤다면, 프리코스 후반에는 확장 가능하고 유지보수가 용이한 코드를 설계할 수 있게 되었습니다. 특히 다른 크루들의 코드를 리뷰하고 피드백을 주고받는 과정에서, 같은 문제를 해결하는 다양한 방법을 배울 수 있었고, 이는 제 코드 품질을 향상시키는 데 큰 도움이 되었습니다.
깔끔한 코드 작성이라는 목표를 달성하면서, 단순히 코드가 작동하는 것을 넘어 다른 개발자들과 효과적으로 협업할 수 있는 코드를 작성하는 것의 중요성을 깊이 이해하게 되었습니다.
'
소프트 스킬 향상'이라는 두 번째 목표도 성공적으로 달성했습니다. PR 리뷰에서 2주차와 3주차에 1등을 달성할 수 있었던 것은 단순히 기술적인 실력 때문만이 아닌, 다른 크루들과의 활발한 소통과 피드백 교환 덕분이었습니다. 매 PR마다 최소 10명 이상의 크루들과 코드 리뷰를 주고받으며, 각자의 관점에서 코드를 바라보는 방법을 배웠습니다. 또한, 좋은 피드백과 의견을 주기 위해서 다양한 많은 크루들의 코드를 하나씩 뜯어보면서 깊게 읽으려고 노력함으로써 코드를 읽는 능력이 매우 향상한 것 같습니다. 이 경험 덕분에, 코드를 읽는 속도와 다양한 코드의 이해도가 이전과 비교해서 향상된 것 같습니다. 특히, 특정한 코드를 보았을 때 머릿속에서 자연스럽게 다양한 리팩토링 방법과 코드를 보는 시각이 매우 넓어졌다고 생각합니다.
'JavaScript의 심층적 이해'라는 세 번째 목표도 큰 성과를 이뤘습니다.
매일 시간 날 때마다, 혹은 특정한 메소드를 쓸 때 마다 궁금한 점이 생기거나 동작 원리에 대해서 모르는 점이 생겼을 때 자바스크립트 공식 문서를 읽는 습관을 통해, 특히 비동기 처리와 프로미스 체이닝에 대한 깊은 이해를 얻을 수 있었습니다. 이는 4주차 미션의 복잡한 사용자 입력 처리를 구현하는 데 결정적인 도움이 되었습니다.
중간 회고에서는 '코드 구조화'와 '재사용성 향상'이라는 세부 목표를 추가했는데, 이는 후반부 미션을 수행하는 데 매우 효과적이었습니다. 처음에는 단순히 'MVC 패턴을 적용해보자'는 수준이었지만, 실제로 적용하면서 각 계층 간의 의존성 관리와 책임 분리의 중요성을 깊이 이해하게 되었습니다.
각 미션의 목표 달성을 위한 가장 효과적인 전략은 '선 구조화, 후 구현'이었습니다. 코드를 작성하기 전에 전체 구조를 클래스 다이어그램으로 그려보고, 각 클래스의 책임과 역할을 명확히 정의했습니다. 4주차 미션에서는 다음과 같은 구조화 전략을 사용했습니다:

  1. Model 계층에서 Product와 PromotionProduct를 분리하여 상속 관계 구현
  2. ProductStorage 클래스를 통해 상품 관리 로직 캡슐화
  3. Service 계층을 도입하여 비즈니스 로직 분리
  4. InputView와 OutputView를 통한 사용자 인터페이스 관리
    또한 '단계적 리팩토링' 전략도 매우 효과적이었습니다. 먼저 기능 구현 하기 전, 설계한 기능 목록에 맞춰서 기능을 구현한 후, 매일 저녁 시간을 활용해 코드를 점진적으로 개선했습니다. 4주차 미션에서는 처음에 구현한 긴 메소드들을 작은 단위로 분리하고, 변수명과 함수명을 더 직관적으로 수정하는 작업을 반복했습니다.

전체적인 프리코스를 통해 배운 핵심적인 내용들은 크게 5가지가 있었습니다.

  1. MVC 패턴과 Service 레이어를 활용한 체계적인 코드 구조화
  2. JSDoc을 활용한 문서화의 중요성
  3. 콜백 함수와 비동기 처리의 실전 적용
  4. 클래스 기반 객체지향 프로그래밍의 심화 이해
  5. 효과적인 코드 리뷰 방법과 커뮤니케이션 스킬
    특히 4주차 미션은 가장 큰 도전이었지만, 이전 주차들에서 배운 모든 개념들을 종합적으로 적용할 수 있었습니다. 프로모션 로직을 구현하면서 상속과 다형성을 활용했고, 사용자 입력 처리에서는 비동기 처리와 예외 처리를 적절히 조합했습니다. 이 과정에서 발생한 어려움들을 극복하면서 문제 해결 능력도 크게 향상되었습니다.
    프리코스 초반에는 함수형 프로그래밍에만 익숙했던 제가 객체지향 프로그래밍의 진정한 가치를 깨닫게 된 것이 가장 큰 성장이었습니다. 특히 4주차 편의점 미션에서 이러한 깨달음이 정점을 찍었습니다.
    처음에는 단순히 클래스를 '관련된 데이터와 함수를 묶는 컨테이너'로만 이해했습니다. 하지만 프로모션 로직을 구현하면서 객체지향의 진정한 의미를 깨달았습니다. Product 클래스와 PromotionProduct 클래스를 설계할 때, 단순히 상속을 사용하는 것을 넘어서 '어떤 책임을 어떤 클래스에 부여할 것인가'를 깊이 고민했습니다.
    예를 들어, 초기에는 모든 상품 관련 로직을 Product 클래스에 넣으려고 했습니다. 하지만 이는 "단일 책임 원칙"을 위반하는 것임을 깨달았고, 프로모션 관련 로직을 PromotionProduct 클래스로 분리했습니다. 이 과정에서 '상속'이 단순히 코드 재사용의 수단이 아니라, 객체의 행위를 확장하는 수단임을 이해하게 되었습니다.
    또한, ProductStorage 클래스를 구현하면서 '캡슐화'의 중요성을 실감했습니다. 초기에는 상품 목록을 배열로 관리하면서 외부에서 직접 접근하도록 했지만, 이는 데이터 무결성을 해칠 수 있다는 것을 깨달았습니다. 이를 private 필드로 변경하고 적절한 메서드를 통해서만 접근하도록 수정하면서, 객체가 자신의 상태를 스스로 책임지는 것의 중요성을 이해했습니다.
    특히 인상 깊었던 것은 '다형성'의 활용이었습니다. 프로모션 적용 여부에 따라 다르게 동작해야 하는 getProductStatus() 메서드를 구현하면서, 오버라이딩을 통해 동일한 메서드 호출이 객체의 타입에 따라 다르게 동작하도록 구현했습니다. 이를 통해 코드의 유연성과 확장성이 크게 향상될 수 있었습니다.
    이러한 객체지향적 설계는 코드의 유지보수성을 크게 향상시켰습니다. 예를 들어, 새로운 프로모션 타입을 추가해야 할 때, 기존 코드를 수정하지 않고도 PromotionProduct 클래스를 상속받아 새로운 클래스를 만드는 것만으로 기능을 확장할 수 있었습니다.

프리코스 기간 동안 가장 큰 변화는 '문제를 바라보는 관점'이었습니다. 1주차에는 단순히 기능 구현에만 집중했다면, 4주차에 이르러서는 확장성과 유지보수성을 고려한 설계를 먼저 고민하게 되었습니다. 예를 들어, 프로모션 기능을 구현할 때는 새로운 프로모션 타입이 추가될 것을 고려하여 인터페이스를 설계했고, 이는 코드의 유연성을 크게 높였습니다.
4주간의 프리코스는 제게 단순한 학습 기간이 아닌, 진정한 성장의 시간이었습니다. 매 미션마다 새로운 도전과 어려움이 있었지만, 이를 극복하는 과정에서 기술적 역량뿐만 아니라 문제 해결 능력, 협업 능력도 크게 향상되었습니다. 특히, 스스로 뭐가 부족하고 이를 보완하기 위해선 어떤 노력을 해야하고, 어떻게 성장해야 하는지 ‘메타인지’를 통해 스스로 크게 성장할 수 있었던 계기가 되었습니다. 또한, 다른 크루들과의 활발한 교류는 제 시야를 넓히고 다양한 관점에서 문제를 바라볼 수 있게 해주었습니다.
이러한 모든 경험들은 제가 앞으로 나아갈 방향을 더욱 명확하게 해주었습니다. 단순히 코드를 작성하는 개발자가 아닌, 지속적으로 성장하고 함께 발전하는 개발자가 되겠다는 목표를 더욱 굳건히 하게 되었습니다. 프리코스는 끝났지만, 이 기간 동안 형성된 학습 습관과 성장에 대한 열정은 앞으로도 계속될 것입니다.
가장 중요한 것은 이 모든 경험이 단순한 기술적 성장을 넘어, 지원서에 Motto로 적은 ‘같이 일하고 싶은 프론트엔드 개발자’로서의 마인드셋을 형성하는 데 큰 도움이 되었다는 점입니다. 코드 품질, 협업, 지속적 학습의 중요성을 몸소 체험하면서, 앞으로도 이러한 가치들을 추구하며 성장해 나갈 것입니다.

Posted inwoowacourse
Written byEunwoo