소개

우아한형제들 결제시스템팀에서 근무하고 있는 이주현이라고 합니다.

제가 입사하고 이 팀에서 일한 지 3년이 넘었습니다. 지금은 회사, 사람, 팀, 인프라, 코드, 문화 등 다양한 변화에 적응하고 있는 구성원이지만 한 때 우아한형제들은 너무나 가고 싶은 회사였습니다. 지금도 저는 다른 회사를 외부에서 바라보면 궁금한 점이 많습니다. ‘저 회사는 어떤 언어를 사용할까?, 어떤 인프라를 가지고 있을까?, 배포는 어떻게 하지?’라고 말이죠.

요즘은 IT회사에서 기술 블로그를 많이 운영하고 있습니다. 때문에 많은 정보를 얻을 수 있는 한 편 궁금증이 증폭되기도 합니다. ‘정말 저 회사는 TDD 하는 거야?, 저 회사에 가려면 반드시 Spring을 잘해야 하는 거야?’

‘그래서 내가 저 회사에 가면 어떤 일을 하게 될까?’..

제가 우아한형제들의 모든 개발팀 이야기를 하기는 힘들겠지만 적어도 우리 팀에 한 하여 기술 및 소개를 할 수 있겠다는 생각이 들었습니다. 그래서 이번 블로그 주제는 특정 기술, 도구가 아닌 결제시스템팀의 하루, 개발 이야기로 준비했습니다.

잠깐! 우아한형제들은 정말 많은 개발팀이 있습니다. 대부분 각자 팀에 맞는 언어, 프레임워크, 문화, 등 다양한 개발 방법, 인원 구성을 가지고 있기 때문에 ‘우아한형제들의 모든 개발팀이 이렇다!’라고 단정짓는 것은 아닙니다.

오전

결제시스템팀

properties

??: "안녕하세요~!"

출근을 하면 모두 아침 인사를 해줍니다. 출근시간까지 30분이나 남았는데 대부분 일찍 도착해 있네요.

결제시스템팀은 기획자 6명, 개발자 7명. 총 코미디언13명으로 이루어져 있습니다. 기획자 분들과 같은 팀 이라니! 예상하지 못하신 분들도 계실 겁니다. 저희는 같은 팀으로서 결과를 만들어내기까지 빠른 피드백을 주고받으며 좋은 성과를 만들어 내고 있습니다.

아직 업무시간까지는 여유가 있기 때문에 페이스북, 커피, 잡담, 기술 블로그를 살펴보는데 시간을 보냅니다. 어제 해결하지 못했던 코드를 다시 살펴보는 사람도 보이네요.

9시 30분이 되었습니다!

아침회의

결제시스템팀은 빌링,비즈머니,포인트 총 세 가지 도메인을 맡고 있습니다. 9시 30분부터 각 시스템을 맡고 있는 개발자 분들이 모여 아침 미팅을 합니다. 서로 돌아가며 어제 했던 일, 이슈, 오늘 해야 할 일에 대하여 짧게 공유합니다. 이렇게 이야기를 하다 보면 서로 다른 도메인에 대하여 이해할 수 있고 더 좋은 문제 해결 방법을 얻을 수도 있습니다.

빌링시스템

제 차례가 되었군요! 저는 빌링시스템을 맡고 있습니다. 입사 전 생각한 빌링시스템은 여러 PG사의 역할을 묶어 사내 서비스를 위해 제공한다고 생각했습니다. 그런데 그건 당연한 거였고 생각보다 하는 업무가 많아 놀랐습니다. 결제, 영수증, 대사, 관리자 등등 그리고 수많은 배치들.. 그리고 외부 시스템과 연동이 많다 보니 생각하지 못했거나 알지 못했던 이슈도 많이 생깁니다.

우아한형제들 시스템 모두 많은 트래픽을 처리하고 있습니다. 특히 빌링 시스템은 돈과 관련되어있기 때문에 신경 써여할 부분이 많습니다. ‘결제 시 timeout이 발생하면 어떻게 해야 할까?, 결제 요청이 급증할땐 어떻게 처리해야 할까?, 결제 취소 요청이 실패하면 어떻게 해야 하지?’ 많은 고민을 하게 되죠. 버려지는 트래픽이 발생하면 안 됩니다. 우리에게는 작은 트래픽 하나지만 누군가에게는 번거로움과 화(火)로 이어질 수 있습니다.

올해 초에는 중소상공인 우대 프로젝트를 진행하여 배달의민족 업주분들의 카드 수수료 부담을 덜게 했습니다. 제가 진행한 업무가 영세 상인분들에게 직접적으로 도움이 되었고 뉴스에도 나오니 신기하면서 뿌듯했습니다.

Spring Boot/JPA

