Post

[Netty] ๋„คํ‹ฐ๋ž€?

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ž๋ฐ” ๋„คํŠธ์›Œํฌ ํ”„๋ ˆ์ž„์›Œํฌ Netty๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

Desktop View

Netty๋ž€? ์ž๋ฐ” ํ™˜๊ฒฝ์—์„œ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์†์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ. ๊ณ ์„ฑ๋Šฅยท๊ณ ์•ˆ์ •์„ฑ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ˆœ์ˆ˜ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋ณด๋‹ค ์ถ”์ƒํ™”๋กœ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๋‹ค.

1
2
3
Client โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Server
 Outbound  โ”€โ”€โ–บ  Send (๋ช‡์‹œ์—์š”?)  โ”€โ”€โ–บ        Inbound
 Inbound   โ—„โ”€โ”€ (์˜คํ›„ 8์‹œ) Response โ—„โ”€โ”€       Outbound

Netty = ๋น„๋™๊ธฐ(Async) + ๋…ผ๋ธ”๋กœํ‚น(Non-blocking) + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜(Event-driven)


1. ๋™๊ธฐ/๋น„๋™๊ธฐ vs ๋ธ”๋กœํ‚น/๋…ผ๋ธ”๋กœํ‚น

ํ”ํžˆ ํ˜ผ๋™ํ•˜์ง€๋งŒ ์„œ๋กœ ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์ด๋‹ค.

๊ฐœ๋…๊ธฐ์ค€์ •์˜
๋™๊ธฐ/๋น„๋™๊ธฐ์ž‘์—…์˜ ์‹œ์ž‘ยท์ข…๋ฃŒ ์‹œ๊ฐ„๋™๊ธฐ: ์‹œ๊ฐ„์„ ๋งž์ถค / ๋น„๋™๊ธฐ: ๊ฐ์ž ๋ณ„๋„
๋ธ”๋กœํ‚น/๋…ผ๋ธ”๋กœํ‚น๋‹ค๋ฅธ ์ฃผ์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š”๊ฐ€๋ธ”๋กœํ‚น: ๊ธฐ๋‹ค๋ฆผ / ๋…ผ๋ธ”๋กœํ‚น: ๊ณ„์† ์ง„ํ–‰

Desktop View

๐Ÿ’ก ๋ธ”๋กœํ‚น ์˜ˆ: JDBC๋กœ DB์— ์งˆ์˜ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ. ๋…ผ๋ธ”๋กœํ‚น ์˜ˆ: ์š”์ฒญ๋งŒ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ž๊ธฐ ์ผ์„ ๊ณ„์†.

๋น„๋™๊ธฐ + ๋…ผ๋ธ”๋กœํ‚น ์กฐํ•ฉ์€ ์ž์›์ด ์ถฉ๋ถ„ํ•˜๋ฉด ํšจ์œจ์ด ์ข‹๋‹ค. ์ž๊ธฐ ์ž‘์—…์ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ฝœ๋ฐฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ ํ•ฉํ•œ ์ƒํ™ฉ์˜ˆ
๋Œ€๊ทœ๋ชจยท๋™๊ธฐ ๋ถˆํ•„์š”๋Œ€๋Ÿ‰ ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€ ์ „์†ก
์—ฌ๋Ÿฌ ์™ธ๋ถ€ API ๋™์‹œ ํ˜ธ์ถœAPI ๋ณ‘๋ ฌ ํ˜ธ์ถœ

2. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ด๋ฒคํŠธ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ , ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ•œ๋‹ค. (๋…ผ๋ธ”๋กœํ‚น ์†Œ์ผ“์˜ Selector I/O ๊ฐ์ง€๊ฐ€ ๋Œ€ํ‘œ์ )

๋„คํŠธ์›Œํฌ์—์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ฃผ์ฒด๋Š” โ€˜์†Œ์ผ“โ€™์ด๋ฉฐ, ์ด๋ฒคํŠธ ์ข…๋ฅ˜๋Š” ์†Œ์ผ“ ์—ฐ๊ฒฐยท๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์ด๋‹ค.

Desktop View

