안녕하세요? 
인프런과 랠릿 서비스를 운영하고 있는 인프랩의 CTO 향로입니다.

(카카오 이모티콘)

올해초 인프랩 팀은 IT인들을 위한 채용 서비스인 랠릿을 오픈했는데요.
신규 서비스의 런칭과 함께 기존 서비스인 인프런의 2~3배 성장, 100만 회원 달성 등 담당하는 서비스들의 폭발적인 성장을 경험하고 있습니다. 그리고 개발팀 역시 여러 도전적인 과제들을 만나고 있습니다.

💡 많은 분들이 봐주셨던 2022년 1월 100% 할인 이벤트 장애로 인해서 개발 파트의 간담이 서늘한 경험을 하기도 했습니다.

 기존 서비스인 인프런의 아키텍처, 신규 기술 스택으로의 전환과 성장속도에 맞는 트래픽 대응을 위해 시스템 구조를 개선해야 하는 등의 많은 작업들을 인프랩 백엔드 팀에서 준비중입니다.

많은 비지니스 요구 사항을 속도감 있게 달성하기 위해,
늘어난 트래픽을 안정적으로 대응하기 위해,
현재의 인프랩 백엔드 팀만으로는 시간이 오래걸릴 것 같다는 생각을 하게 되었습니다.

그래서 많은 백엔드 개발자분들을 모셔와 저희의 목표를 더 빠르게 달성하고자 합니다.
지원하고자 하는 회사의 백엔드 개발자 채용 공고를 본다면 일반적으로 다음과 같은 궁금증이 생깁니다.

  • 같이 일하게 될 사람들은 어떤 사람들일까?
  • 배포 프로세스는 어떻게 될까? 자동화가 되어있을까?
  • 코드리뷰는 하고 있는 걸까? 서비스 기능 개발하기에 바빠서 각개전투 하는건 아닐까?
  • 백엔드 역량 향상이 가능할 정도의 유의미한 트래픽이 발생하고 있을까?
  • 테스트 코드를 작성하고 있을까?
  • 모니터링과 로깅은 제대로 구축되어있을까?
  • 구성원의 성장을 위해 회사에서는 어떤 지원을 해줄까?

개발자의 성장에 있어 가장 중요한 건 개인의 노력인데요.
그렇다면 회사에서 해줄 수 있는 것은 무엇일까요?
제 생각에는 그 사람이 성장할 수 있는 좋은 재료와 환경을 제공해주는 것이 아닐까 싶습니다.

지금부터는 인프랩의 백엔드 파트를 소개 드리려고 합니다.
이런 환경이라면 좋은 개발자로 성장할 수 있지 않을까 생각해보는 시간이 되셨으면 합니다.

직군 소개


현재 인프런 백엔드 팀은 1년 차부터 10년 차까지 총 8명의 개발자로 이루어져 있습니다. 이 8명의 인프런 백엔드 개발자는 24시간 365일 장애 없는 서비스 환경 구성과 데이터 기반의 비즈니스 로직 개발을 담당합니다.

대부분의 개발자분들이라면 잘 아시겠지만, 백엔드 개발자는 24시간 365일 장애 없는 서비스 환경 구성과 데이터 기반의 비즈니스 로직 개발을 담당합니다.

출처: https://www.instagram.com/p/CQXLFvODOfF/

    • NodeJS 기반으로 백엔드 비지니스 로직을 개발하고 배포합니다.
    • 데이터 성격에 맞게 PostgreSQL과 Redis, MongoDB Atlas에 데이터를 적재하고 이용하는 코드를 작성합니다.
    • SEO를 위한 Server Rendering과 Client Rendering을 위한 API를 설계하고 개발합니다.
    • 여러 백엔드 개발자들이 협업하기 좋은 코드로 지속적으로 리팩토링합니다.
    • 테스트 코드 기반의 개발을 진행하며, 타입 지향, 정적 분석등 같이 협업하는 분들의 심리적 안정감을 주기 위해 노력합니다.
    • 온라인 PR, 오프라인 페어 프로그래밍 등 코드 리뷰를 통해 성장하는 문화를 지향하고 있습니다.
    • 데이터베이스의 실행 계획 (Explain) 을 통한 인덱스 설계/수정과 슬로우 쿼리에 대한 튜닝 등을 진행합니다.
    • 모니터링 서비스인 Datadog을 적극적으로 사용하여 시스템에서 발생하는 모든 이슈 사항에 대해서 추적하고 해결합니다.

이외에 인프런 백엔드 팀의 개발자들은 어떤 고민들을 하고 있고, 어떤 문제들을 해결하기 위해 노력하고 있는지는 아래 기술 블로그를 통해 확인할 수 있습니다.

