if(newKrew2023) onBoarding.start()

ethan.mino

ethan.mino

안녕하세요. 스마트채팅개발파트의 ethan(이든)입니다. 온보딩을 마치고, 다양한 챗봇 서비스를 만들고 운영하기 위한 챗봇 플랫폼을 운영하고 개발하는 부서에 합류했어요. 👏

davi.d

davi.d

안녕하세요. 모니터링솔루션파트의 davi(다비)입니다. 카카오의 애플리케이션들에 대한 표준화된 모니터링 툴을 제공하는 부서인 모니터링솔루션파트 소속입니다.

깃헙 링크에서 뉴크루들의 기술 온보딩의 코드를 확인하실 수 있습니다! 👍 2023 뉴크루들은 7주간의 기술 온보딩 과정을 통해 업무에 필요한 기술적 소양과 지식을 배우며 성장했어요.  이번 글에서는 서버 직무의 뉴크루들이 온보딩을 통해 얻은 경험과 성장 과정을 함께 나누어 보고자 합니다.

기술 온보딩 소개

뉴크루들은 서버 직무의 온보딩 기간 동안 자바와 스프링을 중심으로 TDD객체지향, 그리고 웹 서버 구현을 통한 프레임워크의 이해 등 다양한 분야에서 성장할 수 있었습니다.

뉴크루의 성장을 위해 카카오 내외로 많은 분들이 도움을 주셨는데요, 서버 온보딩 교육과정은 넥스트 스텝에서 맡아 주셨습니다.

기술 온보딩은 총 53명의 뉴크루가 참여했습니다. 온보딩 전후 변화를 비교하기 위해 기술 온보딩 시작 전, 서버 뉴크루를 대상으로 설문조사를 했습니다.

서버 개발 및 자바 사용 경험
자바/스프링 역량 정도

먼저, 서버 개발 및 자바 사용 경험에 대한 설문 결과입니다.

약 20% 뉴크루분들은 서버 개발 경험이 없었고, 15%는 자바 사용 경험이 없었습니다.

자바와 스프링의 역량 정도는 1 ~ 4가 비교적 많은 것을 볼 수 있습니다. 

이렇게 이번 교육은 서버 개발 경험이 없거나, 있더라도 자바/스프링 역량이 높지는 않은 크루들을 대상으로 진행되었습니다.

기술 온보딩 커리큘럼 및 일정

뉴크루들은 7주간의 온보딩 기간 동안 TDD, OOP, Spring, 웹 서버를 주제로 심도 있게 학습하며 성장했습니다. 미션마다 약 일주일가량의 시간이 주어졌고 7주간 총 6개의 미션을 진행했습니다. 일정에 맞춰 미션을 진행하면서, 시간 관리의 중요성도 느낄 수 있었어요.

커뮤니케이션

데일리미팅

서버 뉴크루들은 5 ~ 6명이 한 조가 되어 매일 아침 조원들과 데일리 미팅을 통해 각자의 상태를 공유하며 하루를 시작했습니다. 

또한, 스몰톡을 통해 서로 간의 네트워크가 더욱 끈끈해지는 시간이 되기도 했는데요. 동기들과 다양한 이야기를 나누며 개발자로서 미래를 그려나가고 성장 동력을 얻을 수 있는 좋은 시간이었습니다. 🙂

조별 주간회고

한 주를 마무리할 때는 조별로 주간 회고를 진행하고 공유했는데요, 쉬는 날에도 열심히 미션을 한 크루, 비슷한 고민을 가지고 있던 크루, 파트 활동을 벌써 받아서 진행하는 크루 등 크루들의 경험을 서로 공유받을 수 있어서 좋았습니다.

미션 회고

미션 과정

회고 전, 먼저 기술 온보딩의 미션 과정에 대해 설명드릴게요. 🙂

매주 강의를 통해서 미션에 대한 설명을 듣거나 리뷰했어요. 그다음 랜덤하게 매칭된 페어와 페어 프로그래밍을 진행했습니다. 미션의 일부 단계까지는 페어와 함께하고 헤어진 후에는 개인 미션을 수행했어요.

각 단계가 마무리되면 코드 리뷰를 받았습니다. 리뷰어분들이 꼼꼼하게 리뷰해 주시고, 뉴크루 분들도 많은 질문을 하면서 코드를 개선해 나갔어요.

