2889 단어
14 분
[ 우테코 회고 ] 프리코스 4주차 회고

최종 회고#

제 지원서와 중간회고에서의 목표는 완성도 높은 객체지향 설계와 구현, 그리고 최적화였습니다. 처음에는 SOLID 원칙과 다양한 객체지향 기법들을 적용하는 것에 중점을 두었으나, 프리코스를 진행하면서 이보다는 객체지향의 본질을 이해하고 적용하는 것이 더 중요하다고 판단하여 목표를 수정했습니다. 특히 객체의 책임과 역할에 대해 깊이 고민하고, 상속과 다형성을 활용한 확장 가능한 설계를 구현하는 데 초점을 맞추었습니다. 또한 여유가 있다면 최적화 측면에서는 불필요한 객체 생성을 최소화하고 적합한 자료구조를 선택하며, 테스트 환경의 적절성을 검토하는 것을 세부 목표로 설정했습니다. 이러한 목표들을 달성하기 위해 다른 참가자들의 코드를 꼼꼼히 리뷰하며 다양한 관점을 흡수하고, 이를 통해 제 코드의 한계를 극복하고 발전시켜 나가고자 했습니다.

목표를 완전히 달성했다고 생각하지는 않습니다. 3주차에서는 객체지향 원칙을 충실히 적용하며 설계와 구현 모두 만족스러운 수준에 도달했지만, 4주차에서는 요구사항이 복잡해지면서 목표를 달성하지 못한 부분이 남았습니다. 특히 설계 과정에서 충분히 고민하지 않고 구현에 들어가면서, 각 객체의 책임을 명확하게 정의하지 못해 객체 간의 역할 분리가 미흡했습니다. 결국 중간에 설계를 바꾸는 일이 발생했고, 그로 인해 코드의 일관성도 떨어지게 되었습니다. 이러한 경험을 통해 ‘복잡한 요구사항일수록 설계에 더 많은 시간을 할애하고, 초기 단계에서 요구사항을 완전히 이해하는 것이 중요하다’는 점을 깨달았습니다.

중간 회고에서 SOLID 원칙 적용보다 객체지향의 본질에 집중하기로 한 것은 도움이 되었다고 생각합니다. 어떤 기법을 익히기 위해 노력하기보다는 코드가 가지고 있는 의미에 집중했습니다. 코드 리뷰의 경우에도 전체적인 흐름을 보고, 객체지향의 관점에서 코드의 의미에 집중하여 리뷰를 하였습니다. 특히 3주차 미션에서는 각 객체의 책임과 역할을 명확히 하고, 객체 간의 관계를 자연스럽게 설계할 수 있었습니다. 다만 4주차에서는 요구사항이 복잡해지면서 각 객체의 역할을 명확하게 적용하는데 어려움을 겪었지만, 객체지향의 본질에 초점을 맞춘 것이 문제 해결의 방향을 잃지 않게 해주었습니다. 기능들을 기준으로 보는 것이 아닌 프로그램 전체에서 주요 역할을 기준으로 관심사를 분리하고, 관심사에서 기능들을 구현하니 복잡했던 머리속이 조금씩 정돈되는 느낌이었습니다.

각 미션의 목표 달성을 위해서는 3단계 전략을 세우고 실행했습니다. 먼저 요구사항을 분석하여 큰 그림을 그리고 필요한 객체들을 대략적으로 도출했습니다. 구현이 완료된 후에는 다시 한 번 전체적인 설계를 검토하며 객체들의 관계와 책임이 처음 의도했던 방향과 일치하는지 확인하고, 필요한 경우 리팩토링을 통해 설계를 개선했습니다. 이러한 ‘추상화 - 구체화 - 재추상화’의 순환적인 접근 방식이 복잡한 요구사항을 체계적으로 해결하는 데 매우 효과적이었습니다. 처음 추상화를 제대로 하지 못해 구체화를 하며 추상화를 다시 하여 시간이 오래 걸렸지만, 문제를 해결하는 데에는 효과적이었습니다. 특히 코드 리뷰를 통해 받은 피드백을 이 과정에 지속적으로 반영하면서, 만족스럽지는 않지만, 더 나은 설계와 구현을 할 수 있었습니다.

프리코스를 진행하면서 가장 인상 깊었던 경험은 다른 참가자들과의 코드 리뷰를 통한 성장이었습니다. 특히 3주차에서는 텍스트 기반의 리뷰 대신 라이브 코드리뷰를 진행했는데, 이를 통해 코드에 대한 즉각적인 질문과 답변이 가능해 더욱 심도 깊은 학습을 할 수 있었습니다. 예를 들어, 로또 미션에서 코드 리뷰어가 던진 “만약”이라는 질문을 통해 변경 가능성을 고려한 설계의 중요성을 배웠고, 인터페이스를 활용해 동작을 추상화하여 유연한 설계를 구현하는 방법에 큰 영감을 받았습니다. 코드리뷰를 서로 해주고, 객체지향에 대해 토론하며 새벽까지 4시간정도 대화할 만큼 재미있고 도움이 되었습니다.

