ν”„λ‘œκ·Έλž˜λ°/Web

[Web] μ›Ή μ†ŒμΌ“(Web Socket)μ΄λž€? λ“±μž₯ λ°°κ²½κ³Ό λͺ©μ , λ™μž‘ 방식 (feat. Polling, Long polling, Server-Sent Event)

μš©λ‡½ 2024. 2. 9. 21:56
λ°˜μ‘ν˜•

[Web] μ›Ή μ†ŒμΌ“(Web Socket)μ΄λž€? λ“±μž₯ λ°°κ²½κ³Ό λͺ©μ , λ™μž‘ 방식 (feat. Polling, Long polling, Server-Sent Event)

πŸ“– λ“€μ–΄κ°€λ©°

이번 ν¬μŠ€νŒ…μ€ μ›Ή μ†ŒμΌ“(Web Scoket)에 λŒ€ν•œ ν¬μŠ€νŒ…μ„ ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

 

이 글을 μ½μœΌμ‹œλŠ” 뢄듀은 μ•„λ§ˆ μ›Ή μ†ŒμΌ“μ΄ 무엇인지 μ •λ„λŠ” μ•Œκ³  μžˆμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

 

λ§žμŠ΅λ‹ˆλ‹€. μ‹€μ‹œκ°„ 톡신이 ν•„μš”ν•  λ•Œ 적극적으둜 μ‚¬μš©λ˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€.

 

그럼 μ™œ μ‹€μ‹œκ°„ 톡신을 ν•  λ•Œ μ›Ή μ†ŒμΌ“μ„ μ‚¬μš©ν•˜λŠ”μ§€, κΈ°μ‘΄μ—λŠ” μ–΄λ–€ 방식을 μ‚¬μš©ν–ˆκ³ , μ–΄λ–€ 문제λ₯Ό ν•΄κ²°ν•΄ μ£ΌλŠ”μ§€, μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ λ“±λ“± μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ›Ή μ†ŒμΌ“μ˜ λ“±μž₯ λ°°κ²½

초기의 인터넷 톡신 방식은 주둜 HTTPλ₯Ό μ΄μš©ν•œ ν΄λΌμ΄μ–ΈνŠΈ(μš”μ²­) - μ„œλ²„(응닡) λͺ¨λΈμ„ 톡해 μ§„ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

즉, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­(Request)을 보내고, μ„œλ²„κ°€ 이에 응닡(Response)ν•˜λŠ” λ°˜μ΄μ€‘ 톡신 방식을 λ”°λ¦…λ‹ˆλ‹€.

 

이 방식이 νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λŠ” λ“±μ˜ κ°„λ‹¨ν•œ μž‘μ—…μ—λŠ” νš¨κ³Όμ μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, μ‹€μ‹œκ°„μœΌλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 데에 ν•œκ³„μ μ΄ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

 

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μš”μ²­ν•˜μ§€ μ•ŠλŠ” 이상 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ¨Όμ € 데이터λ₯Ό 보낼 수 μ—†μŠ΅λ‹ˆλ‹€.

 

이 νŠΉμ§•μœΌλ‘œ μ‹€μ‹œκ°„ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 상황을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ,

ν΄λΌμ΄μ–ΈνŠΈλŠ” 항상 μƒˆλ‘œμš΄ 데이터가 μžˆλŠ”μ§€ 확인을 ν•˜κΈ° μœ„ν•΄ μ„œλ²„μ— μ§€μ†μ μœΌλ‘œ μš”μ²­μ„ 보낼 μˆ˜λ°–μ— μ—†μŠ΅λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ 되면 νŠΈλž˜ν”½μ„ λΆˆν•„μš”ν•˜κ²Œ μ¦κ°€μ‹œν‚€κ³ , 이둜 인해 μ„œλ²„μ˜ λΉ„μš©μ΄ 증가될 λΏλ”λŸ¬ μš”μ²­κ³Ό μ‘λ‹΅μ‚¬μ΄μ˜ μ§€μ—°μ‹œκ°„μ΄ 있기 λ•Œλ¬Έμ— μ‹€μ‹œκ°„ ν†΅μ‹ μ˜ νš¨μœ¨μ„±μ„ μ €ν•˜μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ›Ή μ†ŒμΌ“ μ΄μ „μ˜ 톡신 방식