이 과정을 반복해서 매주 미션을 완수했습니다.

 

첫번째 미션 – 자동차 경주, 테스트 주도 개발을 경험하다!

자동차 경주 미션

첫 번째 미션은 테스트 주도 개발을 중심으로 한 자동차 경주 미션이었습니다.

미션의 요구사항은 “주어진 횟수 동안 n대의 자동차가 랜덤하게 전진 혹은 정지하는 상황을 시뮬레이션하는 것”으로 간단한 콘솔 애플리케이션을 구현하는 것이 목표였습니다.

“너무 쉽지 않아?”라고 생각될 수 있는 이 미션은 TDD(Test-Driven Development)를 활용해야 한다는 제약 조건으로 인해 생각보다 까다로웠습니다. TDD는 테스트 주도 개발의 약자로 테스트 코드를 먼저 작성하고, 이를 기반으로 코드를 작성하는 방식으로 진행됩니다. 테스트 코드를 작성하면서 개발자는 기능 요구사항을 명확히 이해하고, 이를 코드로 구현하는 방법을 배웁니다. 대부분의 뉴크루들이 TDD를 처음 접했기 때문인지 미션에 바로 적용하는 일이 더욱 힘들었던 것 같습니다. 

테스트 코드를 작성하면서 랜덤 값을 기반으로 움직이는 자동차를 어떻게 테스트할까?라는 고민이 있었는데요, 전략 패턴Stub Generator를 이용하여 테스트하기 어려운 부분을 분리했던 기억이 있네요. 전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 소프트웨어 디자인 패턴입니다. 또한, Stub Generator를 이용해서 테스트를 하는 것도 좋았습니다.

두 번째 미션 – 로또, 객체지향을 향해

로또 미션 콘솔
객체지향 생활 체조 원칙

두 번째 미션은 로또번호 발급과 관련된 기능들을 자동, 수동으로 나누어 단계별로 구현하는 미션이었습니다. 미션 수행 과정에서 “소트웍스 앤솔러지” 책의 객체지향 생활 체조 원칙에 따라 일급 컬렉션을 이용하거나, “마틴 파울러”의 TDA(Tell Don’t Ask) 원칙 등을 지키며 애플리케이션을 구성하는 모든 요소들을 객체지향적으로 설계하고 구현하려고 노력했습니다. 객체 생활 체조 원칙은 SOLID 원칙을 포함하고 있습니다. 이를 지키면 유지보수가 쉬우며 확장성이 높은 코드를 작성할 수 있습니다. 또한, TDA 원칙은 객체 간의 의존성을 최소화해 유연하고 재사용 가능한 코드를 만드는 데 도움을 줍니다.

객체지향 개발 방법론과 TDD를 이용해서 미션을 수행하면서 객체지향적 설계와 좋은 코드 작성 방법에 대해서 배울 수 있었던 의미 있는 경험이었습니다. 그 과정에서, “아 그동안 나는 그저 객체를 이용한 프로그래밍을 객체지향이라고 생각했구나”라고 느꼈습니다. 지금까지 전혀 객체지향을 이용하지 못하고 있었음을 깨달았고, 객체의 책임에 대해 고민해 보는 계기가 되었습니다.

 

또한, 다양한 예외 상황에 대한 테스트 코드를 작성해 좀 더 안정적인 코드를 작성할 수 있는 방법을 배웠다는 것도 좋은 점이었습니다. 단순한 애플리케이션이지만, 좋은 설계와 코드에 대해 고민할 수 있는 시간이 있었고 클린한 코드를 작성할 수 있는 역량을 키울 수 있었습니다.

마지막으로, 극악 무도한 로또 당첨 확률을 보면서 로또 당첨이 쉬운 일이 아니라는 것도 배웠습니다. 😅

세 번째 미션 – 스프링으로 방탈출 카페 운영하기 1, 예약

Spring Basic - 방탈출 예약관리

세 번째 미션부터 다섯 번째 미션까지는 스프링 프레임워크와 관련된 미션이었습니다. 이번 미션부터는 스프링 프레임워크에 익숙하지 않은 뉴크루들이 많아 교수진분들은 강의뿐만 아니라 스스로 학습할 수 있도록 학습 테스트를 제공해 주셨습니다. 학습 테스트를 통해 스프링의 기능들을 학습할 수 있었어요.

