클라이언트-서버 패턴(Client-Server Pattern)은 네트워크 아키텍처 패턴으로, 클라이언트와 서버라는 두 가지 주요 구성 요소가 서로 요청과 응답을 주고받는 구조이다.
이 패턴은 응용 프로그램이 서버에서 데이터를 제공하고, 클라이언트가 이를 요청하여 사용하는 방식으로 설계된다.
네트워크 기반의 소프트웨어에서 클라이언트와 서버의 역할을 분리할 때 다음과 같은 이점이 있다:
클라이언트-서버 패턴은 이러한 이점을 활용하여 네트워크를 통해 데이터와 리소스를 제공하고 소비하는 시스템을 설계할 수 있게 한다.
웹 애플리케이션에서 클라이언트(브라우저)는 사용자 요청을 서버(백엔드)로 보내고, 서버는 해당 요청을 처리하여 응답을 반환한다.
Client ↔ Network ↔ Server
이번 예시에서는 클라이언트가 서버에 특정 데이터를 요청하고, 서버가 이를 응답하는 방식으로 구현한다.
// 서버 측 코드
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6789);
System.out.println("서버가 시작되었습니다.");
Socket connectionSocket = serverSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
String clientMessage = inFromClient.readLine();
System.out.println("클라이언트로부터 받은 메시지: " + clientMessage);
String response = "서버에서 받은 메시지: " + clientMessage;
outToClient.writeBytes(response + '\n');
connectionSocket.close();
serverSocket.close();
}
}
// 클라이언트 측 코드
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = "Hello Server!";
outToServer.writeBytes(message + '\n');
String response = inFromServer.readLine();
System.out.println("서버로부터 받은 응답: " + response);
clientSocket.close();
}
}
서버 측:
서버가 시작되었습니다.
클라이언트로부터 받은 메시지: Hello Server!
클라이언트 측:
서버로부터 받은 응답: 서버에서 받은 메시지: Hello Server!
클라이언트-서버 패턴(Client-Server Pattern)은 네트워크 환경에서 리소스와 데이터 관리를 위한 구조적 솔루션을 제공한다.
특히, 중앙 서버를 통한 데이터 관리가 필요하거나, 다수의 클라이언트가 동일한 서버에 접근해야 하는 경우에 적합하다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음