본문 바로가기메뉴 바로가기


글 작성에는 톡플랫폼개발1팀 leean과 moka가 함께해 주셨습니다.

안녕하세요, 2021 카카오 여름 인턴십 프로그램에 참여했던 moka와 leean입니다.
지금은 인턴십을 마치고, 카카오톡의 톡서랍 플러스 서비스를 개발하는 톡드라이브파트에서 열심히 공부하고, 배우며, 성장하는 중입니다.

지난 두 달 동안 좋은 기회로 인턴십에 참여하게 되어 많은 것을 배울 수 있었습니다.
인턴십 과정은 어떻게 진행되었는지, 어떤 어려움을 겪었고 어떻게 해결했는지, 결과적으로 어떻게 성장했는지를 공유하고자 합니다.

이 글이 출발을 준비하는 개발자분들에게 작은 이정표가 되었으면 좋겠습니다.


인턴 과정의 성장곡선

아마도 많은 인턴 크루들이 공감할 성장 곡선입니다.

카카오에서의 첫걸음

인턴십을 본격적으로 시작하기 전에 카카오의 문화에 적응하고, 팀에 녹아들 수 있도록 여러 프로그램들이 진행됩니다.

Hello, Kakao에서는 배정된 파트장/멘토와 처음 만나는 자리입니다. 어떤 파트에 배정되었는지, 어떤 서비스를 개발하는 파트인지를 알게 됩니다. 저는 이 때 톡서랍 서비스를 처음 알게 되어서 개발 전에 미리 사용해 보고 익숙해지는 시간을 가질 수 있었습니다. 또, 책을 추천해 주시고 보내주시는데 이때에 받은 책이 인턴십 기간 동안 많은 도움이 됐습니다.

온보딩에서는 사내에서 꼭 지켜야 할 원칙들을 배우고, 사내 포털과 개발 플랫폼을 사용하는 방법들을 배우게 됩니다. 또, 인턴 크루들과 gather town에서 대화하는 시간도 가지면서 친해질 수 있었습니다.

파트에서는 여러 번의 온보딩을 진행했습니다. 간단한 티타임을 통해서 파트원들과 인사도 하고, 어색하지만 대화도 하면서 파트 분위기에 익숙해지는 시간을 갖게 됩니다. 또, 톡서랍의 비즈니스와 시스템 구조에 대해서 배우고, Q&A를 할 수 있는 시간과 파트에서 사용하는 기술 스택에 대해서 배우는 시간을 통해서 과제를 시작하기 전에 빠르게 도메인 지식과 기술을 익힐 수 있었습니다. (짧은 시간에 많은 내용을 듣느라 뇌 용량의 한계를 느꼈지만 이때의 내용들이 지금도 업무에 도움이 되고 있습니다..!)

코로나로 인해 이 모든 과정이 온라인으로 진행되어서 인턴십을 진행하고 있다는 실감이 나지 않아 아쉽기도 했지만, 짧은 기간 동안 카카오 문화에 적응할 수 있던 시간들이었습니다.

목표는 분명히, 공부는 확실하게!

인턴십 과제가 정해지고 난 후에 다음과 같은 과정을 수행했습니다.

1. 과제의 의미 이해

과제를 이해하기 위해서 파트에서 운영하는 위키를 읽으면서 개발 규칙과 도메인 지식, 시스템 구성에 익숙해지는 시간을 가졌습니다. 어려운 부분은 멘토님과의 면담 시간에 질문을 하고 해당 이슈에 대한 히스토리를 공유 받아 이해하는 과정을 거쳤습니다. 이 부분이 친구들과 프로젝트 할 때와의 가장 큰 차이점이었습니다. 친구들과 프로젝트 할 때는 다른 사람이 진행하던 일을 이어받는 경우가 드물지만, 회사에서는 해당 이슈가 만들어지기까지 여러 사람의 의견들이 쌓이기 때문에 그 히스토리를 통해 정확하게 이해하는 과정이 필요합니다. 이 과정을 통해 과제가 가지는 의미를 이해하려고 노력했습니다.

2. 프로젝트 기획

기존에 운영되던 As-is와 과제를 통해 발전될 To-be를 비교하면서 과제의 당위성을 찾고, 요구 사항을 분석하고, 필요한 기능들을 고민했습니다.

3. 기반 지식 공부 및 코드 분석