세 번째 미션은 방탈출 카페의 예약 관리 API를 구현하는 미션으로, 콘솔 환경에서 동작하는 방탈출 예약 애플리케이션이 제공되었어요.

이 미션에서는 아래와 같은 요구사항이 있었습니다.

  • 기존 콘솔 애플리케이션은 그대로 잘 동작해야 한다.
  • 콘솔 애플리케이션과 웹 애플리케이션에서 각각 데이터베이스에 접근하는 로직을 구현한다.
  • 콘솔 애플리케이션에서 데이터베이스에 접근 시 직접 커넥션(Connection)을 생성하여 데이터베이스에 접근한다.
  • 웹 애플리케이션에서 데이터베이스 접근 시 JdbcTemplate를 사용한다.
  • 콘솔 애플리케이션과 웹 애플리케이션의 중복 코드 제거해 본다.

인터페이스를 추가하고, 각 환경에 맞는 구현체를 만들어 주입하는 방식으로 중복된 로직을 제거할 수 있었고, 레이어드 아키텍처의 계층별 역할에 대해 고민하며 레이어를 분리했습니다.

네 번째 미션 – 스프링으로 방탈출 카페 운영하기 2, 인증

Spring Web MVC - 인증 관리

네 번째 미션은 스프링 프레임워크의 Argument Resolver와 Interceptor를 활용한 인증/인가 처리 로직을 구현하는 미션이었습니다. 해당 미션을 통해  세션 및 토큰 기반 인증방식을 이해하고 학습할 수 있었습니다.

세션과 쿠키의 동작 방식에 대해 학습하고, 인터셉터를 사용해 토큰 발급, 인증/인가가 필요한 자원들에 적절한 토큰이 존재하지 않으면 접근할 수 없도록 하는 기능을 구현했습니다.

이러한 미션 수행을 통해 스프링 프레임워크의 기본적인 원리와 개념을 이해하고, 웹 애플리케이션을 개발하는 데 필요한 역량을 갖출 수 있었습니다.

다섯번째 미션 – 스프링으로 방탈출 카페 운영하기3, 예약 대기

Spring Core - 예약 대기 관리

다섯 번째 미션은 예약 대기 미션으로, 의존성 사이클을 제거하고 동시성 이슈를 해결하는 미션이었습니다.

첫 번째 요구사항은 “지난 미션에서 만든 인증 관련 기능을 auth 패키지로 분리하고, 중간 객체를 이용해 의존성 사이클을 제거하는 것”이었습니다. A와 B 간에 의존성 사이클이 존재한다면, A가 변할 때, B도 같이 변할 수 있기 때문에 코드 수정이 어렵고 버그가 발생할 수 있어요. 그리고 무한 루프와 같은 여러 성능 이슈도 발생할 수 있습니다. 이번 미션에서는 인증 관련 기능을 auth 패키지로 분리했고, 중간 객체인 UserDetails를 만들어 의존성 사이클을 제거했습니다.

두 번째 요구사항은 예약 대기 기능입니다. 예약 대기 번호를 발급하는 과정에서 다중 스레드 환경에서 요청이 동시에 들어올 경우 동일한 예약 대기 번호가 발급되는 동시성 이슈가 발생할 수 있는데요. 대기 번호 발급 요청을 Thread safe한 큐에 담는 방법, 메서드에 synchronized 키워드를 달아주는 방법, Redis를 이용한 분산 Lock 등 다양한 방법으로 동시성 이슈를 해결하기 위해 고민했습니다. 추가적으로, Limit을 이용하여 100+와 같이 대략적인 예약 대기 번호를 발급하는 방법으로 Count 쿼리의 성능 이슈를 해결하신 분도 계셨습니다.

여섯 번째 미션 – HTTP 웹서버 구현, 돌고 돌아 기본으로

HTTP의 이해 - 웹 서버 구현

여섯 번째 미션은 프레임워크를 사용하지 않고 웹 서버를 구현하는 것이었습니다.

