시작하며
10월 14일 부터 1월 10일까지 프리코스, 오픈미션, 마지막 최종코딩테스트까지 3개월의 대장정을 마쳤다 !
매번 회고 마다 느끼지만 몰입의 힘은 정말 대단하고 신기한 것 같다.
반팔 반바지를 입고 에어컨 바람을 맞으며 시작했던 우아한테크코스 8기 선발 과정은 어느새 패딩을 입고 난방을 켜야 하는 계절을 지나 새해와 함께 끝을 맺었다.
시간이 이렇게까지 압축되어 흐를 수 있다니.. 타임머신? 정신과시간의방? 을 경험 한듯 1년의 1/4인 한 분기가 순식간에 지나갔다 !
그 만큼 후회없이 모든 걸 하얗게 불태웠다 !!
하지만 마냥 불태운 것만은 아니다.
매주 고민했던 흔적들, 시행착오와 깨달음, 그리고 그때의 생각들은 모두 블로그라는 공간에 차곡차곡 기록으로 남아 있다.
지나가버린 시간이 아니라, 언제든 다시 꺼내볼 수 있는 자산으로 남았다는 점이 더 의미 있게 느껴진다.
이렇게나 높은 몰입을 통해 하나에 온힘을 다 쏟아 부은 경험이 너무 소중하다.
나를 이렇게 성장시켜주고, 이 과정 자체를 즐길 수 있게 해준 우아한테크코스 운영진분들에게 늘 감사한 마음이 든다.
무엇보다 다시금 그간의 기록을 돌아보며, 포기하지 않고 끝까지 잘 완주해낸 나 자신에게도 “정말 잘 해냈다”는 말을 해주고 싶다.
이 경험은 분명, 앞으로의 선택과 도전 앞에서 나의 삶 전반을 관통하며 다시 나를 움직이게 만들어 줄 중요한 기준이 될 것이다.
1차 합격


오픈 미션를 마친 후, 매일 10시간 씩 최종코딩테스트 준비를 하던 중 어느덧 1차 합격자 발표날이 되었다.
1차 합격과 최종합격 모두 결과를 기다리는 동안 조금이나마 의심과 불안, 후회가 없도록 최선을 다해 자신감이 있었지만, 당일 아침부터 손이 저릿저릿하며 심장이 붕떠있는 느낌이 들었다.
그래서 늘 오전 9시에 5시간동안 1문제를 풀고 1시간을 회고하고 정리하는 시간을 가졌지만, 29일 만큼은 이 루틴을 1시간 늦게 시작했다. 역시나 문제 하나를 시작하니 5시간 동안 아무런 감정을 느끼지 못한채 온전히 문제를 푸는것에 집중할 수 있었다.
그리고 대망의 오후 3시가 되자 카카오톡 우테코 오픈톡방에는 벌써 여러 합격자분들의 소식이 전해졌지만 나의 메일창에는 아무런 소식이 없었고, 약 10분 뒤 합격 메일을 확인했다. 1000명이 넘는 모든 지원자에게 메일을 보내다보니 늦게 오는 경우가 있다는것과 그 순서가 합격의 유무와 관련이 없다는걸 알지만 새로고침을 반복해서 누르던 10분이 마치 플랭크를 하듯 아주 느리게 시간이 흘러갔고 손이 저릿저릿 심장이 쿵쾅거렸다. 작년 7기에는 오후 11시경에 결과가 나왔다는 분도 계셨고, 올해는 다음날 새벽에 연락이 왔다는 분도 계셨다.
작년 7기를 떨어진 이후 1년 가까운 시간을 8기 우테코 지원을 준비했고, 프리코스 기간 동안 오직 우테코 단 하나만을 위해 달려왔었기에 1차는 분명 합격할 것 이라는 확신이 있었지만, 매번 실제 결과를 보기 전까지는 늘 짜릿한 것 같다.
한달간 미리 최종코딩테스트를 준비하며 점차 텐션이 떨어지고 이었지만, 실제 합격 소식을 눈으로 본 만큼 다시금 최종코딩테스트 준비에 대한 동기가 더욱 불탔다.
최종 코딩 테스트 준비
작년 7기의 경우 1차 합격 발표가 나온 뒤 약 7일 정도 후 바로 코딩테스트를 쳐야했지만 올해는 약 10일 가량 시간이 있었다.
작년 코딩테스트 경험과 두번의 프리코스, 오픈미션의 자체 프리코스를 더해 이미 프리코스 미션들을 최소 4번씩 풀어보았기 때문에 약간의 자신감이 있었다.
그래서 1차 결과가 나온 이후 결과를 보고 준비를 할까도 싶었지만 그 어떠한 후회도 남기고 싶지 않았고, 8기 프리코스를 정말 열심히 진행했기에 1차 합격에 대한 확신이 있어 그 어떤 타협과 실패에 대한 가정없이 오픈미션이 끝난 이틀 뒤부터 바로 최종코딩테스트 준비를 시작했다. 우선 풀어볼 문제들을 노션에 정리를 했다.
모든 문제들은 우테코 깃허브나 구글링을 통해 찾을 수 있었지만 작년 7기 문제들은 찾을 수 없었다.
4주차 편의점 미션의 경우 작년 프리코스를 준비하며 정리를 해놓은것이 있었지만 최종 코딩테스트 문제를 찾을 수 없었다. 7기 최종 코딩테스트 문제는 제외를 할까도 싶었지만, 너무나 좋은 양질의 문제였어서 포기할 수 없고, 작년 7기 백엔드 합격자분들의 깃허브와 합격후기들을 통해 문제를 만들어 보려했지만 너무 빈약했다.


