λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Project ESG+AI/Tech Basics

39일차. IT κ°œλ… 정리

by GreenJin_S2 2025. 12. 5.

 


κΉƒν—ˆλΈŒ μ•‘μ…˜(GitHub Actions)μ—μ„œ μ‚¬μš©λ˜λŠ” μš©μ–΄μΈ μ•‘μ…˜(Action), μŠ€ν…Œμ΄μ§€(Stage), **νƒœμŠ€ν¬(Task)**λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 라이프사이클을 μžλ™ν™”ν•˜λŠ” μ›Œν¬ν”Œλ‘œμš°(Workflow)의 ꡬ성 μš”μ†Œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

λ‹€λ§Œ, GitHub Actions의 곡식 λ¬Έμ„œμ—μ„œλŠ” 주둜 μ›Œν¬ν”Œλ‘œμš°(Workflow), μž‘μ—…(Job), 단계(Step), **μ•‘μ…˜(Action)**μ΄λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•˜λ©°, **μŠ€ν…Œμ΄μ§€(Stage)**λ‚˜ **νƒœμŠ€ν¬(Task)**λŠ” **μž‘μ—…(Job)**μ΄λ‚˜ **단계(Step)**와 같은 λ‹€λ₯Έ ꡬ성 μš”μ†Œλ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ 더 일반적으둜 μ‚¬μš©λ˜λŠ” μš©μ–΄μž…λ‹ˆλ‹€.

βš™οΈ μ£Όμš” ꡬ성 μš”μ†Œ μ„€λͺ…

1. μ•‘μ…˜ (Action)

  • μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ λ‹¨μœ„μž…λ‹ˆλ‹€.
  • μ›Œν¬ν”Œλ‘œμš°μ˜ **단계(Step)**μ—μ„œ μ‹€ν–‰ν•  수 μžˆλŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ μž‘μ—…μž…λ‹ˆλ‹€.
  • 자체적으둜 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ±°λ‚˜, GitHub Marketplaceμ—μ„œ λ‹€λ₯Έ μ‚¬λžŒμ΄ λ§Œλ“  μ•‘μ…˜μ„ 가져와 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: μ½”λ“œλ₯Ό μ²΄ν¬μ•„μ›ƒν•˜λŠ” actions/checkout, Node.js ν™˜κ²½μ„ μ„€μ •ν•˜λŠ” actions/setup-node.

2. μž‘μ—… (Job)

  • **μ›Œν¬ν”Œλ‘œμš° λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” 일련의 단계(Steps)**μž…λ‹ˆλ‹€.
  • ν•˜λ‚˜μ˜ **λŸ¬λ„ˆ(Runner)**μ—μ„œ μ‹€ν–‰λ˜λ©°, λŸ¬λ„ˆλŠ” 가상 ν™˜κ²½(VM) λ˜λŠ” μ»¨ν…Œμ΄λ„ˆμΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 기본적으둜 **병렬(Parallel)**둜 μ‹€ν–‰λ˜μ§€λ§Œ, needs ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ **순차적(Sequential)**으둜 μ‹€ν–‰λ˜λ„λ‘ 쒅속성을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 일반적으둜 λΉŒλ“œ, ν…ŒμŠ€νŠΈ, 배포와 같은 큰 νƒœμŠ€ν¬ λ˜λŠ” μŠ€ν…Œμ΄μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

3. 단계 (Step)

  • μž‘μ—…(Job) λ‚΄μ—μ„œ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λ˜λŠ” κ°œλ³„ λͺ…λ Ήμž…λ‹ˆλ‹€.
  • λ‹¨κ³„λŠ” λ‹€μŒ 두 κ°€μ§€ 쀑 ν•˜λ‚˜λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    1. 슀크립트 μ‹€ν–‰(run): μ…Έ λͺ…λ Ή(예: npm install, npm test)을 직접 μ‹€ν–‰ν•©λ‹ˆλ‹€.
    2. μ•‘μ…˜ μ‚¬μš©(uses): μœ„μ—μ„œ μ„€λͺ…ν•œ **μ•‘μ…˜(Action)**을 μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • λ‹¨κ³„λŠ” μž‘μ—… λ‚΄μ—μ„œ 정보λ₯Ό κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ—οΈ μŠ€ν…Œμ΄μ§€μ™€ νƒœμŠ€ν¬

