λ²μ κ΄λ¦¬μ λ―Έλλ₯Ό νννμΈμ. μμ€ μ½λ νμ μμ€ν κ³Ό AST κΈ°λ°μ μ°¨μ΄μ λΉκ΅λ₯Ό ν΅ν΄ λ³ν© μΆ©λμ μ κ±°νκ³ μμ λ‘μ΄ λ¦¬ν©ν λ§μ κ°λ₯νκ² νλ λ°©λ²μ μμ보μΈμ.
νμ μμ λ²μ κ΄λ¦¬: μννΈμ¨μ΄ 무결μ±μ μν μλ‘μ΄ ν¨λ¬λ€μ
μννΈμ¨μ΄ κ°λ°μ μΈκ³μμ Gitκ³Ό κ°μ λ²μ κ΄λ¦¬ μμ€ν (VCS)μ νμ μ κΈ°λ°μ λλ€. μ΄λ€μ λ³νμ 보νΈμ μΈ μΈμ΄μ΄μ, μ°λ¦¬μ μ§λ¨μ λ Έλ ₯μ μμ₯μ λλ€. κ·Έλ¬λ κ·Έλ€μ λͺ¨λ κ°λ ₯ν¨μλ λΆκ΅¬νκ³ , κ·Έλ€μ λ³Έμ§μ μΌλ‘ μμ μ΄ κ΄λ¦¬νλ κ²μ λ³Έμ§, μ¦ μ½λμ μλ―Έλ₯Ό κ°κ³Όν©λλ€. Gitμκ² λΉμ μ΄ μΈμ¬νκ² λ§λ μκ³ λ¦¬μ¦μ μλ μ₯보기 λͺ©λ‘κ³Ό λ€λ₯Ό λ° μμ΅λλ€. κ·Έμ ν μ€νΈ λΌμΈμΌ λΏμ λλ€. μ΄λ¬ν κ·Όλ³Έμ μΈ νκ³λ μ°λ¦¬μ κ°μ₯ μ§μμ μΈ μ’μ μ μμ²μ λλ€. μ¦, μ μ μλ λ³ν© μΆ©λ, κΉ¨μ§ λΉλ, κ·Έλ¦¬κ³ λκ·λͺ¨ 리ν©ν λ§μ λν λ§λΉμν€λ λλ €μμ λλ€.
νμ§λ§ μ°λ¦¬μ λ²μ κ΄λ¦¬ μμ€ν μ΄ μ»΄νμΌλ¬μ IDEλ§νΌ κΉμ΄ μ½λλ₯Ό μ΄ν΄ν μ μλ€λ©΄ μ΄λ¨κΉμ? ν μ€νΈμ μ΄λλΏλ§ μλλΌ ν¨μ, ν΄λμ€, νμ μ μ§νλ₯Ό μΆμ ν μ μλ€λ©΄ μ΄λ¨κΉμ? μ΄κ²μ΄ λ°λ‘ νμ μμ λ²μ κ΄λ¦¬μ μ½μμ λλ€. μ½λλ₯Ό λ¨μν ν μ€νΈ νμΌμ΄ μλ ꡬ쑰νλκ³ μλ―Έλ‘ μ μΈ κ°μ²΄λ‘ μ·¨κΈνλ νμ μ μΈ μ κ·Ό λ°©μμ λλ€. μ΄ κ²μλ¬Όμ μ½λμ μΈμ΄λ₯Ό λ§μΉ¨λ΄ μ΄ν΄νλ VCSλ₯Ό ꡬμΆνκΈ° μν ν΅μ¬ κ°λ , ꡬν κΈ°λ₯ λ° μ¬μ€ν μλ―Έλ₯Ό νꡬνλ©° μ΄ μλ‘μ΄ μ§νμ νμν©λλ€.
ν μ€νΈ κΈ°λ° λ²μ κ΄λ¦¬μ μ·¨μ½μ±
μλ‘μ΄ ν¨λ¬λ€μμ νμμ±μ μ΄ν΄νκΈ° μν΄, μ°λ¦¬λ λ¨Όμ νμ¬ ν¨λ¬λ€μμ λ³Έμ§μ μΈ μ½μ μ μΈμ ν΄μΌ ν©λλ€. Git, Mercurial, Subversionκ³Ό κ°μ μμ€ν μ λ¨μνκ³ κ°λ ₯ν μμ΄λμ΄μΈ λΌμΈ κΈ°λ° μ°¨μ΄μ λΉκ΅(diff)λ₯Ό κΈ°λ°μΌλ‘ ꡬμΆλμμ΅λλ€. μ΄λ€μ νμΌμ λ²μ μ ν μ€μ© λΉκ΅νμ¬ μΆκ°, μμ λ° μμ μ μλ³ν©λλ€. μ΄λ λλλλ‘ μ€λ«λμ νλ₯νκ² μλνμ§λ§, 볡μ‘νκ³ νμ μ μΈ νλ‘μ νΈμμλ κ·Έ νκ³κ° κ³ ν΅μ€λ¬μΈ μ λλ‘ λΆλͺ ν΄μ§λλ€.
ꡬ문μ λκ°ν λ³ν©
κ°μ₯ νν λ¬Έμ μ μ λ³ν© μΆ©λμ λλ€. λ κ°λ°μκ° νμΌμ κ°μ μ€μ νΈμ§ν λ, Gitμ ν¬κΈ°νκ³ μ¬λμκ² λͺ¨νΈν¨μ ν΄κ²°ν΄λ¬λΌκ³ μμ²ν©λλ€. Gitμ ꡬ문μ μ΄ν΄νμ§ λͺ»νκΈ° λλ¬Έμ μ¬μν 곡백 λ³κ²½κ³Ό ν¨μμ λ Όλ¦¬μ λν μ€μν μμ μ¬νμ ꡬλ³ν μ μμ΅λλ€. λ λμ κ²μ, λλ‘λ ꡬ문μ μΌλ‘ μ ν¨νμ§ μμ μ½λλ₯Ό μ΄λνλ "μ±κ³΅μ μΈ" λ³ν©μ μννμ¬, κ°λ°μκ° μ»€λ° νμμΌ λ°κ²¬νλ κΉ¨μ§ λΉλλ₯Ό μ λ°ν μ μλ€λ κ²μ λλ€.
μμ: μ μμ μΌλ‘ μ±κ³΅ν λ³ν©main λΈλμΉμ μλ κ°λ¨ν ν¨μ νΈμΆμ μμν΄ λ³΄μΈμ:
process_data(user, settings);
- λΈλμΉ A: ν κ°λ°μκ° μ μΈμλ₯Ό μΆκ°ν©λλ€:
process_data(user, settings, is_admin=True); - λΈλμΉ B: λ€λ₯Έ κ°λ°μκ° λͺ
νμ±μ μν΄ ν¨μ μ΄λ¦μ λ³κ²½ν©λλ€:
process_user_data(user, settings);
νμ€ 3λ°©ν₯ ν μ€νΈ λ³ν©μ μ΄λ¬ν λ³κ²½ μ¬νμ λ€μκ³Ό κ°μ΄ 무μλ―Έν κ²μΌλ‘ κ²°ν©ν μ μμ΅λλ€:
process_user_data(user, settings, is_admin=True);
λ³ν©μ μΆ©λ μμ΄ μ±κ³΅νμ§λ§, process_user_dataκ° is_admin μΈμλ₯Ό λ°μ§ μκΈ° λλ¬Έμ μ½λκ° μ΄μ κΉ¨μ‘μ΅λλ€. μ΄ λ²κ·Έλ μ΄μ μ½λλ² μ΄μ€μ μ‘°μ©ν μ¨μ΄λ€μ΄, CI νμ΄νλΌμΈ(λλ λ λμκ²λ μ¬μ©μ)μ μν΄ λ°κ²¬λκΈ°λ₯Ό κΈ°λ€λ¦¬κ³ μμ΅λλ€.
리ν©ν λ§ μ λͺ½
λκ·λͺ¨ 리ν©ν λ§μ μ½λλ² μ΄μ€μ μ₯κΈ°μ μΈ μ μ§λ³΄μμ± μΈ‘λ©΄μμ κ°μ₯ 건μ ν νλ μ€ νλμ΄μ§λ§, λμμ κ°μ₯ λλ €μνλ νλ μ€ νλμ λλ€. ν μ€νΈ κΈ°λ° VCSμμ λ리 μ¬μ©λλ ν΄λμ€ μ΄λ¦μ λ°κΎΈκ±°λ ν¨μ μκ·Έλμ²λ₯Ό λ³κ²½νλ©΄ λ°©λνκ³ λ Έμ΄μ¦κ° λ§μ μ°¨μ΄μ λΉκ΅(diff)κ° μμ±λ©λλ€. μ΄λ μμ λλ μλ°± κ°μ νμΌμ 건λλ € μ½λ 리뷰 νλ‘μΈμ€λ₯Ό μ§λ£¨ν νμμ μΈ μμ μΌλ‘ λ§λλλ€. λ¨μΌ μ΄λ¦ λ³κ²½μ΄λΌλ μ§μ ν λ Όλ¦¬μ λ³κ²½μ ν μ€νΈ λ³κ²½μ λμ¬ν μλ 묻νκ² λ©λλ€. μ΄λ¬ν λΈλμΉλ₯Ό λ³ν©νλ κ²μ κ³ μν, κ³ μ€νΈλ μ€ μ΄λ²€νΈκ° λ©λλ€.
νμ€ν 리컬 컨ν μ€νΈμ μμ€
ν
μ€νΈ κΈ°λ° μμ€ν
μ μλ³μ μ΄λ €μμ κ²ͺμ΅λλ€. ν¨μλ₯Ό utils.pyμμ helpers.pyλ‘ μ΄λνλ©΄ Gitμ μ΄λ₯Ό ν νμΌμμ μμ λκ³ λ€λ₯Έ νμΌμ μΆκ°λ κ²μΌλ‘ κ°μ£Όν©λλ€. μ°κ²°μ΄ λμ΄μ§λλ€. ν΄λΉ ν¨μμ μ΄λ ₯μ μ΄μ λ¨νΈνλ©λλ€. μ μμΉμ μλ ν¨μμ λν git blameμ λͺ λ
μ μ λ‘μ§μ μμ±ν μλ μμ±μκ° μλ 리ν©ν λ§ μ»€λ°μ κ°λ¦¬ν¬ κ²μ
λλ€. μ°λ¦¬ μ½λμ μ΄μΌκΈ°λ κ°λ¨νκ³ νμν μ¬μ‘°μ§μ μν΄ μ§μμ§λλ€.
κ°λ μκ°: νμ μμ λ²μ κ΄λ¦¬λ 무μμΈκ°?
νμ μμ λ²μ κ΄λ¦¬λ κΈμ§μ μΈ κ΄μ μ μ νμ μ μν©λλ€. μμ€ μ½λλ₯Ό λ¬Έμ λ° μ€μ μνμ€λ‘ 보λ λμ , νλ‘κ·Έλλ° μΈμ΄μ κ·μΉμ λ°λΌ μ μλ ꡬ쑰νλ λ°μ΄ν° νμμΌλ‘ κ°μ£Όν©λλ€. κΈ°λ³Έ μ§μ€μ ν μ€νΈ νμΌμ΄ μλλΌ κ·Έ μλ―Έλ‘ μ ννμΈ μΆμ ꡬ문 νΈλ¦¬(AST)μ λλ€.
ASTλ μ½λμ ꡬ문 ꡬ쑰λ₯Ό λνλ΄λ νΈλ¦¬μ μ μ¬ν λ°μ΄ν° ꡬ쑰μ λλ€. ν¨μ μ μΈ, λ³μ ν λΉ, if-λ¬Έκ³Ό κ°μ λͺ¨λ μμλ μ΄ νΈλ¦¬μ λ Έλκ° λ©λλ€. ASTμμ μλν¨μΌλ‘μ¨ λ²μ κ΄λ¦¬ μμ€ν μ μ½λμ μλμ ꡬ쑰λ₯Ό μ΄ν΄ν μ μμ΅λλ€.
- λ³μ μ΄λ¦ λ³κ²½μ λ μ΄μ ν μ€μ μμ νκ³ λ€λ₯Έ μ€μ μΆκ°νλ κ²μΌλ‘ κ°μ£Όλμ§ μμ΅λλ€. μ΄λ λ¨μΌμ μμμ μμ
μ
λλ€:
RenameIdentifier(old_name, new_name). - ν¨μ μ΄λμ λκ·λͺ¨ 볡μ¬-λΆμ¬λ£κΈ° μμ μ΄ μλλΌ ASTμμ ν¨μ λ Έλμ λΆλͺ¨λ₯Ό λ³κ²½νλ μμ μ λλ€.
- λ³ν© μΆ©λμ λ μ΄μ κ²ΉμΉλ ν μ€νΈ νΈμ§μ κ΄ν κ²μ΄ μλλΌ, λ€λ₯Έ λΈλμΉκ° μμ νλ €λ ν¨μλ₯Ό μμ νλ κ²κ³Ό κ°μ΄ λ Όλ¦¬μ μΌλ‘ νΈνλμ§ μλ λ³νμ κ΄ν κ²μ λλ€.
"νμ
μμ "μ "νμ
"μ μ΄λ¬ν ꡬ쑰μ , μλ―Έλ‘ μ μ΄ν΄λ₯Ό λνλ
λλ€. VCSλ κ° μ½λ μμμ "νμ
"(μ: FunctionDeclaration, ClassDefinition, ImportStatement)μ μκ³ μμΌλ©°, μ μ νμ
μΈμ΄κ° μ»΄νμΌ μμ μ λ¬Έμμ΄μ μ μ λ³μμ ν λΉνλ κ²μ λ°©μ§νλ κ²κ³Ό λ§€μ° μ μ¬νκ² μ½λλ² μ΄μ€μ ꡬ쑰μ 무결μ±μ 보쑴νλ κ·μΉμ μ μ©ν μ μμ΅λλ€. μ΄λ μ±κ³΅μ μΈ λͺ¨λ λ³ν©μ΄ ꡬ문μ μΌλ‘ μ ν¨ν μ½λλ₯Ό μμ±ν¨μ 보μ₯ν©λλ€.
ꡬνμ κΈ°λ₯: VCλ₯Ό μν μμ€ μ½λ νμ μμ€ν ꡬμΆ
ν μ€νΈ κΈ°λ° λͺ¨λΈμμ νμ μμ λͺ¨λΈλ‘ μ ννλ κ²μ μ½λλ₯Ό μ μ₯νκ³ , ν¨μΉνκ³ , λ³ν©νλ λ°©μμ μμ ν μ¬κ΅¬μν΄μΌ νλ κΈ°λ λΉμ μΈ μμ μ λλ€. μ΄ μλ‘μ΄ μν€ν μ²λ λ€ κ°μ§ ν΅μ¬ κΈ°λ₯μ κΈ°λ°μ λ‘λλ€.
κΈ°λ₯ 1: μΆμ ꡬ문 νΈλ¦¬(AST)λ₯Ό κΈ°λ³Έ μ§μ€λ‘
λͺ¨λ κ²μ νμ±μμ μμλ©λλ€. κ°λ°μκ° μ»€λ°μ ν λ, 첫 λ²μ§Έ λ¨κ³λ νμΌμ ν μ€νΈλ₯Ό ν΄μ±νλ κ²μ΄ μλλΌ ASTλ‘ νμ±νλ κ²μ λλ€. μ΄ ASTλ μμ€ νμΌμ΄ μλλΌ μ μ₯μμ μλ μ½λμ νμ€ ννμ΄ λ©λλ€.
- μΈμ΄λ³ νμ: μ΄κ²μ΄ 첫 λ²μ§Έ ν° λκ΄μ λλ€. VCSλ μ§μνλ €λ λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μ λν΄ κ²¬κ³ νκ³ λΉ λ₯΄λ©° μ€λ₯μ κ°ν νμμ μ κ·Όν μ μμ΄μΌ ν©λλ€. μλ§μ μΈμ΄μ λν μ¦λΆ νμ±μ μ 곡νλ Tree-sitterμ κ°μ νλ‘μ νΈλ μ΄ κΈ°μ μ μ€μν μ‘°λ ₯μμ λλ€.
- λ€μ€ μΈμ΄ μ μ₯μ μ²λ¦¬: νλ νλ‘μ νΈλ λ¨μΌ μΈμ΄λ‘λ§ μ΄λ£¨μ΄μ Έ μμ§ μμ΅λλ€. Python, JavaScript, HTML, CSS, ꡬμ±μ μν YAML, λ¬Έμνλ₯Ό μν Markdown λ±μ΄ νΌν©λμ΄ μμ΅λλ€. μ§μ ν νμ μμ VCSλ μ΄λ¬ν λ€μν ꡬ쑰ν λ° λ°κ΅¬μ‘°νλ λ°μ΄ν° 컬λ μ μ νμ±νκ³ κ΄λ¦¬ν μ μμ΄μΌ ν©λλ€.
κΈ°λ₯ 2: λ΄μ© κΈ°λ° μ£Όμ μ§μ μ΄ κ°λ₯ν AST λ Έλ
Gitμ κ°λ ₯ν¨μ λ΄μ© κΈ°λ° μ£Όμ μ§μ μ μ₯μμμ λΉλ‘―λ©λλ€. λͺ¨λ κ°μ²΄(λΈλ‘, νΈλ¦¬, 컀λ°)λ λ΄μ©μ μνΈν ν΄μμ μν΄ μλ³λ©λλ€. νμ μμ VCSλ μ΄ κ°λ μ νμΌ μμ€μμ μλ―Έλ‘ μ μμ€μΌλ‘ νμ₯ν κ²μ λλ€.
μ 체 νμΌμ ν μ€νΈλ₯Ό ν΄μ±νλ λμ , κ°λ³ AST λ Έλμ κ·Έ μμμ μ§λ ¬νλ ννμ ν΄μ±ν κ²μ λλ€. μλ₯Ό λ€μ΄, ν¨μ μ μλ μ΄λ¦, λ§€κ°λ³μ λ° λ³Έλ¬Έμ κΈ°λ°μΌλ‘ κ³ μ μλ³μλ₯Ό κ°κ² λ©λλ€. μ΄ λ¨μν μμ΄λμ΄λ μ¬μ€ν κ²°κ³Όλ₯Ό κ°μ Έμ΅λλ€:
- μ§μ ν μλ³: ν¨μ μ΄λ¦μ λ³κ²½νλλΌλ
nameμμ±λ§ λ³κ²½λ©λλ€. λ³Έλ¬Έκ³Ό λ§€κ°λ³μμ ν΄μλ λμΌνκ² μ μ§λ©λλ€. VCSλ μ΄λ¦λ§ λ°λ λμΌν ν¨μμμ μΈμν μ μμ΅λλ€. - μμΉ λ
립μ±: ν¨μλ₯Ό λ€λ₯Έ νμΌλ‘ μ΄λνλλΌλ ν΄μλ μ ν λ³κ²½λμ§ μμ΅λλ€. VCSλ ν¨μκ° μ νν μ΄λλ‘ κ°λμ§ μκ³ μμΌλ©°, ν΄λΉ μ΄λ ₯μ μλ²½νκ² λ³΄μ‘΄ν©λλ€.
git blameλ¬Έμ λ ν΄κ²°λ©λλ€. μλ―Έλ‘ μ λΈλ μ λꡬλ λ‘μ§μ΄ λͺ λ² μ΄λνκ±°λ μ΄λ¦μ΄ λ³κ²½λμλμ§μ κ΄κ³μμ΄ λ‘μ§μ μ§μ ν μλ³Έμ μΆμ ν μ μμ΅λλ€.
κΈ°λ₯ 3: λ³κ²½ μ¬νμ μλ―Έλ‘ μ ν¨μΉλ‘ μ μ₯
μ½λ ꡬ쑰μ λν μ΄ν΄λ₯Ό λ°νμΌλ‘ ν¨μ¬ λ ννμ μ΄κ³ μλ―Έ μλ μ΄λ ₯μ λ§λ€ μ μμ΅λλ€. 컀λ°μ λ μ΄μ ν μ€νΈ μ°¨μ΄μ λΉκ΅κ° μλλΌ κ΅¬μ‘°νλκ³ μλ―Έλ‘ μ μΈ λ³ν λͺ©λ‘μ΄ λ©λλ€.
λ€μκ³Ό κ°μ λμ :
- def get_user(user_id): - # ... logic ... + def fetch_user_by_id(user_id): + # ... logic ...
μ΄λ ₯μ λ€μμ κΈ°λ‘ν κ²μ λλ€:
RenameFunction(target_hash=\"abc123...\", old_name=\"get_user\", new_name=\"fetch_user_by_id\")
μ’ μ’ "ν¨μΉ μ΄λ‘ "(Darcs λ° Pijulκ³Ό κ°μ μμ€ν μμ μ¬μ©λ¨)μ΄λΌκ³ λΆλ¦¬λ μ΄ μ κ·Ό λ°©μμ μ μ₯μλ₯Ό μ λ ¬λ ν¨μΉ μ§ν©μΌλ‘ μ·¨κΈν©λλ€. λ³ν©μ μ΄λ¬ν μλ―Έλ‘ μ ν¨μΉλ₯Ό μ¬μ λ ¬νκ³ κ΅¬μ±νλ κ³Όμ μ΄ λ©λλ€. μ΄λ ₯μ λΆν¬λͺ ν ν μ€νΈ λ³κ²½ λ‘κ·Έκ° μλλΌ λ¦¬ν©ν λ§ μμ , λ²κ·Έ μμ λ° κΈ°λ₯ μΆκ°μ λν 쿼리 κ°λ₯ν λ°μ΄ν°λ² μ΄μ€κ° λ©λλ€.
κΈ°λ₯ 4: νμ μμ λ³ν© μκ³ λ¦¬μ¦
μ¬κΈ°μ λ§λ²μ΄ μΌμ΄λ©λλ€. λ³ν© μκ³ λ¦¬μ¦μ κ³΅ν΅ μ‘°μ, λΈλμΉ A, λΈλμΉ BλΌλ μΈ κ°μ§ κ΄λ ¨ λ²μ μ ASTμμ μ§μ μλν©λλ€.
- λ³ν μλ³: μκ³ λ¦¬μ¦μ λ¨Όμ μ‘°μμ λΈλμΉ Aλ‘, μ‘°μμ λΈλμΉ Bλ‘ λ³ννλ μλ―Έλ‘ μ ν¨μΉ μ§ν©μ κ³μ°ν©λλ€.
- μΆ©λ νμΈ: κ·Έλ° λ€μ μ΄ ν¨μΉ μ§ν© κ°μ λ
Όλ¦¬μ μΆ©λμ νμΈν©λλ€. μΆ©λμ λ μ΄μ κ°μ μ€μ νΈμ§νλ κ²μ κ΄ν κ²μ΄ μλλλ€. μ§μ ν μΆ©λμ λ€μκ³Ό κ°μ κ²½μ°μ λ°μν©λλ€:
- λΈλμΉ Aκ° ν¨μ μ΄λ¦μ λ³κ²½νλ λμ, λΈλμΉ Bλ ν΄λΉ ν¨μλ₯Ό μμ ν©λλ€.
- λΈλμΉ Aκ° κΈ°λ³Έκ°μ κ°μ§ λ§€κ°λ³μλ₯Ό ν¨μμ μΆκ°νλ λμ, λΈλμΉ Bλ κ°μ μμΉμ λ€λ₯Έ λ§€κ°λ³μλ₯Ό μΆκ°ν©λλ€.
- λ λΈλμΉ λͺ¨λ λμΌν ν¨μ λ³Έλ¬Έ λ΄μ λ‘μ§μ νΈνλμ§ μλ λ°©μμΌλ‘ μμ ν©λλ€.
- μλ ν΄κ²°: μ€λλ ν
μ€νΈ μΆ©λλ‘ κ°μ£Όλλ μλ§μ μΆ©λμ μλμΌλ‘ ν΄κ²°λ μ μμ΅λλ€. λ λΈλμΉκ° λμΌν ν΄λμ€μ λ κ°μ λ€λ₯Έ, μΆ©λνμ§ μλ λ©μλλ₯Ό μΆκ°νλ κ²½μ°, λ³ν© μκ³ λ¦¬μ¦μ λ¨μν λ
AddMethodν¨μΉλ₯Ό λͺ¨λ μ μ©ν©λλ€. μΆ©λμ μμ΅λλ€. μ μν¬νΈλ₯Ό μΆκ°νκ±°λ, νμΌ λ΄μμ ν¨μ μμλ₯Ό λ°κΎΈκ±°λ, ν¬λ§·ν λ³κ²½μ μ μ©νλ κ²½μ°μλ λ§μ°¬κ°μ§μ λλ€. - ꡬ문 μ ν¨μ± 보μ₯: μ΅μ’ λ³ν© μνλ μ ν¨ν ASTμ μ ν¨ν λ³νμ μ μ©νμ¬ κ΅¬μ±λλ―λ‘, κ²°κ³Ό μ½λλ ꡬ문μ μΌλ‘ μ νν¨μ΄ 보μ₯λ©λλ€. νμ νμ±λ κ²μ λλ€. "λ³ν©μΌλ‘ μΈν΄ λΉλκ° κΉ¨μ§" μ€λ₯ λ²μ£Όλ μμ ν μ κ±°λ©λλ€.
κΈλ‘λ² νμ μν μ€μ§μ μΈ μ΄μ λ° μ¬μ© μ¬λ‘
μ΄ λͺ¨λΈμ μ΄λ‘ μ μ°μν¨μ μ μΈκ³ κ°λ°μμ μΌμκ³Ό μννΈμ¨μ΄ μ λ¬ νμ΄νλΌμΈμ μ λ’°μ±μ λ³νμν¬ μ€μ§μ μΈ μ΄μ μΌλ‘ μ΄μ΄μ§λλ€.
- λλ €μ μλ 리ν©ν λ§: νμ λλ €μ μμ΄ λκ·λͺ¨ μν€ν μ² κ°μ μ μνν μ μμ΅λλ€. μμ² κ°μ νμΌμ κ±Έμ³ ν΅μ¬ μλΉμ€ ν΄λμ€ μ΄λ¦μ λ°κΎΈλ κ²μ λ¨μΌνκ³ λͺ ννλ©° μ½κ² λ³ν© κ°λ₯ν 컀λ°μ΄ λ©λλ€. μ΄λ μ½λλ² μ΄μ€κ° κΈ°μ λΆμ±μ λ¬΄κ² μλ μ 체λ기보λ€λ 건κ°νκ² μ μ§λκ³ λ°μ νλλ‘ μ₯λ €ν©λλ€.
- μ§λ₯μ μ΄κ³ μ§μ€μ μΈ μ½λ 리뷰: μ½λ 리뷰 λꡬλ μ°¨μ΄μ λΉκ΅λ₯Ό μλ―Έλ‘ μ μΌλ‘ νμν μ μμ΅λλ€. λΉ¨κ°μκ³Ό λ
Ήμμ λ°λ€κ° μλλΌ, 리뷰μ΄λ "λ³μ 3κ° μ΄λ¦ λ³κ²½,
calculatePriceμ λ°ν νμ λ³κ²½,validate_inputμ μ ν¨μλ‘ μΆμΆ"κ³Ό κ°μ μμ½μ λ³Ό μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ 리뷰μ΄λ ν μ€νΈ λ Έμ΄μ¦λ₯Ό ν΄λ νλ κ²μ΄ μλλΌ λ³κ²½ μ¬νμ λ Όλ¦¬μ μ νμ±μ μ§μ€ν μ μμ΅λλ€. - κΉ¨μ§μ§ μλ λ©μΈ λΈλμΉ: μ§μμ ν΅ν© λ° λ°°ν¬(CI/CD)λ₯Ό μ€μ²νλ μ‘°μ§μκ² μ΄κ²μ νλλ₯Ό λ°κΎΈλ μμμ
λλ€. λ³ν© μμ
μ΄ κ΅¬λ¬Έμ μΌλ‘ μ ν¨νμ§ μμ μ½λλ₯Ό μ λ μμ±ν μ μλ€λ 보μ₯μ
mainλλmasterλΈλμΉκ° νμ μ»΄νμΌ κ°λ₯ν μνμμ μλ―Έν©λλ€. CI νμ΄νλΌμΈμ λμ± μ λ’°ν μ μκ² λκ³ , κ°λ°μλ₯Ό μν νΌλλ°± 루νλ λ¨μΆλ©λλ€. - μ°μν μ½λ κ³ κ³ ν: μ½λ μ‘°κ°μ΄ μ μ‘΄μ¬νλμ§ μ΄ν΄νλ κ²μ΄ μ¬μν΄μ§λλ€. μλ―Έλ‘ μ λΈλ μ λꡬλ νμΌ μ΄λ λ° ν¨μ μ΄λ¦ λ³κ²½μ κ±°μ³ μ 체 μ΄λ ₯μ κ±Έμ³ λ‘μ§ λΈλ‘μ μΆμ νμ¬, λ¨μν νμΌμ μ¬ν¬λ§·ν 컀λ°μ΄ μλλΌ λΉμ¦λμ€ λ‘μ§μ λμ ν 컀λ°μ μ§μ κ°λ¦¬ν¬ μ μμ΅λλ€.
- ν₯μλ μλν: μ½λλ₯Ό μ΄ν΄νλ VCSλ λ μ§λ₯μ μΈ λꡬλ₯Ό ꡬλν μ μμ΅λλ€. κ΅¬μ± νμΌμ λ²μ λ²νΈλ₯Ό λ³κ²½ν λΏλ§ μλλΌ νμν μ½λ μμ (μ: λ³κ²½λ APIμ μ μ)μ λμΌν μμμ 컀λ°μ μΌλΆλ‘ μ μ©ν μ μλ μλνλ μ’ μμ± μ λ°μ΄νΈλ₯Ό μμν΄ λ³΄μΈμ.
μμΌλ‘μ κ³Όμ
λΉμ μ λ§€λ ₯μ μ΄μ§λ§, νμ μμ λ²μ κ΄λ¦¬μ κ΄λ²μν μ±νμΌλ‘ κ°λ κΈΈμ μ€λν κΈ°μ μ λ° μ€μ μ κ³Όμ λ‘ κ°λν©λλ€.
- μ±λ₯ λ° κ·λͺ¨: μ 체 μ½λλ² μ΄μ€λ₯Ό ASTλ‘ νμ±νλ κ²μ ν μ€νΈ νμΌμ μ½λ κ²λ³΄λ€ ν¨μ¬ λ λ§μ κ³μ° 리μμ€λ₯Ό νμλ‘ ν©λλ€. μν°νλΌμ΄μ¦ λ° μ€ν μμ€ νλ‘μ νΈμμ νν λ³Ό μ μλ λ°©λν μ μ₯μμ λν΄ νμ© κ°λ₯ν μ±λ₯μ λ΄κΈ° μν΄μλ μΊμ±, μ¦λΆ νμ±, κ·Έλ¦¬κ³ κ³ λλ‘ μ΅μ νλ λ°μ΄ν° κ΅¬μ‘°κ° νμμ μ λλ€.
- λꡬ μνκ³: Gitμ μ±κ³΅μ λꡬ μ체λΏλ§ μλλΌ κ·Έ μ£Όλ³μ ꡬμΆλ λ°©λν κΈλ‘λ² μνκ³(GitHub, GitLab, Bitbucket, IDE ν΅ν©(VS Codeμ GitLens λ±), μμ² κ°μ CI/CD μ€ν¬λ¦½νΈ)μ μμ΅λλ€. μλ‘μ΄ VCSλ μ²μλΆν° λ³λ ¬ μνκ³λ₯Ό ꡬμΆν΄μΌ νλ©°, μ΄λ κΈ°λ λΉμ μΈ μμ μ λλ€.
- μΈμ΄ μ§μ λ° λ‘±ν μΌ: μμ 10-15κ° νλ‘κ·Έλλ° μΈμ΄μ λν κ³ νμ§ νμλ₯Ό μ 곡νλ κ²λ§μΌλ‘λ κ±°λν μμ μ λλ€. νμ§λ§ μ€μ νλ‘μ νΈμλ μ μ€ν¬λ¦½νΈ, λ κ±°μ μΈμ΄, λλ©μΈ νΉμ μΈμ΄(DSL), κ΅¬μ± νμ λ± λ‘±ν μΌμ΄ ν¬ν¨λμ΄ μμ΅λλ€. ν¬κ΄μ μΈ μ루μ μ μ΄λ¬ν λ€μμ±μ λν μ λ΅μ κ°μ§κ³ μμ΄μΌ ν©λλ€.
- μ£Όμ, 곡백 λ° λΉμ ν λ°μ΄ν°: AST κΈ°λ° μμ€ν μ μ£Όμμ μ΄λ»κ² μ²λ¦¬ν κΉμ? λλ νΉμ νκ³ μλμ μΈ μ½λ ν¬λ§·ν μμ? μ΄λ¬ν μμλ€μ μ’ μ’ μΈκ°μ μ΄ν΄μ μ€μνμ§λ§, ASTμ 곡μμ μΈ κ΅¬μ‘° λ°μ μ‘΄μ¬ν©λλ€. μ€μ©μ μΈ μμ€ν μ ꡬ쑰λ₯Ό μν ASTμ μ΄ "λΉμ ν" μ 보λ₯Ό μν λ³λμ ννμ μ μ₯νκ³ , μ΄λ₯Ό λ€μ λ³ν©νμ¬ μλ³Έ ν μ€νΈλ₯Ό μ¬κ΅¬μ±νλ νμ΄λΈλ¦¬λ λͺ¨λΈμ΄ νμν κ²μ λλ€.
- μΈκ°μ μμ: κ°λ°μλ€μ 10λ μ΄μ Gitμ λͺ λ Ήκ³Ό κ°λ μ λν κΉμ κ·Όμ‘ κΈ°μ΅μ ꡬμΆν΄μμ΅λλ€. μλ‘μ΄ μμ€ν , νΉν μλ‘μ΄ μλ―Έλ‘ μ λ°©μμΌλ‘ μΆ©λμ μ μνλ μμ€ν μ κ΅μ‘μ λν μλΉν ν¬μμ μ μ€νκ² μ€κ³λ μ§κ΄μ μΈ μ¬μ©μ κ²½νμ νμλ‘ ν κ²μ λλ€.
κΈ°μ‘΄ νλ‘μ νΈ λ° λ―Έλ
μ΄ μμ΄λμ΄λ μμ ν νλ¬Έμ μΈ κ²μ΄ μλλλ€. μ΄ λΆμΌλ₯Ό μ κ·Ήμ μΌλ‘ νꡬνλ μ ꡬμ μΈ νλ‘μ νΈλ€μ΄ μμ΅λλ€. Unison νλ‘κ·Έλλ° μΈμ΄λ μ΄λ¬ν κ°λ μ κ°μ₯ μλ²½νκ² κ΅¬νν μ¬λ‘μΌ κ²μ λλ€. Unisonμμ μ½λλ λ°μ΄ν°λ² μ΄μ€μ μ§λ ¬νλ ASTλ‘ μ μ₯λ©λλ€. ν¨μλ λ΄μ©μ ν΄μμ μν΄ μλ³λμ΄ μ΄λ¦ λ³κ²½ λ° μ¬μ λ ¬μ΄ μ¬μν μΌμ΄ λ©λλ€. μ ν΅μ μΈ μλ―Έμ λΉλλ μκ³ μ’ μμ± μΆ©λλ μμ΅λλ€.
Pijulκ³Ό κ°μ λ€λ₯Έ μμ€ν μ μ격ν ν¨μΉ μ΄λ‘ μ κΈ°λ°μΌλ‘ ꡬμΆλμ΄ Gitλ³΄λ€ λ κ²¬κ³ ν λ³ν©μ μ 곡νμ§λ§, AST μμ€μμ μμ ν μΈμ΄ μΈμ§μ μ΄μ§λ μμ΅λλ€. μ΄ νλ‘μ νΈλ€μ λΌμΈ κΈ°λ° μ°¨μ΄μ λΉκ΅λ₯Ό λμ΄μ μ κ·Ό λ°©μμ΄ κ°λ₯ν λΏλ§ μλλΌ λ§€μ° μ μ΅νλ€λ κ²μ μ¦λͺ ν©λλ€.
λ―Έλλ λ¨μΌ "Git ν¬λ¬"κ° μλ μλ μμ΅λλ€. λ κ°λ₯μ± μλ κ²½λ‘λ μ μ§μ μΈ μ§νμ λλ€. μ°λ¦¬λ λ¨Όμ Git μμ μλνλ©° μλ―Έλ‘ μ μ°¨μ΄μ λΉκ΅, 리뷰, λ³ν© μΆ©λ ν΄κ²° κΈ°λ₯μ μ 곡νλ λꡬμ νμ°μ λ³Ό μ μμ΅λλ€. IDEλ λ κΉμ AST μΈμ κΈ°λ₯μ ν΅ν©ν κ²μ λλ€. μκ°μ΄ μ§λ¨μ λ°λΌ μ΄λ¬ν κΈ°λ₯μ Git μ체μ ν΅ν©λκ±°λ μλ‘μ΄ μ£Όλ₯ μμ€ν μ΄ λ±μ₯νλ κΈΈμ μ΄ μλ μμ΅λλ€.
μ€λλ κ°λ°μλ₯Ό μν μ€ν κ°λ₯ν ν΅μ°°
μ΄λ¬ν λ―Έλλ₯Ό κΈ°λ€λ¦¬λ λμ, μ°λ¦¬λ νμ μμ λ²μ κ΄λ¦¬μ μμΉμ λΆν©νκ³ ν μ€νΈ κΈ°λ° μμ€ν μ κ³ ν΅μ μννλ κ΄νμ μ€λλ μ±νν μ μμ΅λλ€:
- AST κΈ°λ° λꡬ νμ©: λ¦°ν°, μ μ λΆμκΈ°, μλ μ½λ ν¬λ§·ν°(Prettier, Black, gofmt λ±)λ₯Ό μ κ·Ή νμ©νμΈμ. μ΄λ¬ν λꡬλ ASTμμ μλνμ¬ μΌκ΄μ±μ μ μ§νκ³ , 컀λ°μμ μλλ½κ³ λΉκΈ°λ₯μ μΈ λ³κ²½ μ¬νμ μ€μ΄λ λ° λμμ΄ λ©λλ€.
- μμμ 컀λ°: λ¨μΌ λ Όλ¦¬μ λ³κ²½μ λνλ΄λ μκ³ μ§μ€λ 컀λ°μ λ§λμΈμ. 컀λ°μ 리ν©ν λ§, λ²κ·Έ μμ λλ κΈ°λ₯ μ€ νλμ¬μΌ νλ©°, μΈ κ°μ§ λͺ¨λλ₯Ό ν¬ν¨ν΄μλ μ λ©λλ€. μ΄λ κ² νλ©΄ ν μ€νΈ κΈ°λ° μ΄λ ₯λ λ μ½κ² νμν μ μμ΅λλ€.
- 리ν©ν λ§μ κΈ°λ₯κ³Ό λΆλ¦¬: λκ·λͺ¨ μ΄λ¦ λ³κ²½μ΄λ νμΌ μ΄λμ μνν λλ μ μ© μ»€λ° λλ ν 리νμ€νΈμμ μ§ννμΈμ. κΈ°λ₯ λ³κ²½ μ¬νκ³Ό 리ν©ν λ§μ νΌν©νμ§ λ§μΈμ. μ΄λ κ² νλ©΄ λ κ°μ§ λͺ¨λμ λν 리뷰 νλ‘μΈμ€κ° ν¨μ¬ κ°λ¨ν΄μ§λλ€.
- IDEμ 리ν©ν λ§ λꡬ μ¬μ©: μ΅μ IDEλ μ½λ ꡬ쑰μ λν μ΄ν΄λ₯Ό λ°νμΌλ‘ 리ν©ν λ§μ μνν©λλ€. μ΄λ₯Ό μ λ’°νμΈμ. IDEλ₯Ό μ¬μ©νμ¬ ν΄λμ€ μ΄λ¦μ λ³κ²½νλ κ²μ΄ μλμΌλ‘ μ°ΎκΈ° λ° λ°κΎΈκΈ°λ₯Ό νλ κ²λ³΄λ€ ν¨μ¬ μμ ν©λλ€.
κ²°λ‘ : λ νλ ₯μ μΈ λ―Έλλ₯Ό μν ꡬμΆ
λ²μ κ΄λ¦¬λ νλ μννΈμ¨μ΄ κ°λ°μ κΈ°λ°μ΄ λλ 보μ΄μ§ μλ μΈνλΌμ λλ€. λ무 μ€λ«λμ μ°λ¦¬λ ν μ€νΈ κΈ°λ° μμ€ν μ λ§μ°°μ νμ μ νΌν μ μλ λΉμ©μΌλ‘ λ°μλ€μμ΅λλ€. μ½λλ₯Ό ν μ€νΈλ‘ μ·¨κΈνλ κ²μμ ꡬ쑰νλκ³ μλ―Έλ‘ μ μΈ κ°μ²΄λ‘ μ΄ν΄νλ κ²μΌλ‘μ μ νμ κ°λ°μ λꡬμ λ€μ ν° λμ½μ λλ€.
νμ μμ λ²μ κ΄λ¦¬λ κΉ¨μ§ λΉλκ° μ€μ΄λ€κ³ , λ μλ―Έ μλ νμ μ΄ κ°λ₯νλ©°, μμ κ°μ κ°μ§κ³ μ½λλ² μ΄μ€λ₯Ό λ°μ μν¬ μμ κ° μλ λ―Έλλ₯Ό μ½μν©λλ€. κΈΈμ κΈΈκ³ λμ μΌλ‘ κ°λ μ°¨ μμ§λ§, μ°λ¦¬μ λκ΅¬κ° μ°λ¦¬κ° νλ μΌμ μλμ μλ―Έλ₯Ό μ΄ν΄νλ μΈμμ΄λΌλ λͺ©μ μ§λ μ°λ¦¬μ μ§λ¨μ λ Έλ ₯μ κΈ°μΈμΌ κ°μΉκ° μλ λͺ©νμ λλ€. μ΄μ μ°λ¦¬μ λ²μ κ΄λ¦¬ μμ€ν μκ² μ½λ©νλ λ°©λ²μ κ°λ₯΄μΉ λμ λλ€.