Transport
Chapter 4: Transports
Netty๋ ๋ค์ํ ํธ๋์คํฌํธ๋ฅผ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ ์ฌํญ์ ๋ง๋ ์ต์ ์ ํธ๋์คํฌํธ๋ฅผ ์ ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด ์ฅ์์๋ Netty์ ํธ๋์คํฌํธ ๊ตฌํ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ ์ ํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์์ธํ ์ค๋ช ํฉ๋๋ค.
4.1 ํธ๋์คํฌํธ ๋ง์ด๊ทธ๋ ์ด์
ํธ๋์คํฌํธ์ ๋ํ ์ดํด๋ฅผ ๋๊ธฐ ์ํด, ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํด OIO์ NIO๋ฅผ ์ฌ์ฉํ ๋คํธ์ํน์ ์ดํด๋ด ๋๋ค
4.1.1 Netty ์์ด OIO์ NIO ์ฌ์ฉํ๊ธฐ
Netty ์์ด OIO์ NIO๋ฅผ ์ฌ์ฉํ๋ ๋ธ๋กํน ๋ฐ ๋น๋๊ธฐ ๋ฒ์ ์ ๊ตฌํํฉ๋๋ค.
OIO๋ฅผ ์ฌ์ฉํ ๋ธ๋กํน ๋คํธ์ํน
์ด ์ฝ๋๋ ์ ๋นํ ์์ ๋์ ํด๋ผ์ด์ธํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ๋๊ท๋ชจ์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋น๋๊ธฐ ๋คํธ์ํน์ผ๋ก ์ ํํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
NIO๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ๋คํธ์ํน
์ด ์ฝ๋๋ ๋น๋๊ธฐ I/O๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ ์์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์ฝ๋ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
4.1.2 Netty๋ฅผ ์ฌ์ฉํ OIO์ NIO
Netty๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋์คํฌํธ ๋ณ๊ฒฝ์ด ํจ์ฌ ๊ฐ๋จํด์ง๋๋ค. Netty์ ํต์ผ๋ API ๋๋ถ์ ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ๊ฑฐ์ ์์ ํ์ง ์๊ณ ๋ ํธ๋์คํฌํธ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
Netty๋ฅผ ์ฌ์ฉํ ๋ธ๋กํน ๋คํธ์ํน
Netty๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ๋คํธ์ํน
Netty๋ ๋์ผํ API๋ฅผ ๋ ธ์ถํ๋ฏ๋ก, ํธ๋์คํฌํธ ๊ตฌํ์ ์๊ด์์ด ์ฝ๋๊ฐ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
4.2 ํธ๋์คํฌํธ API
ํธ๋์คํฌํธ API์ ํต์ฌ์ Channel
์ธํฐํ์ด์ค์
๋๋ค. ์ด๋ ๋ชจ๋ I/O ์์
์ ์ฌ์ฉ๋๋ฉฐ, Channel
ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Channel
์๋ ChannelPipeline
๊ณผ ChannelConfig
๊ฐ ํ ๋น๋์ด ์์ต๋๋ค. ChannelConfig
๋ ์ฑ๋์ ๋ชจ๋ ์ค์ ์ ๋ณด์ ํ๋ฉฐ ํซ ๋ณ๊ฒฝ์ ์ง์ํฉ๋๋ค. ํน์ ํธ๋์คํฌํธ๋ ๊ณ ์ ํ ์ค์ ์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ChannelConfig
์ ํ์ ํ์
์ ๊ตฌํํ ์ ์์ต๋๋ค.
Channel
์ ์ ์ผํ๊ธฐ ๋๋ฌธ์ java.lang.Comparable
์ ํ์ ์ธํฐํ์ด์ค๋ก ์ ์ธ๋์ด ์์๋ฅผ ๋ณด์ฅํฉ๋๋ค. ๋ฐ๋ผ์ AbstractChannel
์ compareTo()
๊ตฌํ์ ๋ ๊ฐ์ ๊ณ ์ ํ Channel
์ธ์คํด์ค๊ฐ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
ChannelPipeline๊ณผ ChannelHandler
ChannelPipeline
์ ๋ชจ๋ ChannelHandler
์ธ์คํด์ค๋ฅผ ๋ณด์ ํ์ฌ ์ธ๋ฐ์ด๋ ๋ฐ ์์๋ฐ์ด๋ ๋ฐ์ดํฐ์ ์ด๋ฒคํธ์ ์ ์ฉ๋ฉ๋๋ค. ์ด ChannelHandler
๋ค์ ์ํ ๋ณํ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ChannelHandler
์ ์ฌ์ฉ ์:
๋ฐ์ดํฐ๋ฅผ ํ ํ์์์ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํ
์์ธ ์๋ฆผ ์ ๊ณต
Channel
์ด ํ์ฑํ ๋๋ ๋นํ์ฑํ๋ ๋ ์๋ฆผ ์ ๊ณตChannel
์ดEventLoop
์ ๋ฑ๋ก๋๊ฑฐ๋ ๋ฑ๋ก ํด์ ๋ ๋ ์๋ฆผ ์ ๊ณต์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ์ ๋ํ ์๋ฆผ ์ ๊ณต
์ฃผ์ Channel ๋ฉ์๋
eventLoop
์ฑ๋์ ํ ๋น๋ EventLoop
์ ๋ฐํํฉ๋๋ค.
pipeline
์ฑ๋์ ํ ๋น๋ ChannelPipeline
์ ๋ฐํํฉ๋๋ค.
isActive
์ฑ๋์ด ํ์ฑ ์ํ์ธ์ง ์ฌ๋ถ๋ฅผ ๋ฐํํฉ๋๋ค.
localAddress
๋ก์ปฌ SocketAddress
๋ฅผ ๋ฐํํฉ๋๋ค.
remoteAddress
์๊ฒฉ SocketAddress
๋ฅผ ๋ฐํํฉ๋๋ค.
write
์๊ฒฉ ํผ์ด์ ๋ฐ์ดํฐ๋ฅผ ์๋๋ค. ์ด ๋ฐ์ดํฐ๋ ChannelPipeline
์ ํตํด ์ ๋ฌ๋ฉ๋๋ค
flush
์ด์ ์ ๊ธฐ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ ํธ๋์คํฌํธ์ ํ๋ฌ์ํฉ๋๋ค.
4.3 ํฌํจ๋ ํธ๋์คํฌํธ
Netty๋ ๋ค์ํ ํธ๋์คํฌํธ๋ฅผ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ๋ง๋ ์ต์ ์ ์๋ฃจ์ ์ ์ ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ Netty๊ฐ ์ ๊ณตํ๋ ์ฃผ์ ํธ๋์คํฌํธ๋ค์ ์๊ฐํฉ๋๋ค.
4.3.1 NIOโ๋
ผ๋ธ๋กํน I/O
NIO๋ Netty์ ์ฃผ์ ๋
ผ๋ธ๋กํน ํธ๋์คํฌํธ์
๋๋ค. java.nio.channels
ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ ํ๊ธฐ(Selector) ๊ธฐ๋ฐ์ผ๋ก ๋จ์ผ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
NIO์ ํน์ง
๋น๋๊ธฐ I/O ์์ ์ง์: ๋ชจ๋ I/O ์์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ํ๋ฉ๋๋ค.
๋์ ํ์ฅ์ฑ: ๋ง์ ์์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ ๋ก ์นดํผ ํ์ผ ์ ์ก ์ง์: FTP ๋๋ HTTP์ ๊ฐ์ ํน์ ์ฌ์ฉ ์ฌ๋ก์์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
4.3.2 Epoll ๋ค์ดํฐ๋ธ ๋
ผ๋ธ๋กํน ํธ๋์คํฌํธ
Epoll์ ๋ฆฌ๋
์ค์์ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๋ค์ดํฐ๋ธ ๋
ผ๋ธ๋กํน ํธ๋์คํฌํธ์
๋๋ค. ๋ฆฌ๋
์ค์ epoll
๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค.
Epoll์ ํน์ง
๋ฆฌ๋ ์ค ์ ์ฉ: ๋ฆฌ๋ ์ค ์ด์ ์ฒด์ ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๋์ ์ฑ๋ฅ: ๋ฆฌ๋ ์ค์ ๋ค์ดํฐ๋ธ
epoll
๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.๋ฎ์ ์ง์ฐ ์๊ฐ: ๋๊ท๋ชจ ๋์ ์ฐ๊ฒฐ์์ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ ์งํฉ๋๋ค.
4.3.3 OIOโ๋ธ๋กํน I/O
OIO๋ ์ ํต์ ์ธ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ํธ๋์คํฌํธ์ ๋๋ค. ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ ๋ ๊ฑฐ์ ์ฝ๋์ ์ด์ฃผ์ ์ ์ฉํฉ๋๋ค.
OIO์ ํน์ง
๋ธ๋กํน I/O ์์ ์ง์: ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
์ ์ ์ค๋ ๋ ์ฌ์ฉ: ๊ฐ ์ฐ๊ฒฐ์ด ๋ณ๋์ ์ค๋ ๋์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์ ์ต์ํ์ง ์์ ๊ฐ๋ฐ์์๊ฒ ์ ์ฉํฉ๋๋ค.
4.3.4 ๋ก์ปฌ ํธ๋์คํฌํธ
Netty๋ ๊ฐ์ JVM ๋ด์์ ๋น๋๊ธฐ ํต์ ์ ์ํด ๋ก์ปฌ ํธ๋์คํฌํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํธ๋์คํฌํธ๋ ์ค์ ๋คํธ์ํฌ ์ฃผ์์ ๋ฐ์ธ๋ฉ๋์ง ์๊ณ ๋ ์ง์คํธ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค. ์ด ํธ๋์คํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํต์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ก์ปฌ ํธ๋์คํฌํธ์ ํน์ง
๊ฐ์ JVM ๋ด์์์ ํต์ ์ง์: ์ค์ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋น ๋ฅธ ๋ฐ์ดํฐ ์ ์ก: ๋์ ์ฑ๋ฅ์ ์๊ตฌํ๋ ๋ด๋ถ ํต์ ์ ์ ํฉํฉ๋๋ค.
4.3.5 ์๋ฒ ๋๋ ํธ๋์คํฌํธ
Netty๋ ํ ์คํธ ๋ชฉ์ ์ ์ํด ์๋ฒ ๋๋ ํธ๋์คํฌํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค์ ๋คํธ์ํฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ChannelHandler๋ฅผ ๋จ์ ํ ์คํธํ ์ ์์ต๋๋ค.
์๋ฒ ๋๋ ํธ๋์คํฌํธ์ ํน์ง
๋จ์ ํ ์คํธ ์ฉ๋: ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์ ์์ด ์ค์ ํธ๋์คํฌํธ์ ๋์ผํ API ์ด๋ฒคํธ ํ๋ฆ์ ๋ณด์ฅํฉ๋๋ค.
ํ ์คํธ ํ๊ฒฝ ์ต์ ํ: ํ ์คํธ ํ๊ฒฝ์์ ๋คํธ์ํฌ ์์กด์ฑ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
4.4 ํธ๋์คํฌํธ ์ฌ์ฉ ์ฌ๋ก
๊ฐ ํธ๋์คํฌํธ์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
NIO: ๋์ ๋์์ฑ๊ณผ ์ฑ๋ฅ์ด ์ค์ํ ์น ์๋ฒ ๋ฐ ๋๊ท๋ชจ ์์คํ ์ ์ ํฉํฉ๋๋ค.
OIO: ๋จ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ ๊ฑฐ์ ์ฝ๋์ ์ด์ฃผ ์ ์ ์ฉํฉ๋๋ค.
๋ก์ปฌ ํธ๋์คํฌํธ: ๋จ์ ํ ์คํธ ๋ฐ ๋ก์ปฌ ํต์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฒ ๋๋ ํธ๋์คํฌํธ: ํ ์คํธ ํ๊ฒฝ์์ ๋คํธ์ํฌ ์์กด์ฑ์ ์ ๊ฑฐํ์ฌ ํจ์จ์ ์ธ ํ ์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ฐธ๊ณ : Netty์ ํธ๋์คํฌํธ API๋ ๋ค์ํ ํธ๋์คํฌํธ๋ฅผ ํต์ผ๋ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํ์ฌ, ๊ฐ๋ฐ์๊ฐ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ง๋ ํธ๋์คํฌํธ๋ฅผ ์ฝ๊ฒ ์ ํํ๊ณ ์ ํํ ์ ์๊ฒ ํฉ๋๋ค.
Last updated
Was this helpful?