기술 스택


현재 백엔드 기술 스택은 크게 2가지로 나눠져 있습니다.

  • 현재 대부분의 인프런 기능을 담당하고 있는 기존 시스템
  • 새 기술 스택으로 기존 기능을 하나씩 이관 중인 신규 시스템

각각의 기술 스택은 목적에 맞게 다르게 구성되어 있습니다.

기존 시스템 스택

  • NodeJS / JavaScript
  • Express
  • FxJS
    • 함수형 라이브러리
  • FxSQL
    • SQL Builder
  • Date-fns
  • AWS Lambda를 통한 스케줄링 & 배치 환경
  • Circle CI를 통한 배포 환경
  • FP 로만 이루어진 애플리케이션 설계와 구조

신규 시스템 스택

  • NodeJS / TypeScript
  • Nest.js
  • TypeORM / MikroORM
  • Jest / SuperTest
  • AWS LocalStack
    • AWS 서비스를 로컬 테스트 하기 위해
  • JS-Joda / TS-JEnum
  • Docker Compose를 통한 개발 환경
  • Jenkins를 통한 스케줄링 & 배치 환경
  • Jenkins / Github Action 를 통한 배포 환경
  • OOP / 도메인 기반의 애플리케이션 설계와 구조
    • FP를 버리는 것이 아니라, FP가 필요한 영역과 OOP가 필요한 영역을 조화롭게 사용합니다.

이외 인프라 요소는 두 시스템 모두 비슷한 형태를 취하고 있습니다.

  • Docker
  • CircleCI
  • DataDog 모니터링
  • AWS Aurora PostgreSQL, Elastic Cache Redis, MongoDB Atlas
  • AWS ECS (Fargate, EC2) & EC2
  • Git/GitHub
  • Webstorm / VSCode / DataGrip
    • JetBrains사의 전 제품을 지원하고 있어 개인이 원하는 제품을 사용하도록 권장하고 있습니다.

신규 시스템의 기술 스택과 기존 시스템의 기술 스택이 조금 차이가 있는데요.
인프랩 서비스는 초기에 빠르게 성장하기 위해 가장 익숙한 방법으로 열심히 달려왔습니다.

 

원피스 – 고잉 메리 호

시간이 지나 조금 더 규모가 있는 서비스로 확장하려다보니 다음과 같은 고민을 하게 되었습니다.

  • 신규 입사자의 러닝 커브
  • 타입 안정성
  • 개발자 시장 Pool
  • Third Party 라이브러리 호환성
  • 규모가 있는 커뮤니티

그래서 신규 시스템의 기술 스택은 이 부분을 해결하기 위한 것으로 선택하였습니다.

원피스 – 사우전드 써니 호

 

💡 기존의 기술 스택을 신규 기술 스택으로 전환하는 과정을 제대로 경험해보실 수 있습니다. 현재도 구성원 분들과 함께 신규 기술 스택에 대한 스터디를 진행하고 있습니다.

 

자격요건


당연하게도 NodeJS를 비롯한 JavaScript 생태계에 대한 기본적인 이해도가 필요합니다.

  • Node.js 기반의 백엔드 개발 경험이 있으신 분
  • ES6+ 에 추가된 기본 스펙들을 사용해본 경험이 있으신 분
  • MySQL / PostgreSQL 과 같은 관계형 데이터베이스를 사용해보신 분
  • Linux의 기본적인 명령어들을 사용할 수 있고, EC2에 기본적인 패키지들을 설치하고 Node 애플리케이션을 실행할 수 있으신 분
  • HTTP 통신에 대한 기본적인 이해, RESTful API에 대한 설계나 개발 경험이 있으신 분
  • FunctionClassInstanceObject Literal에 대해 기본적인 내용을 알고 있고, 상황에 따라 적절하게 사용하고 계신 분
  • 기본적인 SQL 문법, JOIN, Subquery 등을 활용할 줄 아시는 분
  • RDBMS의 인덱스가 무엇인지 알고 있고, 어떤 경우 인덱스가 사용이 안되는지 알고 계신 분
  • Git과 Github에 대한 기본적인 사용법을 알고 있고, Git Flow를 이해하고 계신 분

우대조건


우대 조건은 아래 조건을 모두 할 수 있는 분을 의미하진 않습니다.
이 중 일부라도 해당하는 분이시면 즐거운 마음으로 관련 대화를 나눠볼 수 있을 것 같습니다.