GitHub Actions의 곡식적인 μš©μ–΄λŠ” μ•„λ‹ˆμ§€λ§Œ, CI/CD(지속적 톡합/지속적 배포) λ§₯λ½μ—μ„œ λ‹€μŒκ³Ό 같이 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν…Œμ΄μ§€ (Stage)

  • 일반적인 CI/CD νŒŒμ΄ν”„λΌμΈμ—μ„œ Build(λΉŒλ“œ), Test(ν…ŒμŠ€νŠΈ), **Deploy(배포)**와 같이, 전체 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ…Όλ¦¬μ μœΌλ‘œ κ΅¬λΆ„ν•˜λŠ” 큰 λ‹¨μœ„λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • GitHub Actionsμ—μ„œλŠ” μ΄λŸ¬ν•œ μŠ€ν…Œμ΄μ§€μ˜ κ°œλ…μ΄ 보톡 μž‘μ—…(Job) λ‹¨μœ„λ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€. 즉, 'λΉŒλ“œ' μŠ€ν…Œμ΄μ§€λŠ” ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ, 'ν…ŒμŠ€νŠΈ' μŠ€ν…Œμ΄μ§€λŠ” λ‹€λ₯Έ μž‘μ—…μœΌλ‘œ μ •μ˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

νƒœμŠ€ν¬ (Task)

  • 일반적으둜 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” ꡬ체적인 ν™œλ™μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • GitHub Actionsμ—μ„œλŠ” μž‘μ—…(Job) μžμ²΄κ°€ ν•˜λ‚˜μ˜ μ£Όμš” νƒœμŠ€ν¬λ‘œ κ°„μ£Όλ˜κ±°λ‚˜, **단계(Step)**κ°€ κ°œλ³„μ μΈ νƒœμŠ€ν¬λ‘œ 간주될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예: "μ˜μ‘΄μ„± μ„€μΉ˜", "μ½”λ“œ 컴파일", "λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹€ν–‰" 등은 λͺ¨λ‘ 단계(Step)둜 κ΅¬ν˜„λ˜λŠ” νƒœμŠ€ν¬μž…λ‹ˆλ‹€.

μš”μ•½

μš©μ–΄ GitHub Actions ꡬ성 μš”μ†Œ μ„€λͺ…
μŠ€ν…Œμ΄μ§€ (Stage) μž‘μ—… (Job) λΉŒλ“œ, ν…ŒμŠ€νŠΈ, 배포와 같은 ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμš” 논리적 λ‹¨κ³„μž…λ‹ˆλ‹€.
νƒœμŠ€ν¬ (Task) μž‘μ—… (Job) λ˜λŠ” 단계 (Step) μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” ꡬ체적인 ν™œλ™μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
μ•‘μ…˜ (Action) μ•‘μ…˜ (Action) 단계 λ‚΄μ—μ„œ μ‚¬μš©λ˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ λ‹¨μœ„μž…λ‹ˆλ‹€.

 


FastAPI의 λ°μ½”λ ˆμ΄ν„°(Decorator) vs Spring의 μ–΄λ…Έν…Œμ΄μ…˜(Annotation) 차이점

FastAPI의 “λ°μ½”λ ˆμ΄ν„°”와 Spring의 “μ–΄λ…Έν…Œμ΄μ…˜”은 κ²‰μœΌλ‘œ 보면 역할이 λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ, λ™μž‘ 방식과 철학이 μ™„μ „νžˆ λ‹€λ¦…λ‹ˆλ‹€.
μ•„λž˜μ—μ„œ ν•œκ΅­ 개발자 κ΄€μ μ—μ„œ κ°€μž₯ μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ 비ꡐ해 λ“œλ¦΄κ²Œμš”.


