[회고록] 레벨2 전체 회고

왕왕조현·2026년 6월 28일

회고록

목록 보기
8/8
post-thumbnail

안녕하세요!

안녕하세요. 회고를 통해 스스로를 돌아보며 성장하는 개발자 꿈나무 김조현입니다.

레벨1이 끝난게 엊그제 같은데 벌써 레벨2 회고를 쓰고 있다니.... 하는 것이 많아서 그런지 시간이 무척 빨리 가는거 같다 ㅎㅎ...

지난 회고를 작성할 때 까먹은 일들이 많아서 이번 레벨부터는 짧게라도 일기를 써보자고 했는데...... 실패했다 ㅎ

그래도? 작심삼일은 갔다!! 일주일치는 썼네 ㅎㅎㅎ 고생했다 나~

장바구니 미션

레벨1 때와 동일한 방식으로 진행되는 미션이다. 페어 프로그래밍 → 리뷰로 진행되었다. 많은 일들이 있었다. 무슨 미션인지, 어떤 것을 구현했는지를 명시하기 보단 무엇을 배웠는가를 적는게 더 보람차다고 생각한다. 많은 일이 있었던 만큼 많은 것을 느꼈던 미션이다.

interface 추상화의 필요성

기술적으로는 interface로 추상화하는 것이 왜 필요한가에 대해 깨달았다. 추상화를 하지 않았을 경우에는 코드가 서로 강력하게 의존되어, 하나의 코드가 변경되었을 때 다른 코드도 변경해야한다는 불편함이 있다. 간단하게 예를 들면 목 데이터를 사용하여 앱을 만들어 mock data → viewmodel → ui 형식으로 데이터의 흐름이 간다고 해보자. 이 때 mock data가 아닌 서버 또는 로컬로부터 오도록 데이터의 형식을 변경한다고 해보자. 그러면 mock data가 의존되어 있는 viewModel 코드 또한 변경되어야 할 것이다.

하지만 interface로 서비스가 받아오는 데이터를 추상화한다면, viewmodel의 경우는 추상화된 인터페이스를 받게되어 입력받는 data 구현체만 변경하도록 의존성을 분리할 수 있다는 것을 알았다.

과식의 위험성

개인적? 학습적으로는 과식을 하지 않겠다고 느꼈다…. 과식이라 부르는 이 단어는 이번 미션에서 지정된 범위보다 더 나아가 학습을 진행했을 때를 일컬어 부르는 것이다 ㅋㅋㅋ

장바구니 미션에서 도메인 데이터와 UI의 상태를 관리하기 위해 stateHolder만을 사용해도 충분했었다. 하지만 더 나아가 viewModel을 사용했었다. 그랬을 때 flow가 무엇인지, viewModelScope가 무엇인지, 왜 viewModel을 사용하면 구성 변경에서 상태가 살아남을 수 있는지 등 아무것도 모르는 상태에서 viewModel을 사용하니 리뷰어가 남겨준 질문에 대해 아무것도 대답할 수 없었다. 애초에 stateHolder로 구현함에 충분하고, 이를 활용하는 것이 이번 미션의 학습 범위이였기 때문에 내가 배울 수 있는 범위조차 제대로 학습하지 않고 더 나아가 학습하고자 했음을 느꼈다.

비동기 학습에 대한 도전

그리고 코루틴에 대해서도 집중적으로 많이 공부했다. 이번 미션에서 서버 데이터와 연결이 있었기에 커리큘럼에 코루틴 또한 포함되었던 것 같다.

우테코 오기 이전부터 코딩을 배울 때 항상 비동기라는 키워드가 어렵게 느껴졌었다. 내가 아는 코드는 위에서부터 아래로 읽고 순차적으로 동작하는 것인데, 멈추고~ 기다리고~ async~ await~ 뭐라는지 모르겠고 어떻게 동작하는지도 몰랐었다. 어려웠기에 애초에 공부를 하려고 시도를 안해봤던 것 같다.

그래서 이번 기회에 코루틴 즉, 비동기 흐름에 대해 제대로 이해해보는 것을 목표로 했다. 학습할 때는 “코틀린 코루틴의 정석” 책을 정독했다. 물론~ 수업도 열심히 들었다 :)

완벽하게 내가 어떤 상황에서든 코루틴을 야무지게 활용할 수 있다!! 까진 아니더라도, 이 코드가 무엇인지, 어떻게 흘러가는지 등 이해했다고 느낄 정도의 학습을 했다고 생각한다. 그래서 내가 이를 잘 배웠는가를 확인하면서 다른 사람들에게도 알려주기 위해 코루틴을 학습하고, 수업 범위에 겹친 내용을 방과후를 통해 발표하고자 했다.

이는 뒤에서 자세하게 풀어보겠다.