아래 관점으로 백엔드 개발 파트가 지향하고 있다고 봐주시면 좋을 것 같습니다.

  • Spring MVC와 같은 MVC Framework를 사용해본 경험이 있으신 분
  • 레이어드 아키텍처 (Layered Architecture) 가 왜 필요한지 이해하고, 적용해서 개발하고 계신 분
  • 언어/프레임워크에 관계 없이 DI (Dependency Injection) 패턴을 사용하고 있고, 왜 필요한지 알고 계신 분
  • pub-sub 구조, 메세지큐 등의 경험이 있으신 분
  • Jest, Mocha, Junit 등 테스트 프레임워크를 통해 테스트 코드를 작성해오신 분
  • OOP에 대한 기본적인 이해도가 있으신 분
    • 객체의 역할 / 책임 / 협력
    • 객체 간의 메세지 등에 대해 이해하고 계신 분
  • FP에 대한 기본적인 이해가 있으시거나 아래 함수형 강좌를 수강해 보신 분
  • 24/365 서비스 운영을 경험해보신 분
    • 혹은 본인이 만든 서비스를 실제 오픈 / 운영까지 해보신 분
  • MySQL 혹은 PostgreSQL 과 같은 RDBMS 의 실행 계획을 통해 인덱스 튜닝 / 쿼리 튜닝 등을 진행해본 경험이 있으신 분
    • 일반적으로 DBA분들이 해주시기 때문에 DBA분들이 해주셨던 작업들에 대해 충분히 이해를 하고 계셔도 좋습니다.
  • RDBMS의 테이블을 설계할 때 상황에 맞게 정규화 혹은 비정규화를 적절하게 구분해서 적용해보신 분
  • 부하 테스트 (Stress Test) 를 통해 성능 개선을 진행해본 경험이 있으신 분
  • 모니터링/로그/알람을 통해 장애를 탐지하고 해결해본 경험이 있으신 분
    • 동일 장애 재발 방지를 위해 시스템/프로세스 개선을 해보신 분
  • 인프라 엔지니어가 없으면, 본인이 직접 AWS 인프라 구성을 해서라도 문제를 해결해야 속이 시원하신 분
  • 반복적으로 진행하는 수동적인 작업에 불편을 느껴 자동화를 진행해본 경험이 있으신 분
  • (주니어분들이라면) 위 언급되어있는 개념들을 몰라도 빠르게 내 것으로 만들 수 있는 나만의 학습법을 가지고 계신 분
  • (경력 대상) 주니어를 멘토링하여 성장 시킨 경험이 있으신 분 ****
  • (경력 무관) 기술 스택의 전환, 시스템의 전환 등 기술 변화를 좋아하고 받아들이는데 부담이 없으신 분
  • (경력 무관) 운영/기획 파트 등 개발자가 아닌 분들께 상황을 설명할 때 그들의 입장에서/그들의 언어로 이야기하는 게 당연하신 분
  • (경력 무관) 대화보다 하나의 문서를 작성하고 공유하길 좋아하시는 분

업무 방식


스타트업 특유의 빠른 제품 릴리즈와 서비스 안정성 이라는 2마리 토끼를 최소한의 인원으로 잡기 위해 적절히 업무 균형을 유지하고 있습니다.

  • Confluence cloud / Jira를 도입하여 문서화를 적극적으로 진행하고 있습니다.
    • 설치형을 사용하지 않고, Cloud 버전을 사용해 관리 리소스를 최소화 하고 있습니다.
    • 특정 개인에게 의존하는 위험도를 낮추고, 신규 입사자분들의 심리적 안정감을 위해 개발 파트 전체가 문서화에 적극 참여하고 있습니다.
    • 장애 내역과 그에 대한 해결 사례를 남겨 전체 구성원의 역량을 끌어올리려고 노력하고 있습니다.

  • 1주 혹은 2주 단위의 스프린트로 업무 공유와 회고를 주기적으로 진행합니다.
    • 스프린트 방식 자체에 대해서도 주기적으로 회고를 진행합니다.
    • 어떤 방식이 가장 효율적이고 성과를 낼 수 있을지 정기적으로 고민하고 논의합니다.

  • JIRA로 각자 티켓을 생성해서 업무를 진행합니다.
  • Git Flow를 변형한 저희만의 Git Flow에 맞춰 Branch 를 생성하고 Rebase / Merge 등을 진행합니다.
  • 작업된 코드는 PR을 요청하고 코드 리뷰를 진행하여 반영하고 있습니다.

  • 개발된 코드는 테스트 서버에 배포를 하여 QA를 진행합니다.
  • 모든 배포는 CircleCI를 통해 dev / master 브랜치 push 시에 자동으로 ECS로 배포가 진행됩니다.
  • PostgreSQL에서 발생하는 Slow Query에 대해 슬랙 알람을 걸어두고, 매번 쿼리 튜닝과 사내 가이드 문서를 작성합니다.

Slow Query Alarm