h2️⃣ 1. 핡심 차이 μš”μ•½

ꡬ뢄FastAPI (Python)Spring (Java/Kotlin)
κ°œλ… ν•¨μˆ˜ μœ„μ— λΆ™μ΄λŠ” λ°μ½”λ ˆμ΄ν„° 문법 클래슀/λ©”μ„œλ“œμ— λΆ™μ΄λŠ” 메타데이터 기반 μ–΄λ…Έν…Œμ΄μ…˜
λ™μž‘ 방식 ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜λ‘œ κ°μ‹Έμ„œ κΈ°λŠ₯을 ν™•μž₯ λ¦¬ν”Œλ ‰μ…˜(Reflection) 기반으둜 ν”„λ ˆμž„μ›Œν¬κ°€ λ™μž‘μ„ 해석
μ‹€ν–‰ μ‹œμ  μ½”λ“œ μ‹€ν–‰ μ‹œ μ¦‰μ‹œ 적용(λŸ°νƒ€μž„) 주둜 컴파일·λŸ°νƒ€μž„μ—μ„œ ν”„λ ˆμž„μ›Œν¬κ°€ 읽어 처리
μ£Όμš” μ‚¬μš© λͺ©μ  라우트 등둝, 미듀웨어, 검증 λ“± μ˜μ‘΄μ„± μ£Όμž…, AOP, μ„€μ •, λΌμš°νŒ… λ“± ν”„λ ˆμž„μ›Œν¬ ꡬ성 μš”μ†Œ
μ–Έμ–΄ νŠΉμ„± 반영 Python의 κ³ μ°¨ ν•¨μˆ˜, λ°μ½”λ ˆμ΄ν„° 문법 ν™œμš© Java/Kotlin의 정적 νƒ€μž… + λ¦¬ν”Œλ ‰μ…˜ 기반 메타데이터 μ‹œμŠ€ν…œ

h2️⃣ 2. FastAPI의 λ°μ½”λ ˆμ΄ν„°

FastAPIμ—μ„œ μ‚¬μš©ν•˜λŠ” λ°μ½”λ ˆμ΄ν„°λŠ” 순수 Python λ¬Έλ²•μž…λ‹ˆλ‹€.

βœ” νŠΉμ§•

  • ν•¨μˆ˜μ— κΈ°λŠ₯을 “κ°μ‹Έμ„œ” μΆ”κ°€ν•˜λŠ” νŒ¨ν„΄
  • FastAPIλŠ” 이 문법을 μ΄μš©ν•΄ λΌμš°νŒ…μ„ μ²˜λ¦¬ν•¨
  • λ°μ½”λ ˆμ΄ν„°κ°€ ν•¨μˆ˜ 객체 자체λ₯Ό μ‘°μž‘ν•¨

βœ” μ˜ˆμ‹œ

 
@app.get("/users") def get_users(): return {"users": []}

μ—¬κΈ°μ„œ @app.get()은
→ get_users ν•¨μˆ˜λ₯Ό FastAPI λΌμš°ν„°μ— 직접 λ“±λ‘ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

즉,

λ°μ½”λ ˆμ΄ν„° = “ν•¨μˆ˜μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” Python κΈ°λŠ₯”


h2️⃣ 3. Spring의 μ–΄λ…Έν…Œμ΄μ…˜(Annotation)

Spring의 μ–΄λ…Έν…Œμ΄μ…˜μ€ Java/Kotlin의 메타데이터 μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

βœ” νŠΉμ§•

  • μ£Όμ„μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” 클래슀/λ©”μ„œλ“œμ˜ 의미λ₯Ό μ •μ˜ν•˜λŠ” 메타데이터
  • Spring이 λŸ°νƒ€μž„μ—μ„œ λ¦¬ν”Œλ ‰μ…˜μœΌλ‘œ 읽고 λ™μž‘μ„ ꡬ성함
  • μ˜μ‘΄μ„± μ£Όμž…(DI), AOP, νŠΈλžœμž­μ…˜, 미듀웨어 ꡬ성 λ“± ν”„λ ˆμž„μ›Œν¬ μ „λ°˜μ„ μ œμ–΄

