주변에서 백엔드 개발자(Backend Developer)가 하는 일을 물어볼 때 나는 이렇게 대답 한다.
프론트엔드 개발자(Frontend Developer)는 눈에 보이는 개발을 한다면 백엔드 개발자(Backend Developer)는 눈에 보이지 않는 것들을 개발 해요.
결국 눈에 모이지 않는 모든 것들을 개발하는 사람이 바로 백엔드 개발자(Backend Developer)이다. 시스템이나 서비스의 규모에 따라 차이가 있겠지만 결국 훌륭한 백엔드 개발자로 성장 하기 위해서는 다양한 범위의 지식과 경험을 가지고 있어야 한다.
프론트엔드와 연동을 위한 API 개발 부터, DBMS, 파일스토리지, 네트워크 및 인프라 구성 등 서비스 동작을 위한 기본적인 서버 관련 업무 뿐만 아니라 서비스 운영을 위한 로그수집, 서버 모니터링, 캐싱, 데이터 분석 시스템, 빌드 및 배포 환경 구축 등 운영을 위한 여러가지 업무들도 신경 써야 한다. 그래서 오늘은 '백엔드 개발자(Backend Developer) 되기 위해 필요한 지식들' 첫번째 이야기를 나누어 볼까 한다.
먼저 백엔드 개발자(Backend Developer) 되기 위해 알아야 할 것들은 다음과 같다.
첫번째 이야기에서는 기본적으로 원하는 서버를 개발하고 배포 하여 서비스에 적용하기 위한 지식들을 정리 해봤다.
1. API 개발 (REST API)
백엔드 개발자의 시작은 바로 프론트엔드와 연동하기 위한 API 개발이다. 그래서 백엔드 개발자가 되기로 마음을 먹었다면 '원하는 기능의 API를 만들어야지' 라고 생각 하면된다. 그중에서도 REST API를 시작하면 좋은 이유는 오랫동안 API개발의 표준 처럼 사용 되어 왔고 서버개발의 전반적인 흐름을 이해 하는데 도움이 되기 때문이다. 최근에는 GraphQL을 도입하는 회사들도 많아지고 개발 생산성도 좋은 편이지만 아직 까지는 좋은 백엔드 개발자가 되기 위해서는 REST API를 먼저 익히고 학습 하는게 좋다고 생각한다.
2. 개발 언어와 웹 프레임워크 (Language & Web Framework)
앞서 얘기한 REST API를 실제로 개발하기 위해 필요한 도구가 바로 개발 언어와 웹 프레임워크이다. 이미 알고 있겠지만 백엔드 개발을 위한 개발 언어와 웹 프레임워크는 NodeJS (JavaScript, TypeScript), Ruby On Rails, Python Django, Spring Boot(Java, Kotlin), golang 등 아주 다양하다. 대부분 개발 언어와 웹 프레임워크 선택을 위해 많이 고민할 텐데 저는 개인적으로 이미 잘 알고 있는 개발언어가 있다면 개발 언어에 맞는 웹 프레임워크를 선택 할 것을 추천한다. golang의 경우 다른 언어 대비 웹 프레임워크가 정형화 되어 있지는 않지만 golang 을 제외 하고는 쉽게 설정하고 서버를 띄울수 있도록 웹 프레임워크가 잘 되어 있다.
개발 언어와 웹 프레임워크를 처음 부터 고민하는 분이라면 개인적으로는 NodeJS (TypeScript)를 추천한다. 추천하는 이유는
- ReactJS, NextJS 등 훌륭한 프론트엔드 개발 언어와 같은 언어를 사용한다는점
- TypeScript 이후 기존 JavaScript 의 단점들을 보완하여 정적 타입 체킹을 통해 자동완성이나 잘못된 변수/함수 사용에 대한 에러 알림 등이 가능해져 개발시 안정적인 코드를 만들 수 있음
- Serverless 에 가장 편리하고 적합하게 사용 할수 있음
이다.
개인적으로 많이 사용하는 개발 언어와 웹 프레임워크는 Ruby On Rails, NodeJS (TypeScript), Golang 이다. Ruby On Rails를 가장 많이 쓰는 이유는 가장 많이 개발 해왔고 그러다보니 여전히 개인적인 개발 생산성은 가장 좋기 때문이다. 하지만 Ruby On Rails 개발자를 점점 찾기 힘들어지고 다른 웹 프레임워크들 역시 개발 생산성이 좋아지면서 Ruby On Rails를 써야할 이유가 점점 사라져 가고 있다. 그래서 그 대안으로 몇년 전 부터는 위에서 언급한 장점들을 가진 NodeJS (TypeScript)를 많이 사용하려고 하고 있다. golang 의 경우 정형화된 웹 프레임워크가 없다보니 사용중인 라이브러리가 유지보수가 안되거나 기본적인 기능들을 직접 구현해야 하는 경우도 있지만 성능에서 압도적인 우위를 보이고, 언어 특성상 문법이 간단하고 컨벤션들이 정형화 되어 있어 개발 협업 및 코드 관리에 용이한 장점이 있다. 마이크로 서비스 처럼 단순한 기능을 만들 때에는 golang 도 좋은 선택지라고 생각이 된다.
3. 서버 기본 지식 (Server)
앞서 선정한 개발 언어와 웹 프레임워크를 통해 API 개발에 성공 했다면 다음에 필요한 내용이 개발한 API를 어떻게 서버에 올려서 API 서비스를 할까 일것이다. 요즘은 기존의 서버의 개념과 다른 Serverless 가 유행하고 실제 코드만 있으면 바로 서비스 할수 있을 정도로 만들어주는 서비스 들이 많이 있지만 백엔드 개발자가 되기로 마음을 먹었다면 일단 AWS의 EC2 Instance 와 친해져야 한다. 그리고 EC2 Instance에 올라가는 이미지들이 주로 Linux 기반의 OS라서 Linux 주요 커맨드 들도 잘 알고 있으면 좋다. AWS말고 GCP (Google Cloud Platform) 도 있지만 개인적으로 AWS에 익숙하다보니 앞으로 이야기들은 대부분 AWS 관리형 서비스 (AWS Managed Service) 중심으로 진행 할 예정이다. AWS EC2 Instance를 이해 했다면 지금은 조금 이해하기 어려운 개념 일 수도 있지만 AWS는 AWS Elastic Beanstalk과 같은 관리형 플랫폼 서비스를 이해 하면 좋다. PaaS 라고도 볼 수 있는데 원하는 개발 결과물 코드만 있으면 기본 인프라 구성, 배포, 애플리케이션 버전 제어, 자동 확장 기능까지 전체 시스템을 구축 해준다. 간단하더라도 웹 프레임워크를 통해 API 개발을 성공 했다면 AWS Elastic Beanstalk 환경을 구성해서 배포 까지 해볼 것을 추천한다. Load Balancer, Auto Scaling, SSL 적용, 네트워크 구성 등 AWS Elastic Beanstalk에 내부에서 동작하는 요소들에 대한 구체적인 설명은 다른 포스트로 설명 하려고 한다.
5. 네트워크 기본 지식 (Network)
웹 프레임워크를 통해 API 개발을 서버 또는 위에서 언급한 AWS Elastic Beanstalk 위애 올렸다면 그 뒤로 필요한 지식은 네트워크에 대한 기본 지식이다. 일단 REST API의 기반이 되는 HTTP 부터 원하는 Domain 에 연결하여 서비스 하기 위한 DNS, EC2 에 접속하기 위한 SSH 연결 그리고 지금 자세히 다루지는 않겠지만 서버가 올라가기 위한 기본 네트워크 구성 (VPC, Routing Table, Subnet)등 서버 동작 전체를 잘 이해 하기 위해서는 네트워크에 대한 기본 지식이 필요하다.
6. 데이터베이스 (Database)
개인적으로 백엔드 개발자로서 가장 중요한 분야는 바로 데이터베이스라고 생각한다. API 개발이 백엔드 개발 중에서 프론트엔드와 연동하는 가장 앞단에 있다면 데이터베이스의 경우 가장 뒷단에서 개발하고자 하는 서비스를 위해 필요한 데이터를 체계적으로 저장하는 데이터 저장소의 역할을 한다. 데이터베이스의 종류는 MySQL와 같은 관계형 데이터베이스 (Relational Database : RDB) 에서 부터 MongoDB, Redis, ElasticSearch 등 NoSQL 까지 다양한 종류가 있는데 백엔드 개발자를 시작 한다면 개인적으로 MySQL와 같은 관계형 데이터베이스 부터 시작 하는 것을 추천한다.
백엔드 개발자를 시작하시는 분들에게 MySQL와 같은 RDB를 추천 하는 이유는 다음과 같다.
- 데이터를 정형화하고 모델링하는 연습을 할수 있고
- 다양한 데이터 베이스가 쓰이는 있지만 여전히 현업에서 가장 우선적으로 고려되는 저장소 있고
- 데이터를 다룰수 있는 SQL 쿼리의 개념을 잘 이해 할수 있음
데이터베이스에서 중요한 개념 중에 하나는 바로 CRUD이다. CRUD는 대부분의 데이터베이스의 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 가리키는 말이다.
그리고 실제 Create(생성), Read(읽기), Update(갱신), Delete(삭제) 등의 CRUD 개발 작업을 할때 실제 쿼리를 이용하여 개발 하는 경우도 있지만 ORM (Object-relational mapping) 같은 추상화된 프레임워크를 사용 하는 경우가 많다. 결국 API 개발하면서 필요한 데이터베이스를 설계 하고 ORM 을 이용하여 간단하게 데이터베이스와 연동하는 코드를 작성 할수 있다.
7. 분산 스토리지 (Distributed Storage)
데이터베이스가 서비스에 필요한 데이터를 저장 한다면 사진, 동영상 등 서비스에 필요한 파일들은 어디에 저장 할까? 서비스에 필요한 서비스들을 저장하는 공간이 바로 분산 스토리지 (Distributed Storage)이다. 분산 스토리지라는 단어가 생소 할수 있는데 클라우드 기반의 파일 저장소 라고 생각하면 된다. 이미 친숙한 AWS S3 (Simple Storage Service) 가 바로 분산 스토리지 중의 하나이다.
예전에는 서버에서 직접 파일들을 관리하는 경우도 있었는데 구글 파일 시스템 (Google File System) 논문을 발표하고 AWS S3 (Simple Storage Service) 가 보편화 되면서 분산 스토리지가 백엔드 개발을 위한 파일 저장소로 자리 잡게 되었다.
8. 기본적인 프론트엔드 기술 (Basic Frontend Skill)
백엔드 개발자도 프론트엔드 개발을 할줄 알아야 할까? 정답은 ‘백엔드 개발자도 기본적인 프론트엔드 기술을 알아야 한다’이다. 예전에만 해도 백엔드 개발자, 프론트엔드 개발자가 명확히 나뉘어 있지 않고 웹 프로젝트 자체가 뷰를 포함한 MVC 형태로 구현되는 경우가 많았다. 그리고 최근에는 프론트엔드 개발과 백엔드 API 개발이 명확하게 나뉘는 형태의 아키텍처가 주류를 이루고 있긴 하지만 내부 백오피스, 관리페이지 (Admin) 등을 개발 할 때는 여전히 MVC 형태로 개발 되는 경우도 볼수 있다. 그러다 보니 HTML/CSS, JavaScript 등 기본적인 프론트엔드 기술은 알아두는 것이 필요하다.
마무리
지금까지 백엔드 개발자가 되기위해 필요한 지식들에 대한 기본적인 것들을 정리 해보았다. 이미 백엔드 개발을 많이 한 사람들에게는 당연한 내용일 수도 있겠지만 백엔드 개발자를 시작하는 분들에게는 많은 내용 일수도 있을거라는 생각이 든다. 배워야 할것도 알아야 할것도 많아 힘들 수도 있겠지만 반대로 광범위한 지식을 필요로 하는 백엔드 개발이 개발자 로서의 매력이기도 하다. 백엔드 개발자가 되기 위한 기본에 대한 내용으로 시작을 했지만 앞으로 중급, 고급 등 계속 해서 백엔드 개발자가 되기위해 필요한 지식들을 정리 해보려 한다.