μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” 가상 λ¨Έμ‹  JVM의 ꡬ쑰 클래슀 λ‘œλ” (Class Loader) λ‘œλ”© (Loading) : .class νŒŒμΌμ„ 읽어듀여 λ©”λͺ¨λ¦¬μ— 적재 링크 (Linking) : 적재된 클래슀의 μ°Έμ‘°λ₯Ό ν™•μΈν•˜κ³  μ€€λΉ„ μ΄ˆκΈ°ν™” (Initialization) : static 블둝과 static λ³€μˆ˜ μ΄ˆκΈ°ν™” μ‹€ν–‰ 엔진 (Execution Engine) 클래슀 λ‘œλ”κ°€ λ©”λͺ¨λ¦¬μ— 적재된 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ—­ν•  인터프리터 (Interpreter) λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ JIT 컴파일러 (Just-In-Time Compiler) Runtime μ‹œμ μ— λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ κΈ°κ³„μ–΄λ‘œ λ³€κ²½ ν›„ μ‹€ν–‰ -> μ„±λŠ₯ ν–₯상 GC (Garbage Collector) 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜λŠ” μ—­ν•  λŸ°νƒ€μž„ 데이터 μ˜μ—­ (Runtime Data Area) PC(Program Counter) μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” λΆ€λΆ„μ˜ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 JVM μŠ€νƒ (JVM Stack) λ©”μ†Œλ“œ 호좜 μ‹œλ§ˆλ‹€ ν”„λ ˆμž„μ„ μΆ”κ°€ν•˜κ³ , λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή ν”„λ ˆμž„μ„ 제거 각 ν”„λ ˆμž„μ€ 둜컬 λ³€μˆ˜, μ—°μ‚° μŠ€νƒ, λ©”μ†Œλ“œ μˆ˜ν–‰μ΄ λλ‚˜λ©΄ μ’…λ£Œλ˜λŠ” 정보λ₯Ό μ €μž₯ Native λ©”μ†Œλ“œ μŠ€νƒ JNI(Java Native Interface)λ₯Ό 톡해 ν˜ΈμΆœλ˜λŠ” C/C++/Assembly와 같은 λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ μŠ€νƒ νž™ (Heap) new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체와 배열을 μ €μž₯ν•˜λŠ” 곡간 λ©”μ†Œλ“œ μ˜μ—­ (Method Area) 클래슀 정보, μƒμˆ˜, 정적 λ³€μˆ˜ 등을 μ €μž₯ν•˜λŠ” 곡간 λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” 곡간 -> λ©€ν‹°μ“°λ ˆλ”© μ‹œ 동기화 처리 ν•„μš”
🐍 Python
GIL(Global Interpreter Lock) ν•˜λ‚˜μ˜ μ“°λ ˆλ“œλ§Œ 파이썬 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것 파이썬의 ν‘œμ€€ κ΅¬ν˜„μΈ CPythonμ—μ„œλ§Œ 쑴재 μž₯점 Reference Counting 기반 λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ˜ Race condition 방지 데이터 무결성 보μž₯ : λ©€ν‹°μ“°λ ˆλ“œ ν™˜κ²½μ—μ„œ 파이썬 κ°μ²΄λ‚˜ λ©”λͺ¨λ¦¬ κ΄€λ ¨ μž‘μ—…μ΄ μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰λ˜λ„λ‘ 보μž₯ 파이썬 Interpreter의 κ΅¬ν˜„μ„ λ‹¨μˆœν™” : λ³΅μž‘ν•œ 락 λ©”μ»€λ‹ˆμ¦˜μ΄ ν•„μš”μ—†μŒ C ν™•μž₯ λͺ¨λ“ˆμ΄ Thread-Safe ν•˜μ§€ μ•Šλ”λΌλ„ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 보μž₯ ν”Œλž«νΌ 독립성 μœ μ§€ : CPU μ•„ν‚€ν…μ²˜λ³„ 동기화 λ©”μ»€λ‹ˆμ¦˜μ— μ˜μ‘΄ν•˜μ§€ μ•ŠμŒ 단점 λ©€ν‹°μ½”μ–΄ CPU ν™œμš© μ œν•œ: 단일 μ½”μ–΄λ§Œ μ‚¬μš©λ˜λ―€λ‘œ 병렬 처리의 이점을 얻을 수 μ—†μŒ λ©€ν‹°μ“°λ ˆλ”© μ„±λŠ₯ μ €ν•˜ : μ“°λ ˆλ“œ κ°„ context switching이 λΉˆλ²ˆν•˜κ²Œ λ°œμƒ 곡정성 문제 : νŠΉμ • μ“°λ ˆλ“œκ°€ GIL을 μž₯μ‹œκ°„ μ μœ ν•˜λ©΄ starvation λ¬Έμ œκ°€ λ°œμƒν•  수 있음 Reference Counting 객체가 λͺ‡ 번 μ°Έμ‘°λ˜λŠ”μ§€λ₯Ό μ„Έμ–΄μ„œ 0이 되면 λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜λŠ” 방식
πŸ‘¨β€πŸ’» λͺ¨κ°μ½”
1. Agile 방법둠 Agile μ„ μ–Έλ¬Έ μ‚¬λžŒκ³Ό μƒν˜Έμž‘μš© > ν”„λ‘œμ„ΈμŠ€μ™€ 도ꡬ μž‘λ™ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ > 포괄적인 λ¬Έμ„œ 고객과의 ν˜‘λ ₯ > 계약 ν˜‘μƒ 변화에 λŒ€ν•œ λŒ€μ‘ > κ³„νšμ„ λ”°λ₯΄κΈ° Agile 12가지 원칙 μ΄ˆκΈ°λΆ€ν„° μ§€μ†μ μœΌλ‘œ 고객을 만쑱 μš”κ΅¬μ‚¬ν•­ λ³€κ²½ 수용 짧은 배포 μ£ΌκΈ° κΈ°νšμžμ™€ 개발자의 ν˜‘μ—… λ™κΈ°λΆ€μ—¬λœ νŒ€μ›λ“€λ‘œ νŒ€λΉŒλ”© 얼꡴보고 λŒ€ν™”ν•˜κΈ° λ™μž‘λ˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‘œ 진척 μΈ‘μ • 지속 κ°€λŠ₯ν•œ 개발 속도 μœ μ§€ 쒋은 기술둜 쒋은 μ„€κ³„ν•˜κΈ° λ‹¨μˆœμ„± : ν•„μš”μ—†λŠ” 일 μ΅œμ†Œν™”ν•˜κΈ° μžκΈ°μ‘°μ§ν™” νŒ€ μ •κΈ°μ μœΌλ‘œ νš¨μœ¨μ„±μ„ ν–₯μƒμ‹œν‚€κΈ° Self-Organizing Team (μžκΈ°μ‘°μ§ν™” νŒ€) 슀슀둜 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΄€λ¦¬ν•˜λ©° 진행 상황을 λͺ¨λ‹ˆν„°λ§ν•˜λŠ” 방법을 슀슀둜 κ²°μ •ν•˜λŠ” νŒ€
상황 μ‚¬μ΄λ“œ ν”„λ‘œμ νŠΈ “μ•Œλ‘"을 κ°œλ°œν•˜λ˜ 쀑, μ‚¬μš©μžκ°€ μ•…μ˜μ μΈ λͺ©μ μœΌλ‘œ 반볡적으둜 μš”μ²­μ„ λ³΄λ‚΄λŠ” 것을 μ–΄λ–»κ²Œ λ§‰μ„κΉŒ κ³ λ―Όν•˜κ²Œ λ˜μ—ˆλ‹€. 쑰사λ₯Ό 톡해 Googleμ—μ„œ μ œκ³΅λ˜λŠ” Recaptchaλ₯Ό μ‚¬μš©ν•˜λ©΄ μ†μ‰½κ²Œ 방지할 수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. 곡격자의 μž…μž₯μ—μ„œ μƒκ°ν–ˆμ„ λ•Œ, μ§€κΈˆ ν”„λ‘œμ νŠΈμ—μ„œ κ°€μž₯ μ·¨μ•½ν•œ 뢀뢄은 νšŒμ›κ°€μž…μ΄λΌκ³  μƒκ°ν–ˆλ‹€. νšŒμ›κ°€μž…μ€ νšŒμ›μ΄ μ•„λ‹Œ μžκ°€, 아이디와 λΉ„λ°€λ²ˆν˜Έ κ·œμΉ™λ§Œ λ§Œμ‘±ν•œλ‹€λ©΄ 반볡적으둜 μš”μ²­μ„ 보낼 수 있고, μ΄λŠ” DB에 λ°”λ‘œ μ €μž₯되기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ νšŒμ›κ°€μž… 뢀뢄에 Recaptchaλ₯Ό μ μš©ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€. Recaptchaλž€? RecaptchaλŠ” κ΅¬κΈ€μ—μ„œ μ œκ³΅ν•˜λŠ” 무료 λ³΄μ•ˆ μ„œλΉ„μŠ€λ‘œ, μ‚¬μš©μžκ°€ λ‘œλ΄‡μ΄ μ•„λ‹˜μ„ 증λͺ…ν•˜λŠ” 방법 쀑 ν•˜λ‚˜μ΄λ‹€.