IO์ NIO
์๋ฐ์์ ์์ผ ํต์ ์ ๊ตฌํํ๊ธฐ ์ํด์๋ io ๋๋ nio ํจํค์ง๋ฅผ ํ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค. ์๋ฐ 4๋ถํฐ ์๋ก์ด ์ ์ถ๋ ฅ์ด๋ผ๋ ๋ป์์ java.nio ํจํค์ง, ์๋ฐ 7๋ถํฐ ๋คํธ์ํฌ ์ง์์ ๊ฐํํ์ฌ java.nio ํจํค์ง๋ฅผ ์ ๊ทธ๋ ์ด๋ ํ๋ค.
IO๋ ์คํธ๋ฆผ(Stream)์ด๋ผ๋ ๋จ๋ฐฉํฅ ํต๋ก๋ก ์ธ๋ถ ๋ฐ์ดํฐ์ ํต์
NIO๋ ์ฑ๋(Channel)์ด๋ผ๋ ์๋ฐฉํฅ ํต๋ก๋ก ์ธ๋ถ ๋ฐ์ดํฐ์ ํต์
โถ NIO๋ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ํ๋์ ํต๋ก๋ก ํด๊ฒฐํ ์ ์๋ค.
IO๋ ์ ์ถ๋ ฅ ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง, ํํฐ ์คํธ๋ฆผ์ ์ฌ์ฉํ ์๋ ์์
NIO๋ ์ ์ถ๋ ฅ ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํจ
โถ NIO๋ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ถ๋ ฅ ์๋๊ฐ ๋น ๋ฅด๋ค.
IO๋ ๋ธ๋กํน ๋ฐฉ์๋ง ์ง์ํ์ฌ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์์ ๋๋ฐ ํฐ ๋น์ฉ์ด ๋ค์ด๊ฐ
NIO๋ ๋ธ๋กํน/๋ ผ๋ธ๋กํน ๋ฐฉ์ ์ค ์ ํํ์ฌ ์ฌ์ฉํ ์ ์์
โถ NIO๋ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ์ง์ํ๋ค.
IO | NIO | |
์ ์ถ๋ ฅ ๋ฐฉ์ | ์คํธ๋ฆผ ๋ฐฉ์ | ์ฑ๋ ๋ฐฉ์ |
๋ฒํผ ๋ฐฉ์ | ๋๋ฒํผ | ๋ฒํผ |
๋น๋๊ธฐ ๋ฐฉ์ | ์ง์ํ์ง ์์ | ์ง์ |
๋ธ๋กํน/๋ ผ๋ธ๋กํน ๋ฐฉ์ | ๋ธ๋กํน ๋ฐฉ์๋ง ์ง์ | ๋ธ๋กํน/๋ ผ๋ธ๋กํน ๋ชจ๋ ์ง์ |
์คํธ๋ฆผ๊ณผ ์ฑ๋
- ์คํธ๋ฆผ์ ๋จ๋ฐฉํฅ, ์ฑ๋์ ์๋ฐฉํฅ
- ์ฑ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- ์ฑ๋์ ํญ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์
- Stream
์คํธ๋ฆผ์ ๋ค์ด์จ ์์๋๋ก ํ ๋ฐ์ดํธ์ฉ ์ ๊ณตํ๋ ๋จ๋ฐฉํฅ ํต๋ก์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก byte ๊ธฐ๋ฐ์ด๊ณ , ์ฑ๋ฅ์ ์ํด byte[] ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์๋ ์๋ค.
์ฝ์ ๋๋ InputStream, ์ธ ๋๋ OutputStream์ผ๋ก ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ค.
์ฝ๊ณ ์ฐ๋ ์์ ์ ์ง์ํ ํ์๋ ๊ทธ ์์ ์ด ๋๋์ผ return๋๋ blocking ๋ฐฉ์์ด๋ค.
- Channel
์ฑ๋์ ๋ฒํผ ์์ ์๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ ๋ฌํ๋ ์๋ฐฉํฅ ํต๋ก์ด๋ค. ์ฑ๋์ ํตํ ์ ์ถ๋ ฅ์ ๋ฌด์กฐ๊ฑด ๋ฒํผ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์คํธ๋ฆผ์ blocking ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ง ์์ ์ ์ถ๋ ฅ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ์ ์ ๊ฐ์ ํ ๊ฒ์ด๋ค.
์๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ input/output์ ๊ตฌ๋ถํ์ง ์๋๋ค.
blocking ๋ฐฉ์๊ณผ non-blocking ๋ฐฉ์์ ๋ชจ๋ ์ง์ํ์ฌ ๊ณผ๋ํ ์ค๋ ๋ ์์ฑ์ ํผํ ์ ์๋ค.
๋๋ฒํผ์ ๋ฒํผ
- buffer
๋ฒํผ๋ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ์ด์ด๋ค. ๋ ์์ธํ๋ ๋ฒํผ๋ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ๋ํํ ๊ฐ์ฒด์ด๋ค.
NIO์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅํ ๋ ์ฑ๋์ ์ฌ์ฉํ๋ค.
์ฑ๋์ ํตํด ์ ์ถ๋ ฅํ ๋ ๋ฐ์ดํฐ๋ ์ฑ๋์์ ์ฝํ ๋ฒํผ๋ก ์ฐ์ฌ์ง๊ฑฐ๋, ๋ฒํผ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ฑ๋๋ก ์ฐ์ฌ์ง๋ค.
์คํธ๋ฆผ์ ์ฌ์ฉํ ๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ด 1๋ฐ์ดํธ๋ฅผ ์ฐ๋ฉด ์ ๋ ฅ ์คํธ๋ฆผ์ด 1๋ฐ์ดํธ๋ฅผ ์ฝ๋๋ค. ๋ฐ๋ผ์ ์๋๊ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํด ๋ณต์ ๊ฐ์ ๋ฐ์ดํธ๋ฅผ ํ ๋ฒ์ ์ ๋ ฅ๋ฐ๊ณ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค. (๊ทธ๋์ IO์์๋ ๋ฒํผ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋ ๋ณด์กฐ ์คํธ๋ฆผ์ธ BufferedInputStream, BufferedOutputStream์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.)
๋ฒํผ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ค์ํ ๊ฐ์ด ์๋ค.
- ์ฉ๋(capacity): ๋ฒํผ๊ฐ ๋ณด์ ํ ์ ์๋ ์ต๋ ์์ ์, ๋ฒํผ ์์ฑ ์ ์ค์ ํ๊ณ ๋ณ๊ฒฝ ๋ถ๊ฐ
- ์์น(position): ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ์ ๊ทผํด์ผ ํ๋ ํฌ์ธํฐ (๋ํดํธ 0, ์ต๋๊ฐ์ ๋ฒํผ์ ํฌ๊ธฐ์ ๊ฐ์)
- ํ๋(limit): ๋ฒํผ์์ ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ์ ๋
- ํ์(mark): ๋ฒํผ์์ ํด๋ผ์ด์ธํธ์ ์ ํ๋ ์ธ๋ฑ์ค
* ์ฐ๊ธฐ ๋ชจ๋์ ์ฝ๊ธฐ ๋ชจ๋๊ฐ ๋ฐ๋ก ์๋ ๊ฒ์ ์๋๊ณ position, limit ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ
IO์์๋ ์ฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๊ณ ์ฆ์ ์ฒ๋ฆฌํ์ง๋ง, NIO๋ ๋ฒํผ์ ์ ์ฅํ๊ณ ๋ฒํผ ๋ด์์ ์์น(ํฌ์ธํฐ)๋ฅผ ์ด๋ํด๊ฐ๋ฉฐ ํ์ํ ๋ถ๋ถ๋ง ์ฝ๊ณ ์ธ ์ ์๋ค.
๋๊ธฐ ๋ฐฉ์๊ณผ ๋น๋๊ธฐ ๋ฐฉ์
- ๋๊ธฐ
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ฉด ๊ทธ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
ํ๋์ ์์ ์ด ๋๋๋ฉด ๋ค๋ฅธ ์ฃผ์ฒด๊ฐ ์์ ์ ์์ํ๋ ๊ฒ
- ๋น๋๊ธฐ
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ํ๋ค๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ด ์๋ค๋ callback ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด ์ฒ๋ฆฌํ๋ ๋ฐฉ์
๋ธ๋กํน๊ณผ ๋๋ธ๋กํน
- ์๋ฐ์์ ๋ธ๋กํน ์์ผ์ ServerSocket, Socket
- ์๋ฐ์์ ๋ ผ๋ธ๋กํน ์์ผ์ ServerSocketChannel, SocketChannel
- blocking
์์ฒญํ I/O ์์ ์ด ์๋ฃ๋์ง ์์ผ๋ฉด ์๋ต์ ๋๋ ค์ฃผ์ง ์๊ณ ๋๊ธฐํ๋ฉฐ ๊ทธ๋์ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋ค.
์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ง๋ง ์์ฒญ ์๋งํผ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๋ฐ๋ฉํ๋ ๋ฐฉ์์ ํ๊ณ๊ฐ ์๋ค.
๐ก ์ค๋ ๋์ ๊ฐ์๋ ํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์์กดํ๋๋ฐ, ๊ด๋ฆฌํด์ผ ํ ์ค๋ ๋ ๊ฐ์๊ฐ ๋์ด๋๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํ์๋๊ฐ ๊ฐ์ํ๋ค.
๐ก ๋ง์ ์ค๋ ๋๊ฐ Context Switching์ ํ๋ฉด์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํจ๋ค.
* Context Switching: cpu๋ฅผ ์ ์ ํ๊ธฐ ์ํ ์ํ๋ณ๊ฒฝ
- non-blocking
์ ๋ ํฐ์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ์์ผ์ ๋ฐ์ธ๋ฉ์ํค๊ณ ํ๋์ ์ฑ๊ธ ์ค๋ ๋๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ ๋ ํฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฑ๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋์ง ํ์ธํ๊ณ ๋ฒํผ๊ฐ ๋น์ด์์ผ๋ฉด ๋ฐ๋ก ๋ค์ ์์ฒญ์ ๋ฐ๋๋ค.
์ ์ถ๋ ฅ ์์ ์ค๋น๊ฐ ์๋ฃ๋ ์ฑ๋๋ง ์ ํํ์ฌ ์์ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๊ฐ ๋ธ๋กํน๋์ง ์๋๋ค.
๐ ๋๊ธฐ์ ๋น๋๊ธฐ, ๋ธ๋กํน๊ณผ ๋ ผ๋ธ๋กํน์ ์ฐจ์ด
- ๋๊ธฐ์ ๋น๋๊ธฐ
์๋น์ค๋ ํจ์์ ๋์ ๋ฐฉ์, ์ฐ๊ด๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
์์ ์ ์ํํ๋ ์ฃผ์ฒด๊ฐ ๋ ๊ฐ ์ด์์ด์ด์ผ ํจ
- ๋ธ๋กํน๊ณผ ๋ ผ๋ธ๋กํน
์์ผ์ ๋์ ๋ฐฉ์
์์ ์ ๋์์ด 2๊ฐ ์ด์์ด์ด์ผ ํจ
๋๊ธฐ/๋น๋๊ธฐ, ๋ธ๋กํน/๋ ผ๋ธ๋กํน ๋น๊ต ์ฐธ๊ณ ๋งํฌ : https://deveric.tistory.com/99
๋ ผ๋ธ๋กํน ์ฑ๋ ๋์๋ฐฉ์
NIO์ ๋์๋ฐฉ์์๋ ํต์ฌ ๊ฐ์ฒด์ธ ์ ๋ ํฐ๊ฐ ์๋ค. ์ ๋ ํฐ๋ ๋จ์ผ ์ค๋ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ฌ๋ฌ ์ฑ๋๋ค์ ๋ชจ๋ํฐ๋งํ๊ณ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ์ฌ ์์ ์ ์ฒ๋ฆฌํ๋ค.
๋ธ๋กํน ๋ฐฉ์์์๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์์ฒญ์ด ์ธ์ ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ accept() ๋ฉ์๋์์ ๋ธ๋กํน ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ์ง ๋ชจ๋ฅด๋ read() ๋ฉ์๋๋ ํญ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ค๋น๋ฅผ ํ๋ฉฐ ๋ธ๋กํน ๋๋ค.
while (true) {
SocketChannel socketChannel = serverSocketChannel.accept();
...
}
ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋น ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์์ ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ์ ์ ์๊ฐ ๋ง์์ง๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ ํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ ผ๋ธ๋กํน์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ญํ ์ ํ๋ Selector๋ฅผ ์ฌ์ฉํด ๋ฉํฐ ์ฑ๋์ ์์ ์ ์ฑ๊ธ ์ค๋ ๋์์ ์ฒ๋ฆฌํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ํ๋ฉด ์ฑ๋์ ์์ ์ ์์ ์ ํ์ ํค๋ก ์์ฑ
- ์ ๋ ํฐ์ ๊ด์ฌ ํค์ ์ ํค ๋ฑ๋ก
- ์ ๋ ํฐ๋ ์์ ์ฒ๋ฆฌ ์ค๋น๊ฐ ๋ ํค๋ฅผ ์ ํ
- ์ ํ๋ ํค์ ์ ๋ณ๋๋ก ์ ์ฅ
- ์์ ์ค๋ ๋๋ ์ ํ๋ ํค์ ์์ ํค๋ฅผ ํ๋์ฉ ๊บผ๋
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://dev-coco.tistory.com/44
https://codevang.tistory.com/185
https://lelumiere.tistory.com/14
'๊ฐ๋ฐ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TCP ์์ผ ํต์ (0) | 2022.03.11 |
---|---|
Java ์ฐ์ ์์ ํ(Priority Queue) (0) | 2022.01.17 |
[JAVA 8] ์คํธ๋ฆผ(Stream) (0) | 2022.01.15 |
[JAVA 8] ํจ์ํ ์ธํฐํ์ด์ค(Functional Interface) (0) | 2022.01.14 |
[JAVA 8] ๋๋ค ํํ์ (0) | 2022.01.13 |
๋๊ธ