쑰금 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ›Ή μ†ŒμΌ“μ΄ λ“±μž₯ ν•˜κΈ° μ „ 주둜 μ‚¬μš©λ˜λ˜ HTTP ν”„λ‘œν† μ½œμ„ 기반으둜 ν•œ μ‹€μ‹œκ°„ 톡신 방식은 μ–΄λ–€ 것듀이 μžˆμ„κΉŒμš”?


폴링(Polling)

Polling λ™μž‘ 방식

ν΄λΌμ΄μ–ΈνŠΈκ°€ 주기적으둜 μ„œλ²„μ— μš”μ²­μ„ λ³΄λ‚΄λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

즉, 일정 μ‹œκ°„λ₯Ό μ •ν•΄ 놓고 μƒˆλ‘œμš΄ 데이터가 μžˆλŠ”μ§€ μš”μ²­μ„ λ³΄λ‚΄μ„œ ν™•μΈν•˜κ²Œ λ©λ‹ˆλ‹€.

 

μ΄λ•Œ, μƒˆλ‘œμš΄ 데이터가 없더라도 μ„œλ²„λŠ” 응닡을 λ³΄λƒ…λ‹ˆλ‹€.

 

κ·Έλž˜μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” 응닡을 λ°›μœΌλ©΄ μ²˜λ¦¬ν•˜κ³  일정 μ‹œκ°„ 후에 λ‹€μ‹œ μš”μ²­μ„ λ³΄λ‚΄λŠ” 과정을 λ°˜λ³΅ν•˜κ²Œ λ˜λŠ” 것이죠.

 

μ•„λž˜ μ½”λ“œ μ˜ˆμ œλŠ” νλ¦„μ˜ 이해λ₯Ό 돕기 μœ„ν•œ μ•„μ£Ό κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

// ν΄λΌμ΄μ–ΈνŠΈ
setInterval(function(){
    fetch('/server').then(function(response){
        console.log(response);
    });
}, 5000); // 5μ΄ˆλ§ˆλ‹€ μ„œλ²„μ— μš”μ²­

// μ„œλ²„ (Node.js)
app.get('/server', function(req, res){
    res.send('μƒˆλ‘œμš΄ 데이터');
});

μž₯μ μœΌλ‘œλŠ” 맀우 κ°„λ‹¨ν•œ λ©”μ»€λ‹ˆμ¦˜μ΄κΈ° λ•Œλ¬Έμ— κ΅¬ν˜„μ΄ 맀우 μ‰½μŠ΅λ‹ˆλ‹€.

μ„œλ²„ μΈ‘ λ˜ν•œ μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅λ§Œ μ²˜λ¦¬ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, 이 λ°©μ‹μ—λŠ” 단점이 λΆ„λͺ…νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€.

  • λΆˆν•„μš”ν•œ μš”μ²­(Request) 수 ➑️ μ„œλ²„ λΉ„μš© 증가
  • μš”μ²­κ³Ό 응닡 μ‚¬μ΄μ˜ 지연 μ‹œκ°„μ΄ λ°œμƒν•©λ‹ˆλ‹€.

둱 폴링(Long Polling)

Long Polling λ™μž‘λ°©μ‹

λ‘± 폴링은 ν΄λ§μ—μ„œ 쑰금 더 κ°œμ„ λœ λ°©μ‹μž…λ‹ˆλ‹€.

 

λ¨Όμ €, λ™μΌν•˜κ²Œ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ—κ²Œ μš”μ²­(Request)을 λ³΄λƒ…λ‹ˆλ‹€.