그래서 7기 합격자분들의 합격 후기와 깃허브를 통해 메일로 직접 연락을 드렸고, 결국 한 7기 크루분에게 문제 가이드 문서를 얻을 수 있었다.
거의 1년이 지난 자료임에도 불구하고 퇴근 후 시간을 써서 찾아봐 주셨고, 직접 가지고 계시지는 않았지만 주변 크루분들을 통해 자료를 전달해 주셨다.
그리고 꼭 합격한 뒤 커피챗을 신청해 달라는 말씀과 함께, 합격하면 밥을 사주겠다는 응원도 받았다.
너무 큰 힘이 되었고, 꼭 합격한 뒤에는 내가 밥을 대접하고 싶다는 생각이 들었다.
처음 문제 가이드를 보내주신 분뿐만 아니라, 다음 날에는 연락을 드린 모든 분들로부터 답장을 받았고 많은 응원을 받을 수 있었다.
바쁘신 와중에 부담스러우실까 봐 최대한 공손하게 메일을 보냈는데, 모두들 따뜻하게 대해 주셔서 우테코 크루분들의 따뜻함을 다시 한번 느낄 수 있었다.
꼭 합격한 후 연락을 드린 분들께 안부 인사를 전하고, 시간이 된다면 함께 식사를 하며 여러 이야기를 나누고 싶다는 생각이 들었다.
문제 풀기



그 후 총 8년간의 모든 우테코 프리코스 미션들을 최소 다섯 번 이상씩 풀어보며 회고와 정리의 시간을 가졌다.
처음 두 바퀴는 시간을 재지 않고, 기능 구현과 리팩토링, 테스트 코드 작성을 목표로 풀어보았다.
이 과정을 통해 헷갈리던 문법과 컨벤션을 노션에 정리했고, 시간이 오래 걸렸던 부분들을 복기하며 개선점을 기록했다.
리팩토링과 설계를 다양한 관점에서 개선할 수 있다는 것을 다시금 느끼며, 프리코스에서의 배움을 복습할 수 있었다.