우아한형제들의 많은 시스템이 Spring Boot로 이루어져 있습니다. 결제시스템팀에서 개발 중인 모든 프로젝트도 마찬가지입니다. 모두 Gradle기반 multimodule 구조를 가지고 있습니다. 제가 입사했을 때 김영한님께서 사내에 JPA를 적극적으로 전도하고 계셨습니다. 덕분에 모든 프로젝트에서 사용하고 있습니다. 또한 사내에는 스프링 능력자 분들이 많으시기에 궁금했던 부분을 명쾌하게 해결해주시기도 합니다.

능력자 분들은 Spring Boot 2.x가 정식 release 되기도 전에 변경점을 파악합니다. 또한 1.5x에서 upgrade시 주의해야 할 점에 대하여 사내 wiki에 정리해주십니다. 이 정도는 아무것도 아닙니다. 또 어떤 tip이 있을까요? 보물창고 같은 저희 wiki가 궁금하지 않습니까? 우아한형제들에서 개발자로 일하는 동안에는 빨대 꼽고 다 뽑아먹을 수 있습니다. 하지만 일회용 사용은 자제합시다.

Spring Batch

properties

모든 시스템 알림을 Slack으로 받습니다.

회의가 끝나고 각자 자리로 돌아가 업무에 집중합니다. 드디어 풀 집중 모드를 발휘할 때가 왔습니다. 그런데 Slack에 배치 실패 알림이 왔네요. 오전은 시간이 잘 갈 것 같습니다.
확인결과 외부 시스템과 연동하는 데이터에 문제가 있었습니다. 바로 기획/운영자와 어떻게 해결할지 아이디어를 공유하고 패치 작업을 시작합니다.

저희 팀은 수많은 배치가 존재합니다. 모두 Spring Boot Batch를 이용하며 많은 문제를 해결하고 있습니다. 한 번에 프로세싱되는 데이터 수 만 해도 자세히 말씀드릴 수 없지만 엄청나기에 고민해야 할 포인트가 많습니다.

‘총 10억 개의 데이터 프로세싱 중 9억 9천만 번째에서 Exception이 발생하면 어떻게 해야 할까요?, Spring Batch 테스트 케이스는 어떻게 작성할까요?, 스케줄은 어떻게 관리는 어떻게 해야 할까요?’

코드리뷰

properties

착한척

저는 관심 없던 회사라도 코드리뷰 문화가 있다고 한다면 갑자기 좋게 보이기 시작합니다. 그만큼 코드리뷰는 개발 문화에 중요한 부분 중 하나이며 정착시키기 위해 팀원 모두의 노력이 수반되어야 하기 때문입니다.

점심시간까지 시간이 남았네요. 리뷰 거리가 없는지 굶주린 하이에나처럼 두리번 거려봅니다.

우아한형제들에서는 코드리뷰 툴로 upsource를 사용하고 있습니다. Intellij에 플러그인을 설치해서 사용할 수도 있습니다. 때문에 리뷰로 요청된 소스와 변경 지점을 쉽게 파악하고 의견을 나눌 수 있습니다. 코드리뷰를 받다 보면 본인의 코드가 눈에 띄게 바뀌고 발전된다는 게 느껴집니다. 정말 돈 내고서라도 코드리뷰를 받고 싶었는데 회사에서는 공짜라 너무 좋습니다.

점심시간

properties

대한민국에서 "아무거나"를 제일 많이 내뱉는 시간.

변수 네이밍 보다 더 고민하는 시간이 다가왔습니다. “오늘 점심 뭐 먹지?”

저희 사무실은 ‘작은집‘이라고 불립니다. 잠실역 9번 출구에서 자빠지면 코 닿는 곳에 위치해 있습니다. 근처에 회사가 많이 모여있기 때문에 음식점이 많이 모여 있습니다. 점심메뉴 선택의 폭이 넓습니다. 같점(팀과 같이 점심먹기)을 하셔도 되고 핵인싸분은 개인적인 점심 약속이 많을 테니 따점(따로 점심먹기)을 하셔도 됩니다. 요즘같이 더운 날에는 배달의민족 답게 미리 주문해서 회사 밖으로 나가지 않고 먹을 때도 있습니다.

오후

스프린트

오늘은 2주에 한 번 있는 스프린트 시간입니다. 개발자 모두 모여 진행했던 업무에 대하여 이야기를 나눕니다. 앞으로 어떤 일을 하는지 공유합니다. 또한 아쉬웠던 점과 좋았던 점 앞으로 2주 동안 해보고 싶은 일을 정리합니다. 이러한 스프린트 회의는 Jira/Wiki를 이용해 관리합니다. 그동안 제가 처리 한, 앞으로 제가 처리해야 할 ticket들을 보고 있노라면 ‘내가 마냥 월급을 훔치고 있던 건 아니구나’라는 생각이 들어 뿌듯합니다.

배포

Git