미니 프로젝트

레벨2에서 가장 재밌었으면서도, 가장 알찼던 미션이라고 생각한다. 이 미니프로젝트는 4주차로 구성되었다.

첫 번째 주차

첫 번째 주차에서는 팀 빌딩 및 주제 선정이었다. 이 미션은 먼저 크루원 각자가 하고 싶은 주제에 대해 정하고, 그 주제를 어필해서 팀을 꾸리는 방식으로 팀빌딩을 진행하는 것이었다. 하지만 나는? 엘리와 엠버를 먼저 팀으로 데리고 그 이후에 주제를 선정했다 ㅎㅎㅎ

제임스가 말씀해주시길 이런 의도가 아니였다고 하지만…….. 그렇게 됐다 ㅎㅎ 어쩔 수 없었다~

또한 아두이노도 지원해주며, 안드로이드에 종속되지 않고 다양한 플랫폼을 사용해보라는 취지도 있었기에 “집에서 나올 때 에어컨, 불 자동으로 꺼주기”, “책을 넘겨주는 독서대” 등 소프트웨어가 아닌 주제도 다양하게 나왔었다.

그 중에서 우리 팀이 정한 주제는 “출석앱 개선하기”였다. 현재 우테코 크루들이 사용하는 출석 앱에서는 네트워크가 연결되지 않았을 때 출석 화면이 나타나지 않는 문제가 있었다.

이 문제로 인해 출석 과정에서 거의 대부분의 크루가 불편함을 겪고 있다는 것을 알고, 이를 해결하기 위해 네트워크에 의존하지 않는 NFC를 이용한 출석 앱을 만들어보자! 라는 식으로 결정하였다.

많은 주제들 중 이 주제를 선정한 이유는 크게 두 가지가 있다.

  1. 현재 겪고 있는 문제에 대해 해결하는 MVP를 구현하고 싶다.
  2. 기간이 한달이라는 짧은 기간이며, 이 시간을 온전히 개발에만 쏟는 것이 아니기에 너무 거대한 MVP를 다루기보단 작은 MVP를 구현을 완료하고 싶었다.

또한 주제를 정할 때 어떤 기술을 사용할 것인지, 어느 부분까지 구현할지 등을 구체적으로 정해보며 사용한 기술은 “왜” 사용했는지, 반대로 사용하지 않거나 배제한 구현 범위는 “왜” 그렇게 선택했는지를 명확하게 정해야 했다.

이런 식으로 정한 후 간단하게 주간 보고 발표를 해야했다. 이 때 팀장과 팀 이름을 정했어야 했다. 팀 이름은 Bello라고 정했다 ㅋㅋㅋ.

큰 이유는 없고 미니언즈들의 인사가 귀여웠기에 이를 채택하였다.(우테코 크루 중 벨로라는 사람이 있었다는건 나중에 알게 된 사실이다…..)

팀장을 정해야하는데, 팀장은 매주 보고 발표를 해야했다. 하지만 나는 마이크를 많이 잡고 싶었다. 잘 들어주는 크루들이 있으며, 내가 발표를 연습할 수 있는 최적의 환경이라고 생각했기에 먼저 팀장을 하기로 나섰다.

두 번째 주차

두 번째 주차에서는 사용자 인터뷰 및 가설 검증을 해야했다.

우리가 정한 주제가 모두가 겪는 문제인지, 다른 사람들은 어떻게 생각하는지 다른 사람들에게 인터뷰를 하며 우리가 주제를 선정하며 정했던 가설들이 적절한가를 검증해보는 시간을 가졌다. 미션에서는 사용자 인터뷰까지가 해야할 일이였지만, 우리는 따로 설문지를 만들어 더 많은 자료를 얻고자 했다.

세 번째 주차

세 번째 주차에서는 개발 중간 발표가 핵심이었다.

두 번째 주차까지 우리의 주제와 가설, 사용자들의 반응에 대해 조사했으니 본격적으로 개발에 들어가는 것이다. 이번 미션에서 달랐던 점은 AI 사용을 적극적으로 해도 되는 것이다. 이전 미션에서는 AI 사용을 자제하며 미션을 진행해왔었기에 이 부분이 살짝 크게 다가왔다.

단, AI를 사용하되 “해줘”, “딸깍”으로 사용하는게 아니라 도우미? 정도로만 사용하도록 조건이 있었다. “해줘” 처럼 AI에게 모든 것을 맡기면 결국 내가 하는 것이 없다. 왜 이렇게 만들었는지도 모르게 된다.

“AI에게 다양한 정보나, 기술, 방향에 대한 조언을 얻되 최종 판단은 결국 내가 해야하는 것이다.” 라는 것을 배웠다. 우리 팀도 AI를 사용할 때 무조건 “해줘” 보다는 어떤 기술을 사용해야 하는지 후보를 받고 각 후보를 어떤 상황에서 사용하는게 좋은가? 반대로 어떤 상황에서 사용하는건 좋지 않은가? 등을 물어보는데 많이 활용했다.

