우아한테크코스 VS 우아한형제들

Dec.14.2021 김태헌
clipboard facebook twitter

Backend Culture Education

안녕하세요. 우아한테크코스를 통해 우아한형제들에 입사하여, 지금은 배민서비스개발팀 회원인증파트에서 서버 개발자로 합류하게 된 김태헌이라고 합니다. 🙇‍♂️

최근 개발자 채용과 더불어 개발자 교육이 주목을 받고 있는데, 그런 의미에서 우아한형제들에서 (무료로) 운영하는 개발자 교육인 우아한테크코스에 대한 이야기를 공유해드리고 싶습니다. 특히, 우아한테크코스에선 어떤 교육을 받으며, 우아한형제들 개발팀에서의 업무와 어떤 차이가 있는지를 중점적으로 다룰 예정입니다.

이 글을 통해 우아한테크코스 혹은 우아한형제들 입사를 선택하시는 데 있어 도움이 되었으면 좋겠습니다. 그럼 시작하겠습니다!


우아한테크코스

우아한테크코스는 총 10개월, 5-Level 으로 나뉘어집니다.

  • 레벨 1: 객체지향(JAVA), 테스트 코드, 클린 코드, TDD
  • 레벨 2: Spring 웹프로그래밍 (ATDD, Spring Data JDBC, JPA), 웹프론트엔드 기본
  • 레벨 3: 팀 프로젝트를 통한 협업, 배포, 운영
  • 레벨 4: 프레임워크 WAS 만들기, 레거시 코드 리팩토링, 서비스 운영
  • 레벨 5: 개인 학습, 취업 준비, 리크루팅 데이

우아한테크코스는 기초 JAVA & Spring부터 대규모의 시스템을 운영하기에 필수적인 요소들을 가르칩니다. 코딩 외에도 Database, Network와 같은 기초 전공지식, 아키텍처 설계, AWS 배포와 관련된 지식도 배우게 됩니다. 그뿐만 아니라 소프트 스킬인 커뮤니케이션 능력, 글쓰기, 협업과 관련된 내용도 포함할 만큼 많은 내용을 학습하게 됩니다. 우아한테크코스의 교육과정이 더 궁금하신 분들은 우아한테크코스 로드맵을 참고해 주세요.

교육은 매주 주제에 맞는 실전 압축 강의를 시작으로, 페어 프로그래밍을 통한 미션 수행으로 진행됩니다. 미션을 완료하면 리뷰어에게 코드리뷰를 받고, 리팩토링하며 리뷰어의 머지 메시지와 함께 한 주를 마무리하게 됩니다.

또한 우아한테크코스는 단순한 주입식 교육이 아닌, 학습 공동체입니다. 크루들과의 지식 및 경험을 공유하며 성장하는 공간이라는 게 가장 큰 장점이라고 생각합니다. 테코톡 그리고 블로그와 같이 공식적인 공유뿐만 아니라 크루들끼리 자율적으로 하는 스터디도 활성화되어 있습니다.

마지막으로 우아한테크코스는 Java & Spring & 전공지식 노베이스분들도 열정만 있다면 얼마든지 수료할 수 있는 교육입니다. 처음 우아한테크코스에 들어왔을 때 Spring은커녕 Java의 Stream API가 뭔지도 모르고 시작했음에도, 무리 없이 미션들을 소화해낼 수 있었습니다. 레벨에 필요한 내용에 대해 교육을 받고 페어와 지식을 공유하기 때문에 부족한 부분이 자연스럽게 채워집니다. 물론 성장하고자 하는 노력이 없으면 불가능하다는 것도 명심하셔야 합니다!

우아한형제들 (배민서비스개발팀)

이어서 제가 일하고 있는 배민서비스개발팀에 대해서 소개해드리겠습니다. 배민서비스개발팀은 사용자 경험의 최전방에 있는 팀입니다. 사용자들이 배달의민족 앱을 켠 순간부터 주문을 전달하기 전까지의 모든 기능과 동작을 담당합니다.