저희팀은 gitflow 전략을 사용합니다. 새로운 기능, 수정에 대한 요구사항이 생기면 제일 먼저 Jira ticket을 생성합니다. 그런 다음 develop branch로부터 ticket branch를 생성한 뒤에 코딩을 시작합니다. 이러한 과정은 이미 널리 알려진 방법중에 하나이고 많은 분들이 애용(?)하고 계실거라 생각합니다. 모든 작업이 마무리 되면 release브랜치를 생성하고 staging서버에 배포한 뒤 이상이 없으면 master branch로 운영서버 배포를 진행합니다.

Test

properties

편-안

이러한 과정이 매끄럽고 편-안 할 수 있는 이유중 하나는 바로 테스트 케이스입니다. 저희는 반드시 테스트 케이스를 작성합니다. 테스트 없는 코드는 commit 직후 죽어버립니다. 어떤 동료도 그것을 건들고싶어 하지 않을겁니다. 우리는 팀 입니다. 모두가 신뢰하고 이해할 수 있는 방향으로 진행합니다. 팀원 모두가 노력한 덕분에 지금은 테스트케이스가 당연한 것이 되었습니다.

테스트 라이브러리는 주로 junit4, spock, 신규 프로젝트에는 junit5를 사용하고 있습니다.

Jenkins

CI/CD툴로는 젠킨스를 사용합니다. 테스트도 돌리고 빌드, 배포도 하지만 이 외에도 여러 용도에 마르고 닳도록 사용하고 있습니다. 또한 많은 젠킨스 서버를 보유하고 있습니다. 때문에 관리해야 할 포인트가 많습니다. 젠킨스 서버에 하드웨어 장애가 발생하면 어떻게 해야 할까요?

빌링시스템은 여러 대의 서버를 보유하고 있습니다. bash, python으로 만들어진 스크립트도 많습니다. 위에서도 말씀드렸지만 배포하는 순간에도 사용자의 request를 버리면 안 됩니다. 무중단 배포는 어떻게 해야 할까요?, L4에서 신경 써야 할 부분은 무엇일까요?, L4가 없다면 어떻게 해야 할까요? 궁금하지 않으신가요?!

파일럿 프로젝트

properties

발표자의 마음속 일뿐 사실과 관계 없습니다.

얼마 전 새로 오신 유성님의 파일럿 프로젝트 발표 시간입니다. 저희 팀은 신규 입사자가 있으면 파일럿 프로젝트를 진행합니다. 팀에서 운영 중인 서비스와 관련된 과제를 주고 약 2주일 동안 개발하게 됩니다. Jira, Git, Spring Boot, JPA, Vue.js를 기본적으로 사용하게 됩니다. 이번 주제는 대용량 데이터 처리가 포인트라 Spring Boot Batch까지 사용되었네요.

대망의 발표 시간에는 다른 팀 개발자 분들도 같이 초대합니다. 코드뿐만 아니라 전반적인 아키텍처까지 궁금한 부분을 물어보고 발표자의 생각도 들어보며 좋은 해결책을 만들어봅니다.

요즘 들어오는 신입 분들의 실력이 상당합니다. 어려운 문제를 제가 생각하지도 못한 방법으로 Nice하게 해결한 부분이 나올 때면 저 스스로 자극받으며 반성하고 퇴근 후 배틀그라운드를 합니다.

이벤트

properties

우아한형제들 IP에서만 보이는 이미지입니다.

잠시 후 배달의민족 이벤트가 시작됩니다. 국가에서 허락한 유일한 DDoS가 발생할 예정입니다. 개발자분들 모두 만일에 대비해 모니터링 시스템을 살펴보며 몰려들 트래픽에 대비합니다. Newrelic, Pinpoint는 필수입니다. 현재 배달의민족 시스템은 여러 장애를 겪으며 발전되어 왔습니다. 빌링시스템도 마찬가지입니다. 모든 요청을 통과한 사용자가 정작 결제를 할 수 없다면 화가 날 수 있습니다. 이번 이벤트도 무사히 지나갔네요. ^^ 맘 편히 퇴근각 나왔습니다.

앞으로 배달의민족 사용자는 더 늘어날 것입니다. 대용량 트래픽을 안정적으로 처리할 수 있는 방법은 무엇이 있을까요? Scale-out이 무조건 정답일까요? Application을 개선하고 Nginx, Linux kernel 등 에서 튜닝 포인트를 만들어낼 수 있지 않을까요?

퇴근

하고 싶은 이야기가 많습니다. 비즈머니와 포인트시스템 그리고 AWS, 데이터베이스 등등.. 하지만 이쯤에서 칼퇴 해야되니깐..^^

결제시스템팀에는 할 일이 넘쳐납니다. 정말로 재미있게 일! 하고 싶은 분 계시나요?! 지원서 링크에서 ‘[배민플랫폼실] 서버 개발자 모집’에 많은 관심 부탁드립니다.

감사합니다.