백엔드 개발과정 탐색하기

5 분 소요

백엔드 개발에 대한 과정을 정리해 봅니다. 첫번째로 백엔드 로드맵을 살펴보면서 앞으로의 과정을 탐색해 보겠습니다.

백엔드 로드맵

1

백엔드 로드맵 탐색

주요 백엔드 로드맵을 검색해 보니 위와 같은 그림이 나왔다. 나름 보안분야에서도 많은 프로젝트를 경험했고 현재는 개발도 하고 있지만 위의 로드맵을 보면서 음… 위 항목에 대한 질문이 있을때 몇개나 대답할수 있을까? 의구심이 들더라 대답 할 수 있는 항목들을 체크해보니 더 심각한 수준이였다. 손가락 안에 들정도…

2

이대로 있을순 없다! 이제부터 하나 하나 곱씹어 익혀보자!

어떤 걸 공부해야 할까?

사실 막상 공부를 해보려고 하니 시간도 한정적이고 로드맵 전체를 다 따라가기에는 무리가 있어 보였다. 앞의 추천 항목부터 필수적으로 공부를 하면서 대체 가능한 옵션 및 선택 항목을 차례대로 진행해 봐야겠다.

(1) 인터넷

인터넷은 개발자라면 필수로 기본 개념을 이해 해야 한다고 생각했다. 1. 인터넷의 작동 원리, 2. HTTP란?, 3. 브라우저와 그 작동 원리, 4. DNS와 그 작동원리, 5. 도메인 이름이란?, 6. 호스팅이란? 내용을 바로 전달 할 수 있도록 익혀보겠다.

(2) 프론트엔드 기본 지식

백엔드 개발자가 프론트엔드 지식을 알아야 한다고? 할수 있겠지만 사실 서비스를 이용하는 입장에서 백엔드 데이터는 단순히 정보일뿐 가시성이 없다면 반쪽짜리 서비스가 아닐까? 필자는 역으로 프론트엔드 개발파트 프로젝트를 진행해 보았다. 그 때 백엔드를 개발 하션던 분이 프론트엔드의 어려움을 고려 안하시고 필요없는 데이터까지 넘겨주시는 걸 보면서 내가 백엔드 파트라면 프론트파트를 고려해서 꼭 필요한 데이터만 넘겨야 겠다 라는 생각을 했다. 거창한 지식을 모르더라도 1. HTML 2. CSS 3. JavaScript는 웹 페이지를 구성하는 기본 상식이다. 그 개념에 대해서 정리해야 겠다.

(3) OS에 대한 전반적인 지식

우리가 작성한 프로그램의 동작은 반드시 윈도우OS 또는 리눅스OS 던 어느 컴퓨터/서버의 OS에서 동작하는것이 아닌가 그러면 OS에대해서 알아야 하는데 이유를 정리해 보았다.

  1. 서버운영: 백엔드 개발자는 서버 운영을 담당하는데, 서버 운영을 위해서는 OS의 기본 지식과 명령어 사용법이 필요하다. OS의 이해 없이 서버 환경 설정, 모니터링 보안 업무가 어렵기 때문에 운영을 위해서 지식을 가지고 있어야 한다.
  2. 성능 최적화: 백엔드 개발자는 성능을 최적화 하는데 많은 시간을 투자한다. 이를 위해서는 OS의 내부 동작 방식과 함께 하드웨어의 성능 특성도 이해 해야 한다. OS에서 제공하는 자원 관리 기능을 잘 이용한다면 서버의 성능을 최대한 끌어 올릴 수 있을 것이다.
  3. 보안: 앞서 말했듯 백엔드 개발자는 서버의 보안을 담당한다. OS의 보안 기능에 대한 이해와 이를 활용한 보안 정책 설정이 필요하다. 또한 OS관련 취약점에 대한 이해도 필요하다.
  4. 대응: 서버 환경에서 발생하는 다양한 이슈에 대한 대응이 필요하다. 이를 위해서는 OS에서 제공하는 로그를 분석하고 디버깅하는 데 필요한 지식과 기술이 필요하다.

위와 같이 OS에 대한 전반적인 지식은 아무리 강조해도 모자라다. 1.터미널 사용법 2.터미널 기본 명령 3.OS의 일반적인 작동 원리 4.프로세스 관리 5. 스레드의 동시성 6.메모리 관리 7.프로세스 간 통신 8. 입출력(I/O)관리 9.POSIX 기초 10.네트워크 기본 개념 에 대해서는 모든 개념을 정확히 익힐 예정이다.