배민서비스개발팀은 회원인증, 가게노출, 프론트서버, 웹프론트, QA 5개의 파트로 나누어집니다. 이중 저는 배달의민족의 모든 회원인증 시스템을 담당하는 회원인증 파트에서 근무하고 있습니다.

회원시스템은 약 3,000만 명의 회원을 관리하며, 피크타임 기준 13,000TPS 이상 규모의 대용량 데이터와 대규모 트래픽을 다루고 있습니다.

이처럼 배달의민족의 회원인증 시스템은 우아한테크코스에선 경험하기 힘든 대용량 데이터, 대규모 트래픽을 다루고 있습니다. 또한 배달의민족은 급격하게 성장하는 서비스이기에 끊임없이 요구사항이 변화하고 기능들이 추가됩니다. 높은 트래픽에도 장애 없이 안전한 시스템을 추구하며, 변경에 유연하고 신속하게 대응할 수 있도록 아키텍처와 코드를 지향하고 있습니다.

우아한테크코스, 충분할까?

그렇다면 우아한테크코스 교육만으로 배달의민족 서비스 개발 업무에 무리 없이 적응할 수 있을까요? 저의 대답은 그럴 수도, 아닐 수도 있습니다 입니다.

교육에서 배운 것 중 현업에서 바로 적용할 수 있는 지식이 많았습니다. 개발 문화, 소프트 스킬, 기술 역량 등은 우아한테크코스에서 배운 것들로 충분했다고 생각합니다. 특히 Java, Spring, 클린 코드, 유지보수, 테스트와 같은 기술적인 역량은 실무에 빠르게 적응할 수 있을 정도의 역량을 갖추게 됩니다. 또한, 페어 프로그래밍, 코드리뷰, 협업과 같은 개발 문화에 쉽게 받아들일 수 있었던 것도 우아한테크코스를 경험했기에 가능했다고 생각합니다.

하지만 배달의민족 서비스이기에 교육으론 경험할 수 없었던 것도 있었습니다. 수많은 트래픽과 데이터, 그리고 끊임없이 변화하는 요구사항과 추가되는 기능들, 또한 운영상에 발생하는 이슈들은 교육 과정에선 경험하기 힘든 것들이었습니다.

이런 공통점과 차이점들을 좀 더 자세하게 설명해 드리고 싶습니다.


공통점

우아한테크코스에서 배우는 기술이나 문화는 우아한형제들의 개발팀에서 중요시하는 가치와 비슷합니다. Java, Spring, JPA와 같이 우아한형제들에서 활용하고 있는 자바와 스프링 생태계의 기술들을 학습합니다. 그뿐만 아니라 테스트, 페어 프로그래밍, 스크럼과 같은 애자일 소프트웨어 개발문화를 배우면서 좀 더 신속하게 이슈에 대응할 수 있는 개발 문화들을 배우고 있습니다. 이러한 공통점들을 다뤄보도록 하겠습니다.

테스트 & 리팩토링

배달의민족 시스템이 성장해가면서, 회원인증 시스템은 더 높은 수준의 보안과 시스템 신뢰성이 필요한 상태였습니다. 보안을 강화하고, 장애로부터 안전한 시스템을 위해 기존 회원인증 시스템 대규모 구조 개편 및 코드 리팩토링을 수행하였습니다. 회원시스템과 인증시스템이 통합된 기존의 시스템을 회원, 인증 두 개의 시스템으로 분리하는 대규모 개편을 진행하며, 동시에 기존 레거시 코드의 아키텍처와 코드 스멜들을 리팩토링하였습니다.

2020.11 기준 전체 테스트 – 357개, 20% 수준 커버리지
2021.3 기준 전체 테스트 – 423개, 25% 수준 커버리지
2021.11 기준 테스트 – 1,022개, 59% 커버리지

