์‚ถ/F-Lab

Week 6

osean 2021. 6. 11. 01:20

Week 6
: ๋ถ€์กฑํ•œ CS


โœ๏ธ 6์›” ๋‘˜์งธ ์ฃผ ๋ฉ˜ํ† ๋ง์„ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค.
์ด๋ฒˆ ์ฃผ๋Š” ์ž๋ฐ”์˜ ์‹ ์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ฝ์–ด๋ณด๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋Š”๋ฐ, ๊ฐ€์กฑ ์—ฌํ–‰์ด๋ž‘ ์ผ์ •์ด ๊ฒน์ณ์„œ ์ตœ๋Œ€ํ•œ ์—ฌํ–‰์ง€์—์„œ ๊ณต๋ถ€ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ–ˆ๋˜ ํ•œ ์ฃผ์˜€๋‹ค. 
๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ ์ฑ•ํ„ฐ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ CS ์ง€์‹๊ณผ ์šด์˜์ฒด์ œ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ์–ด์•ผ ๋น ๋ฅด๊ฒŒ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด๋ผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ํ•œ ๋ฒˆ์— ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ ํ•ด๋‹น ์ฑ•ํ„ฐ์—์„œ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š” ๋๋‹ค.
๊ทผ๋ฐ ์ •์ž‘ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๋“ค์ด ๋‹ค ๋‚ด ๊ฒƒ์ด ๋˜์—ˆ๋‚˜? ๋˜๋Œ์•„๋ณด๋ฉด ๋˜ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜๋„ ์˜ค๋Š˜ ๋ฉ˜ํ† ๋ง ๋‚ด์šฉ์„ ์žŠ์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ•ด๋ณด์ž!

1. Synchronized

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

Synchronized ์ œ์–ด์ž๋ฅผ ๋ฉ”์†Œ๋“œ์— ์ง์ ‘ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ ํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์ €ํ•˜ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™๊ธฐํ™” ๋œ ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ๋‚ด์— ๊ตณ์ด ๋™๊ธฐํ™” ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ณ€์ˆ˜๋ฅผ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ๋„ ์ ‘๊ทผ์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, Lock ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์— ๊ณ„์† ์ ‘๊ทผํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๋’ค์— ์Šค๋ ˆ๋“œ๋“ค์ด ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋•Œ๋ฌธ์— Synchroinzed ์ œ์–ด์ž๋ฅผ ๋ฉ”์†Œ๋“œ์— ์ง์ ‘ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์€ ๋งŽ์€ ๊ณ ๋ฏผ ๋์— ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ด ๊ฐ™์€ ์ด์œ ๋กœ ์ด์ „์— ๋ฐฐ์šด Vector, HashTable ํด๋ž˜์Šค๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. volatile

Syncrhronized ์ œ์–ด์ž์™€ ๊ฐ™์ด ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์ œ์–ด์ž.
volatile ์ œ์–ด์ž๋Š” ๋ณ€์ˆ˜์— ์ง์ ‘์ ์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.
๋ณธ๋ž˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ์ž์› ์ •๋ณด๋ฅผ CPU ์บ์‹œ์—์„œ ๊ฐ€์ง€๊ณ  ์˜ค๋Š”๋ฐ, ํ•ด๋‹น ์ œ์–ด์ž๋ฅผ ๋ณ€์ˆ˜์— ์„ ์–ธํ•˜๋ฉด
volatile ์ œ์–ด์ž๊ฐ€ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์ •๋ณด๋ฅผ CPU ์บ์‹œ๊ฐ€ ์•„๋‹Œ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.
๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์—๋Š” ์„ ์–ธ ํ•  ์ˆ˜ ์—†๊ณ , ์ฐธ์กฐ ์ž๋ฃŒํ˜•์—๋งŒ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.
 

[Java] Multi Threadํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•

์Šค๋ ˆ๋“œ(Thread)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”? ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ์ƒ์œ„ ๋‹จ์œ„์ธ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์šฐ๋ฆฐ ํ”„๋กœ๊ทธ๋žจ์ด

deveric.tistory.com

 

3. Atomic Type

Synchronized ์ œ์–ด์ž๋‚˜ volatile ์ œ์–ด์ž ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผ ํ–ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Compare And Swape(ํ˜น์€ Set) ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๋‹น ์ž์›์˜ ๊ธฐ์กด์˜ ๊ฐ’๊ณผ ์ƒˆ๋กœ ํ• ๋‹น๋œ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜๊ณ  ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ๊ต์ฒดํ•˜์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋‹ค๋งŒ ์•„์ง ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ ์€ ๋ฉ˜ํ† ๋ง ์‹œ๊ฐ„์— CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Java ์–ธ์–ด๋กœ๋Š” ์ •ํ™•ํžˆ ๊ตฌํ˜„๋˜์ง€ ์•Š๊ณ  Native Language๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด JNI๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฑธ ์–ผํ• ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ์–ด๋–ค ๊ฒ€์ƒ‰์–ด๋กœ ์ฐพ์•„๋ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.
์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด์ž.
(sun.misc.Unsafe ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” compareAndSwap..() ๋ฉ”์†Œ๋“œ์— native ์ œ์–ด์ž๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.)
public final native boolean compareAndSwapObject(Object o, long offset,
                                                     Object expected,
                                                     Object x);

 

4. CAS(Compare And Swape / Set) Algorithm

> CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ป๊ฒŒ ๋™์‹œ์„ฑ์„ ๋ณด์žฅ ๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ?
๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ / ํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ์—์„œ CPU๋Š” ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฐธ์กฐํ•˜๋Š”๋ฐ, ์ด ๋•Œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋ฅผ ํ•ด๊ฒฐ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šค๋ ˆ๋“œ / ํ”„๋กœ์„ธ์Šค๊ฐ€ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฐธ์กฐํ•œ ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ ๊ฐ’๊ณผ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋‘ ๊ฐ’์ด ์ผ์น˜ํ•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๊ต์ฒด๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์žฌ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Java์˜ Atomic Type ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋œ compareAndSet() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” get..() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉด compareAndSet() ๋ฉ”์†Œ๋“œ๋ฅผ while ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5. Thread, Demon Thread

์ผ๋ฐ˜์ ์ธ ์Šค๋ ˆ๋“œ์™€ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด๋Š” ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ์— ์ข…์†์ ์ธ ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ์— ์†ํ•œ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋„ ํ•จ๊ป˜ ์ข…๋ฃŒ๋œ๋‹ค. 
์ฆ‰, ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด์กฐํ•˜๋Š” ์—ญํ• ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” GC๊ฐ€ ์žˆ๋‹ค.
์ด๋ฅผ ์‘์šฉํ•œ ์„œ๋น„์Šค(?)๋“ค์€ ์Œ์•… ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค, ๊ฒ€์ƒ‰์–ด ์ž๋™ ์™„์„ฑ, ๊ฒŒ์‹œ๊ธ€ ์ž„์‹œ ์ €์žฅ์ด ์žˆ๊ฒ ๋‹ค.
ํ•ด๋‹น ์„œ๋น„์Šค๋“ค์˜ ๊ณตํ†ต์ ์€ ๋ฉ”์ธ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•  ๊ฒƒ๋“ค์„ ๋ณด์กฐํ•˜๋Š” ์„œ๋น„์Šค๋ผ๋Š” ์ ์ด๋‹ค.

์™„์ „ํžˆ ์™€๋‹ฟ์ง€๋Š” ์•Š์ง€๋งŒ ์–ด๋Š์ •๋„ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€ํ•  ๋‚ด์šฉ๋“ค

๐Ÿ’ฅ Thread Local > MDC Filter, CountDown Match > ๋™์‹œ์„ฑ ์ง€์› ํด๋ž˜์Šค(Concurrent)

๐Ÿ’ฅ Stream, Buffer, Block

๐Ÿ’ฅ Blocking, Non-Blocking / Sync, Async

๐Ÿ’ฅ Race Condition (๋ณ‘๋ชฉ ํ˜„์ƒ)

 

[์šด์˜์ฒด์ œ] Race Condition๊ณผ ์˜ˆ๋ฐฉํ•  ๋ฐฉ๋ฒ•(์„ธ๋งˆํฌ์–ด, ๋ฎคํ…์Šค)

1.   Race Condition์— ๋Œ€ํ•ด race condition์ด๋ž€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณตํ†ต ์ž์›์„ ๋ณ‘ํ–‰์ ์œผ๋กœ(concurrently) ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋™์ž‘์„ ํ•  ๋•Œ, ๊ณต์šฉ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์–ด๋–ค ์ˆœ์„œ์— ๋”ฐ๋ผ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€์— ๋”ฐ

iredays.tistory.com

๐Ÿ’ฅ OS > Sytem Call, Kernel, Shell (์šด์˜์ฒด์ œ ๊ฐœ๋… ์žก๊ธฐ)

๐Ÿ’ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ, ํŽ˜์ด์ง• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹ค์‹œ ํ†บ์•„๋ณด๊ธฐ


๐Ÿ’ญ ์ด๋ฒˆ์— ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๋“ค์€ ์ „๋ฐ˜์ ์œผ๋กœ ์šด์˜์ฒด์ œ ๊ฐœ๋…์—์„œ ๋‚˜์˜ค๋Š” ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์•„์„œ ์ดํ•ดํ•˜๋Š”๋ฐ ์• ๋ฅผ ๋จน์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ดˆ์ ์ธ ์šด์˜์ฒด์ œ ๊ฐœ๋…์ด ์—†์–ด์„œ ์ง€๊ธˆ ๋‹น์žฅ์€ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๋‚ด๊ฒŒ ์™€๋‹ฟ์ง€ ์•Š๊ณ , ์šด์˜์ฒด์ œ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ธˆ๋ฐฉ ๋จธ๋ฆฟ์†์—์„œ ํœ˜๋ฐœ๋  ๊ฒƒ ๊ฐ™๋‹ค. (๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ..^^.. ๊ฑ”๋Š” ๋˜‘๋˜‘ํ•˜๊ธฐ๋ผ๋„ ํ•˜์ง€..)
๋‹น์žฅ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ•˜๊ธฐ์—๋Š” ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•˜์ง€๋งŒ ํ‹ˆํ‹ˆํžˆ ์šด์˜์ฒด์ œ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ปดํ“จํŒ…์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ด๋‹ˆ๊นŒ ๋ง์ด๋‹ค.

'์‚ถ > F-Lab' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Week 8  (0) 2021.06.25
Week 7  (0) 2021.06.18
Week 5  (0) 2021.06.03
Week 4  (0) 2021.05.27
Week 3  (0) 2021.05.20