(4) 언어

언어는 개발자라면 필수로 한가지 이상은 알아야 하기에 필요성은 언급할 필요가 없다고 생각한다. 이중 어떤 언어를 해야할까? 다양한 언어가 존재하지만 서버 개발에 가장 적합한 언어는 역시 Java이다. Java는 멀티 스레드를 지원하고, 메모리 관리와 가비지 컬렉션을 자동으로 처리하며, 높은 수준의 보안성과 안정성을 제공한다. 이러한 특성들은 백엔드 개발에 필수적이며, Java를 이용하면 안정적인 서버 개발이 가능하게 한다. Java를 기본으로 Kotlin을 같이 공부할 예정이다. Kotlin은 Java와 100% 상호 운용이 가능하면서, Java보다 코드를 더 간결하게 작성할 수 있는 정적 타입 언어이다. 심지어 Intelij IDE는 Java코드를 자동으로 Kotlin코드로 변환하는 기능까지 있을 정도! 하지만 Java를 모르고 Kotlin만 할 순 없다. ( 기존 코드가 대부분 Java인데 내가 하고 싶다고 강요만 할 순 없다… ) 앞으로의 기술 포스트는 Kotlin으로 올릴 예정이지만 개인적으로는 Java에서 동작도 생각하며 진행 예정

(5) 버전관리 시스템

개발환경에서 빠지지 않는것이 있으니 바로 버전제어이다. 예전에는 한때 SVN을 사용하기도 했지만 요즘은 Git을 대부분 사용 할 것이다. Git을 왜 사용할까?

  1. 협업을 원활하게 할 수 있다. Git을 사용하면 여러 명이 동시에 작업할 수 있고, 각자의 변경 사항을 효과적으로 관리할 수 있다. 이를 통해 팀 전체의 생산성을 높일 수 있다.
  2. 변경 사항을 추적할 수 있다. Git은 변경 사항을 추적하고, 변경 이력을 기록한다. 이를 통해 언제든지 이전 상태로 되돌릴 수 있다.
  3. 코드 충돌을 방지할 수 있다. 동일한 파일을 여러 명이 수정할 경우 코드 충돌이 발생할 수 있는데 Git은 이를 방지하고, 충돌이 발생한 경우 충돌을 해결할 수 있는 방법을 제공한다.
  4. 브랜치를 이용해 개발을 분리하여 관리할 수 있다. Git은 브랜치를 이용해 개발을 분리하여 관리할 수 있다. 이를 통해 여러 기능을 동시에 개발하거나, 안정적인 상태의 코드와 실험적인 코드를 분리하여 개발할 수 있다.

Git에 대한 사용법을 정리하고 배포전략도 함께 정리해 보겠다.

(6) 관계형 데이터베이스

관계형 데이터베이스는 데이터를 구조화하고, 저장하고, 검색하며, 조작하는 데에 있어서 효율적인 방법을 제공하기 때문에 꼭 필요하다. 우리가 사용하는 대부분의 애플리케이션은 사용자 정보, 상품 정보, 주문 정보 등의 데이터를 다루기에 이러한 데이터는 대부분의 경우 테이블과 열로 구성된 관계형 데이터베이스에 저장된다 관계형 데이터베이스는 또한 데이터를 효율적으로 저장하고 검색하기 위해 다양한 기능을 제공하는데 예를 들어, 데이터의 중복을 최소화하기 위해 정규화를 적용하거나, 데이터를 검색하고 조작하기 위해 SQL을 사용한다. 또한, 여러 사용자가 동시에 데이터를 조작할 수 있는 동시성과 데이터 무결성을 보장하기 위한 기능도 제공한다.
데이터베이스의 모든 것을 정리하는 것은 DBA분야를 따로 나눌수 있을 정도로 방대한 내용임으로 PostgreSQL을 바탕으로 기술 포스트를 정리하면서 개념에 대해서도 차근 차근 정리해 보겠다.

(7) NoSQL 데이터베이스