카프카, MongoDB, JUnit5, Java 등 과제를 하기 위해 필수로 알아야 하는 기초 지식이 있었기 때문에 빠르게 공부하는 시간을 가졌습니다. ‘Hello, KAKAO’에서 추천해 주신 책들을 읽고 documents를 읽으면서 다양한 지식들을 공부하고 위키에 정리하며 공부한 내용을 기록했습니다.

MongoDB를 설계할 때 처음 고민했던 내용은 컬렉션의 분리, document의 생성 단위입니다. RDBMS는 테이블의 attribute와 그 타입이 정해져 있어서 규칙에 맞는 데이터만 넣을 수 있지만, MongoDB는 document 타입으로 저장이 되어 attribute와 타입이 달라도 자유롭게 삽입할 수 있습니다. ‘따라서 이 특징을 활용해 다양한 document를 하나의 컬렉션에 저장 하고, mode 값을 통해 특성을 구분하면 MongoDB의 특징을 잘 살린 설계가 되는 걸까? 아니면 컬렉션이 커지고  mode 값으로 분기를 하는 쿼리 때문에 성능 저하의 원인이 될까?’ 이런 고민들을 하면서 각 고민점들에 대한 근거를 정리하고 멘토님께 조언을 구하면서 더 나은 방법을 찾기 위해 고민하는 과정들을 거쳤습니다.

또한, 기존의 방대한 양의 코드를 이해하는 시간도 필요했습니다. 수많은 클래스의 관계를 파악하기 어려웠고, 낯선 Java 문법들이 많아 공부해가며 코드의 의미를 이해하는 과정을 거쳤습니다.

4. 요구사항 정의

과제의 의미에 맞게 기능을 제공하기 위해서는 어떤 요구 사항들이 만족 되어야 하는지를 고민했습니다. 또한, 처음에 기획한 내용 중에서 기존 코드 구조에 적용하기 위해 변경이 필요한 부분들을 찾고, 다른 해결책을 멘토님과 함께 고민하는 시간도 가졌습니다.

5. DB 모델링

정의한 요구 사항을 만족시키도록 데이터베이스를 모델링하는 과정이었습니다. NoSQL을 처음 경험하면서 RDBMS와 NoSQL의 차이점을 공부하고, NoSQL의 장점을 살릴 수 있게 설계하려고 노력했습니다.
구현 단계에서 $in 쿼리를 수행하는 부분에서는 성능 저하가 나는 이슈가 있어 몇 번의 모델링 수정 작업을 거쳐야 했습니다.

6. 구현

이전의 단계들은 개인적으로 프로젝트하는 과정과 비슷하게 진행된다고 느끼실 수 있을 것 같습니다. 하지만 구현 단계에서부터 많은 차이점이 생기게 됩니다.
팀 내에서는 여러 사람이 협업하더라도 한 사람이 작성한 코드처럼 구현되도록 coding style을 맞춰 작업합니다. 또, 혼자서는 놓칠 수 있는 오류를 잡기 위해 PR(이하 Pull Request)는 두 명 이상의 리뷰를 받아야 합니다.

활발한 코드 리뷰는 많이 성장할 수 있는 발판이었습니다. 개인적으로 프로젝트를 진행할 때 기능 구현을 목표로 하고, 설계를 고민해 본 경험이 없었는데 가독성이 좋은 코드, 중복이 없는 코드, 확장성을 고려한 코드를 작성하기 위해서는 어떻게 해야 하는지 리뷰를 받고 반영하면서 짧은 시간 동안 많이 발전할 수 있었습니다.

인턴십이 끝나고 이 과정들을 돌아보니 기반 지식을 공부했던 과정이 후회되고 아쉬움이 남습니다. 주어진 과제를 끝내야 한다는 조급한 마음에 ‘인스턴트식 공부’를 했기 때문입니다.

블로그와 공식 문서, 책을 찾아보지만 어설프게 이해한 채로 넘어가고, 당장 적용하기 위한 정도로 적당히 공부했습니다. 이렇게 공부하고 과제에 적용할 때는 이해하고 사용했다는 착각을 하게 됩니다. 하지만 같은 내용을 다른 곳에 적용할 때, 매번 어려움을 겪게 됩니다. 또, 정확한 동작 과정을 이해하지 못해 예상치 못한 문제가 생길 수 있고, 대비가 전혀 안 되어있는 채로 문제에 직면하게 됩니다. 