또한 개발이 이뤄질 때 어떤 순서로 개발해야 순조롭게 개발을 진행할 수 있을지 물어볼 때도 많이 활용했다.

네 번째 주차

마지막 네 번째 주차에서는 최종 발표다. 지난 4주동안 해온 모든 것을 정리해서 발표하는 시간을 가졌다.

간단한 앱 화면~

어떤 점이 가장 즐거웠는가

이 중에서 나는 인터뷰를 통해 사용자의 의견을 들어보는 과정이 무척 즐거웠다. 우리의 주제가 모든 크루들이 겪고 있는 문제여서 그런 것도 있겠지만, 인터뷰를 한 크루들이 우리 주제에 대해서 정말 깊게 생각하며 피드백을 해주고, 더 있으면 좋을거 같은 점 등을 얘기해줬다.

이 경험을 통해 정말 사용자들이 필요로 하는 서비스를 만드는 것이 내가 원하는 것을 만드는 것보다 재밌구나! 라는 것을 많이 느낄 수 있었다. 비록 이 출석앱이 정말 채택되지는 못했지만 이런 경험을 했다는 것 자체가 너무 의미있다고 생각한다!!!

아쉬운 점

우리는 명확하게 MVP 범위를 설정해서 개발에 큰 난관이 없었다. 하지만 “NFC”라는 특정 기능에 시야가 좁게 잡혀있어, 다른 방향을 생각해보거나 밴치마킹을 생각해보지 못한게 아쉬웠다.

또한 우리가 이번 프로젝트에서 네트워크에 의존되 문제가 발생하는 것을 해결하기 위해 NFC라는 다른 방향을 생각하여 구현하고자 했지만, 알고보니 API 자체가 네트워크에 의존되어 있어서 출석 방법을 바꾸기로는 현재의 문제를 해결할 수 없었다는 것을 나중에 깨달았다. 문제의 원인에 대해 확실하게 알았다면 다른 방법을 생각해볼 수 있었을텐데… 라는 아쉬움도 함께 남았다.

이번 미니프로젝트를 경험삼아 다음 프로젝트에서는 문제에 대한 원인을 더 자세하게 알아보고, 다른 비슷한 서비스, 앱 등이 있는지도 파악해보며 다른 사람들은 비슷한 문제를 어떻게 해결했는가에 대해서 더 알아보면 좋을거 같다는 생각이 들었다.

우리 팀이였던 엘리, 엠버 모두 고생 많았어ㅓ어어어어ㅓㅓㅓㅓㅓㅓ 💯💯💯💯💯💯

방과후

우테코 안드로이드에는 자신이 공부한 것을 앞에서 공유하는 활동인 “방과후”라는 것이 있다. 레벨2를 시작하면서 제임스의 기획하에 이 방과후 활동을 안드로이드 뿐만 아니라 백엔드, 프론트엔드도 함께 해보는 자리를 만들고자 했다.

하지만 생각보다 다른 크루는 우리에게 관심이 없었다 ㅋㅋㅋㅋ. 결국 조금 더 큰 공간에서 우리끼리 하는 것처럼 방과후를 하는 시간을 가졌다. 나는 총 두 번의 방과후를 도전했다.

첫 번째 방과후

불변 객체의 가치” 라는 주제를 가지고 방과후를 진행하였다. 이 주제를 정한 이유는 레벨1을 진행하면서 불변 객체와 가변 객체의 존재를 알게 되었고, 불변 객체를 선호하는 이유에 대한 궁금증이 생겼었다. 이를 알아보고 싶었기에 다음과 같은 주제를 결정하게 되었다.

두 번째 방과후

두 번째 방과후는 “코틀린 코루틴 환경에서의 동시성 문제”라는 주제를 선정하였다. 코루틴은 비동기이다보니 동기 코드처럼 작성했을 때 동시성 문제라는게 발생할 수 있다. 간단하게 설명하면 여러 스레드가 동시에 접근하고 연산하다보니 계산 결과나 과정이 중첩되어 없어지게 되는 문제인 것이다. 코루틴 수업 이후에 사무엘이 이 문제가 왜 생기는거지? 라는 질문을 툭 던졌었다. 나는 이 때 분명 책을 읽고 공부를 했기에 알고는 있었지만, 사무엘이 이해할 수준으로 설명하는 것이 힘들었다.

이 때 아직 내가 설명하기엔 공부가 부족하구나 라는 것을 느끼게 되어, 더 학습하는 것을 목표로 이 주제를 선정하게 된 것이다.

후기

