restaurant.png

서버와 클라이언트, DB의 관계를 이해하기 위해 가상의 음식점을 하나 떠올려 봅시다. 음식점에는 테이블과 홀이 있고, 장부를 적는 카운터와 주방, 그리고 재료를 보관하는 작은 창고 또는 냉장고가 있을 겁니다. 애초에 서버와 클라이언트라는 표현은 서비스service를 제공serve하는 웨이터server와 고객client이라는 뜻의 영단어로부터 나왔습니다. 홀에서 음식을 나르고 주문을 받는 역할의 아르바이트를 ‘홀 서빙(Hall serving) 알바’라고 부르는 것, 다들 아시죠?

1. 클라이언트

먼저 클라이언트에 두 가지 의미가 있다는 걸 이해해야 합니다.

  1. 고객, 즉 사용자 자신 = 클라이언트
  2. 사용자가 다루는 소프트웨어, 또는 컴퓨터 = 클라이언트 프로그램

위의 그림에서 1은 식탁에 앉아 주문을 하고 있는 사람까지이지만, 2번의 의미까지 생각한다면 아마 테이블이나 식기류, 웨이터까지 포함해 클라이언트라고 부를 수 있을 겁니다.

여기서 웨이터는 카운터에 고객의 주문 내용을 전달하거나, 주방에서 나온 요리를 고객에게 제공하거나 하는 일을 합니다. 이것은 클라이언트 프로그램과 서버 프로그램이 각각 API를 호출하고 그것에 응답하며 통신하는 과정과 비슷합니다.

2. 서버와 DB

그러면 위의 그림에서 붉은 색 영역으로 표시된 나머지 부분을 우리는 서버라고 부를 수 있을 겁니다. 서버는 DB에서 데이터를 가져와서 클라이언트에 보내주거나, 클라이언트로부터 받은 정보를 DB에 저장하거나 하는 일을 하는데요. 이것을 음식점에서 고객의 주문 내용을 장부에 적고, 창고로부터 재료를 가져와 요리해서 고객에게 제공하는 것에 비유한다면, 여기서 장부나 창고 같은 것은 DB와 역할이 비슷하다고 볼 수 있겠죠?

<aside> 💡 2번의 의미를 갖는 클라이언트 프로그램을 두고, 사용자에게 보여지고 사용자가 만지고 조작하는 ‘앞단’이라는 의미를 담아 프론트엔드 라고 부르기도 합니다. 그리고 사용자에게는 보이지 않게 뭔가 중요한 작업을 하는 부분의 프로그램을 ‘뒷단’이라는 의미의 백엔드라고 부르기도 하죠. 대부분의 서버 프로그램은 백엔드로 분류됩니다. 하지만 클라이언트 프로그램이라고 해도, 사용자에게는 보이지 않게 중요한 작업을 하는 백엔드 부분을 가질 수 있기 때문에 클라이언트 프로그램과 프론트엔드가 완전한 동의어는 아닙니다. 서버와 백엔드도 마찬가지로 동의어가 아니구요.

</aside>

<aside> 💡 DB도 일종의 서버입니다. 서버 프로그램 중 데이터만을 전문적으로 다루는 부분을 보안성, 효율성 등의 이유로 별도의 서버로 분리해서 운영하는 것이 일반적입니다.

</aside>