이런 대규모 개편을 안정적으로 진행할 수 있도록 가능한 모든 비즈니스 요구사항을 검증하는 데 초점을 맞췄으며, 올해 3월만 해도 테스트 개수가 400개 정도에 머물렀으나 현재 약 1000개가 넘는 테스트, 60% 테스트 커버리지를 달성했습니다.

이번 테스트 작업과 회원 인증 개편 작업은 모두 우아한테크코스에서 배웠던 테스트 기반 레거시 코드 리팩토링 미션으로 사전에 경험해 보았기에 수월하게 작업할 수 있었습니다. 우아한테크코스와 우아한형제들 모두 테스트를 통한 코드 품질 관리를 중요시하며, 이를 바탕으로 언제든지 신속하게 변화에 대처할 수 있는 구조를 추구하고 있습니다.

페어 프로그래밍

회원인증파트는 거의 모든 업무를 페어 프로그래밍으로 진행합니다. 스프린트도 페어 그룹을 기반으로 주간계획을 짜고, 맡은 업무에 대해 페어가 없다면 자연스럽게 같이 합류하여 작업할 수도 있습니다.

우아한테크코스 또한 모든 미션을 페어 프로그래밍을 통해 진행합니다. 처음엔 불편하기도 하고, 시간 낭비라는 생각을 많이 했습니다. 하지만 미션 결과를 볼 때마다 페어 프로그래밍이 생산적인 시간 낭비(?)라는 걸 깨달았고, 협업의 불편함 극복능력 또한 개발자들에겐 필요역량이라고 생각하게 되었습니다.

미리 경험해 본 덕분에 입사하고 나서도 페어 프로그래밍에 쉽게 적응할 수 있었습니다. 또한 경험이 풍부하신 회원인증파트 개발자분들의 꿀팁들을 흡수할 수 있었기에 신입 개발자 입장에선 더할 나위 없이 좋은 개발문화라고 생각이 듭니다!

코드 리뷰

회원인증파트의 PR 규칙

회원인증파트는 모든 피쳐 브랜치를 코드리뷰 후 머지합니다. 최근에는 원활한 MR(PR) 관리를 위해 파트 나름의 규칙도 정해나가고 있습니다. 코드리뷰 덕분에 실수나 장애를 마지막으로 점검할 수 있고, 작업 내용도 공유를 할 수 있어서 다양한 장점이 있다는 생각이 듭니다.

우아한테크코스의 미션 또한 현직 개발자분들의 코드리뷰를 통해 피드백을 받습니다. 코드리뷰를 통해 현업에서 고려해야 하는 포인트나, 잘못된 코드 습관들을 간접적으로 피드백 받고 배울 수 있는 장점이 있었습니다.

또한 팀 프로젝트에서는 직접 다른 팀원들의 코드를 리뷰하면서, 코드를 쓰는 방법뿐만 아닌 코드를 읽는 법도 배우게 된 장점이 있습니다. 다른 사람의 코드를 계속 읽음으로써 자신의 코드를 되돌아보기도 하고, 다양한 의견 교류를 통해 더 많이 성장할 수 있었습니다.

이렇게 코드리뷰를 주고받는 문화에 익숙해져서, 입사하고 처음 파일럿프로젝트를 20명 가까이 되는 개발자분들께 라이브 코드리뷰 받을 때도 "덜" 주눅 들고(들긴 들었지만요..) 받아들일 수 있었던 것 같습니다. 물론 처음 코드리뷰 할 때는 소극적으로 리뷰하기도 했는데 지금은 최대한 코드에 대한 제 기준을 제시하면서 다양한 토론을 하도록 노력하고 있습니다.

공통점 요약

기술 역량 교육은 특별히 말씀드리지 않아도 될 정도로 우아한형제들 업무에 적응할 만큼 충분했기에 따로 이야기 드리지 않았습니다. 오히려 개발 문화와 협업적인 측면에서 좋았던 부분을 소개해 드렸는데, 사실 위에서 제시해드린 3가지는 모두 경험해 보지 않고서는 그 효용을 쉽게 체감하기 어렵습니다. 모두 같은 작업을 두 번, 혹은 두 명이 작업하기 때문에 생산성이 떨어진다고 생각하실 수 있습니다. 하지만 우테코를 통해 이런 문화를 미리 경험해 보고, 납득했기 때문에 우아한형제들에 입사하고서도 어렵지 않게 개발문화에 적응할 수 있었습니다.

