μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- λ μ
- html
- μ€λΈμ
- μ½λ©
- database
- κΉλ―Έκ²½μλ§νμμ
- μνμ£Ό
- ν°μ€ν 리μ±λ¦°μ§
- css
- νμ²μ 리νΈλ¦¬νΈ
- κ°μ΄ν μ’ λκ°λΉ
- μΉ΄νλκ°
- μ±
- μλ°
- μΉνΌλΈλ¦¬μ±
- νμ΄μ¬
- Python
- μ 리νΈλ¦¬νΈ
- JavaScript
- μλ°μ€ν¬λ¦½νΈ
- μ€λΌν΄
- μν
- κ°λ°
- λ°μ΄ν°λ² μ΄μ€
- Kλ°°ν°λ¦¬λ 볼루μ
- Java
- νλ‘κ·Έλλ°
- λκ°
- λ°μν
- λ°°μμ λ°°μ
- Today
- Total
JiYoung Dev π₯
νμ΄μ¬ λ©ν°νλ‘μΈμ±μ νμ©ν λ³λ ¬ νλ‘κ·Έλλ° λ°©λ² λ³Έλ¬Έ
νμ΄μ¬ λ©ν°νλ‘μΈμ±μ νμ©ν λ³λ ¬ νλ‘κ·Έλλ° λ°©λ²
Shinjio 2025. 3. 3. 17:09π λ³λ ¬ νλ‘κ·Έλλ°
λ³λ ¬ νλ‘κ·Έλλ°μ CPUκ° μ±κΈ μ½μ΄κ° μλ λ©ν° μ½μ΄ μ»΄ν¨ν° νκ²½μμ μ¬λ¬ κ°μ μμ μ λ³΄λ€ λΉ¨λ¦¬ μ€ννκΈ° μν λͺ©μ μΌλ‘ κ°λ°λλ νλ‘κ·Έλλ°μ΄λ€.
πΎ λ³λ ¬ νλ‘κ·Έλλ°μ ꡬννλ λ°©λ²
1οΈβ£ λ©ν°νλ‘μΈμ±(Multiprocessing)
μ¬λ¬ κ°μ νλ‘μΈμ€λ₯Ό λμμ μ€ννμ¬ λ³λ ¬ μ²λ¦¬λ₯Ό ꡬννλ€. κ° νλ‘μΈμ€λ λ 립μ μΌλ‘ μ€νλλ©°, μλ‘ λ©λͺ¨λ¦¬ 곡κ°μ 곡μ νμ§ μμΌλ―λ‘ νλ‘μΈμ€ κ° ν΅μ (IPC)κ° νμνλ€.
λ©ν° νλ‘μΈμ±μ CPU μ½μ΄λ₯Ό μ¬λ¬ κ° νμ©ν μ μμ΄ λ©ν°μ½μ΄ μμ€ν μμ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμΌλ©°, κ° νλ‘μΈμ€κ° λ 립μ μΌλ‘ μ€νλλ―λ‘ λ€λ₯Έ νλ‘μΈμ€μ μΆ©λ μμ΄ μμ νκ² μ€νν μ μλ€.
2οΈβ£ λ©ν°μ€λ λ©(Multithreading)
νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ μ€λ λλ₯Ό μμ±νμ¬ λ³λ ¬λ‘ μμ μ μννλ€. μ€λ λλ κ°μ λ©λͺ¨λ¦¬ 곡κ°μ 곡μ νλ―λ‘, μ€λ λ κ° λκΈ°νκ° νμν μ μλ€. μ£Όλ‘ κ²½λνλ λ³λ ¬ μ²λ¦¬λ₯Ό μν΄ μ¬μ©νλ©° νλ‘μΈμ€λ³΄λ€ λ©λͺ¨λ¦¬ λΉμ©μ΄ μ κ³ , λΉ λ₯Έ 컨ν μ€νΈ μ€μμΉμ΄ κ°λ₯νλ€.
3οΈβ£ λΉλκΈ°(Asychronous)
λΉλκΈ° νλ‘κ·Έλλ°μ μμ μ λ³λ ¬λ‘ μννλ κ²μ²λΌ 보μ΄μ§λ§ μ€μ λ‘λ λ¨μΌ μ€λ λμμ μμ μ λΉλκΈ°μ μΌλ‘ μ²λ¦¬νλ λ°©μμ΄λ€. μμ μ λΈλ‘νΉ μμ΄ μννλ©° μ½λ°± λλ νλ‘λ―Έμ€λ₯Ό μ¬μ©νμ¬ μμ μλ£ μ κ²°κ³Όλ₯Ό μ²λ¦¬νλ€. μ£Όλ‘ IO μμ μμ μ±λ₯μ μ΅μ νν μ μμΌλ©° μ¬λ¬ μμ μ λμμ κΈ°λ€λ¦΄ μ μλ€.
π νμ΄μ¬μ λ³λ ¬ νλ‘κ·Έλλ°
νμ΄μ¬μμλ μμ 3κ°μ§ λ°©μμ νμ©νμ¬ λ³λ ¬ νλ‘κ·Έλλ°μ ꡬνν μ μλ€.
1οΈβ£ λ©ν°μ€λ λ©
νμ΄μ¬μμ λ©ν°μ€λ λ©μ threading λͺ¨λμ μ¬μ©νμ¬ κ΅¬ννλ€. λ©ν°μ€λ λ©μ νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ μ€λ λλ₯Ό μμ±νμ¬ λμμ μμ μ μ²λ¦¬νλ λ°©μμ΄λ€. κ° μ€λ λλ λμΌν λ©λͺ¨λ¦¬ 곡κ°μ 곡μ νλ©°, CPU μμμ λμμ μ¬μ©νλ κ²μ²λΌ 보μΈλ€. κ·Έλ¬λ νμ΄μ¬μ GIL(Global Interpreter Lock) λλ¬Έμ λ©ν° μ€λ λ©μ μ¬μ©ν λ³λ ¬ μ²λ¦¬λ CPU λ°μ΄λ μμ μ λν΄μλ μ±λ₯ ν₯μμ΄ ν¬μ§ μλ€.
GILμ μΈν°ν리ν°κ° μ¬λ¬ 맀 μκ° 1κ°μ μ°λ λλ§ μ€νν μ μκ² νλ€. κ²°κ΅ νμ΄μ¬μ λ©ν°μ€λ λ©μ λ³λ ¬μ μ΄ μλλΌ λμμ μΌλ‘ μ€νλλ κ²μ΄λ€. λ©ν° μ€λ λ©μ μ£Όλ‘ I/O λ°μ΄λ μμ (μ: νμΌ μ½κΈ°/μ°κΈ°, λ€νΈμν¬ μμ² λ±)μ μ¬μ©νλ€.
** νμ΄μ¬μ GIL κ΄λ ¨ μλ£λ 맨 μλ μ°Έκ³ μλ£λ₯Ό ν΅ν΄ λ΄μ©μ νμΈν μ μλ€. λ€μμλ νμ΄μ¬μ GILμ λν΄ μμΈν ν¬μ€ν ν΄ λ³Ό μμ μ΄λ€.
2οΈβ£ λ©ν°νλ‘μΈμ±
λ©ν°νλ‘μΈμ±μ multiprocessing λͺ¨λμ μ¬μ©νμ¬ μ¬λ¬ κ°μ νλ‘μΈμ€λ₯Ό μμ±νκ³ λ³λ ¬ μ²λ¦¬λ₯Ό μννλ€. κ° νλ‘μΈμ€λ λ 립μ μΈ λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§κ³ μκΈ° λλμ GILμ μν₯μ λ°μ§ μλλ€. CPU λ°μ΄λ μμ (볡μ‘ν κ³μ°, μ΄λ―Έμ§ μ²λ¦¬ λ±)μμ μ±λ₯ ν₯μμ ν¬κ² κΈ°λν μ μλ€.
3οΈβ£ λΉλκΈ° νλ‘κ·Έλλ°
λΉλκΈ° νλ‘κ·Έλλ°μ asyncio λͺ¨λμ μ¬μ©νμ¬ I/O μμ μ λΉλκΈ°μ μΌλ‘ μ²λ¦¬ν μ μλ€. μ΄λ λ©ν°μ€λ λ©μ΄λ λ©ν°νλ‘μΈμ±κ³Όλ λ¬λ¦¬ λ¨μΌ μ€λ λμμ λΉλκΈ°μ μΌλ‘ μ¬λ¬ μμ μ μ²λ¦¬ν μ μκ² ν΄μ€λ€. λΉλκΈ° μμ μ μ£Όλ‘ I/O λ°μ΄λ μμ μμ μ±λ₯ ν₯μμ΄ ν¬λ€.
π νμ΄μ¬ λ©ν°νλ‘μΈμ±
CPU λ°μ΄λ μμ μ μ£Όλ‘ μ§ννλ νλ‘κ·Έλ¨μ λ©ν°νλ‘μΈμ±μ ν΅ν΄ λ³λ ¬ μ²λ¦¬ νμ¬ μ±λ₯μ λμ΄μ¬λ¦¬λ € νλ€. νμ΄μ¬μ λ©ν°νλ‘μΈμ± λ°©λ²μ λν΄ μμ보μ.
νμ΄μ¬μ multiprocessing λͺ¨λμ threading λͺ¨λκ³Ό μ μ¬ν APIλ₯Ό μ¬μ©νμ¬ νλ‘μΈμ€λ₯Ό μμ±ν μ μλλ‘ μ§μνλ ν¨ν€μ§μ΄λ€. multiprocessing ν¨ν€μ§λ λ‘컬 λ° μ격 λμμ±μ μ 곡νλ©°, μ€λ λ λμ μλΈνλ‘μΈμ€λ₯Ό μ¬μ©νμ¬ GILμ μ°ννλ€. μ΄λ‘ μΈν΄ multiprocessing λͺ¨λμ μ£Όμ΄μ§ λ¨Έμ μμ μ¬λ¬ νλ‘μΈμλ₯Ό μμ ν νμ©ν μ μκ² ν΄μ£Όλ©°, Unixμ μλμ°μμ λͺ¨λ μ€ν κ°λ₯νλ€.
multiprocessing λͺ¨λμ Pool κ°μ²΄λ₯Ό μ 곡νλ€. Pool κ°μ²΄λ μ¬λ¬ μ λ ₯ κ°μ λν΄ ν¨μ μ€νμ λ³λ ¬νν μ μλ νΈλ¦¬ν λ°©λ²μ μ 곡νλ€. μ λ ₯ λ°μ΄ν°λ₯Ό νλ‘μΈμ€μ λΆλ°°νμ¬ λ°μ΄ν° λ³λ ¬μ±μ μ²λ¦¬νλ€.
β Poolμ μ¬μ©ν λ°μ΄ν° λ³λ ¬μ±μ κΈ°λ³Έ μμ
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p: # 5κ°μ νλ‘μΈμ€λ₯Ό κ°μ§ νλ‘μΈμ€ ν μμ±
# μ
λ ₯ 리μ€νΈ [1,2,3]μ μλ κ° κ°μ λν΄ fλ₯Ό λ³λ ¬λ‘ μ€ν
# f(1), f(2), f(3)μ΄ κ°κ° λ€λ₯Έ νλ‘μΈμ€μμ μ€ν
print(p.map(f, [1,2,3])) # [1,4,9] μΆλ ₯
β Process μμ±
λ©ν°νλ‘μΈμ±μμλ Process κ°μ²΄λ₯Ό μμ±ν ν, κ·Έ κ°μ²΄μ start() λ©μλλ₯Ό νΈμΆνμ¬ νλ‘μΈμ€λ₯Ό μμ±νλ€.
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
main line
module name: __main__
parent process: 101488
process id: 101493
function f
module name: __main__
parent process: 101493
process id: 101497
hello bob
πΎ νμ΄μ¬ λ©ν°νλ‘μΈμ± νλ‘μΈμ€ μμ λ°©λ²
νμ΄μ¬μ λ©ν°νλ‘μΈμ±μ νλ‘μΈμ€λ₯Ό μμνλ μΈ κ°μ§ λ°©λ²μ μ§μνλ€.
1οΈβ£ spawn
λΆλͺ¨ νλ‘μΈμ€λ μ Python μΈν°νλ¦¬ν° νλ‘μΈμ€λ₯Ό μμνλ€. μμ νλ‘μΈμ€λ ν΄λΉ νλ‘μΈμ€ κ°μ²΄μ run() λ©μλλ₯Ό μ€ννλ λ° νμν 리μμ€λ§ μμ λ°λλ€. νΉν λΆλͺ¨ νλ‘μΈμ€μ λΆνμν νμΌ λμ€ν¬λ¦½ν°μ νΈλ€μ μμλμ§ μλλ€. μ΄ λ°©λ²μ μ¬μ©νμ¬ νλ‘μΈμ€λ₯Ό μμνλ κ²μ forkλ forkserverλ₯Ό μ¬μ©νλ κ²λ³΄λ€ μλΉν λ리λ€.
Unixμ Windowsμμ μ§μλλ©° Windowsμ macOSμμ κΈ°λ³Έκ°μΌλ‘ μ¬μ©λλ€.
2οΈβ£ fork
λΆλͺ¨ νλ‘μΈμ€λ os.fork()λ₯Ό μ¬μ©νμ¬ Python μΈν°ν리ν°λ₯Ό ν¬ν¬νλ€. μμ νλ‘μΈμ€λ μμν λ μ¬μ€μ λΆλͺ¨ νλ‘μΈμ€μ λμΌνλ€. λΆλͺ¨μ λͺ¨λ 리μμ€κ° μμ νλ‘μΈμ€μ μμλλ€. λ©ν°μ€λ λ νλ‘μΈμ€λ₯Ό μμ νκ² ν¬ν¬νλ κ²μ λ¬Έμ κ° λ μ μμμ μ μν΄μΌ νλ€.
Unix μ μ©μΌλ‘ μ¬μ©λλ©°, Unixμμ κΈ°λ³Έκ°μΌλ‘ μ¬μ©λλ€.
3οΈβ£ forkserver
νλ‘κ·Έλ¨μ΄ μμλλ©΄ forkserver μμ λ°©λ²μ μ ννμ¬ μλ² νλ‘μΈμ€κ° μμλλ€. κ·Έ μ΄ν μλ‘μ΄ νλ‘μΈμ€κ° νμν λλ§λ€ λΆλͺ¨ νλ‘μΈμ€λ μλ²μ μ°κ²°νμ¬ μλ‘μ΄ νλ‘μΈμ€λ₯Ό ν¬ν¬νλλ‘ μμ²νλ€. ν¬ν¬ μλ² νλ‘μΈμ€λ λ¨μΌ μ€λ λλ‘ μ€νλλ―λ‘ os.fork()λ₯Ό μ¬μ©νλ κ²μ΄ μμ νλ€. λΆνμν 리μμ€λ μμλμ§ μλλ€.
Unix νλ«νΌ μ€ Unix νμ΄νλ₯Ό ν΅ν΄ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ λ¬νλ κΈ°λ₯μ μ§μνλ νλ«νΌμμ μ¬μ© κ°λ₯νλ€.
π fork vs spawn vs forkserver
fork
λΉ λ₯΄μ§λ§ μμ νμ§ μλ€.
- Forkλ λΆλͺ¨ νλ‘μΈμ€μ λ©λͺ¨λ¦¬, λͺ¨λ, κ°μ²΄ λ±μ κ·Έλλ‘ λ³΅μ¬νμ¬ μμ νλ‘μΈμ€λ₯Ό λ§λ λ€. μ΄ λλΆμ μλκ° λΉ λ₯΄λ€.
- νμ§λ§ λΆλͺ¨ νλ‘μΈμ€μ μ€λ λλ 볡μ¬λμ§ μκΈ° λλ¬Έμ, λΆλͺ¨μμ μ κΈμ κ°μ§κ³ μλ μ€λ λκ° μμ νλ‘μΈμ€μ μν₯μ λ―ΈμΉ μ μμ΄ deadlock λ°μ μνμ΄ μλ€.
- λν, λΆλͺ¨ νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν°λ λ€νΈμν¬ ν¬νΈ λ±λ μμμκ² μμλμ΄ λΆνμν 리μμ€ κ³΅μ κ° λ°μν μ μλ€.
- λ°λΌμ forkλ λΉ λ₯΄μ§λ§, μμ μ±μ΄ λ¨μ΄μ§κ³ λΆνμνκ² μμ νλ‘μΈμ€κ° μ»€μ§ μ μλ€.
Spawn
μμ νμ§λ§ λ리λ€.
- Spawnμ λΆλͺ¨ νλ‘μΈμ€μ λ©λͺ¨λ¦¬, νμΌ λμ€ν¬λ¦½ν°, μ€λ λ λ±μ 볡μ¬νμ§ μκ³ μμ νλ‘μΈμ€λ₯Ό μ²μλΆν° μλ‘ μμνλ€.
- κΈ°μ μ μΌλ‘ spawnμ λΆλͺ¨ νλ‘μΈμ€μ 볡μ λ³Έμ μμ±ν ν, μμ νλ‘μΈμ€λ μλ‘μ΄ Python μΈν°ν리ν°λ₯Ό μμνκ³ , νμν λͺ¨λμ λ‘λν λ€ μ§μ λ ν¨μλ₯Ό μ€ννλ€.
- μ΄ λ°©μμ μμ νκ³ κ°κ²°νμ§λ§, μ²μλΆν° νλ‘μΈμ€λ₯Ό μμν΄μΌ νλ―λ‘ λ리λ€. νμ§λ§ μμ νλ‘μΈμ€κ° νλ μΌμ΄ ν¬μ§ μλ€λ©΄ λλ¦¬κ² λκ»΄μ§μ§ μμ μλ μλ€.
Forkserver
λΉ λ₯΄κ³ μμ νμ§λ§ 볡μ‘νλ€.
- Forkserverλ μ²μμ 'fork server'λΌλ νΉλ³ν νλ‘μΈμ€λ₯Ό λ§λ€μ΄ λκ³ , κ·Έ νλ‘μΈμ€κ° μμ νλ‘μΈμ€λ₯Ό ν¬ν¬νλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λ μμ νλ‘μΈμ€λ κ°κ²°νκ³ μμ νκ² μμλλ€.
- μμ νλ‘μΈμ€λ₯Ό μμν λλ§λ€ forkserverμ μμ²ν΄μ μμ νλ‘μΈμ€λ₯Ό ν¬ν¬νλ€. μ΄ λ°©μμ λΉ λ₯΄κ³ μμ νμ§λ§, 볡μ‘νκ³ λ¬Έμνκ° λΆμ‘±ν΄ μ¬μ©νκΈ° μ΄λ ΅λ€.
- Forkserverλ μ κΈ λ¬Έμ λ₯Ό λ°©μ§ν μ μκ³ , μμ νλ‘μΈμ€κ° 컀μ§μ§ μμΌλ©° μ 체μ μΌλ‘ ν¨μ¨μ μ΄λ€.
Unixμμ spawn λλ forserver μμ λ°©λ²μ μ¬μ©νλ©΄ 리μμ€ μΆμ κΈ° νλ‘μΈμ€κ° μμλλ€. μ΄ νλ‘μΈμ€λ νλ‘κ·Έλ¨μ νλ‘μΈμ€κ° μμ±ν λ§ν¬λμ§ μμ λͺ λͺ λ μμ€ν 리μμ€(μ: λͺ λͺ λ μΈλ§ν¬μ΄λ SharedMemory κ°μ²΄)λ₯Ό μΆμ νλ€. λͺ¨λ νλ‘μΈμ€κ° μ’ λ£λλ©΄ 리μμ€ μΆμ κΈ°λ μΆμ μ€μΈ κ°μ²΄λ₯Ό μΈλ§ν¬ νλ€. μΌλ°μ μΌλ‘ μΆμ ν κ°μ²΄κ° μμ΄μΌ νμ§λ§, νλ‘μΈμ€κ° μ νΈλ‘ μ’ λ£λμμ κ²½μ° λμλ 리μμ€κ° μμ μ μλ€.
μμ λ°©λ²μ μ ννλ €λ©΄ main λͺ¨λμ if __name__ == '__main__' λΈλ‘μμ set_start_method()λ₯Ό μ¬μ©νλ€.
import multiprocessing as mp
def foo(q):
q.put('hello')
if __name__ == '__main__':
mp.set_start_method('spawn')
q = mp.Queue()
p = mp.Process(target=foo, args=(q,))
p.start()
print(q.get())
p.join()
set_start_method()λ νλ‘κ·Έλ¨μμ ν λ²λ§ μ¬μ©νλ€.
π μ°Έκ³ μλ£
https://teus-kiwiee.tistory.com/entry/PythonMultiProcessing-%ED%83%90%EA%B5%AC
[Python]MultiProcessing νꡬ
μλ νμΈμ. Teusμ λλ€.μ΄λ² ν¬μ€ν μ Pythonμ Multiprocessingμ μ¬μ©νλ κ³Όμ μμ λ°μνλ λ¬Έμ μ λ€μ νꡬνλ ν¬μ€ν μ λλ€.0. Pythonμ Multiprocessingμμ λΆν° μ΄μΌκΈ° νμ§λ§, Pythonμ GIL λλ¬Έμ, P
teus-kiwiee.tistory.com
https://docs.python.org/3.10/library/multiprocessing.html#contexts-and-start-methods
multiprocessing — Process-based parallelism — Python 3.10.16 documentation
Source code: Lib/multiprocessing/ Introduction multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency, effectively side-stepping the G
docs.python.org
https://stackoverflow.com/questions/64095876/multiprocessing-fork-vs-spawn
multiprocessing fork() vs spawn()
I was reading the description of the two from the python doc: spawn The parent process starts a fresh python interpreter process. The child process will only inherit those resources necessary to r...
stackoverflow.com
[Python] λ©ν°νλ‘μΈμ€ & λ©ν°μ€λ λ
νμ΄μ¬μ μΈν°νλ¦¬ν° μΈμ΄μ΄κΈ° λλ¬Έμ μ»΄νμΌ μΈμ΄λ³΄λ€ λλ¦¬κ³ λ°λΌμ μ€μκ° κ±°λ μμ€ν μ²λΌ λ§€μ° μ§§μ μλ΅μκ°μ νμλ‘ νλλ° μ¬μ©ν μ μλ€. νμ΄μ¬μ λμλ€λ°μ μΈ λ©ν°μ€λ λλ₯Ό μ²
velog.io
[Python] Global Interpreter Lock(GIL)μ μ λμ λκ³ , μ΄λ€ νΉμ§μ΄ μλμ?
Global Interpreter Lock(GIL)? GILμ λ¬Έμ κ·Έλλ‘ μΈν°ν리ν°μ λν Lockμ΄λ€. Lockμ μΈν°ν리ν°κ° μ¬λ¬ μ€λ λλ₯Ό λ³λ ¬μ μΌλ‘(Parallel) μ€ννμ§ μλλ‘ λ§λλ€. νμ΄μ¬μ GILμ΄ μκΈ° λλ¬Έμ, μΈν°ν리ν°κ°
only-wanna.tistory.com
https://seoyeonhwng.medium.com/python-global-interpreter-lock-gil-%EC%9D%B4%EB%9E%80-2e519d4491a1
Python Global Interpreter Lock(GIL)μ΄λ?
νμ΄μ¬ μΈμ΄ μ체μ λν΄ κ³΅λΆνλ€ λ³΄λ©΄ GILμ λ§μ£ΌμΉκ² λλ€. GILμ΄ λ¬΄μμΈμ§ λλ΅ μκ³ μμ§λ§, μ‘°κΈ λ κΉκ² μ΄ν΄νκ³ μΆμ λ§μμ κ΄λ ¨ κΈμ μ½κ³ μ΄ν΄ν λ°λ₯Ό μ 리ν΄λ³΄μλ€.
seoyeonhwng.medium.com
'Study > Back-End' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Linux νλ‘μΈμ€λ₯Ό μμ±νλ 3κ°μ§ λ°©λ² (spawn, fork, exec) (0) | 2025.03.03 |
---|---|
DBCP ValidationQuery μ΄ν΄ λ° μ€μ νκΈ° (0) | 2024.11.25 |
νκ²½λ³μ(PATH) μ΄ν΄νκΈ° (1) | 2024.11.20 |
λ‘κ·Έ λ 벨 λ° λ‘κ·Έ μμ± κΈ°μ€ (0) | 2024.11.11 |
[Node.js] Expressμ listen λ° Cors μ€μ (1) | 2024.11.07 |