피어 투 피어(Peer-to-Peer, P2P) 패턴은 각 노드가 서로 대등한 지위에서 통신하고 자원을 공유하는 네트워크 구조를 말한다.
각 피어가 동시에 클라이언트와 서버의 역할을 수행하며, 중앙 서버 없이 직접적인 데이터 교환이 이루어진다.
P2P 패턴은 여러 노드가 독립적으로 서로 데이터를 교환할 때 유용하며, 중앙 서버가 필요 없는 구조적 장점을 제공한다.
P2P 패턴은 파일 공유 시스템, 메시징 서비스, 분산 컴퓨팅 시스템에서 널리 사용된다.
P2P 패턴을 이용하면 파일을 저장하고 있는 피어들 간에 데이터를 직접 주고받으면서 파일을 공유할 수 있다.
Peer <-----> Peer
^ |
| v
Peer <-----> Peer
파일 공유 시스템에서 각 피어가 직접 데이터를 요청하고 전달하는 방식으로 P2P 패턴을 구현할 수 있다.
// Peer 클래스: 다른 피어에게 데이터를 요청하고 응답을 받을 수 있는 클래스
import java.util.HashMap;
import java.util.Map;
public class Peer {
private String name;
private Map<String, String> dataStore = new HashMap<>();
public Peer(String name) {
this.name = name;
}
public void storeData(String key, String data) {
dataStore.put(key, data);
}
public String requestData(String key, Peer targetPeer) {
return targetPeer.respondToRequest(key);
}
private String respondToRequest(String key) {
return dataStore.getOrDefault(key, "데이터를 찾을 수 없습니다.");
}
public String getName() {
return name;
}
}
// Main 클래스: 피어들이 데이터를 저장하고 요청을 처리하는 시스템을 시연
public class Main {
public static void main(String[] args) {
Peer peer1 = new Peer("Peer1");
Peer peer2 = new Peer("Peer2");
peer1.storeData("file1", "Peer1의 파일 데이터");
peer2.storeData("file2", "Peer2의 파일 데이터");
String response1 = peer1.requestData("file2", peer2);
String response2 = peer2.requestData("file1", peer1);
System.out.println(peer1.getName() + "가 요청한 데이터: " + response1); // 출력: Peer2의 파일 데이터
System.out.println(peer2.getName() + "가 요청한 데이터: " + response2); // 출력: Peer1의 파일 데이터
}
}
Peer
클래스는 데이터를 저장하고 다른 피어에게 요청을 보낼 수 있는 기능을 제공한다.Peer1가 요청한 데이터: Peer2의 파일 데이터
Peer2가 요청한 데이터: Peer1의 파일 데이터
피어 투 피어 패턴은 시스템 확장성과 자원 분배의 효율성을 제공하는 패턴으로, 중앙 서버가 필요 없는 네트워크 환경에서 유용하게 활용된다.
분산된 데이터 교환이 필요할 때 적합한 구조이다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음