이전에는 관계형 데이터베이스만 사용되었지만 점차 NoSQL 데이터베이스가 영역을 확장해 나가는거 같다. 이유를 정리해보면

  1. 데이터 모델링의 다양성: NoSQL 데이터베이스는 스키마가 없거나 유연한 스키마를 가진다. 이러한 특징은 백엔드 개발자가 데이터 모델링을 할 때 선택의 폭을 넓혀준다. 이는 백엔드 시스템의 유연성을 높여주며, 다양한 종류의 데이터 형식을 저장할 수 있도록 해준다.
  2. 확장성: NoSQL 데이터베이스는 수평적으로 확장이 용이하다. 이는 데이터베이스의 용량이 증가하더라도 성능 저하 없이 데이터를 처리할 수 있도록 도와준다. 백엔드 개발자는 데이터베이스의 확장성을 고려하여 시스템을 설계해야 하며, 이를 위해 NoSQL 데이터베이스에 대한 이해가 필요하다.
  3. 대규모 데이터 처리: NoSQL 데이터베이스는 대규모 데이터 처리에 효과적이다. 따라서 백엔드 개발자는 대량의 데이터를 다루는 경우에 NoSQL 데이터베이스를 활용하여 데이터 처리 속도를 높일 수 있다.
  4. 빠른 개발: NoSQL 데이터베이스는 SQL 기반 데이터베이스에 비해 상대적으로 간단한 문법을 가진다. 이는 백엔드 개발자가 빠르게 개발을 진행할 수 있도록 도와준다.

앞으로의 포스팅을 정리하면서 가장 많이 사용하는 MongoDB를 익혀볼 예정이다.

(8) 더 깊은 데이터베이스 지식

앞서 관계형 데이터베이스 에서도 데이터베이스 분야는 영역을 따로 나눌수 있을 정도로 방대한 내용임으로 벌써 이번 로드맵에서도 파트가 3번째로 나왔다. 백엔드 시스템의 안정성과 성능을 높이기 위해서는 그 만큼 데이터베이스는 중요하다는 얘기가 된다. 항목을 정리해보면

  1. ORM(Object Relational Mapping): ORM은 객체와 관계형 데이터베이스 간의 매핑을 쉽게 해주는 기술이다. 백엔드 개발자는 ORM을 사용하여 객체 지향적인 방식으로 데이터베이스를 다룰 수 있다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하는 것보다 더 쉽고 편리하게 데이터베이스를 다룰 수 있다.
  2. ACID: ACID는 데이터베이스 트랜잭션의 속성을 나타내는 것입니다. Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(영속성)의 약자이다. 이러한 속성은 데이터베이스 트랜잭션의 안정성을 보장하기 위해 중요하다. 백엔드 개발자는 ACID 속성을 이해하여 데이터베이스 트랜잭션을 안정적으로 처리할 수 있다.
  3. 트랜잭션: 트랜잭션은 데이터베이스 상태를 변경하는 작업 단위이다. 백엔드 개발자는 트랜잭션을 이해하여 데이터베이스 상태를 안정적으로 유지하고, 데이터베이스 조작 중 발생할 수 있는 문제를 미리 예방할 수 있다. 또한 트랜잭션을 이용하여 병행성 문제를 해결할 수 있다.
  4. N+1 문제: N+1 문제는 데이터베이스 쿼리를 작성할 때 발생하는 문제로, 관련된 데이터를 가져오는 쿼리가 여러 번 실행되는 문제이다. 이는 데이터베이스 성능에 부정적인 영향을 미치며, 데이터의 양이 많아질수록 더 심각한 문제가 된다. 백엔드 개발자는 N+1 문제를 예방하기 위해 데이터 로딩 전략을 고려하고, 적절한 조인(JOIN)을 사용하여 관련된 데이터를 한 번에 가져올 수 있도록 해야 한다.
  5. 데이터베이스 정규화: 데이터베이스 정규화는 데이터를 효율적으로 저장하기 위한 방법으로, 중복된 데이터를 제거하여 데이터베이스의 일관성과 안정성을 높인다. 백엔드 개발자는 데이터베이스를 설계할 때 적절한 정규화 과정을 거쳐야 하며, 데이터베이스 구조의 효율성과 유지보수성을 높일 수 있다.
  6. 인덱스와 그 작동 원리: 인덱스는 데이터베이스에서 데이터 검색 속도를 높이기 위한 방법이다. 인덱스를 사용하면 데이터베이스에서 데이터를 빠르게 검색할 수 있으며, 데이터베이스의 성능을 높일 수 있다. 백엔드 개발자는 인덱스를 적절히 설계하여 데이터베이스의 성능을 최적화할 수 있으며, 인덱스의 작동 원리를 이해하여 적절한 인덱스를 선택하고 인덱스의 유지보수를 수행할 수 있다.
2