βœ” μ˜ˆμ‹œ

 
@GetMapping("/users") public List<User> getUsers() { ... }

μ—¬κΈ°μ„œ @GetMapping은
→ 이 λ©”μ„œλ“œκ°€ "HTTP GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” ν•Έλ“€λŸ¬"λΌλŠ” λ©”νƒ€λ°μ΄ν„°μž…λ‹ˆλ‹€.
이 정보λ₯Ό Spring이 μ½μ–΄μ„œ λ‚΄λΆ€μ μœΌλ‘œ DispatcherServlet λΌμš°νŒ…μ„ μ„€μ •ν•©λ‹ˆλ‹€.

즉,

μ–΄λ…Έν…Œμ΄μ…˜ = “ν”„λ ˆμž„μ›Œν¬κ°€ μ½μ–΄μ„œ λ™μž‘μ„ κ΅¬μ„±ν•˜λŠ” 메타데이터”


h2️⃣ 4. λ™μž‘ ꡬ쑰 비ꡐ (μ‰½κ²Œ μ„€λͺ…)

πŸ”Ή FastAPI

  • @λ°μ½”λ ˆμ΄ν„°κ°€ ν•¨μˆ˜ 자체λ₯Ό κ°μ‹Έμ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ£Όμž…
    ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기반

πŸ”Ή Spring

  • @μ–΄λ…Έν…Œμ΄μ…˜μ€ 단지 “ν‘œμ‹”
    → μ‹€μ œ λ™μž‘μ€ Spring ν”„λ ˆμž„μ›Œν¬κ°€ λ¦¬ν”Œλ ‰μ…˜μœΌλ‘œ μ½μ–΄μ„œ 처리
    메타데이터 기반 ν”„λ ˆμž„μ›Œν¬ ꡬ성 방식

h2️⃣ 5. μ‰½κ²Œ μ΄ν•΄ν•˜λŠ” ν•œκ΅­μ‹ λΉ„μœ 

  • FastAPI λ°μ½”λ ˆμ΄ν„°
    → ν•¨μˆ˜μ— 직접 양념을 λ°”λ₯΄λŠ” λŠλ‚Œ (ν•¨μˆ˜ μžμ²΄κ°€ 변함)
  • Spring μ–΄λ…Έν…Œμ΄μ…˜
    → λ²€μΉ˜μ— “유료 자리” μŠ€ν‹°μ»€λ₯Ό 뢙여두면
    κ΄€λ¦¬μžκ°€ λ‚˜μ€‘μ— κ·Έκ±Έ 보고 μš”κΈˆμ„ λ§€κΈ°λŠ” 것
    (μ‹€μ œ 행동은 μŠ€ν”„λ§μ΄ ν•œλ‹€)

h2️⃣ 6. κ²°λ‘ 

관점FastAPI λ°μ½”λ ˆμ΄ν„°Spring μ–΄λ…Έν…Œμ΄μ…˜
본질 ν•¨μˆ˜ λ³€ν™˜κΈ° 메타데이터
μ‹€ν–‰ 방식 ν•¨μˆ˜ λž˜ν•‘(wrap) λ¦¬ν”Œλ ‰μ…˜μ„ ν†΅ν•œ ν”„λ ˆμž„μ›Œν¬ μ œμ–΄
μ—­ν•  λΌμš°ν„° 등둝 쀑심 DI, AOP, λΌμš°νŒ…, μ„€μ • λ“± μ „ μ˜μ—­
λ²”μœ„ 둜직 λ‹¨μœ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 전체 ꡬ쑰 λ‹¨μœ„

즉, FastAPIλŠ” Python의 문법을 ν™œμš©ν•˜κ³ ,
Spring은 ν”„λ ˆμž„μ›Œν¬κ°€ 쀑심이 λ˜μ–΄ μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•΄μ„ν•˜λŠ” κ΅¬μ‘°λΌλŠ” μ°¨μ΄μž…λ‹ˆλ‹€.

 

 


 

 

dataclass