실제로 병렬 프로그래밍을 잘 이해하지 못한 채로 ThreadLocal을 적용한 적이 있는데, 이 부분이 실 서비스에 배포가 되어 오류를 일으키기도 했답니다..😭

이후로 개발할 때마다 이때를 떠올리며 정확하게 이해하고 공부했는지 돌아보려고 노력하고 있습니다.

일정 산정은 냉정하게!

발표 준비와 면접 준비를 제외하면 과제를 수행할 수 있는 시간이 한 달 남짓이었는데, 배경지식이 없던 카프카와 MongoDB 등을 공부하면서 초반에 기술 허들이 있었습니다. 주어진 시간 내에 공부하고 과제까지 완성하기 위해서 일정을 빠듯하게 잡고 일주일의 공부 시간을 가진 뒤 설계와 개발을 시작하게 되었습니다.

개발해야 하는 과제의 범위는 넓고, 주어진 시간 안에 모두 완성하기에는 현실적으로 불가능해 보였지만 긍정 회로를 돌리고 비현실적인 일정을 잡곤 했습니다. 특히, 코드 리뷰를 받고 피드백을 반영하는 시간을 고려하지 못해서 하루 만에 가능할 줄 알았던 이슈를 2주 동안 개발하는 때도 있었답니다😱

이렇게 잘못된 일정으로 힘들어하고 있을 때, 파트장님은 몇 가지 조언을 해주셨습니다.
1. 과제를 완성하는 것이 중요한 게 아니라 과제를 하는 과정이 중요하다.
2. 본인의 역량을 잘 측정할수록 일정 산정에 도움이 된다.

이때의 경험으로 story point를 산정할 때, 개발 일정뿐만 아니라 코드 리뷰하고 모든 phase에 배포하고 테스트하는 과정까지 고려해서 최대한 정확하게 산정해야 한다는 것을 배울 수 있었습니다. 

고민은 최선을 다하기 하지만 너무 길지 않게!

저는 인턴십 과제를 하면서 자바를 거의 처음 사용해 봤습니다. 따라서 코드를 작성하면서 이게 맞는 방법인지, 더 나은 방법은 없는지에 대한 고민을 많이, 그리고 오래 했습니다. 최선을 다해서 찾아보고 고민했지만, 아무래도 개발 경험이 짧은 제 지식은 한계가 있고 일정 시간 이상 고민해도 더 나아지지 않음이 느껴졌습니다. 그래서 제가 내린 결론은 최선을 다해서 고민했으니까 일단 PR을 올려보자였습니다.

파트마다 다르겠지만, 모카와 저는 완전히 개별의 과제가 아닌 파트에서 실제로 서비스하는 코드에 기능을 덧붙이는 과제를 받았습니다. 카카오에서 실제로 서비스하고 있는 코드에 제가 작성한 코드를 추가한다니.. 영광스러운 순간의 첫 커밋 메시지는 30분을 고민했습니다.

하지만 제 첫 PR은 138개의 코멘트라는 파트 내 신기록을 달성하게 됩니다…..

타인의 코드를 계속 보는 게 정말 쉬운 일이 아닐 텐데 꼼꼼하게 봐주신 파트장님과 멘토님, 이 자리를 빌려서 다시 한번 정말 정말 감사하다고 말씀드리고 싶습니다.🙇‍♂️ 스스로 좀 더 고민해 볼 걸 하는 부분도 있었지만, 리뷰를 받으면서 공부하고 고쳐나갔던 부분이 정말 많은 도움이 되었습니다.

저는 자바에 익숙하지 않았기 때문에 방대한 자바의 여러 기능 중에서 어떤 부분을 적용해야 할지에 대한 판단이 어려웠습니다. 예를 들어 다른 방법이 있음에도 리플렉션을 불필요하게 사용했던 경험이 있습니다. 이렇게 기능을 구현하는 더 나은 다른 방법이 있을 때는 코멘트해 주시면서 “이런 방법은 어떨까요?” 하고 제안해 주시고 어떤 부분을 공부하면 좋을지 알려주셨습니다.

첫 PR에서 고쳐도 고쳐도 추가되는 코멘트에 눈물의 시간😿도 있었지만 리뷰를 받으면서 공부하고, 코드를 수정해나가는 과정에서 많이 성장할 수 있었다고 생각합니다. 그리고 인턴십 초기와 비교했을 때 혼자 얼마나 시도해 본 뒤 질문해야 하는지에 대한 감이 생겼고, “왜 그땐 그렇게 생각했는지”에 대해 설명하는 소통 방법도 알게 되었습니다.