이후 μ„œλ²„λŠ” μƒˆλ‘œμš΄ 데이터가 μ—†λ‹€λ©΄ 일정 μ‹œκ°„ λ™μ•ˆ 응닡을 ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 데이터가 μžˆμ„ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€.

 

λ§Œμ•½ 일정 μ‹œκ°„ λ™μ•ˆ μƒˆλ‘œμš΄ 데이터가 μ—†λ‹€λ©΄ Time Out이 λ°œμƒν•˜κ³ , μ΄λ•Œ μ„œλ²„λŠ” Time Out에 λŒ€ν•œ 응닡을 λ³΄λƒ…λ‹ˆλ‹€..

λ°˜λ©΄μ— μƒˆλ‘œμš΄ 데이터가 μžˆλ‹€λ©΄ μ¦‰μ‹œ μƒˆλ‘œμš΄ 데이터에 λŒ€ν•œ 응닡(Resonse)을 λ³΄λƒ…λ‹ˆλ‹€.

 

μ•„λž˜ μ½”λ“œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ, 흐름에 λŒ€ν•œ 이해λ₯Ό 돕기 μœ„ν•œ κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

// ν΄λΌμ΄μ–ΈνŠΈ
function longPoll(){
    fetch('/server').then(function(response){
        console.log(response);
        longPoll();
    });
}
longPoll();

// μ„œλ²„ (Node.js)
app.get('/server', function(req, res){
    setTimeout(function(){
        res.send('μƒˆλ‘œμš΄ 데이터');
    }, 10000); // 10초 후에 응닡
});

 

폴링과 μ•„μ£Ό μœ μ‚¬ν•©λ‹ˆλ‹€.

μœ μ‚¬ν•˜μ§€λ§Œ 폴링에 λΉ„ν•΄μ„œ λΆˆν•„μš”ν•œ μš”μ²­(Request) μˆ˜λŠ” μ€„μ–΄λ“€κ²Œ λ©λ‹ˆλ‹€.

 

폴링에 λΉ„ν•΄μ„œ 쀄어든 것이지 λΆˆν•„μš”ν•œ μš”μ²­μ€ 계속 μ§„ν–‰λ©λ‹ˆλ‹€.

λ˜ν•œ, μš”μ²­κ³Ό 응닡 사이에 λ°œμƒν•˜λŠ” 지연 μ‹œκ°„μ€ λΆˆκ°€ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.


μ„œλ²„ μ„ΌνŠΈ 이벀트(Server-Sent Event)

Server-Sent Event λ™μž‘λ°©μ‹

μ„œλ²„ μ„ΌνŠΈ 이벀트 방식은 μœ„ λ°©μ‹λ“€κ³ΌλŠ” 쑰금 λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

 

ν΄λΌμ΄μ–ΈνŠΈλŠ” 졜초둜 ν•œ 번 μ„œλ²„μ— 연결을 μš”μ²­ν•©λ‹ˆλ‹€.

그럼 μ„œλ²„λŠ” μš”μ²­μ„ λ°›κ³ , 이후 μƒˆλ‘œμš΄ 데이터가 생길 λ•Œλ§ˆλ‹€ 적절히 μ²˜λ¦¬ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡을 λ³΄λƒ…λ‹ˆλ‹€.

 

즉, HTTP 톡신을 μ’…λ£Œν•˜μ§€ μ•Šκ³  연결을 μœ μ§€ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

 

μ•„λž˜ μ½”λ“œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ, 흐름에 λŒ€ν•œ 이해λ₯Ό 돕기 μœ„ν•œ κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

// ν΄λΌμ΄μ–ΈνŠΈ
const source = new EventSource("/server");
source.onmessage = function(event) {
    console.log(event.data);
};

