본문 바로가기

SpringBoot/백엔드

[이것이 백엔드 개발이다] ch 4. 서버와 클라이언트

1. 서버와 클라이언트의 개념 

1) 네트워크에서의 서버와 클라이언트 

 - 서비스를 제공하는 쪽이 서버(server), 서비스를 제공받는 쪽이 클라이언트(client)

 - 물리적인 장치 간에 서로 통신이 이루어지기 위해서는 통신을 시작하는 쪽이 상대방의 네트워크 주소인 IP 주소를 알고 있어야 함

 

○ 로드 밸런싱 

 - 서버에 가해지는 부하(Load)를 분산하는 것 

 - 사용자들의 트래픽을 여러 서버가 나눠 받도록 구성하며, 네트워크 장비인 스위치(Switch)를 할당해 로드 밸런싱

 

○ 캐시

 - 비용이 큰 작업의 결과를 어딘가에 저장하여 비용이 작은 작업으로 동일한 효과를 내는 것 

 

2) 애플리케이션에서의 서버와 클라이언트 

 - 네트워크로 연결된 두 장치에서는 각자의 역할에 따라 실제 유의미한 트래픽을 주고 받는 애플리케이션이 실행 

 

3) 소스코드에서의 서버와 클라이언트 

- A라는 코드가 B라는 코드를 사용한다면 B는 서버 코드가 될 것이고,  A는 B 코드를 사용하는 클라이언트 코드가 될 것이다. 

//클라이언트
public static void main() {
 serverMethod();
}

//서버 
private static void serverMethod() {
 System.out.println("this is server method");
}

 

2. 서버와 브라우저 

 

1) www.google.com에  접속하면 생기는 일

 

 ○ DNS 서버 조회 

  - 네트워크상에서 클라이언트가 서버를 찾아가려면 IP 주소를 알아야 함

  - 도메인 네임을 IP로 변경해주는 DNS(Domain Name System)

  - 클라이언트는 DNS를 이용해 구글 웹 서버의 IP 주소를 얻었고, 이 주소로 구글의 웹 서버를 찾아가게 됨 

 

 ○ 라우터 접속 

  - 구글 웹 서버의 IP를 가지고 출발한 클라이언트의 요청은 PC에 연결된 랜선이나 와이파이 전파를 타고 공유기를 거쳐 인터넷 구
    간을 지남

  - 인터넷은 KT와 같은 인터넷 사업자들에 의해 관리되는 회선으로, 회선 중간마다 라우터가 존재 

  - 라우터는 클라이언트의 요청에 적혀 있는 IP 주소를 기반으로 다음 경로를 안내 

 

 

○ HTML 문서 전달 

 - 라우터의 안내를 받아 구글의 웹 서버에 도달한 클라이언트의 요청은 구글의 웹 서버에서 실행 중인 웹 서버 애플리케이션에 전달

 - 웹 서버 애플리케이션은 클라이언트의 요청에 해당하는 HTML 문서를 응답으로 줌

 - 이 HTML 문서는 왔던 길을 다시 되돌아가 최종적으로 클라이언트(웹 브라우저)에게 전달 

 

○ 랜더링(Rendering)

 - 서버로부터 응답받은 HTML 문서를 사용자가 볼 수 있는 형태로 만드는 과정 

 

2) IP 주소 

 - IP 주소는 마침표(.)를 기준으로 구분한 4개의 숫자 조합으로 구성 

 - 전 세계 인터넷에 연결된 모든 곳에 접속할 수 있는 유일한 IP는 공인(public) IP 주소로 부여하고, 각각의 공인 IP 내부에 존재       하는 네트워크 망에는 사설(Private) IP 주소를 부여하는 방식을 사용 

 

 

  - 로컬호스트(localhost)의 범위는 IPv4를 기준으로 127.0.0.1 ~ 127.255.255.254이며, 네트워크상에서 '자기 자신'을 의미 

  - 일반적으로 로컬호스트의 IP 주소로는 127.0.0.1을 사용하는데, 127.0.0.1로 접속하는 것은 곧 자기 자신에게 접속하는 것 

  - 공유기 바깥에서는 포트 포워딩(Port Forwarding)을 통해 내부에 있는 노트북이나 스마트폰으로 접근 가능 

 

3) 포트 

 - IP 주소는 클라이언트의 요청을 물리적인 장치인 서버까지는 안내해 줄 수 있지만, 해당 서버 내에서 돌아가고 있는 서버 애플리       케이션까지 전달해 주기에는 정보가 부족

 - 각각의 서버 애플리케이션에 정확하게 요청을 전달하기 위해서는 포트(Port)라는 추가 정보가 필요 

 

 ○ 잘 알려진 포트(Well Known Port)

  - 자주 사용하는 프로토콜이나 서비스들이 사용하는 포트 

  -  'HTTP는 무조건 80번 포트'라고 생각하면 안됨, 이것은 포트를 별도로 지정하지 않았을 경우에 프로토콜이 해당 포트를 사용한       다는 의미이지 직접 지정만 하면 얼마든지 다른 포트 사용 가능

     (ex: 80번으로 HTTP 서버를 하나 띄우고, 8080으로 또 다른 HTTP 서버를 띄울 수 있음) 

 

등록된 포트(Registered Port)

  - 특정 소프트웨어에서만 사용하는 프로토콜(MySQL 3306, Redis 6379)

 

○ 동적 포트(Dynamic Port)

  - 서버에게 보낸 요청을 되돌려 받기 위해 사용 

  - 서버에만 여러 개의 서버 애플리케이션이 실행되고 있는 것이 아니라, 클라이언트에도 여러 개의 클라이언트 애플리케이션들이        실행되고 있으므로 서로 구분이 필요 

  - 동적 포트는 우리가 직접 지정할 필요 없이 운영체제에 의해 관리되며, 비어 있는 포트를 사용하여 클라이언트 애플리케이션이
    자신의 요청에 대한 응답을 제대로 되돌려 받을 수 있도록 함 

 

3. 웹 서버와 WAS

 

 ○ 웹 서비스가 실행되고 있는 물리적인 형태의 서버 

   - 네트워크 장비나 데이터베이스 등 실제 존재하는 물리적인 장치

 

 ○ 물리적인 서버 내에서 실행 중이며 웹 요청을 받을 수 있는 서버 

   - 웹서버 

   - 정적인 콘텐츠르 렞공하는 것에 중점 

   - ex) Nginx, Apache

 

 ○ 프로그래밍 언어에 의해 특정 로직이 실행되는 웹 애플리케이션 서버

   - WAS

   - 정적인 콘텐츠에 더해 사용자의 요청에 따라 어떠한 로직을 실행시키거나, 그 로직의 결과에 맞춰 서버에 존재하지 않던 콘텐츠       를 새로 만들어 응답 

   - ex) Tomcat, Undertow