๐Ÿ’ก ๋„คํ‹ฐ๋Š” ์ฑ„๋„์— ์ง์ ‘ ์ฝ๊ณ  ์“ฐ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ž‘์—…ํ•œ๋‹ค. ๊ทธ ์žฅ์ ์€:

  • ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ๋„ ์žฌ์‚ฌ์šฉ
  • ์ด๋ฒคํŠธ๋ณ„ ๋กœ์ง ๋ถ„๋ฆฌ โ†’ ๊น”๋”
  • ์—๋Ÿฌ ์ด๋ฒคํŠธ๋„ ํ•จ๊ป˜ ์ •์˜ โ†’ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ถ€๋‹ดโ†“

3. ChannelPipeline โ€” ๋„คํ‹ฐ์˜ ํ•ต์‹ฌ

๊ฐ TCP ์—ฐ๊ฒฐ(SocketChannel)์€ ChannelPipeline์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” ChannelHandler ์ธ์Šคํ„ด์Šค์˜ ๋ฆฌ์ŠคํŠธ๋‹ค.

Desktop View

1
2
์†Œ์ผ“ โ†’ [ChannelInboundHandler ์ฒด์ธ] โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜   (์ˆ˜์‹ )
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ โ†’ [ChannelOutboundHandler ์ฒด์ธ] โ†’ ์†Œ์ผ“   (์†ก์‹ )
๋ฐฉํ–ฅํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ
์ˆ˜์‹ (Inbound)์†Œ์ผ“ ๋ฐ์ดํ„ฐ โ†’ Inbound ์ฒด์ธ โ†’ ์•ฑ
์†ก์‹ (Outbound)์•ฑ ๋ฐ์ดํ„ฐ โ†’ Outbound ์ฒด์ธ โ†’ ์†Œ์ผ“

๐Ÿ’ก ์ด ์ฒด์ธ ๋•๋ถ„์— ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์‹œ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด ์ „์†ก ์‹œ, ์ฒด์ธ ์•ˆ์—์„œ ์ง๋ ฌํ™” โ†’ ์••์ถ• โ†’ ๋ฐ”์ดํŠธ ์ „์†ก์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ํ•œ ๋ฒˆ ๊ตฌํ˜„ํ•ด๋‘๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๋ƒฅ ๊ฐ์ฒด๋ฅผ write()๋งŒ ํ•˜๋ฉด ์ „์†ก๋œ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
6
Netty
โ”œโ”€ ์ •์ฒด     ์ž๋ฐ” ๋„คํŠธ์›Œํฌ ํ”„๋ ˆ์ž„์›Œํฌ (๊ณ ์„ฑ๋Šฅยท๊ฐ„๊ฒฐ)
โ”œโ”€ ํŠน์ง•     ๋น„๋™๊ธฐ + ๋…ผ๋ธ”๋กœํ‚น + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜
โ”œโ”€ ๊ฐœ๋…     ๋™๊ธฐ/๋น„๋™๊ธฐ(์‹œ๊ฐ„) vs ๋ธ”๋กœํ‚น/๋…ผ๋ธ”๋กœํ‚น(๋Œ€๊ธฐ)
โ”œโ”€ ์ด๋ฒคํŠธ   ์†Œ์ผ“ ์ด๋ฒคํŠธ(์—ฐ๊ฒฐยท์†ก์ˆ˜์‹ )๋ฅผ ํ•ธ๋“ค๋Ÿฌ๋กœ
โ””โ”€ ํ•ต์‹ฌ     ChannelPipeline = ํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ (Inbound/Outbound)
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
Netty์ž๋ฐ” ๊ณ ์„ฑ๋Šฅ ๋„คํŠธ์›Œํฌ ํ”„๋ ˆ์ž„์›Œํฌ
๋น„๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฝœ๋ฐฑ์œผ๋กœ
ChannelPipeline๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ

Netty์˜ ํ•ต์‹ฌ์€ ChannelPipeline(ํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ)์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ง๋ ฌํ™”ยท์••์ถ• ๊ฐ™์€ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์ฒด์ธ์— ๋„ฃ์–ด๋‘๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” write() ํ•œ ๋ฒˆ์œผ๋กœ ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.