// μ„œλ²„ (Node.js)
app.get('/server', function(req, res){
    res.setHeader('Content-Type', 'text/event-stream');
    setInterval(function(){
        res.write('data: μƒˆλ‘œμš΄ 데이터\n\n');
    }, 5000); // 5μ΄ˆλ§ˆλ‹€ 데이터 전솑
});

SSEλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€μ‹œκ°„μœΌλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡을 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, 이벀트 기반으둜 μ„œλ²„μ—μ„œ 보낸 λ©”μ‹œμ§€μ— λŒ€ν•΄ 이벀트 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

연결이 λŠμ–΄μ§„ κ²½μš°μ—λ„ SSEλŠ” μžλ™μœΌλ‘œ μž¬μ—°κ²°μ„ μ‹œλ„ν•©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ 이 방식은 ν΄λΌμ΄μ–ΈνŠΈμ˜ 졜초 μš”μ²­ 이후 μ„œλ²„λ§Œ 일방적으둜 응닡을 ν•˜κ²Œ λ©λ‹ˆλ‹€.

즉, μš°λ¦¬κ°€ μ²­μ·¨ν•˜λŠ” λΌλ””μ˜€μ™€ κ°™λ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„μ—μ„œ μ•Œμ•„λ³Έ λ°©μ‹λ“€λ‘œ HTTP ν†΅μ‹ μœΌλ‘œ μ‹€μ‹œκ°„ 톡신 방식을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 단지 μ‹€μ‹œκ°„ 톡신을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 방법일 뿐, μ™„λ²½ν•œ μ‹€μ‹œκ°„ 톡신을 보μž₯ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

 

κ·Έλž˜μ„œ 이 λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ°”λ‘œ μ›Ή μ†ŒμΌ“(Web Socket)이 λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€.


μ›Ή μ†ŒμΌ“(Web Socket)μ΄λž€?

Web Socket λ™μž‘ 방식

μ›Ή μ†ŒμΌ“μ€ HTML5에 λ“±μž₯ μ‹€μ‹œκ°„ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•΄ μ„€κ³„λœ 톡신 ν”„λ‘œν† μ½œμ΄λ©°, TCP(Transmission Control Protocol)λ₯Ό 기반으둜 ν•©λ‹ˆλ‹€.

TCPλ₯Ό 기반으둜 ν•œ μ›Ή μ†ŒμΌ“μ€ μ‹ λ’°μ„± μžˆλŠ” 데이터 전솑을 보μž₯ν•˜λ©°, λ©”μ‹œμ§€ 경계λ₯Ό μ‘΄μ€‘ν•˜κ³ , μˆœμ„œκ°€ 보μž₯된 μ–‘λ°©ν–₯ 톡신을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

HTTP와 λ‹€λ₯΄κ²Œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 졜초 연결이 이루어지면, 이 연결을 톡해 μ–‘λ°©ν–₯ 톡신을 μ§€μ†μ μœΌλ‘œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

즉, μ „ν™” 톡화와 같이 μ–‘μͺ½ λͺ¨λ‘μ—μ„œ 정보λ₯Ό 주고받을 수 μžˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

 

이 '지속적 μ—°κ²°'을 ν†΅ν•΄μ„œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ‹€μ‹œκ°„μœΌλ‘œ 데이터λ₯Ό 보낼 수 있으며, λ°˜λŒ€λ‘œ ν΄λΌμ΄μ–ΈνŠΈλ„ μ„œλ²„μ—κ²Œ 데이터λ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.


μ΄λ•Œ λ°μ΄ν„°λŠ” ‘νŒ¨ν‚·(packet)’
ν˜•νƒœλ‘œ μ „λ‹¬λ˜λ©°, 전솑은 μ—°κ²° 쀑단과 μΆ”κ°€ HTTP μš”μ²­ 없이 μ–‘λ°©ν–₯으둜 μ΄λ€„μ§‘λ‹ˆλ‹€.

