๐Ÿค– Java Socket ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Socker ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

  • ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‘ ์žฅ์น˜๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๋‹ค.
  • ์ž๋ฐ”๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์†Œ์ผ“ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ TCP/UDP ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Socket์˜ ์ •์˜

  • ์†Œ์ผ“์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ์ข…๋‹จ์ (Endpoint) ์„ ์˜๋ฏธํ•˜๋ฉฐ, IP + Port ์กฐํ•ฉ์„ ํ†ตํ•ด ํŠน์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ˆ .
Socket ๊ณผ REST API์˜ ์ข…๋‹จ์  ์ฐจ์ด

RestApi์˜ ๊ฒฝ์šฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ์ž์›(resource)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๋Š” URL๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ž์›์„ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์ •๋œ HTTP ์ ‘๊ทผ ์ง€์  ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค.

GET /api/users/123
POST /api/orders

Socket ํ†ต์‹  ์—์„œ์˜ ์ข…๋‹จ์ ์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๋„คํŠธ์›Œํฌ์ฃผ์†Œ(IP + Port)์ด๋‹ค. HTTP์˜ URL๊ณผ ๋‹ฌ๋ฆฌ, ์†Œ์ผ“์€ ํ”„๋กœ์„ธ์Šค-ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์—ฐ๊ฒฐ ์ง€์ ์„ ์˜๋ฏธํ•œ๋‹ค.

203.0.113.20:9000  (TCP Chat Server)
192.168.0.10:5000 (UDP Game Server)


์†Œ์ผ“์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • IP์ฃผ์†Œ : ํ†ต์‹ ํ•  ์žฅ์น˜์˜ ์ฃผ์†Œ
  • ํฌํŠธ : ํ•ด๋‹น ์žฅ์น˜ ๋‚ด ํŠน์ • ํ”„๋กœ์„ธ์Šค ์‹๋ณ„
  • ํ”„๋กœํ† ์ฝœ : TCP/UDP ๋“ฑ
  • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ : ์†ก์ˆ˜์‹  ๋ฐ์ดํ„ฐ ํ๋ฆ„


์ž๋ฐ” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›๋ฆฌ

์†Œ์ผ“ ํ†ต์‹ ์€ ํฌ๊ฒŒ ๋‘ ํ๋ฆ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์„œ๋ฒ„(Server) ์ธก ์›๋ฆฌ

  1. ํฌํŠธ ๋ฐ”์ธ๋”ฉ
  2. ํด๋ผ์ด์–ธํŠธ ์ ‘์† ์š”์ฒญ ๋Œ€๊ธฐ
  3. ์ ‘์† ์ˆ˜๋ฝ ํ›„ ์†Œ์ผ“ ์ƒ์„ฑ
  4. ์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜ ์†กยท์ˆ˜์‹  ์ฒ˜๋ฆฌ
  5. ์„ธ์…˜ ์ข…๋ฃŒ ๋ฐ ์†Œ์ผ“ close

์ด๋ฅผ ์œ„ํ•ด Java๋Š” ServerSocket ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ(Client) ์ธก ์›๋ฆฌ

  1. ์„œ๋ฒ„ IP์™€ ํฌํŠธ๋กœ ์ ‘์† ์š”์ฒญ
  2. ์—ฐ๊ฒฐ ์„ฑ๊ณต ์‹œ ์†Œ์ผ“ ์ƒ์„ฑ
  3. ์†กยท์ˆ˜์‹  ์ŠคํŠธ๋ฆผ ํ™•๋ณด
  4. ๋ฐ์ดํ„ฐ ์†ก์‹ /์ˆ˜์‹ 
  5. ์ข…๋ฃŒ ์ฒ˜๋ฆฌ

Java๋Š” Socket ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.



์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•„์š”์„ฑ


1. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

๊ฐœ๋…

๋ฉ”์‹ ์ €ยท์ฑ„ํŒ…์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ฆ‰์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
HTTP ์š”์ฒญ/์‘๋‹ต ๋ฐฉ์‹์€ ๋งค๋ฒˆ ์—ฐ๊ฒฐ์„ ์ƒˆ๋กœ ์—ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