쿼리 튜닝 개선 사례 위키

  • AWS Cloud Watch와 SaaS APM을 통해 서비스 장애 알람을 수신 받고, 대응합니다.

  • 상반기/하반기마다 워크샵을 진행합니다.
    • 진행했던 과제에 대한 소개와 아쉬운 점/개선 점등을 이야기합니다.
    • 다음 반기에 진행할 과제들을 정리합니다.
    • 이를 통해 제품 릴리즈에 몰두하느라 방향성을 잃는 일이 없도록 중심을 잡고 있습니다.

백엔드 개발자로서 얻을 수 있는 것들


채용공고를 작성하면서 가장 많은 고민을 했던 부분인데요. 이 글을 보시는 분들이 수많은 시리즈 A이상의 스타트업들과 대기업들 사이에서 인프런에 백엔드 개발자로서 합류해야 할 이유는 무엇일까 곰곰히 생각해보았습니다.

  • 다양한 도메인을 경험해볼 수 있습니다.
    • 일반적으로 큰 기업에서 백엔드 개발자는 깊게 한가지 역량에 집중하게 됩니다.
      • 마이크로 서비스 아키텍처로 인해 각 도메인팀이 분리되어있다면 그럴 확률이 더 높습니다.
    • 반면에 인프런은 현재 백엔드 개발 파트가 서비스 전체의 백엔드를 다루고 있습니다.
      • 그러다보니 커뮤니티, 블로그, 영상 스트리밍, 결제/정산 등의 커머스, 이벤트를 통한 갑작스런 트래픽 대응 등 백엔드 개발자가 익혀야 할 전반적인 역량을 익힐 수 있습니다.
      • 물론 규모가 더 커진다면 저희 역시 MSA 구조로 갈 예정입니다.
  • 확정적으로 서비스의 성장을 경험해볼 수 있습니다.
    • 현재 인프런은 매년 300%의 서비스 성장을 하고 있습니다.
    • 백엔드 개발자의 기술적 역량을 쌓기 가장 좋은 환경은 폭발적으로 성장하는 서비스 규모라고 생각하는데요.
    • 매년 KPI를 초과 달성하고 있고, 그에 맞춰 아키텍처 변경이 지속적으로 필요하기 때문에 이 과정에서 얻는 수많은 경험들이 있습니다.
  • 다양한 레거시 개편 경험을 얻을 수 있습니다.
    • 이미 안정화된 서비스에서는 개편을 경험하기 쉽지 않은데요.
    • 더이상 이 코드와 구조로는 버틸수 없다는 판단하에 레거시를 개편하는 것은 성장하는 스타트업에서만 경험해볼 수 있는 희귀한 경험입니다.
  • 기술 스택과 패러다임 변경이 예정되어있어 전체 구성원이 함께 공부하는 문화가 있습니다.
    • 현재는 리팩토링 2판을 통해 레거시 코드를 효과적으로 개선하는 내용을 매 주마다 공유하고 토론하고 있습니다.
    • 팀 전체가 학습하고 성장하는 문화가 시작되고 있어, 같이 시작해볼 수 있습니다.

 

마무리


제가 즐겨보는 백종원의 골목식당에서는 (거의) 매번 가게 주인분께 여쭤보는 질문이 있습니다.

쉴틈없이 손님들이 방문하면 어떻게 할 것이냐?

백종원의 골목식당

저는 이 부분이 백엔드 개발자에게 항상 필요한 질문이라고 생각하는데요.
일단 실행되는 백엔드 애플리케이션을 만드는 일은 쉽습니다.
요즘은 특히 인터넷에 튜토리얼이 있기에 더욱 그러합니다. (여기서 인프런을 떠올리셨다면 가산점++)

그러나 협업하기에 좋은 방식으로, 성능과 안정성까지 고려한 백엔드 애플리케이션을 만드는 개발은 쉽지 않습니다. 모니터링 / 로그관리 / 테스트하기 좋은 구조 / 테스트코드 등 사용자분들은 못느끼지만 실제 운영 레벨에서 중요한 점들이 백엔드에서는 더 많은 비중을 차지합니다.

현재 인프랩은 데이터와 사용자가 적었을 때 효율적이었던 방식들이 서비스가 성장하면서 더 이상 효율적이지 않다는 것을 매일 경험하고 있습니다.

이런 경험은 이 시기에만 경험할 수 있기 때문에 같이 경험해보았으면 합니다.
긴 글 끝까지 읽어주셔서 감사합니다. 면접장에서 뵙겠습니다.


여기까지 인프랩 팀의 백엔드 개발 파트가 마음에 드셨다면,
지원하기 버튼을 통해 많은 지원해주세요 😉

 

지원하기