νŒ¨ν‚·(packet)μ΄λž€β“
λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ—μ„œ 데이터λ₯Ό μž‘μ€ 쑰각으둜 λ‚˜λˆ μ„œ μ „μ†‘ν•˜λŠ” λ‹¨μœ„λ₯Ό λ§ν•©λ‹ˆλ‹€.

 

μ›Ήμ†ŒμΌ“ 연결을 ν•˜λ €λ©΄ new WebSocket을 ν˜ΈμΆœν•˜λ©΄ λ˜λŠ”λ°, μ΄λ•Œ wsλΌλŠ” 특수 ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

const socket = new WebSocket("ws://yong-nyong.tistory.com/socket");

ws 말고 wss://λΌλŠ” ν”„λ‘œν† μ½œλ„ μ‘΄μž¬ν•˜λ©°, 두 ν”„λ‘œν† μ½œμ˜ κ΄€κ³„λŠ” HTTP와 HTTPS의 관계와 μœ μ‚¬ν•©λ‹ˆλ‹€.

 

μ†ŒμΌ“μ΄ μ •μƒμ μœΌλ‘œ μƒμ„±λ˜λ©΄ μ•„λž˜ λ„€ 개의 이벀트λ₯Ό μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

  • open – 연결이 μ„±κ³΅μ μœΌλ‘œ λ˜μ—ˆμ„ λ•Œ λ°œμƒ
  • message – 데이터λ₯Ό μˆ˜μ‹ ν•˜μ˜€μ„ λ•Œ λ°œμƒ
  • error – μ—°κ²° 상 μ—λŸ¬κ°€ 생겼을 λ•Œ λ°œμƒ
  • close – 연결이 μ’…λ£Œλ˜μ—ˆμ„ λ•Œ λ°œμƒ

μΆ”κ°€ 속성은 곡식 λ¬Έμ„œμ—μ„œ 확인해 μ£Όμ„Έμš”.


μ›Ή μ†ŒμΌ“ ν•Έλ“œμ…°μ΄ν¬(handshake)

new WebSocket(url)을 ν˜ΈμΆœν•΄ μ†ŒμΌ“을 μƒμ„±ν•˜λ©΄ μ¦‰μ‹œ μ—°κ²°μ΄ μ‹œμž‘λ©λ‹ˆλ‹€.

 

μ›Ή μ†ŒμΌ“μ€ HTTP 기반으둜 초기 handshakeλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
이후, λ°μ΄ν„° μ „솑은 μ›Ή μ†ŒμΌ“ ν”„λ‘œν† μ½œμ„ μ΄μš©ν•˜μ—¬ ν†΅μ‹ ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

new WebSocket("wss://yong-nyong-tistory.com/socket")을 ν˜ΈμΆœν•΄ 졜초 μš”μ²­μ„ μ „μ†‘ν–ˆλ‹€κ³  κ°€μ •ν•©μ‹œλ‹€.

 

μ΄λ•Œμ˜ μš”μ²­(Reqeust) 헀더λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

GET /socket
Host: yong-nyong-tistory.com
Origin: https://yong-nyong-tistory.com
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: Ivyio/9s+lYongNyongczP8Q==
Sec-WebSocket-Version: 13
  • Origin – ν΄λΌμ΄μ–ΈνŠΈ origin을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • Connection: Upgrade – ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ ν”„λ‘œν† μ½œμ„ λ°”κΎΈκ³  μ‹Άλ‹€λŠ” μ‹ ν˜Έλ₯Ό λ³΄λƒˆλ‹€λŠ” 것을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. (https ➑️ wss)
  • Upgrade: websocket – ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μš”μ²­ν•œ ν”„λ‘œν† μ½œμ€ 'websocket’μ΄λΌλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. (https ➑️ wss)
  • Sec-WebSocket-Key – λ³΄μ•ˆμ„ μœ„ν•΄ λΈŒλΌμš°μ €μ—μ„œ μƒμ„±ν•œ ν‚€λ‘œ, μ„œλ²„κ°€ μ›Ήμ†ŒμΌ“ ν”„λ‘œν† μ½œμ„ μ§€μ›ν•˜λŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • Sec-WebSocket-Version – μ›Ήμ†ŒμΌ“ ν”„λ‘œν† μ½œ 버전을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

 