기술적인 역량과는 다르게, 이러한 개발문화와 협업 스킬은 학교나 학원에서는 접하기 어렵습니다. 따라서 실전 개발자로 성장하고 싶으신 열정 넘치는 모든 분께, 우아한테크코스를 적극적으로 추천해 드리고 싶습니다!


차이점

위에서 말씀드렸다시피 우아한테크코스는 현업 개발자에게 필수적인 기술 역량, 개발문화, 소프트 스킬들을 제공해 줍니다. 그런데도 경험하지 못했던 배민서비스개발팀 내에서의 특수한 상황들을 소개해드리고자 합니다. 교육환경에서는 경험하기 어려웠던 배민서비스개발팀이기에 겪을 수 있었던 이슈들과, 해결해나간 과정에 대해 공유해 드리도록 하겠습니다.

레거시 프로젝트

입사 당시 회원 프로젝트

회원시스템은 오래된 레거시 프로젝트였습니다. 우아한테크코스에서 팀프로젝트, 레거시 프로젝트 리팩토링 미션을 경험하긴 했지만, 실제 레거시 코드를 개편하는 건 복잡도가 훨씬 높고, 달리는 마차의 바퀴를 갈아 끼우는 작업이었습니다. 기존 회원시스템은 실시간으로 운영 이슈가 올라오고, 레이어간 경계가 불분명했고, 패키지 구조가 복잡하게 섞여 있었습니다. 또한 만능 DTO및 Service들로 인해 변경에 굉장히 취약한 상태였습니다.

하지만 그중에서도, 가장 큰 문제는 회원시스템과 인증시스템이 통합되어, 회원시스템의 장애가 인증시스템의 장애로 이어지는 취약한 구조였습니다. 따라서 운영 중인 회원인증 시스템을 서로 다른 DB를 활용하는 회원시스템과 인증시스템 두 개로 분리하는 대규모 개편을 수행하게 되었습니다. 기존 사용자들의 로그인이 끊기지 않고 장애 없이 신규 인증과 구 인증이 완벽하게 100% 호환되기 위해선 대규모 데이터 마이그레이션, 배치, 성능, 테스트, 보안, 인프라, 모니터링 등 굉장히 많은 것을 고려하여 작업하여야 했습니다.

우아한테크코스 팀프로젝트

우아한테크코스에서도 물론 팀 프로젝트를 통해 운영 중인 서비스의 리팩토링을 경험해 보았습니다만, 비교적 최신 코드이며, 운영상의 이슈도 많지 않고, 24시간 무중단이지 않아도 크게 문제 되지 않는다는 점이었습니다. 따라서 크게 아키텍처를 변경하거나 마이그레이션, 성능 테스트, 개편과정에서의 운영 이슈 등을 겪어보지 못했기에 회원인증 시스템의 개편이 어렵게 느껴졌습니다.

밤샘 배포에 지쳐 쓰러진 개발자들.jpa

이처럼 난생처음 겪어보는 개편작업이었기에 도전적인 과제였다고 생각했는데, 장애 없이(+ 로그아웃 없이) 배포를 완료하고 나서 말로 표현할 수 없었던 성취감을 느끼게 되었습니다.

대규모 트래픽에서 살아남기 – 동시성 이슈

운영상에는 교육과정에선 경험할 수 없는 다양한 이슈들이 있었습니다. 그중에서도 가장 경험하기 어려웠던 문제가 동시성 이슈였습니다.

