우리가 만든 앱이 실제로 '사는 땅'이 있어요. 바로 서버, 그리고 그 서버들이 모인 인프라예요. 오늘은 서버가 시대별로 어떻게 발전해왔는지, 그리고 인프라의 기본 구성 요소들을 편하게 정리해볼게요.
백엔드 레이어, 이름부터 알아두기
본격적으로 들어가기 전에, 백엔드 코드를 나눌 때 쓰는 레이어 이름부터 짚고 갈게요.
- 비즈니스 로직 계층 — services
- 데이터 접근 계층 — repositories
- 프레젠테이션 계층 — api, controller
이렇게 역할별로 이름을 나눠두면 코드를 볼 때 "아, 이건 DB 접근하는 부분이구나", "이건 실제 로직 처리하는 부분이구나" 하고 딱 감이 오겠죠.
서버는 어디에 있을까?
서버를 보관하는 곳을 **렉(Rack)**이라고 불러요. 그 안에 트레이처럼 생긴 게 바로 서버예요. 보통 저렴한 x86 서버에 리눅스 OS를 깔아서 웹서버나 애플리케이션 서버(WAS)로 써요.
서버 진화 1단계: 2000년 이전 — 베어메탈 시대
옛날엔 물리적인 서버 1대 = 서버 1개였어요. OS도 안 깔린 순수한 하드웨어를 베어메탈(Bare Metal), 말 그대로 '날 것의 금속'이라고 불러요.
이때의 문제점
- CPU, Memory 같은 자원을 비효율적으로 관리할 수밖에 없었어요
- 리소스 조정이 어려웠어요
- 스케일링(서버 늘리고 줄이기)이 힘들고 시간도 오래 걸렸어요
서버 진화 2단계: 2000년대 — 가상화 기술
이 문제를 해결하려고 등장한 게 가상화 기술이에요. 물리적인 서버 1대를 논리적으로 여러 개(N개)의 서버로 쪼갤 수 있게 됐어요.
- 물리적 서버 = Host (Host OS 사용)
- 논리적 서버 = VM(Virtual Machine) (Guest OS 사용)
Host든 VM이든 둘 다 OS가 필요하다는 게 포인트예요. 이 VM들을 관리하고 리소스를 배분해주는 소프트웨어를 Hypervisor라고 불러요.
해결된 문제
- 자원을 효율적으로 관리할 수 있게 됐어요
- 리소스 조정이 쉬워졌어요
- 스케일링도 훨씬 쉬워지고 시간도 줄었어요
근데 새로운 문제도 생겼어요
- VM 자체를 스케일링해야 하니까 시간이 여전히 좀 걸렸어요
- VM마다 자체 OS가 있어서, OS 부팅 시간 때문에 시작하는 데 시간이 오래 걸렸어요
- VM마다 OS가 자원을 차지하다 보니, 베어메탈 하나에 띄울 수 있는 VM 개수가 한정될 수밖에 없었어요
- 서버 수를 늘리는 **수평적 스케일링(Horizontal Scaling)**은 자동으로 할 수 있는데, **수직적 스케일링(Vertical Scaling)**은 수동으로만 가능했어요
서버 진화 3단계: 2013년 — 컨테이너의 등장
이때 등장한 게 그 유명한 Docker예요. Docker가 내놓은 컨테이너라는 새로운 서버 가상화 기술은, Guest OS를 아예 없애버리고 각 컨테이너가 Host OS의 커널을 공유하게 만들었어요.
커널은 OS의 핵심 요소로, 서버의 주변 장치들이랑 소통하는 인터페이스 역할을 해요.
해결된 문제
- 스케일링 시간이 혁신적으로 줄었어요
- Guest OS가 없으니까 서버 부팅 시간도 훨씬 빨라졌어요
- Guest OS가 없어서, 하나의 베어메탈이나 VM에 훨씬 더 많은 컨테이너를 띄울 수 있게 됐어요
- Vertical Scaling(수직 스케일링)도 자동화가 가능해졌어요
그래도 남은 문제
- Stateless한 서비스(데이터를 안 갖고 있는 서비스)엔 완벽한데, Stateful한 서비스(DB처럼 데이터를 가지고 있어야 하는 서비스)엔 아직 좀 애매한 부분이 있어요.
참고로, 파이썬 가상환경도 비슷한 원리예요
파이썬의 **virtual environment(가상환경)**는 OS를 격리하는 게 아니라, **실행 환경(라이브러리 등)**을 격리하는 개념이에요. 라이브러리 버전 충돌을 막기 위해서, 공유 라이브러리 디렉토리 대신 내가 지정한 디렉토리에 라이브러리를 따로 설치하게 하는 거예요.
그리고 환경 변수는 OS에 정의된 변수를 말해요.
참고로 Docker Compose는 여러 컨테이너를 한 번에 실행하기 위한 툴이고, 프론트엔드·백엔드를 둘 다 다룰 수 있는 개발자를 풀스택(Full Stack) 개발자라고 불러요.
인프라를 이루는 기본 구성 요소
**인프라(Infrastructure)**는 말 그대로 프로그램이 사는 땅, 기반 구조예요. 크게 세 가지로 나눌 수 있어요.
1. 서버
베어메탈, VM, 컨테이너 — 앞서 다룬 그 서버들이에요.
2. 네트워크
서버끼리 통신하기 위한 연결망이에요.
- LAN(Local Area Network): 좁은 지역 내 네트워크 (작은 건물 안 등)
- WAN(Wide Area Network): 넓은 지역의 네트워크 (인터넷 등)
- VPN(Virtual Private Network): 가상 사설망. 클라우드(데이터센터)에서 VM을 빌려 쓸 때, 우리 회사만의 보안을 위해 독자적으로 만드는 가상 사설망이에요.
3. 스토리지
서버 데이터를 CRUD하기 위한 디스크예요. 스토리지 서버도 종류가 나뉘어요.
- NAS(Network Attached Storage): 파일 공유용 서버. 상대적으로 저렴해서 로그 쌓는 용도로도 많이 써요.
- SAN(Storage Area Network): DB 서버용. NAS보다 비싸요.
컴퓨터 디스크 자체도 두 종류가 있어요.
- HDD: 하드 디스크
- SSD: 메모리 기반 디스크 (더 빠름)
정리해볼게요
서버는 "비효율적인 베어메탈 → 유연하지만 무거운 VM → 가볍고 빠른 컨테이너" 순으로 발전해왔어요. 그리고 이 서버들이 실제로 돌아가려면 서버 자체뿐 아니라, 서버끼리 이어주는 네트워크, 데이터를 담아두는 스토리지까지 삼박자가 맞아야 해요.