백엔드는 프런트엔드에서 사용할 API를 제공하고, 필요에 따라 데이터베이스 같은 외부 요소와 상호작용합니다. 그럼 백엔드 개발자는 API 서버와 데이터베이스만 다룰 줄 알면 되는 것일까요? 물론 아닙니다. 백엔드 개발자가 궁극적으로 해야 할 역할이 무엇이고, 백엔드 개발자가 되려면 어떤 역량이 필요한지 알아보겠습니다.
백엔드 개발자는 곧 백엔드 애플리케이션을 개발하는 사람입니다. 백엔드 애플리케이션은 프런트엔드 애플리케이션과 함께 서비스를 구성하고 사용자가 직접 서비스를 이용할 수 있도록 하죠. 전체 서비스 개발 프로세스에 포함되어 있는 일부 기능을 개발하는 것이므로 전체 서비스가 어떻게 기획, 개발, 운영되는지 먼저 알아본 다음, 그 안에서 백엔드 개발자가 어떤 역할을 하는지 살펴보겠습니다. 서비스 개발은 일반적으로 다음과 같은 5단계를 거칩니다.
① 기획 단계
어떤 서비스를 만들 것인지를 정의하는 단계입니다. 보통 개발자보다는 기획자가 서비스를 주도하며, 사람들의 어떤 문제를 해결하는지, 누구를 타깃으로 하는지, 다른 서비스와의 차별점은 무엇인지, 비즈니스 모델은 어떻게 되는지 등을 정의합니다. 이 단계에서 개발자가 하는 일은 기획 내용에 대한 가능성과 기술적 조언, 개발 기간에 대한 검토 등입니다. 이 과정에 개발자가 참여하지 않으면 구현 자체가 불가능한 서비스가 될 수도 있으므로 첫 단추를 잘 꿰는 것이 중요합니다.
② 설계 단계
기획 단계에서 정의한 서비스를 구현하기 위해 어떤 기능과 인프라가 필요한지 설계하는 단계입니다. 모든 기획이 기획 단계에서 완벽하게 정의될 수는 없기 때문에 설계 단계에서도 수시로 변경될 수 있습니다. 이 단계부터는 개발자가 주도적으로 서비스 개발에 참여합니다.
프런트엔드 개발자와 백엔드 개발자는 각자 다루게 될 데이터와 주고받을 데이터를 정의합니다. 즉, API를 설계하는 것입니다. 더 나아가 백엔드 개발자는 데이터베이스와 같은 저장소에 데이터가 어떻게 저장되는지도 정의해야 합니다. 이렇게 데이터를 정의한 뒤에는 이를 문서로 만드는데, 이것을 ‘API 문서’라고 합니다. 정확한 문서가 있어야 개발 과정에서 문서를 참고해 제대로 개발할 수 있습니다. 또한 문서로 만드는 과정에서 서로 잘못 이해했던 부분이 드러나기도 합니다.
③ 개발 단계
서비스를 실제로 구현하는 단계입니다. 개발 단계에서는 설계 단계에서 만들어진 문서를 기반으로 실제 프로그램을 개발합니다. 개발 초기에는 아직 백엔드 서버가 없기 때문에 프런트엔드 개발자가 임시로 사용하는 목업(Mockup) 서버를 만들기도 합니다. 반대로 백엔드 개발자 역시 아직 프런트엔드 페이지가 없기 때문에 Postman과 같은 툴을 사용하거나 테스트 코드를 작성하여 본인이 개발한 코드를 확인합니다. 물론 상황에 따라 계속해서 초기 기획과 설계를 수정할 수 있습니다.
대부분의 서비스는 오픈일이 정해져 있으므로 일정을 지키기 위해 빠른 속도로 개발해야 합니다. 그렇기 때문에 서비스 개발 초기에는 특히 빠르게 구현하는 쪽에 높은 우선순위를 둘 때가 많습니다. 서비스 오픈 속도가 시장을 선점하는 데 중요한 요소이기 때문이죠.
④ 배포 단계
개발 단계에서 구현된 코드를 서버에 올려 서비스하는 단계입니다. 물론 처음 배포한 코드를 사용자에게 바로 서비스하는 경우는 드뭅니다. 일반적으로 어느 정도 개발된 코드의 초기 배포는 개발 단계에서 이루어지고, 프런트엔드와 백엔드의 여러 개발자가 각자 배포된 서버를 통해 남은 개발을 이어 나갑니다. 최종적으로 사용자에게 서비스를 공개할 시점이 되면 공개할 버전의 소스코드를 각자 서버에 배포해 둔 상태에서 테스트를 진행합니다. 테스트를 완료한 후 이상이 없다면 서비스 오픈일에 사용자에게 공개하고, 그때부터는 사용자의 트래픽이 서비스로 들어 옵니다. 서비스가 공개된 이후에는 프런트엔드와 백엔드 모두 버전(Version)을 관리 하는 방식으로 함께 배포하는 경우가 많습니다. 이러한 배포를 ‘패치(Patch)’라고 합니다.
⑤ 운영 단계
서비스를 오픈하고 운영하는 단계를 의미합니다. 아무리 서비스를 잘 개발했다고 해도 모든 서비스는 버그를 내포하고 있습니다. 서비스를 오픈한 다음부터는 CS(Customer Service) 등을 통해 수시로 여러 가지 버그가 접수되므로 우선순위에 따라 하나씩 처리해 나가야 합니다. 당연히 서비스 이용에 치명적인 오류를 일으키는 버그들이 높은 우선순위를 가집니다.
트래픽이 많아지면서 문제가 생기는 경우도 있습니다. 트래픽이 너무 많아지면 서버의 CPU, 디스크, 네트워크 사용량이 많아지면서 API의 응답 시간이 길어져 사용자가 서비스 이용에 불편을 겪거나 완전히 이용하지 못하는 상황이 될 수 있습니다. 백엔드 개발자는 이러한 문제를 미연에 식별하여 테스트하고 대책을 수립해야 합니다. 일반적으로 사용자에게 서비스를 오픈하기 전 배포 단계에서 테스트를 진행하며, 서비스 오픈 후 문제가 발생했다면 빠르게 원인을 파악하여 추가적인 서버를 투입하거나 로직을 변경하여 문제를 해결해야 합니다.
여기까지가 일반적인 서비스 기획부터 운영까지의 백엔드 개발 과정입니다. 서비스가 한 번 배포된 다음에는 운영만 하면 되는 것이 아니라 앞선 다섯 단계를 지속적으로 반복해야 합니다. 상황에 따라 수시로 서비스 기능이 추가되거나 버그를 수정해야 하기 때문입니다. 실제 서비스 개발은 이보다 더 복잡하지만 지금은 이 정도만 알고 있어도 충분합니다.
개발자의 역량은 어떤 기준을 세우느냐에 따라 달라질 수 있습니다. 다양한 사람들과 협업하고 끊임없이 서비스를 개선해야 하는 직무의 특성이 곧 백엔드 개발자의 역량이라 할 수 있는데요, 하나씩 살펴보도록 하겠습니다.
① 커뮤니케이션 능력
개발자뿐 아니라 모든 사람에게 필요하겠지만, 타 부서와의 협업이 많은 백엔드 개발자에게는 특히나 중요한 역량입니다. 기획부터 운영에 이르기까지 커뮤니케이션이 필요하지 않은 단계가 없죠. 커뮤니케이션 능력은 단순히 말을 잘하는 것을 의미하지 않습니다. 커뮤니케이션 능력이란 ‘내가 알고 있는 것을 상대방에게 이해시키고, 반대로 상대방이 알고 있는 것을 이해하는 능력’을 말합니다. 말은 수단 중 하나일 뿐 글이나 그림을 적절히 활용하는 것도 좋은 커뮤니케이션 수단이 될 수 있습니다.
② 구현 능력
기획한 내용을 실제 개발물로 구현해 내는 능력을 말합니다. 요구사항을 이해하고 그것을 자신이 구현할 수 있는 언어로 개발하는 능력은 개발자가 갖춰야 할 가장 기본적이면서도 중요한 역량이죠. 특히 백엔드 개발자는 기획과 설계 단계에서 어떤 요소를 구현할 수 있고, 어떤 요소를 구현하기 어려운지를 구분할 줄 아는 능력이 매우 중요합니다. 그래야 서비스 개발의 전체 소요 일정을 적절하게 산출하고, 정해진 날짜에 오픈할 수 있기 때문입니다.
이제 개발자로 첫 발을 뗐다면 자신이 생각한 기능을 어떤 식으로든 구현해 내는 것을 첫 번째 목표로 삼아야 합니다. 그밖의 유용한 기능을 추가하거나 유지보수하기 좋게 개발하는 것은 그 다음 문제입니다.
③ 주도성
주도성은 사실 역량이라기보다 개인적 성향에 가까울 수 있지만 본래 주도성이 부족한 사람이라도 좋은 개발자가 되려면 프로젝트를 적극적으로 끌고 나갈 수 있어야 합니다. 주도성이 강한 사람은 팀의 목표와 자신이 해야 할 일을 이해하며, 팀과 자신이 더 좋은 방향으로 나아가려면 무엇을 해야 할지를 먼저 파악하고 행동하는 사람입니다.
예를 들어 설계 단계에서는 프런트엔드 개발자와 백엔드 개발자가 소통하면서 서로 참고할 문서를 만들어야 하는데, 문서화 작업은 그리 간단하지 않습니다. 특히 API 서버로 서로 데이터를 주고받을 때 사용되는 데이터 포맷을 문서화하는 작업은 더더욱 귀찮고 번거로운 일이죠. 이때 프런트엔드 개발자와 백엔드 개발자가 서로 상대편에서 먼저 정리해 주기만 바란다면 어떻게 될까요? 주도성이 강한 사람이라면 그 일을 먼저 진행했을 겁니다. 당시에는 손해보는 것 같을 수 있지만, 그로 인해 쌓아 올린 실력과 자신감은 남들보다 빠르게 기회를 캐치해 내는 능력으로 남게 됩니다.
④ 풍부한 CS 지식
풍부한 CS(Computer Science) 지식은 단순히 작동만 하는 소프트웨어를 만들어 내는 것을 넘어, 방대한 트래픽을 처리할 수 있는 시스템을 설계하고 구현하는 데 도움이 됩니다. CS 지식은 대표적으로 운영체제, 데이터베이스, 네트워크 관련 지식을 들 수 있는데, 이들 모두 실무에서 가장 필요한 대규모 트래픽 처리 시스템을 만드는 데 꼭 필요합니다. 실제 업무를 하며 배우게 되는 지식도 있지만, 신입 개발자로 일을 시작하려면 기본적인 CS 지식은 반드시 갖추고 있어야 합니다. 특히 신입 개발자의 경우 채용 면접에서 물어보는 내용의 대부분이 CS 지식입니다. 신입이라는 특성상 경험에 대한 질의보다는 지식을 통해 검증하는 것이 적절하기 때문이죠.
⑤ 당연한 것에 의문 품기
개발자 채용 면접에서는 대개 다음과 같은 형태의 질문을 받을 것입니다. ‘A와 B 중에 왜 A를 사용하셨나요?’ 혹은 ‘A의 장점과 단점에는 어떤 것이 있나요?’ 등입니다. A와 B에는 여러분이 예상할 만한 것부터 전혀 생각지도 못했던 대상이 들어가기도 합니다.
혹시 자바를 배울 때 사용했던 자바 언어의 버전을 기억하시나요? 왜 그 버전을 선택하셨나요? 그 버전의 특징은 무엇인가요? 막상 이런 질문을 받으면 답변하기 어렵죠. 어쩌면 이런 질문 자체를 생각해 본 적도 없을 수 있습니다.
면접관은 왜 이런 질문을 하는걸까요? 개발자는 단순히 기능을 구현하는 데 그치지 않고, 그 원리를 이해해야 하기 때문입니다. 원리를 먼저 이해해야 구현 능력도 향상되고, 나아가 대량의 트래픽을 처리할 수 있는 시스템도 만들 수 있습니다. 따라서 평소에 당연하게 알고 있던 것에 의문을 품고, 관련 자료를 검색하는 습관을 들이는 것이 좋습니다.
위 콘텐츠는 『이것이 취업을 위한 백엔드 개발이다 with 자바』를 재구성하여 작성하였습니다.
최신 콘텐츠