배달의민족 로그인 과정에서 액세스 토큰이 만료되었다면 기존 토큰을 삭제하고, 새로 만들어야 합니다. 사용자가 직접 로그인하는 과정뿐만 아니라 사용자의 인증이 필요한 시점에 자동으로 토큰을 재생성하는 과정에서도 이 요청이 수행되기 때문에 매우 많은 트래픽이 발생하는 구간입니다. 수많은 트래픽을 처리하다 보면, 토큰의 삭제와 저장이 경합하면서 Deadlock이 발생했습니다.

마침 친구들과 Real MySQL 스터디를 하고 있어서(자신감 과잉이었을지도..) 해당 이슈를 처리해 내겠노라 나서게 되었습니다.

@Test
@DisplayName("토큰 갱신 시 발생하는 DeadLock 환경 테스트")
void 동시성_테스트() {
        ...
    CompletableFuture[] completableFutures = IntStream.range(...)
        .mapToObj(i -> CompletableFuture.supplyAsync(() -> tokenService.refresh(...)))
        ...
}

원인을 찾기 위해 문제 상황을 동시 요청 테스트코드를 통해 재현해놓고, 책에 나왔던 데드락 상황을 재현했습니다. 그런데 데드락 로그에서 알 수 없는 Shared Lock이 잡히는 걸 알게 되었고 책에서 배운 내용과 달라서 당황하였습니다.

파트원분들과 이슈 상황을 공유하고 해결하기 위해 침착하고 천천히 공식문서를 읽어보며 해결해 냈습니다. MySQL 5.6 문서에 따르면 InnoDB 엔진에서 Duplicated Key Exception 발생 시 Shared Lock을 잡는다는 사실을 알게 되었고, 이를 기반으로 데드락 로그를 하나하나 읽어가며 추적에 나섰습니다.

MySQL Document
실제 데드락 로그

Insert 시 유니크 키로 설정해놓은 인덱스에서 Exclusive 레코드 락이 잡힌 상태에서 Duplicated Exception으로 인한 Shared 레코드 락 과 다른 트랜잭션에서의 Delete 문의 Exclusive 레코드 락이 경합하면서 데드락이 발생한다는 사실을 깨달았습니다. (파일럿 프로젝트 코드리뷰에서 DB로 탈탈 털리고 스터디하길 잘했다는 생각이 드네요..)

이렇게 대규모 트래픽을 다루기에 발생하는 데드락 이슈 또한 우아한테크코스에서는 이론적으론 알고 있어도, 경험할 수는 없었기 때문에 생소한 이슈였습니다. DB 관련 측면뿐 아니라 코드상에서도 동시성 이슈를 고려해야 하는 경우를 많이 경험하여 서비스 운영에 대해 한 발자국 더 성장하게 된 계기가 되었습니다.

급격하게 변화하는 서비스

회원인증파트 캡틴 용근님 발표
만들면서 배우는 클린 아키텍처 원서 스터디

배달의민족 서비스는 기능의 변화 혹은 새로운 기능들에 대한 요구사항이 끊임없이 쏟아집니다. 재빠르게 변화하는 비즈니스 요구사항에 대응하기 위해서는 변화에 열려있는 코드와 아키텍처가 필수적입니다. 따라서 변화를 발 빠르게 대응하고, 안정적으로 서비스를 운영하기 위한 새로운 아키텍처가 필요했고 파트 내 아키텍처 스터디를 하여 더 나은 아키텍처에 대해 고민을 하게 되었습니다.

신규 인증시스템 설계도 – 도메인과 Data 레이어를 모듈로 분리하여 도메인을 변경으로부터 보호

신규 인증시스템은 다양한 시스템으로부터 트래픽을 받아야 하므로 안정적인 서비스를 유지해야 했습니다. 기존 데이터베이스에 의존적인 도메인 구조를 벗어나, 데이터베이스 엔티티와 도메인의 모델을 구분하여 도메인이 변경의 최상위에 존재하도록 설계하였습니다. 도메인 중심적인 아키텍처를 통해 자연스럽게 비즈니스와 관련된 코드들은 도메인 계층으로 흘러들어오게 되고, DB나 응용계층의 변경이 도메인을 변경하지 않도록 하여 더 견고한 구조를 가질 수 있게 되었습니다.