이 미션의 목표는 HTTP 메시지를 파싱하여 Request line, Header, Query string, Request body를 추출하고 응답을 전달하는 것이었습니다. 먼저 HTTP RFC Spec를 읽고 메시지 구조를 파악한 후, 메시지 구조를 파악하고, 웹 서버의 좋은 설계에 대해서 고민했습니다. 요청 메시지를 파싱하는 기능과 응답 메시지를 빌드(Build)하는 기능 등을 모두 직접 구현하면서 웹 서버가 제공하는 것들이 정말 방대하고 유용하다는 것을 알게 되었습니다.

Reflection과 커스텀 어노테이션을 활용하여 웹 서버뿐만 아니라 WAS를 직접 구현한 크루들도 있었습니다.

고민 포인트 – 성장을 위한 Break Point

고민 포인트

미션을 진행하면서 가장 고민했던 부분에 대해서도 설문을 받아봤습니다. OOP클린코드가 가장 큰 비중을 차지하고 있네요.

저 역시 어떻게 하면 객체지향적으로 구조를 설계하고, 책임을 분리할 수 있을까? 고민하면서, 간단한 미션임에도 시간이 오래 걸렸었죠.

동료도 쉽게 이해할 수 있고, 유지보수가 쉬운 코드를 작성하기 위한 고민도 많이 했는데요, 클린 코드 역시 정답이 없다는 점 때문에 머리를 쥐어짰던 기억이 있네요. 

그리고, 디자인 패턴을 과도하게 적용하면, 클래스가 많이 생겨 오히려 더 복잡해질 수 있기 때문에 변경될 수 있는 부분에 대해서 고민하고, 트레이드오프(trade-off)가 균형을 이룰 수 있는 적절한 포인트를 찾아내기 위해 많이 고민했던 것 같아요.

페어 프로그래밍 – Jobs와 Wozniak의 환상 듀오

모든 미션은 페어 프로그래밍으로 진행되었습니다. 미션 시작 시점에 랜덤하게 페어가 매칭되었고, 미션의 첫 단계를 페어와 함께 했습니다. 

온보딩 기간 동안 다양한 페어와 매칭이 되었던 만큼 여러 페어 프로그래밍 방식을 적용해 보았습니다. 

  • 5, 10분 타이머를 켜두고 알람이 울릴 때마다 드라이버(Driver)를 변경하는 방법
  • 기능 단위로 드라이버를 변경하는 방법
  • 눈치껏 드라이버 변경 방법

페어 프로그래밍 환경 또한 다양했는데요. Intellij의 Code With Me 플러그인을 활용하여 온라인으로 진행한 크루, 회의실이나 카페에서 진행한 크루 등 자유롭게 효율을 극대화 할 수 있는 환경에서 작업을 할 수 있어 좋았습니다.

페어 프로그래밍을 가장 어렵게 했던 요인

페어 프로그래밍을 힘들게 만드는 요인으로 가장 많이 선택된 것은 커뮤니케이션이었습니다. 특히, Code With Me의 제한된 기능이나 느린 속도로 인해 많은 크루들이 고통받았습니다.역량 차이도 높은 요인으로 선정되었습니다.  또한 페어 프로그래밍 과정에서 소모되는 체력에 대한 답변도 눈에 띕니다. 간단한 코드를 작성하더라도 페어 간 합의가 이루어져야 하기 때문에 시간이 오래 걸리기도 하고, 페어에 따라 follower와 followee의 비중이 한쪽으로 기우는 경우도 있었습니다. 

페어 프로그래밍은 비용이 큰 익스트림 프로그래밍 방식이지만, 오타나 개선사항 등을 빠르게 피드백받을 수 있고, 서로가 가진 것들을 공유하면서 성장할 수 있으며, 하나의 프로젝트에 대한 공동 책임이 생기기 때문에 심리적 부담감이 덜하다는 장점을 가지고 있었어요. 따라서 효과적인 페어 프로그래밍을 위해서는 커뮤니케이션과 역량 차이를 극복할 수 있는 방법을 찾아야 한다는 생각이 들었습니다.

코드리뷰

미션을 수행하며 매번 카카오 선배 크루들로부터 코드리뷰를 받았습니다. 그 중 인상적이었던 코드리뷰를 몇 가지 소개해 드리겠습니다.