그 후에는 5시간이라는 제한 속에서 다시 한 번 기능 구현, 리팩토링, 테스트 코드 작성을 목표로 문제를 풀어보았다.
이 과정을 통해 거의 필수적으로 적용되는 여러 패턴과 코드 템플릿을 정리할 수 있었고, 실제 코딩 테스트에서의 행동 강령을 구체화할 수 있었다.
최종 코딩 테스트 시작 전의 마음가짐, 시간대별 체크 사항, 상황별 행동 강령, 리팩토링 우선순위 등을 정리하며 긴장이나 잘못된 몰입으로 인해 절대 망하거나 포기하지 않기 위한 준비를 했다.


또한 공통적으로, 조금이라도 생각하는 시간을 단축하기 위해 자주 사용하는 내용들도 따로 정리해 두었다.
최종 코딩테스트 후기


13시부터 18시까지 총 5시간 시험이 이루어졌으며, 이번 문제인 '행성로또'는 3주차의 로또 문제와 거의 유사했다.
하지만 이번 8기 선발과정은 기존 프리코스와 다르게 4주차 대신 오픈미션이 진행되었던 만큼, 이번 8기 최종코딩테스트에는 달라진 점들이 몇 가지 있었다.


우선 기존에는 5시간 모두 문제를 풀고 최종 제출의 소감문을 최종 제출 시 첨부하면 끝이었다.
하지만 이번에는 17시까지 4시간 동안 문제를 풀어야 했고, 남은 1시간 동안 소감문을 작성하는 것이었다. 또한 '도전 과제'가 추가되었다.
기본적으로 구현해야 하는 요구 사항을 모두 충족한 뒤 2가지 중 하나를 선택해서 도전을 해야 했다.

도전 과제를 선택하는 데에는 큰 어려움이 없었다.
왜냐하면 문서 최앞단에 이미 '최종코딩테스트의 목적'이 있었기 때문이다.
[최종 코딩 테스트의 목적]
"프리코스에서는 3가지 기본 미션과 오픈 미션을 통해 주어진 요구 사항의 구현을 넘어 본인만의 도전을 함께 수행하였습니다. 최종 코딩 테스트는 이 경험을 본인의 힘으로 해냈음을 증명하는 시간입니다."
나는 프리코스 과정, 특히 오픈미션을 진행하며 리팩토링과 테스트코드에 대해 가장 많은 도전과 경험을 하며 성장했기에 'TDD를 통한 리팩토링'을 보여주고자 했다.
무엇보다 내가 오픈미션의 주제로 TDD를 선택하게 된 첫 시작이자 핵심 이유가 '로또'였기 때문이다.
그렇게 기능 구현 목록과 도전 과제를 결정한 후, TDD로 최종 코딩 테스트를 시작했다.
기존 로또 문제에서 약간 요구사항이 달라진 '행성 로또'는 오픈미션을 통해 얻은 여러 교훈 중 '요구사항 분석 도구로서의 TDD'를 적용해보기 너무 좋은 문제였다.
또한 모든 기능 구현을 마친 뒤, 제공된 테스트와 실제 콘솔 출력을 해보려던 차 출력 메서드를 수정할 수 없고, 정해진 메서드를 사용해야 했음을 다시금 발견했다. 하지만 "리팩토링 안전망으로서의 TDD" 덕분에 큰 정신적 충격과 멘탈 붕괴 없이 빠르게 대처할 수 있었다.