도메인 모델이 존재하지 않던 회원 시스템의 Hexagonal 아키텍처 도입기

마찬가지로 도메인 모델이 존재하지 않던 회원시스템도 리팩토링을 통해 도메인 레이어를 확보해 주었습니다. 레거시 코드가 많아 레이어간 경계가 모호했기 때문에 점진적으로 리팩토링을 수행하여 지금은 도메인 레이어가 많이 확보된 상태입니다.

우아한테크코스에서도 좋은 아키텍처에 대해 논의를 합니다. 하지만 프로젝트의 규모가 현업에 비해 작고 복잡도가 낮기 때문에 피부에 와닿는 아키텍처의 효용을 못 느껴 중요하게 여기지 못하는 경향이 있습니다. 또한 요구사항이 급격하게 변하지 않다 보니, 미션이 끝나면 유지보수를 경험하기 어렵기 때문에 좋은 아키텍처에 대한 고민을 깊게 하지 못했던 것 같습니다.

이번 아키텍처 스터디와 리팩토링 업무를 통해 코드를 보는 시각이 늘고 빠르게 요구사항이 변화하는 실제 서비스에 적합한 구조를 잡는 법을 배우게 된 것 같습니다.

차이점 요약

말씀드렸다시피 배민서비스개발팀은 대용량 데이터와 대규모 트래픽을 다루며 수많은 운영이슈를 경험하고 있기에, 교육에선 경험하기 어려운 장애들을 마주치게 됩니다. 이러한 경험을 통해 기술적으로 더 성장하고, 더 도전적인 업무들을 시도하게 되는 부분에 있어서 좋은 환경이라고 생각합니다.

또한 리팩토링과 코드 품질을 관리하는 작업을 자유롭게 건의하고 실행할 수 있는 문화 또한 우아한형제들 개발팀의 특징이라고 생각합니다. 정상 동작하는 코드를 리팩토링하는 업무를 프로젝트로써 받을 수 있는 것도 좋은 개발문화라고 생각합니다.


마치며..

Java의 J도 모르던 제가 어느덧 배민서비스개발팀에서 일한 지 8개월이 되어가네요. 우아한테크코스의 교육이 없었다면 상상도 못 했을 텐데 말이죠. 그만큼 우아한테크코스의 교육은 더 많은 걸 배우고, 바로 현장에 뛰어들 수 있을 만큼의 역량을 키워준다고 확신합니다. 이런 훌륭한 교육을 제공해 주신 우아한형제들과 우테코 캡틴 포비와 코치님들, 크루들께 감사하다는 말씀을 전하고 싶네요. 역량 있는 개발자를 목표로 하신다면 우아한테크코스에 도전해 보시는 걸 추천해 드립니다!

우아한형제들 입사 면접 때 우아한형제들 CTO님이신 재하님께서 평행우주의 자신을 몇 명을 데리고 배달의민족을 만들 수 있겠느냐는 질문을 하셨던 적이 있습니다. 15명 정도 6개월 정도면 프로토타입을 만들 수 있을 거라고 말씀드렸는데, 우아한형제들에 입사하고 나서는 150명이어도 부족할 것 같다는 생각이 들기도 합니다. 그만큼 우아한형제들은 기술적으로 계속해서 도전하고 더 좋은 개발문화와 기술을 만들어 내기 위해 노력하는 회사라고 생각합니다. 우아한테크코스만큼이나 업무에 적응할 수 있게 도와주신 배민서비스개발팀 캡틴 영한님과 파트대장 용근님, 회원인증파트 모든 분들께 정말 감사합니다.😊 좋은 개발 문화와 기술적 성장을 원하시는 개발자분들은 우아한형제들의 개발팀 합류를 고려해 보시는 건 어떨까요?

이상으로 긴 글 읽어주신 독자분들께도 감사드리며 이만 인사드리겠습니다! 🙇‍♂️