๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] I/O Channel

์ถœ์ฒ˜

ChatGPT

 


์ฑ„๋„์ด๋ž€ Channel

์ฑ„๋„์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ†ต๋กœ์ด๋‹ค. ๊ธฐ์กด์˜ ์ŠคํŠธ๋ฆผ์€ ์ž…๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ ์ค‘ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋™์ž‘ํ•˜์ง€๋งŒ, ์ฑ„๋„์€ ์–‘์ชฝ ๋ชจ๋‘์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฑ„๋„์€ ์ฃผ๋กœ ํŒŒ์ผ, ์†Œ์ผ“, ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋น„๋™๊ธฐ์ ์ธ I/O๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

java.nio (New I/O) ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๊ฐœ๋…์ด๋‹ค.

๐Ÿค” ์ฑ„๋„์€ ์™œ ์–‘๋ฐฉํ–ฅ์„ ์ง€์›ํ• ๊นŒ

 

 

์ฑ„๋„๊ณผ ๋ฒ„ํผ์™€์˜ ๊ด€๊ณ„

์ฑ„๋„์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ผ๊ณ  ์“ฐ๋Š” ๋Œ€์‹ , ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ์ฆ‰, ์ฑ„๋„์€ ๋ฒ„ํผ์™€ ์ƒํ˜ธ์ž‘์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„  ๋•Œ๋Š” ์ฑ„๋„์—์„œ ๋ฒ„ํผ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ๋Š” ๋ฒ„ํผ์—์„œ ์ฑ„๋„๋กœ ์ „์†กํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

 

์ฑ„๋„์˜ ์ข…๋ฅ˜

๊ฐ ์ฑ„๋„์€ ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋‚˜ ๋ชฉ์ ์ง€์™€ ์—ฐ๊ฒฐ๋œ๋‹ค.

FileChannel

ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ์ฑ„๋„์ด๋‹ค. FileInputStream, FileOutputStream ๋˜๋Š” RandomAccessFile๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

FileChannel์€ ํŒŒ์ผ์˜ ํŠน์ • ์œ„์น˜๋กค ์ด๋™ํ•ด ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

SocketChannel

๋„คํŠธ์›Œํฌ ์†Œ์ผ“๊ณผ ์—ฐ๊ฒฐ๋˜ ์ฑ„๋„์ด๋‹ค. TCP ์†Œ์ผ“์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋‹ค. 

SocketChannel์€ ๋ธ”๋กœํ‚น ๋ชจ๋“œ์™€ ๋…ผ๋ธ”๋กœํ‚น ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด ๋น„๋™๊ธฐ์ ์ธ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

ServerSocketChannel

์„œ๋ฒ„ ์†Œ์ผ“๊ณผ ์—ฐ๊ฒฐ๋œ ์ฑ„๋„ˆ๋Ÿฌ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ์ˆ˜์‹ ํ•˜๋Š” ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

DatagramChannel

UDP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฑ„๋„์ด๋‹ค.

 

๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น

๋ธ”๋กœํ‚น ๋ชจ๋“œ Blocking Mdoe

๊ธฐ๋ณธ์ ์œผ๋กœ, ์ฑ„๋„์€ ๋ธ”๋กœํ‚น ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๊ฒŒ ๋œ๋‹ค.

๋…ผ๋ธ”๋กœํ‚น ๋ชจ๋“œ Non-blocking Mode

๋…ผ๋ธ”๋กœํ‚น ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š๋”๋ผ๋„ ์ฆ‰์‹œ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์ ์ธ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๋ชจ๋“œ๋Š” ์„œ๋ฒ„๊ฐ€ ๋™์‹œ์— ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋งค์šฐ ์œ ๋ฆฌํ•˜๋‹ค.

 

Selector์™€์˜ ์—ฐ๋™

์ž๋ฐ”์˜ NIO์—์„œ๋Š” Selector๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ์—ฌ๋Ÿฌ ์ฑ„๋„์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Selector๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ„๋„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ(์˜ˆ: ์ฝ๊ธฐ ๊ฐ€๋Šฅ, ์“ฐ๊ธฐ ๊ฐ€๋Šฅ)๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•˜๋‘์˜ ์†Œ์ผ“์„ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ ธ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

 

์ฑ„๋„์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ

  • read() : ์ฑ„๋„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋ฒ„ํผ์— ์ €์žฅํ•œ๋‹ค.
  • write() : ๋ฒ„ํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„๋„์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ „์†กํ•œ๋‹ค.
  • position() : ํ˜„์žฌ ์ฑ„๋„์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์–ป๋Š”๋‹ค.
  • truncate() : ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค. (FileChannel์—์„œ ์‚ฌ์šฉ)
  • force() : ์ฑ„๋„์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋””์Šคํฌ์— ๊ฐ•์ œ๋กœ ๊ธฐ๋กํ•œ๋‹ค.(FileChannel์—์„œ ์‚ฌ์šฉ)

 

๊ธฐ์กด I/O์™€์˜ ๋น„๊ต

  • ์ŠคํŠธ๋ฆผ์€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก(์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ)๋งŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฑ„๋„์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธ”๋กœํ‚น I/O๋ฐฉ์‹์ด์ง€๋งŒ, ์ฑ„๋„์€ ๋…ผ๋ธ”๋กœํ‚น I/O๋ฅผ ์ง€์›ํ•ด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ฑ„๋„๊ณผ ๋ฒ„ํผ์˜ ์กฐํ•ฉ์€ ๋” ํฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ, NIO์˜ ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ I/O ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.