또한, 프리코스가 진행될수록 ‘왜 이렇게 설계해야 하는가’에 대한 고민이 깊어졌고, 이는 제 코드의 품질을 높이는 중요한 계기가 되었습니다. 일어나서부터 자기 전까지, 심지어 식사 시간이나 이동 중에도 더 나은 설계 방법을 고민했습니다. ‘어떻게 하면 더 잘 구성할 수 있을까’, ‘더 개선할 부분은 없을까’ 하는 생각이 끊이지 않았고, 이런 고민의 과정이 오히려 미션을 더욱 재미있게 만들어주었습니다. 시간 가는 줄 모르게 몰입하며 미션을 수행할 수 있었던 것은 끊임없는 고민과 개선의 즐거움 덕분인 것 같습니다.

소감문#

회고 및 학습#

4주차 미션을 시작하기 전, 3주차 미션의 회고를 참가자분과 라이브로 진행했습니다. 서로의 코드를 보면서 왜 이렇게 작성하였는지, 구조는 왜 이런 방식으로 설계했는지 의견을 나눴습니다. 객체지향에 대한 서로의 의견을 주고받으며, 기존에 객체와 상태의 추상화만 해오던 제가 동작의 추상화에 대한 이해도를 높일 수 있었습니다. 인터페이스를 사용하여 로또 미션을 확장성 있게 짠 상대 참가자분의 코드를 보며 감명을 많이 받았고, 이번에는 동작에도 추상화를 넣어보려 노력하였습니다.

미션 진행 과정#

그 이후 다른 분들의 코드 리뷰도 진행하고, 미션을 목요일 정도에 시작했습니다. 처음에는 짧은 시간 안에 구현을 한 뒤, 이후 리팩토링을 해야겠다는 생각으로 설계를 가볍게 하고 구현을 시작했습니다. 하지만 요구사항을 정확하게 파악하지 않고 설계에 충분한 시간을 들이지 않아서인지, 구현을 하면서도 설계가 계속 바뀌었습니다. 설계가 바뀌게 되니 구현에도 다시 시간을 쏟고, 테스트 코드도 설계가 바뀌면서 같이 바뀌어 비효율적이었습니다.

또한, 동작의 추상화라는 개념을 처음 적용해보는 단계라 그런지, 혹은 개념을 완전히 이해하지 못해서인지 만족스러운 수준의 추상화를 이루지 못했습니다. 시간이 얼마 없는 상황에서 테스트 코드보다는 설계와 구현을 병행하며 전체 테스트를 통과하는 것을 1차 목표로 삼고 진행했습니다. 어떻게든 전체 테스트를 통과시킨 후에, 여유가 생겨 리팩토링을 하면서 구조를 다시 잡아나갔고, 놓친 요구사항이 있는지를 다시 체크해보고 문서에 적어나가며 수정했습니다.

구현 결과#

이번 주차에는 시스템을 재고관리, 주문시스템(POS), 결제 시스템이라는 3개의 큰 도메인으로 나누어 구현하였습니다. 재고관리 시스템에서는 현재 재고를 파악하고 결제가 완료되면, 주문 정보를 바탕으로 판매한 재고를 반영하게 구현하였습니다. 주문시스템(POS)에서는 사용자의 요청을 처리하고 재고를 확인하는 로직과 함께, 프로모션 물품을 추천해주는 기능을 구현하였으며 주문 정보를 생성하고 관리하는 기능을 담당하도록 하였습니다. 마지막으로 결제 시스템에서는 주문 정보를 기반으로 결제를 처리하고, 영수증을 생성하여 출력하며 결제 정보를 관리하는 로직을 구현하였습니다.

아키텍처 측면에서는 간단한 DI 컨테이너를 구현하여 각 객체들의 의존성을 관리했습니다. 특히 주문 정보와 같이 초기화가 필요한 객체와 재고와 같이 상태를 유지해야 하는 객체를 명확히 구분하여, 추가 주문 시에도 시스템이 안정적으로 동작하도록 구현했습니다.

느낀 점#

이번 주차를 하면서 저에게 가장 아쉬웠던 점은, 설계를 어느 정도 명확하게 하지 않고 구현을 시작한 것입니다. 기존 1, 2, 3주차의 경우에는 요구사항이 비교적 단순하였고, 시간을 쏟지 않아도 설계가 명확하게 되어서 큰 틀에서 바뀌지 않았습니다. 하지만 이번 미션의 경우에는 요구사항이 복잡하여 제대로 설계에 충분히 시간을 들인 뒤에 구현을 시작해야 했는데, 그러지 못한 점이 너무 아쉬웠습니다. 지금도 요구사항을 만족하는 코드를 작성하긴 하였지만, 제가 만족할 정도의 좋은 품질의 코드가 나오지 않은 것 같습니다. 다만 이번 미션을 통해 복잡한 도메인을 분리하고 각 객체의 책임을 명확히 하는 값진 경험을 할 수 있었습니다. 4주동안 짧다면 짧고 길다면 긴 시간이었지만, 4주동안의 경험을 바탕으로 앞으로 제 인생도 몰입하며, 주변 사람들과 함께 성장해나가려고 합니다.

[ 우테코 회고 ] 프리코스 4주차 회고
https://blog-full-of-desire-v3.vercel.app/posts/retrospect/retrospect-4/
저자
SpeculatingWook
게시일
2024-11-13
라이선스
CC BY-NC-SA 4.0