서버와 클라이언트는 단순한 개념이다. 하지만 현대 정보기술이 복잡해지며 덩달아 까다로워졌다. 중요한 건 각각이 요청과 응답을 주고 받는 관계라는 개념보다, 실제로 예시가 무엇이 있는지 보는 게 좋을 듯하다.
클라이언트(client)는 말 그대로 고객, 사용자가 사용하는 장치나 프로그램이다. 클라이언트에서 서버(server)에 요청을 보내면 서버는 말 그대로 제공(serve)한다. 데이터를 보내주든 받은 요청을 처리하든 어쨌거나 클라이언트로부터 요청을 받고 이를 기반으로 서비스를 제공한다. URL을 가지고 이야기해보자.
크롬이나 사파리같은 브라우저를 이용해 www.google.com을 입력하면 구글 홈페이지에 들어간다. 하지만 어떻게?
브라우저는 사용자가 입력한 도메인 이름을 DNS(Domain Name System)에 보낸다. DNS는 도메인 이름을 관리해주는 시스템이다. 이때 DNS는 시스템 내에서 브라우저가 보낸 도메인 이름에 해당하는 IP 주소를 찾는다. 이후 DNS는 브라우저에게 IP 주소를 찾았으면 그 주소를, 못 찾았으면 못 찾았다는 에러를 보낸다. 이때 브라우저는 도메인 이름(URL)을 가지고 요청을 보내는 클라이언트, DNS는 해당 요청을 가지고 IP 주소를 제공하는 서버다. 브라우저는 다시 IP 주소를 가지고 웹 서버에 요청을 한다. 웹 서버는 해당 IP 주소에 담겨있는 파일이나 데이터를 건네준다. 이때도 역시 브라우저는 클라이언트다.
AWS의 기능들을 보며 클라이언트와 서버의 개념을 구체적으로 살펴보자.
웹 서비스를 개발한다면 우선 서비스 사용자에게 보여줄 화면 파일이 있어야 한다. 사용자가 브라우저를 통해 URL을 입력하면 해당하는 URL을 가진 서버로 요청을 보내고, 그 서버는 HTML / CSS / JS 과 같은 파일을 브라우저로 보낸다. 브라우저는 응답 파일들을 가지고 화면을 사용자에게 보여준다. 이때 서버의 역할은 누가 할까? 답은 모른다. 실제로 지금 쓰고 있는 컴퓨터나 노트북으로 서버 역할을 할 수도 있다. 파일을 저장해놓고, URL 요청이 오면 클라이언트에게 저장된 파일을 보내주는 웹 서버 소프트웨어를 돌려놓으면 된다. 그러면 컴퓨터로 오는 요청을 받아서 클라이언트에게 저장된 파일을 보내주는 웹 서버가 된다. 실제로 2000년대만 해도 개인 개발자들이 자기 집 컴퓨터를 가지고 서버를 구축해 웹 사이트를 운영하는 일이 많았다.
요즈음에는 당연하게 클라우드 시스템을 이용한다. AWS에는 S3(Simple Storage Service)가 있다. 정적 파일들을 저장해놓고 요청이 들어오면 클라이언트에게 파일을 보내주는 서비스다. 이때 google.com 처럼 도메인 네임을 통해 요청을 보내기 위해서는 Route 53과 같이 DNS 시스템을 이용해야 한다. 물론 도메인도 사야 하고.
사용자가 클라이언트에서 이런 저런 요청을 통해 DB에서 작업이 이뤄진다면 클라이언트와 DB 사이를 중개해주는 서버가 필요하다. 이때 사용자의 동작마다 다르게 반응하는 동적 서버가 필요하고, 이를 처리하는 게 보통 백엔드 애플리케이션이다. 클라이언트와 DB 사이를 중개해주는 서버로 집 컴퓨터를 24시간 돌릴 수도 있지만, 애꿎은 컴퓨터를 학대하지 말고 가상 서버를 대여해주는 AWS의 EC2(Elastic Computer Cloud)를 이용하면 된다. 실제 물리적 서버는 AWS에서 관리하고 우리는 AWS가 관리하는 EC2 위에서 백엔드 애플리케이션을 구동시키면 된다.
여기서 AWS의 S3와 EC2는 서버다. S3는 정적 파일을 내려주는 서버고, EC2는 요청을 동적으로 처리하는 서버다. 흔히 웹 서비스를 구동한다면 EC2는 웹 API 호출 역할의 서버로 사용한다고 보면 된다. 그리고 EC2에서 API 요청을 처리하는 소프트웨어가 바로 백엔드 애플리케이션, node.js나 spring boot같은 것들이다.
나 혼자 정리하니 AWS가 얼추 정리된 느낌이다. 사실 반 년 전만해도 AWS라는 단어 자체를 몰랐고, 아마존은 그냥 전자상거래 회사인줄만 알았는데... 참 신기하다. 게임 중독 시절에 이런 컴퓨터의 세계를 알려주는 사람이 있었다면 그때 빠져들었을까? 흠. 알았어도 게임만 했을 것 같긴 하다.
'공부 > 코딩' 카테고리의 다른 글
와플 스튜디오 루키 과정 복습하기 - 2: fetch 와 supabase 기본 세팅 (0) | 2025.02.20 |
---|---|
와플 스튜디오 루키 과정 복습하기 - 1: 개발환경 세팅 (Next.js, Bun) (0) | 2025.02.19 |
바닥부터 공부하기 - 들어가는 말과 패키지와 번들러 (0) | 2025.01.20 |
나는 개발이라는 세계를 알았다 (4) | 2024.11.30 |
Git 정리 1편: 기초 개념과 사용법 (2) | 2024.10.15 |