방과후를 한, 두번 정도는 더 해보고자 했지만 그러지 못했던게 살짝 아쉽다. 욕심 좀 내서 매주 발표해야지!! 라는 큰 포부를 가졌지만, 생각보다 쉽지 않았다…. 그래도 이렇게 다른 사람들 앞에서 발표를 많이 해보고자 한 스스로가 기특하다! 덕분에 발표가 무서운게 아니라 즐거운거구나를 크게 느꼈다.

지킴이 수업

레벨2 지킴이로 지원했기에 지킴이 수업을 듣는 특권(필수로 2개 이상 들어야함)을 가질 수 있었다. 지킴이는 우리 팀 내에서 심리적 안정감을 위해 노력하는 역할을 맡는 것이다. 이전 기수에서는 이끔이라고 불렸던 것 같다.

많은 수업이 있었지만, 나는 정서 리딩과 옳은 실패라는 두 가지 수업을 들었다. 늦게 수강신청을 해서 다른 과목이 자리가 없던 영향도 있지만….. 이 두 개가 가장 흥미있었다. 우테코를 하다보면 자연스럽게 사람들과 대화를 많이하고~ 공감도 하고~ 눈치를 볼 때도 있고~ 그렇다. 이 때 불가피하게 정서 리딩이라는 것을 하게 되는거 같은데, 어떻게 하면 더 잘할 수 있을까에 대한 의문이 들어 이 수업이 끌렸던 것 같다.

마찬가지로 옳은 실패라는 것도 제목이 무척 흥미로웠다. 실패인데 옳은 실패가 있나? 실패는 실패지! 라는 생각도 있었다. 하지만 성공한 사람들의 얘기를 들어보면 전부 자신의 실패에 대한 얘기를 한다. 그러면 실패가 뭘까? 옳은 실패라는게 있는걸까? 라는 생각을 하며 듣게 된 것 같다.

실패 컨퍼런스

레벨2가 끝나기 전에 지킴이들끼리 모여 자신의 실패에 대해 얘기하는 시간을 가져보는 실패 컨퍼런스라는게 열렸다. 우리 조는 테리, 고래, 도우너, 라이, 아티로 나를 포함해 6명이었다. 이 시간은 각자의 실패를 서로 공유하는 시간이었다.

팀원 모두가 얘기를 잘 들어주고, 따뜻한 말을 많이 해줘서 무척 기분이 좋았다! 이 때 회고의 실패에 대한 얘기도 나왔었는데, 여기서 회고 모임을 만들면 어떨까? 라는 말이 나와 “야르한 회고 모임”이 탄생하였다.

아직 구체적인 활동은 정해지지 않았지만 주간, 월간 목표를 세우가 각 주마다 주간 회고를 함께 해보는 그런 자리를 만들어보고자 생긴 모임이다. 아마 레벨3부터 시작하지 않을까? 생각한다.

마무리

오랜만에 써보는 회고(일기)다보니 적어놓고 싶은 말이 많았다. 레벨1은 적응하는데 집중을 했다고 생각하면, 레벨2는 내가 어떻게 성장할 수 있을까에 대한 고민이 더 많았던 시기같았다. 무엇을 공부해야하고, 어떻게 공부하고, 어떻게 팀원과 소통해야 할지, 의견이 맞지 않으면 어떻게 내 의견을 전달해야 기분이 나쁘지 않게 전달될까?, 내가 어떻게 하면 발전할 수 있을까? 등 어떻게 나아가야할지에 대한 고민이 많았다.

레벨2를 진행할 때는 정신없이 달리다보니 내 성장에 대해 생각할 틈이 없었지만, 지금와서 돌아보면 레벨1 때보다 기술적으로도 아는게 많아졌지만, 그 이상으로 마음가짐이나 생각의 깊이도 크게 성장했다고 생각한다.

레벨3가 시작되면 반드시 일기를 적어봐야겠다! 레벨2 회고를 작성하는데도 머리가 지끈지끈했다....

레벨2 마지막 수업을 할 때 KPT를 사용해서 회고를 했다. 레벨 0때도 KPT를 사용해 회고했던게 새록새록 기억이 났다. 그래서 이번 회고 글도 오랜만에 KPT를 적어보며 마무리해보겠다.

Keep

  • 학습 뿐만 아니라, 팀원과의 의견 소통에서도 “왜?”라는 질문을 던지기
  • 부끄러워하지 말고 하고자, 하고싶은 일에 대해서는 적극적으로 참여하기

Problem

  • 방과후 수업을 많이 하지 못해 아쉬움
  • 학습 범위보다 과식한 부분

Try

  • 매일 또는 매주 한 일 적어놓기(회고 정리할 때 머리가 무척 아팠다…)
profile
천천히, 꾸준히, 한 걸음씩

0개의 댓글