기억에 남는 코드 리뷰

kloong은 리뷰에서 이미지와 함께 디테일한 설명을 해주셔서 감동이었다고 하네요. gray는 Race condition에 관한 리뷰가 전혀 생각하지 못한 부분이라 기억에 남는다고 합니다. ethan은 그동안 궁금했던 점과 미션을 진행하면서 느낀 점에 대해 상세하게 피드백해주시고, 매 코드리뷰 때마다 많이 배울 수 있어서 정말 정말 좋았다고 합니다.

업무로 바쁘실 텐데 리뷰어 분들께서 여러 이슈와 좋은 코드, 좋은 설계에 대해 정말 꼼꼼히 의견을 남겨주시고 함께 고민해 주셔서 온보딩 기간 중 성장에 가장 도움이 많이 된 활동이지 않았나 싶네요.

좋았던 점

좋았던 점에 대한 의견을 받아보았습니다. 좋았던 점에서 “다양한”, “동기들과”, “리뷰”, “페어” 와 같은 키워드들이 많이 보이네요.

다양한 동기들하고 함께 교육받고 소통하는 게 가장 좋았고, 또 코드 리뷰를 받은 경험이나 좋은 코드에 대해서 고민하는 시간을 가져서 좋았다는 의견이 많았습니다.

서버 뉴크루(온보딩 후)

마지막으로 설문을 통해 온보딩 기간 동안 크루들의 역량이 몇 단계나 상승했는지 살펴보겠습니다. 10단계 만점을 기준으로 대다수의 크루들이 1~3단계의 역량 성장이 있었다고 표현해 주었습니다. 역시 열정적인 온보딩 참여로 실력이 역행한 크루들은 없었네요. 🙂

뉴크루들의 소감

davi.d: 기술 온보딩을 통해 기술적 역량 성장은 물론이거니와 다양한 동기들과 소통할 수 있어 참 좋았습니다. 정말 많은 분들이 뉴크루의 성장을 위해 노력해 주셨는데, 그만큼 값진 시간이었다고 생각합니다.

baker.gus: 과정 중에 다른 파트의 많은 동기들과 페어로 미션을 진행하며 커뮤니케이션할 수 있었던 게 너무 좋았습니다. 부서에서 업무를 진행하기 전에 준비할 시간을 충분히 갖고 회사와 친해질 기회를 주어 감사합니다.

ethan.mino: 카카오의 문화 속에서 편안한 마음으로 온보딩에 참여할 수 있어서 좋았어요. 그리고 무엇보다 의견을 주고받을 수 있는 개발자가 있다는 것 자체로 너무 만족했어요. “세상엔 역시 개발을 잘하는 분들이 많구나”라고 느끼기도 했고요. 그래서 앞으로도 초심 잃지 않고 꾸준히 열심히 할 생각입니다!! 😂

좋은 가르침 전해주신 넥스트 스텝, 업무 바쁘신데도 꼼꼼하게 리뷰해 주신 리뷰어님들, 서버 기술 온보딩 검수해 주신 blues.park

온보딩 프로세스 관리하느라 고생하신 elphie.hb

Wrap 미팅 발표부터 테크 블로그까지 같이 준비해 주신 davi.d, ethan.mino, baker.gus 

각자의 분야에서 열심히 기술 온보딩 수행한 카카오 뉴크루 여러분 모두 온보딩 진행하느라 고생하셨습니다. 앞으로도 자주 연락하며 지냈으면 좋겠고, 뉴크루들의 앞 날을 무한 응원합니다! 👏

감사합니다.

카카오톡 공유 보내기 버튼

Latest Posts

제5회 Kakao Tech Meet에 초대합니다!

Kakao Tech Meet #5 트렌드와 경험 및 노하우를 자주, 지속적으로 공유하며 개발자 여러분과 함께 성장을 도모하고 긴밀한 네트워크를 형성하고자 합니다.  다섯 번째

테크밋 다시 달릴 준비!

(TMI: 이 글의 썸네일 이미지는 ChatGPT와 DALL・E로 제작했습니다. 🙂) 안녕하세요, Kakao Tech Meet(이하 테크밋)을 함께 만들어가는 슈크림입니다. 작년 5월에 테크밋을 처음 시작하고,