λ‹€μŒμœΌλ‘œ μ„œλ²„κ°€ ν•΄λ‹Ή μš”μ²­μ„ λ°›μœΌλ©΄ μ›Ή μ†ŒμΌ“ 연결을 μˆ˜λ½ν•˜λŠ” 응닡을 λ³΄λƒ…λ‹ˆλ‹€.

ν•΄λ‹Ή μ‘λ‹΅μ—λŠ” '101 Switching Protocols' μƒνƒœ μ½”λ“œμ™€ ν•¨κ»˜ μ‘λ‹΅ν•©λ‹ˆλ‹€.

101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBYongNyong24s99EO10UlZ22C2g=

 

이 과정을 ν†΅ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„ μ‹€μ‹œκ°„ 톡신이 κ°€λŠ₯ν•œ ν†΅λ‘œκ°€ μ—΄λ¦¬κ²Œ λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ μ›Ή μ†ŒμΌ“ 연결이 μ„±λ¦½λ˜λ©΄, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 μ‹€μ‹œκ°„ μ–‘λ°©ν–₯ 톡신이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.


데이터 전솑은 'ν”„λ ˆμž„(Frame)'μ΄λΌλŠ” λ‹¨μœ„λ‘œ μ „μ†‘λ©λ‹ˆλ‹€.
각 ν”„λ ˆμž„μ€ ν…μŠ€νŠΈ 데이터 λ˜λŠ” 이진 데이터λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

βœ”οΈ ν…μŠ€νŠΈ ν”„λ ˆμž„(text frame): ν…μŠ€νŠΈ 데이터가 λ‹΄κΈ΄ ν”„λ ˆμž„
βœ”οΈ  이진 데이터 ν”„λ ˆμž„(binary data frame): 이진 데이터가 λ‹΄κΈ΄ ν”„λ ˆμž„
βœ”οΈ  ν•‘·ν ν”„λ ˆμž„(ping/pong frame): 컀λ„₯μ…˜μ΄ μœ μ§€λ˜κ³  μžˆλŠ”μ§€ 확인할 λ•Œ μ‚¬μš©ν•˜λŠ” ν”„λ ˆμž„μœΌλ‘œ μ„œλ²„λ‚˜ λΈŒλΌμš°μ €μ—μ„œ μžλ™ μƒμ„±ν•΄μ„œ λ³΄λ‚΄λŠ” ν”„λ ˆμž„
βœ”οΈ 이 외에도 컀λ„₯μ…˜ μ’…λ£Œ ν”„λ ˆμž„(connection close frame) λ“± λ‹€μ–‘ν•œ ν”„λ ˆμž„μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 


μ›Ή μ†ŒμΌ“(Web Socket)의 ν•œκ³„μ 

λͺ¨λ“ μ§€ μž₯점이 있으면 단점이 있기 λ§ˆλ ¨μž…λ‹ˆλ‹€. 