์™œ ์†Œ์ผ“์ด ํ•„์š”ํ•œ๊ฐ€?

  • ์—ฐ๊ฒฐ์„ ํ•œ ๋ฒˆ ๋งบ์€ ๋’ค ์ง€์†์ ์œผ๋กœ ์œ ์ง€(TCP ์žฅ๊ธฐ ์—ฐ๊ฒฐ)
  • ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹œ ์ง€์—ฐ ์‹œ๊ฐ„ ์ตœ์†Œํ™”
  • ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„, ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ

์ ์šฉ ์˜ˆ

  • ํŒ€ ์ฑ„ํŒ…(๊ธฐ์—…์šฉ ๋ฉ”์‹ ์ €)
  • ๊ณ ๊ฐ์„ผํ„ฐ ์‹ค์‹œ๊ฐ„ ์ƒ๋‹ด
  • ์•ฑ in ์ฑ„ํŒ…(๋ฐฐ๋‹ฌ์•ฑ, ์‡ผํ•‘๋ชฐ)

2. ์„œ๋ฒ„โ€“ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ ์‹œ์Šคํ…œ ๊ตฌ์ถ•


๊ฐœ๋…

์›นยท์•ฑ ์„œ๋น„์Šค๋Š” ๋ณดํ†ต ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค:

  • ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ๋กœ ์ •๋ณด ์ „์†ก
  • ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„๋กœ ์š”์ฒญ ์ „์†ก

์ผ๋ฐ˜์  HTTP ํ†ต์‹  ์™ธ์—, ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์†Œ์ผ“์ด ํ•„์ˆ˜๋‹ค.

์†Œ์ผ“ ์‚ฌ์šฉ ์ด์œ 

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‹ค์‹œ๊ฐ„ ํ‘ธ์‹œ ๊ฐ€๋Šฅ (์•Œ๋ฆผ, ๋ฉ”์‹œ์ง€, ์ด๋ฒคํŠธ)
  • HTTP Polling ๋Œ€๋น„ ๋ฆฌ์†Œ์Šค ์ ˆ๊ฐ
  • ๊พธ์ค€ํ•œ ์—ฐ๊ฒฐ ์œ ์ง€

์˜ˆ

  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ(ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€)
  • ํ™˜์œจ/์ฃผ๊ฐ€ ์‹ค์‹œ๊ฐ„ ๊ฐฑ์‹ 
  • ์‹ค์‹œ๊ฐ„ ๋Œ€์‹œ๋ณด๋“œ(๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ)

3. ๋‚ด๋ถ€ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹  (Microservice Architecture)

๊ฐœ๋…

MSA์—์„œ๋Š” ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ.
๊ฐ ์„œ๋น„์Šค๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค์™€ ๋„คํŠธ์›Œํฌ๋กœ๋งŒ ํ†ต์‹ ํ•œ๋‹ค.

์˜ˆ:

  • ์ธ์ฆ ์„œ๋ฒ„
  • ์ฃผ๋ฌธ ์„œ๋ฒ„
  • ๊ฒฐ์ œ ์„œ๋ฒ„
  • ๋กœ๊ทธ/๋ถ„์„ ์„œ๋ฒ„

์†Œ์ผ“์ด ํ•„์š”ํ•œ ์ด์œ 

  • ์„œ๋น„์Šค ๊ฐ„ ๊ณ ์„ฑ๋Šฅ RPC ํ•„์š”
  • ๋‚ด๋ถ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • REST๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ๋Ÿ‰ํ™”๋œ ํ†ต์‹  ๊ฐ€๋Šฅ

์ ์šฉ ๊ธฐ์ˆ 

  • gRPC
  • Netty ๊ธฐ๋ฐ˜ ๊ณ ์„ฑ๋Šฅ TCP ์„œ๋ฒ„
  • ์ž์ฒด ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