https://github.com/softmoca/java-planetlotto-8/tree/softmoca
GitHub - softmoca/java-planetlotto-8
Contribute to softmoca/java-planetlotto-8 development by creating an account on GitHub.
github.com
물론 시간 제한 속에서 더 개선하고 싶었던 부분들은 분명히 많이 남아있었다.
하지만 그저 프리코스와 오픈미션에서 내가 경험하며 얻은 여러 배움들을 최종 시험에 온전히 잘 적용하며 그 효과를 느낀 것 만으로 시험을 잘 끝마쳤다 생각한다. 무엇보다 오픈 미션에서 얻은 교훈을 너무나 잘 적용했다는 점에서 너무 너무너무 뿌듯했다 !
하지만 한편으로는, '프리코스와 오픈미션에서 경험한 TDD'를 그대로 보여주기보다 '필요한 기능을 빠르게 구현한 뒤, 미리 준비해 두었던 템플릿을 기반으로 리팩토링'했다면 결과물의 완성도는 더 높아질 수도 있었겠다는 아쉬움도 남았다.
그럼에도 불구하고 이번 최종 코딩 테스트에서 내가 가장 중요하게 여긴 것은 단순히 “더 잘 보이는 선택”이 아니라, "그동안 내가 실제로 고민하고, 부딪히며 체득한 경험들을 코드에 녹여내는 것"이었다.
정답을 맞히는 시험이라기 보다, 프리코스와 오픈미션을 통해 쌓아온 사고 과정과 태도를 나의 힘으로 증명하는 자리였다고 생각하면, 이번 선택과 과정은 충분한 의미가 있었다고 생각한다.
완벽하진 않았지만, 분명히 성장의 방향은 틀리지 않았다는 확신을 남겨준 시간이었다.
https://github.com/softmoca/java-planetlotto-8/tree/refactor_softmoca(코딩테스트 이후 추가 개선하고 싶었던 부분을 반영한 브랜치)
GitHub - softmoca/java-planetlotto-8
Contribute to softmoca/java-planetlotto-8 development by creating an account on GitHub.
github.com
마치며
최종 코딩테스트 제출 후 작성한 소감문으로 후기를 마치려한다.
작년 7기 프리코스와 최종 코딩테스트는 저에게 “나는 한번 꽂히면 끝까지 몰입할 수 있는 사람”이라는 사실을 처음으로 확인하게 해준 경험이었습니다.
동시에, 그 몰입이 항상 올바른 방향을 향하지는 않는다는 것도 배웠습니다.
합격에 대한 압박감 속에서 저는 점점 정답을 맞히는 감각에 집착했고, 그 조급함은 설계와 원칙을 흔들었습니다.
단 하나의 실패한 테스트를 고치겠다는 마음이 전체 구조를 무너뜨렸던 순간은 아직도 선명합니다.
그때의 아쉬움은 단순한 불합격이 아니라, 배운 방향을 스스로 놓쳐버렸다는 데서 왔습니다.
그 이후 저는 제 성장 방식 자체를 다시 견고하게 정리하며 확립했습니다.
저의 단기, 장기 목표는 무엇이고, 최종 꿈은 무엇인지, 제가 진정 무얼 위해 해당 활동을 하는지에 대해 하나씩 정리해 보았고, 주기적으로 메타인지와 회고를 통해 저 자신을 되돌아보는 시간을 가졌습니다.
당시 “기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.”라는 문구가 저에게 족쇄로 다가왔다면 현재의 저에게는 날개를 달아주는 문구처럼 느껴졌습니다.
“정답을 찾아라”가 아니라 미션은 마음껏 성장하는 놀이터로서 “너의 사고를 제한하지 마!”로 다가와서 너무 즐겁게 몰입하며 성장할 수 있었습니다.
덕분에 올해 8기 프리코스를 시작하며, 7기 활동을 하던 당시 족쇄처럼 느껴졌던 “기능 요구 사항에 없는 내용은 스스로 판단하여 구현한다”라는 문장이 이번 8기에는 저에게 날개를 달아주는 문구처럼 다가왔습니다.누구도 모르는 숨어있는 정해진 정답을 찾는것 보다 , 저의 사고를 설계로 증명하는 과정으로 미션을 바라보게 되었기 때문입니다.
이번 프리코스에서 저는 구현보다 먼저 도메인의 의미를 해석하고, 객체의 책임과 협력 관계를 고민하는 데 몰입했습니다.
문자열 계산기에서 단순한 예외 처리 대신 입력의 의미 차이를 고민했고, 자동차 경주와 로또 미션에서는 검증의 책임, 메시지 중심 설계, 그리고 제거하는 리팩토링의 가치를 몸으로 배웠습니다. 작년에는 구조를 늘려야 안전하다고 느꼈다면, 올해의 저는 불필요한 구조가 오히려 불안을 만든다는 걸 느끼기도 했습니다.
특히 오픈미션에서의 TDD 경험은 제 사고를 결정적으로 바꾸었습니다.
테스트는 단순히 버그를 잡는 도구가 아니라 요구사항을 탐색하고, 설계를 이끌며, 리팩토링을 가능하게 하는 안전망이라는 사실을 직접 체득했습니다. 테스트를 먼저 작성하며 애매한 요구사항이 구체적인 규칙으로 드러났고, 살아있는 테스트 덕분에 구조 변경을 두려움 없이 시도할 수 있었습니다. 동시에 모든 테스트가 같은 가치를 가지지는 않으며, 상황에 맞는 균형이 중요하다는 것도 배웠습니다.
저는 여전히 부족하지만, 흔들릴 때 왜 흔들리는지 설명할 수 있고 다시 방향을 잡을 수 있는 사람이 되었습니다. 작년의 저는 정답을 향해 달렸고, 올해의 저는 문제의 의미를 해석하고 그 의미를 코드와 테스트로 책임지려 했습니다. 이것이 제가 이번 프리코스를 통해 얻은 가장 큰 성장이라고 생각합니다.
이러한 이유로 저는 이번 최종 코딩테스트에서 "TDD로 미션을 진행하며 TDD 사이클을 통해 리팩토링" 하는 도전을 선택하게 되었습니다.
1. 리팩터링: 작동은 그대로 유지하면서 코드 품질을 높이는 방향
2. 기능 확장: 기본 기능 위에 새로운 기능을 추가하는 방향
두 방향성이 있었지만 이번 8기 프리코스를 진행하며 특히나 저에게 큰 감명을 주었던 TDD를 활용할수 있는 "리팩터링"을 도전하게 되었습니다.
저는 분명 오픈미션을 진행하며 총 4번의 회고에서 "TDD는 너무 좋은 도구지만 시간이 생각보다 많이 걸리니, 기간이 짧은 경우는 많은 고민을 하고 도입해야겠다" 라는 생각을 했었습니다.
하지만 최종 미션 가이드에 대한 안내와 문서를 읽으며 결정을 내렸습니다.
[최종 코딩 테스트의 목적] - "프리코스에서는 3가지 기본 미션과 오픈 미션을 통해 주어진 요구 사항의 구현을 넘어 본인만의 도전을 함께 수행하였습니다. 최종 코딩 테스트는 이 경험을 본인의 힘으로 해냈음을 증명하는 시간입니다. "
하지만 근거없는 충동이 아니라, 1분간 명상을 하며 "7기 최종 탈락 후 노력한 저의 1년과 올해 8기 프리코스에, 오픈미션에 몰입한 저 자신"을 떠올리며 결심을 할 수 있었습니다.
그 후 미션을 진행하며 TDD 사이클을 끝까지 지키기 위해 노력을 했습니다. 하지만 최종 코딩 테스트 진행하며 오픈미션에서 느꼈다 싶이, OOP와는 약간의 방향성이 달라짐을 느꼈습니다. 오픈미션의 시간이 아니었더라면 이런 느낌을 느꼈을 때 바로 TDD를 포기했었을 것이지만 전 이미 오픈 미션을 통해 2권의 도서와 4번의 실제 프로젝트 적용과 회고를 통해 충분히 인지를 하고 있어 크게 두렵지 않았습니다.
또한 변경된 요구사항에 대해 '프리코스를 통해 얻은 교훈인 [요구사항 분석 도구로서의 TDD]'를 적용해보며 다시금 그 효과를 느낄 수있었습니다.
또한 모든 기능 구현을 마친 뒤 , 제공된 테스트와 실제 콘솔 출력을 해보려던차 출력 메서드를 수정할 수 없고, 정해진 메서드를 사용해야 했음을 다시금 발견했습니다.
하지만 "TDD의 리팩토링 안전망으로서의 TDD"덕분에 큰 정신적 충격없이 빠르게 대처할 수 있었습니다.
마지막으로 최종 코딩테스트를 모두 마치고 제출 버튼을 누르는 순간, 제 마음은 조금 이상했습니다.
긴장감이 완전히 가시기보다는, 그보다 먼저 “여기까지 정말 열심히 왔다”는 감각이 더 크게 남았습니다.
기출 문제들을 반복해서 풀며 준비했던 시간들이 스쳐 지나갔고, 단순히 문제를 맞히는 연습이 아니라 제 사고를 정리하고 우선순위를 세우고 설계하는 모습들이 떠올랐습니다.
작년에는 문제를 마주하면 조급함이 먼저 튀어나왔는데, 이번에는 요구사항을 정확히 이해하고, 작은 단위로 확인하며,제가 선택한 설계와 구현을 꼼꼼히 검증하고, 시간 안에 무엇을 선택하고 무엇을 포기할지까지 판단하려는 방식이 자연스럽게 나오고 있음을 느꼈습니다.
무엇보다 작년에 비해 스스로가 많이 성장해 있다는 감각이 분명히 들었습니다.
물론 시간 제한 속에서 더 개선하고 싶었던 부분들은 분명히 많이 남아 있습니다.
AppConfig도입, 방어적 복사와 불변성을 꼼꼼히 모두 챙기지 못한것, 에러메시지 Enum을 통한 관리, 파싱 클래스 도입 후 책임 분배, 일반화 로직으로 깔끔하게 메서드 및 코드 로직 정리, 빈약한 책임주도 설계, 풍부한 VO 및 도메인 도입, DTO 도입 등등 너무 많이 개선하고 싶었습니다.
제출 직전까지도 “여기를 이렇게 바꾸고 싶다....”라는 생각이 계속 들었고, 다 하지 못했다는 아쉬움도 남았습니다.
그럼에도 예전과 다른 점은, 그 아쉬움이 후회로만 남지 않는다는 것입니다.
이미 머릿속에서는 내일 새로 브랜치를 파서 코드를 다시 열어보고, 온전히 리팩토링하며 더 좋은 코드로 다듬는 장면을 떠올리고 있습니다.
그런 시간을 생각하면 묘하게 설레고 신나며, 오히려 즐거운 마음이 듭니다.
어쩌면 저는 결과보다도 이런 성장하는 과정을 가장 좋아하는 사람인지도 모르겠습니다.
저를 이렇게 성장시켜주시고, 이 과정 자체를 즐길 수 있게 해준 우아한테크코스 운영진분들에게 감사하다는 말을 꼭 남기고 싶습니다.
정말 많이 감사합니다 :)
'외부활동 > 우아한테크코스 [프리코스]' 카테고리의 다른 글
| [우아한테크코스 8기] 프리코스 오픈미션 최종회고 (0) | 2025.11.26 |
|---|---|
| [우아한테크코스 8기] 프리코스 오픈미션 4차 회고- 편의점 TDD (0) | 2025.11.22 |
| [우아한테크코스 8기] 프리코스 오픈미션 3차 회고- 로또 TDD (0) | 2025.11.19 |
| 테스트 주도개발 TDD 실천법과 도구 정리 도서 요약[FAQ & 설계사고과정] (0) | 2025.11.13 |
| 테스트 주도개발 TDD 실천법과 도구 정리 도서 [핵심 요약] (0) | 2025.11.13 |