κ·Έλ ‡λ‹€λ©΄ 단점은 무엇이 μžˆμ„κΉŒμš”?

  • λΈŒλΌμš°μ € 지원: μ›Ή μ†ŒμΌ“μ€ HTML5 μ‚¬μ–‘μ˜ μΌλΆ€μž…λ‹ˆλ‹€. 즉, HTML5λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” λΈŒλΌμš°μ €μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • μ„œλ²„ λΉ„μš©: μ›Ή μ†ŒμΌ“μ€ 지속적인 연결을 μœ μ§€ν•˜λ―€λ‘œ, λ§Žμ€ 수의 μ›Ήμ†ŒμΌ“ 연결을 λ™μ‹œμ— 관리해야 ν•˜λŠ” 경우 μ„œλ²„μ˜ λΆ€ν•˜κ°€ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€μ–‘ν•œ μ—λŸ¬μ²˜λ¦¬: λ§Œμ•½ 연결이 λŠμ–΄μ‘Œμ„ μ‹œ μ–΄λ–€ μ΄μœ μ—μ„œ 연결이 λŠμ–΄μ‘ŒλŠ”μ§€μ™€ 같은 μƒμ„Έν•œ μ—λŸ¬ μ²˜λ¦¬μ— λŒ€ν•œ ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ›Ήμ†ŒμΌ“μ€ 연결이 λŠμ–΄μ§„ μ΄μœ μ— λŒ€ν•΄μ„œ μ •ν™•νžˆ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • μž¬μ—°κ²° 처리: μ•Œ 수 μ—†λŠ” μ—λŸ¬λ‘œ 인해 연결이 λŠμ–΄μ§€λ©΄ 지속적인 연결을 ν•΄μ•Ό ν•˜λŠ” μ›Ή μ†ŒμΌ“ νŠΉμ„±μƒ μž¬μ—°κ²°μ„ ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ›Ήμ†ŒμΌ“μ€ μžλ™μœΌλ‘œ μž¬μ—°κ²°μ„ μ§„ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ“• 마무리

μ΄λ‘œμ„œ, μ‹€μ‹œκ°„ μ–‘λ°©ν–₯ 톡신을 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μ›Ή μ†ŒμΌ“(Web Socket)에 λŒ€ν•œ μ •μ˜, λ“±μž₯ λ°°κ²½, λ™μž‘λ°©μ‹, ν•œκ³„μ μ— λŒ€ν•΄μ„œ μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.

 

졜근 λΉ λ₯Έ 주기둜 갱신이 λ°œμƒν•˜λŠ” μ‹€μ‹œκ°„ 데이터λ₯Ό μ²˜λ¦¬ν•¨μ— μžˆμ–΄μ„œ μ›Ή μ†ŒμΌ“μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

μ›Ή μ†ŒμΌ“μ˜ μ—­ν• λ§Œ μ•Œκ³  μžˆμ—ˆλ˜ 상황인지라, 근본적으둜 깊게 μ•Œμ•„λ³Ό ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν•˜μ—¬ μ΄λ ‡κ²Œ ν¬μŠ€νŒ…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

μ›Ή μ†ŒμΌ“μ„ μ§€μ›ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ„ λͺ‡ 가지 있으며, μ›Ή μ†ŒμΌ“μ˜ ν•œκ³„μ μ„ μ–΄λŠ 정도 ν•΄κ²°ν•˜κ³  μ‚¬μš©μ„ κ°„νŽΈν•˜κ²Œ ν•΄ μ€λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ ν•œκ³„μ μ„ ν•΄κ²°ν•΄ μ€€λ‹€κ³  ν•΄μ„œ 무쑰건 쒋은 κ²ƒλ§Œμ€ μ•„λ‹™λ‹ˆλ‹€.

 

일반 μ›Ή μ†ŒμΌ“μ€ λΌμ΄λΈŒλŸ¬λ¦¬λ³΄λ‹€ 가볍고 λΉ λ₯΄λ©°, 더 적은 μ„œλ²„ μžμ›μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

λ˜ν•œ, μž¬μ—°κ²° 둜직 같은 κΈ°λŠ₯도 직접 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 상황에 따라 일반 μ›Ή μ†ŒμΌ“κ³Ό 라이브러리 쀑 더 λ‚˜μ€ 선택을 ν•˜λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.

 

도움이 λ˜μ—ˆκΈΈ λ°”λžλ‹ˆλ‹€.

 

μ°Έκ³  λ¬Έν—Œ:

λ°˜μ‘ν˜•