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

Java NIO / ๋…ผ๋ธ”๋กœํ‚น / ๋น„๋™๊ธฐ ๋ฐฉ์‹

by 1mj 2022. 3. 14.

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://hbase.tistory.com/37

https://lelumiere.tistory.com/14

 

๋Œ“๊ธ€