한번 알려주신 부분은 같은 코멘트를 받지 않도록 주의해서 코드를 작성하려고 노력했고, 코멘트의 개수가 점점 줄어들 수 있었습니다. 시간이 촉박해서 넘어간 부분도 있겠지만요…

코드 리뷰를 받으면서 공부했던 부분들은 지금 동기분들과 이펙티브 자바 스터디를 할 때도 많은 도움이 되고 있습니다.

피드백의 중요성

카카오 인턴십 과정에는 두 번의 파트 내 발표와 한 번의 최종 발표가 있습니다.

톡플랫폼개발팀 인턴 리더셨던 펄이 티타임을 자주 마련해 주셔서 인턴 동기 분들과 친해질 수 있었는데, 한 분의 아이디어로 최종 면접 전까지 모의 PT를 하였습니다. 서로 피드백을 주고받은 경험이 최종 면접에 정말 많은 도움이 되었습니다.

파트 내에서 두 번의 발표를 했고, 멘토님께서도 계속 피드백을 해주셨습니다. 하지만 파트원 들은 저희가 진행한 과제의 도메인을 잘 알고 계시기 때문에 과제에 대한 설명이 부족해도 어느 정도 이해 가능한 부분이 있었습니다. 면접관분들은 다른 파트/팀에서 오시기 때문에 처음 들어도 과제에 대해 알 수 있도록 충분한 설명이 필요했습니다.

설명이 부족해서 이해가 어려운 부분들은 동기분들과의 피드백을 통해서 찾을 수 있었습니다. 또한, 장표 구성에 대한 아이디어, 불필요하게 설명이 긴 부분이나 PT에서 나올만한 질문 등 전반적인 피드백을 주고받을 수 있었고, 결과적으로 더 나은 PT를 완성할 수 있었습니다. 그리고 다른 인턴분들은 어떤 과제를 하는지, 어떤 과정을 겪었는지 궁금했는데 모의 PT를 통해 알 수 있어서 좋았습니다.

저는 발표할 때 굉장히 긴장하는 타입인데, 동기분들과의 수많은 연습을 통해 실전에서 덜 긴장할 수 있었던 것 같습니다. 만약 이 글을 읽는 독자분들이 다음 인턴십에 참여하게 되신다면 동기분들과 모의 PT는 꼭 하시기를 추천드립니다.

마무리

인턴십 기간이었던 두 달은 정말 짧았습니다. 두 번은 없을 기회라고 생각하고 최대한 많은 경험을 얻어가려고 노력했습니다.

인턴십을 끝내고 돌아보니, 과제 자체가 평가 대상이기보다는 과제의 역할과 필요성에 대한 이해를 바탕으로 완성해나가는 과정이 더 중요하게 평가된다고 느껴집니다. 이는 단순히 인턴십 과정뿐만 아니라 실제 서비스를 개발하는 데에도 적용이 될 것이라고 생각합니다. 단순히 구현을 목표로 하는 개발자가 아닌, 더 나은 세상을 위해 고민하는 개발자로 성장하고 싶습니다.

가보지 않은 길의 끝에서 돌아봤을 때 크게 성장한 저를 만날 수 있도록 적극적인 태도로 일하려고 합니다. 개발자로서의 첫걸음을 카카오에서, 그리고 톡드라이브파트에서 함께할 수 있어서 정말 행복합니다. 인턴 크루가 아닌 카카오 크루로서 새 시작을 할 준비가 되었습니다. 💪

감사합니다.


함께 하면 좋은 글 🔎

kakao tech
kakao tech Developer Relations at kakao corp.
Top Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codegame
codereview
coding
coding test
Collaborative Filtering
communication
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
culture
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
event
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
KnowledgeGraph
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mobile
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
pair programming
parallel
PBA
performance
planning poker
Platform
polyfill
preview
programming-contest
project
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
session
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업
All Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codegame
codereview
coding
coding test
Collaborative Filtering
communication
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
culture
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
event
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
KnowledgeGraph
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mobile
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
pair programming
parallel
PBA
performance
planning poker
Platform
polyfill
preview
programming-contest
project
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
session
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업

위로