๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/CS

CS ๋ฉด์ ‘ ์งˆ๋ฌธ ์ •๋ฆฌ - ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ผ๋ฐ˜

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 2. 6.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ผ๋ฐ˜

1. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

2. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)

3. REST API

4. GIT & GITHUB

5. ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก 

6. ๋””์ž์ธ ํŒจํ„ด

7. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

8. ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

โœ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ, ๊ด€์ 

๋ช…๋ นํ˜• vs ์„ ์–ธํ˜•

โœ” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์–ด๋–ป๊ฒŒ (How)

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = []

for number in numbers:
    if number % 2 == 0:
        if number % 3 == 0:
            result.append(number**2)

print(result)
  • ์ปดํ“จํ„ฐ๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น๋“ค ์ˆœ์„œ๋Œ€๋กœ ์ž‘์„ฑํ•˜๋Š” ํ˜•ํƒœ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ œ์–ด๋ฌธ ํ™œ์šฉ
  • ์žฅ์ 
    • ์—ฐ์‚ฐ์˜ ์ˆœ์„œ์— ๋Œ€ํ•œ ์ œ์–ด์™€ ๋ช…ํ™•์„ฑ ์ œ๊ณต
    • ๋””๋ฒ„๊น… ์šฉ์ด ๋ฐ ์œ ์—ฐ์„ฑ ์ œ๊ณต
  • ๋‹จ์ 
    • ํ”„๋กœ๊ทธ๋žจ์ด ๋ณต์žกํ•ด์ง€๋ฉด ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง

โœ” ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋ฌด์—‡์„ (What)

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

result = list(map(lambda x: x**2, filter(lambda x: x % 2 == 0 and x % 3 == 0, numbers)))

print(result)
  • ์ปดํ“จํ„ฐ๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ฌ์„ฑํ•ด์•ผํ•  ๋ชฉ์  ์„ ์–ธ
  • ์žฅ์ 
    • ์ถ”์ƒํ™”์™€ ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ๊ณผ ๊ฐ€๋…์„ฑ
    • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์—ฐ์‚ฐ์„ ์ค„์—ฌ์„œ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ 
    • ๋””๋ฒ„๊น… ๋‚œํ•ด

์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์ž‘์—…์„ ์ ˆ์ฐจ ๋˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋ถ„ํ• ํ•ด์„œ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ˆœ์ฐจ์ ์ธ ์ฒ˜๋ฆฌ ์ค‘์š”์‹œ
  • ์ปดํ“จํ„ฐ์˜ ์ฒ˜๋ฆฌ๊ตฌ์กฐ์™€ ์œ ์‚ฌ -> ์†๋„ ↑
  • ex: C์–ธ์–ด

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๋ฐ์ดํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ '๊ฐ์ฒด' ๊ฐœ๋…์— ๊ธฐ๋ฐ˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๊ฐ์ฒด๋“ค ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ
  • ํ˜„์‹ค์„ธ๊ณ„์˜ ์—”ํ‹ฐํ‹ฐ(์‚ฌ๋ฌผ)์„ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋กœ ๋ชจ๋ธ๋ง
  • ์บก์Šํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™” ๋“ฑ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ex: java, python, c++

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์ž๋ฃŒ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ•™์  ํ•จ์ˆ˜์˜ ๊ณ„์‚ฐ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๋ถˆ๋ณ€์„ฑ, ์ˆœ์ˆ˜ํ•จ์ˆ˜
  • ์ƒํƒœ ๋ฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€๋ณ€์„ฑ ์ง€์–‘
  • ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰
  • ex: haskell, java, python, javascript

2. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)

OOP์˜ 5๊ฐ€์ง€ ์›์น™

  1. SRP(Single Responsibility Principle) : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™
    • ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ด์œ ์ด์–ด์•ผ ํ•œ๋‹ค.
  2. OCP(Open-Closed Principle) : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™
    • ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  3. LSP(Liskov Substitution Principle) : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™
    • ์ƒ์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ•˜์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ์น˜ํ™˜ํ•ด๋„ ์ƒ์œ„ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  4. ISP(Interface Segregation Principle) : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™
    • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  5. DIP(Dependency Inversion Principle) : ์˜์กด ์—ญ์ „ ์›์น™
    • ๊ตฌ์ฒดํ™”(์ €์ˆ˜์ค€ ๋ชจ๋“ˆ)๊ฐ€ ์•„๋‹Œ ์ถ”์ƒํ™”(๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ vs ์ ˆ์ฐจ์ง€ํ–ฅ

โœ” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๋ฐ์ดํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ '๊ฐ์ฒด' ๊ฐœ๋…์— ๊ธฐ๋ฐ˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๊ฐ์ฒด๋“ค ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ
  • ํ˜„์‹ค์„ธ๊ณ„์˜ ์—”ํ‹ฐํ‹ฐ(์‚ฌ๋ฌผ)์„ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋กœ ๋ชจ๋ธ๋ง
  • ์บก์Šํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™” ๋“ฑ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ex: java, python, c++

โœ” ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์ž‘์—…์„ ์ ˆ์ฐจ ๋˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋ถ„ํ• ํ•ด์„œ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ˆœ์ฐจ์ ์ธ ์ฒ˜๋ฆฌ ์ค‘์š”์‹œ
  • ์ปดํ“จํ„ฐ์˜ ์ฒ˜๋ฆฌ๊ตฌ์กฐ์™€ ์œ ์‚ฌ -> ์†๋„ ↑
  • ex: C์–ธ์–ด

3. REST API

REST

โœ” REST (Representational State Transfer): ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์˜ ํ•˜๋‚˜๋กœ, ์›น ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•œ ๊ฒƒ

REST์˜ ๊ตฌ์„ฑ์š”์†Œ

  1. ์ž์›(Resources): URI
    • HTTP URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์ž์›(Resource)์„ ๋ช…์‹œํ•œ๋‹ค.
  2. ํ–‰์œ„(Method): HTTP Method
    • HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„(Method)๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  3. ํ‘œํ˜„(Representation)
    • Server๋Š” Client์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต(Representation)์„ ๋ณด๋‚ธ๋‹ค(JSON, XML...)

REST API

โœ” REST ์„ค๊ณ„ ๊ทœ์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•œ API

4. GIT & GITHUB

GIT

โœ” ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ž‘์—…์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•œ ๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(VCS : Version Control System)

โœ” ์†Œ์Šค์ฝ”๋“œ์˜ ์ˆ˜์ • ๋‚ด์—ญ์— ๋”ฐ๋ฅธ ๋ฒ„์ „์„ ๊ด€๋ฆฌ

GITHUB

โœ” Git Repository๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์›น ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค

โœ” ๊ฐœ์ธ์˜ ๋กœ์ปฌ ์„œ๋ฒ„ ๋ฐ–์—์„œ Git ๋ฒ„์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š” ์˜จ๋ผ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

5. ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก 

์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก 

โœ” ์‹ ์†ํ•œ ๋ฐ˜๋ณต ์ž‘์—…์„ ํ†ตํ•ด ์‹ค์ œ ์ž‘๋™ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ์ง€์†์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ์‹

์• ์ž์ผ์˜ 4๊ฐ€์ง€ ์ฃผ์š” ํŠน์ง• (์„ ์–ธ๋ฌธ)

  1. ๊ฐœ์ธ๊ณผ ๊ฐœ์ธ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ํ”„๋กœ์„ธ์Šค ๋ฐ ํˆด๋ณด๋‹ค ์šฐ์„ 
  2. ์ž‘๋™ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํฌ๊ด„์ ์ธ ๋ฌธ์„œ๋ณด๋‹ค ์šฐ์„ 
  3. ๊ณ ๊ฐ๊ณผ์˜ ํ˜‘์—…์ด ๊ณ„์•ฝ ํ˜‘์ƒ๋ณด๋‹ค ์šฐ์„ 
  4. ๋ณ€ํ™”์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ๊ณ„ํš์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ๋ณด๋‹ค ์šฐ์„ 

Scrum

โœ” ๋งค์ผ ์ •ํ•ด์ง„ ์‹œ๊ฐ„, ์žฅ์†Œ์—์„œ ์งง์€ ์‹œ๊ฐ„์˜ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ํŒ€์„ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ค‘์‹ฌ ๋ฐฉ๋ฒ•๋ก 

โœ” ์Šคํฌ๋Ÿผ์—์„œ ์†๋„(velocity)๋Š” 1๋ฒˆ์˜ ์Šคํ”„๋ฆฐํŠธ์—์„œ ํ•œ ํŒ€์ด ์–ด๋Š ์ •๋„์˜ ์ œํ’ˆ ๋ฐฑ๋กœ๊ทธ๋ฅผ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ถ”์ •์น˜

TDD

โœ” Test-Driven Development

โœ” ์š”๊ตฌ๋˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ์— ๋งž๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ ํ›„์— ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ ๋ฐฉ์‹

โœ” ๋งค์šฐ ์งง์€ ๊ฐœ๋ฐœ ์‚ฌ์ดํด์˜ ๋ฐ˜๋ณต์— ์˜์กด

BDD

โœ” Behavior-Driven Development

โœ” TDD์˜ ํ™•์žฅ, ์ƒํ˜ธ๋ณด์™„์  ๊ด€๊ณ„

โœ” ๋น„์ฆˆ๋‹ˆ์Šค์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ์ดˆ์ ์„ ๋งž์ถ”์–ด ์‚ฌ์šฉ์ž์˜ ํ–‰์œ„๋ฅผ ๊ณ ๋ คํ•œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰

โœ” Given When Then

DDD

โœ” Domain-Driven Design(Development)

โœ” ๋„๋ฉ”์ธ ํŒจํ„ด์„ ์ค‘์‹ฌ์— ๋†“๊ณ  ์„ค๊ณ„ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹

โœ” ๋„๋ฉ”์ธ: ์†Œํ”„ํŠธ์›จ์–ด์˜ ์š”๊ตฌ์‚ฌํ•ญ

โœ” ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๋””์ž์ธ์œผ๋กœ๋ถ€ํ„ฐ์˜ ํƒˆํ”ผ

MSA

โœ” Microservice Architecture

โœ” 1๊ฐœ์˜ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋กœ ๋ถ„ํ• .

โœ” ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋Š” API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ 1๊ฐœ์˜ ํฐ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑ

โœ” ๋ชจ๋“  ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ํ•œ ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉ๋˜์–ด ์žˆ๋Š” Monolithic Architecture์˜ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ณ ์ž ๋“ฑ์žฅ

6. ๋””์ž์ธ ํŒจํ„ด

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

โœ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ, ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น(static)ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

โœ” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ์„ ์ƒ์„ฑ, ์ดํ›„ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค ํ™œ์šฉ

โœ” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋น„์šฉ, ์‹œ๊ฐ„ ์ ˆ๊ฐ

โœ” ํด๋ž˜์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ  ์šฉ์ด

MVC Pattern

โœ” Model - View - Controller๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ญํ•  ๊ตฌ๋ถ„

โœ” Model

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

โœ” View

  • ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด

โœ” Controller

  • ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์ž‡๋Š” ๋‹ค๋ฆฌ ์—ญํ• 
  • ์ด๋ฒคํŠธ ๋“ฑ ๋ฉ”์ธ ๋กœ์ง ๋‹ด๋‹น
  • View๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž์˜ action์„ ์ „๋‹ฌ๋ฐ›์•„ model์— ๋ฐ˜์˜
  • model์˜ ๋ณ€ํ™”๋ฅผ view์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ์—…๋ฐ์ดํŠธ

โœ” ์žฅ์ : ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ์„ฑ ์šฉ์ด
โœ” ๋‹จ์ : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ณผํ•˜๊ฒŒ ๋ณต์žกํ•ด์ง„๋‹ค

MTV Pattern

โœ” MVC pattern์˜ ๋ณ€ํ˜•์œผ๋กœ Django์—์„œ ์‚ฌ์šฉ๋œ๋‹ค

  • Model - Model
  • View - Template
  • Controller - View

โœ” MVC pattern๊ณผ์˜ ์ฐจ์ด์ 

  • View(Controller)์™€ Template(View)์˜ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ MVC๋ณด๋‹ค ๋Š์Šจํ•˜๋‹ค
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ€๋ถ„์ ์œผ๋กœ django ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ฑฐ๋‚˜ template์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•œ๋‹ค
  • URL pattern์„ ๋”ฐ๋กœ ์ •์˜ํ•ด์„œ ๋งค์นญํ•ด์ฃผ๋Š” URL config๊ฐ€ ์กด์žฌํ•œ๋‹ค

MVP Pattern

โœ” MVC pattern์—์„œ C์— ํ•ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ Presenter๋กœ ๋ฐ”๋€ ํŒจํ„ด

  • Model - Model
  • View - View
  • Controller - Presenter

โœ” View์™€ Presenter๋Š” 1:1 ๊ด€๊ณ„์ด๋‹ค

  • ๊ฒฐํ•ฉ ↑

โœ” View๋Š” Presenter๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค

  • View - Model ์˜์กด์„ฑ x

MVVM Pattern

โœ” MVC pattern์—์„œ C์— ํ•ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ View Model๋กœ ๋ฐ”๋€ ํŒจํ„ด

  • Model - Model
  • View - View
  • Controller - View Model

โœ” Vue.js ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉ

โœ” View์™€ View Model ์‚ฌ์ด์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ ์ง€์›

  • View์™€ View Model ์‚ฌ์ด์˜ ์˜์กด์„ฑ x
  • ๋ชจ๋“ˆํ™”, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์šฉ์ด

7. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๋™๊ธฐ(Synchronous) vs ๋น„๋™๊ธฐ(ASynchronous)

โœ” ๋™๊ธฐ: ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ๋กœ์ง์„ ์ฒ˜๋ฆฌ

โœ” ๋น„๋™๊ธฐ: ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ(๋ณ‘๋ ฌ์  ์ˆ˜ํ–‰)

โœ” ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ์— ํ›จ์”ฌ ์œ ๋ฆฌํ•˜๋‹ค

Python์—์„œ์˜ ๋น„๋™๊ธฐ

# ๋™๊ธฐ

import requests

def send_sync_request(url):
    response = requests.get(url)
    print(f"Response from {url}: {response.text}")

def main():
    urls = ["https://api.example.com/1", "https://api.example.com/2", "https://api.example.com/3"]
    # ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ๋‹ค์Œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
    for url in urls:
        send_sync_request(url)

main()
import asyncio
import aiohttp

# ์š”์ฒญ์ด ๋น„๋™๊ธฐ๋กœ ๋ณด๋‚ด์ง„๋‹ค.
async def send_async_request(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            print(f"Response from {url}: {await response.text()}")

async def main():
    urls = ["https://api.example.com/1", "https://api.example.com/2", "https://api.example.com/3"]
    tasks = [send_async_request(url) for url in urls]
    # ์‘๋‹ต์„ ๋‹ค ๋ฐ›์œผ๋ฉด ๋ชจ์€๋‹ค.
    await asyncio.gather(*tasks)

# ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰
asyncio.run(main())

Java์—์„œ์˜ ๋น„๋™๊ธฐ

โœ” CompletableFuture์™€ @Async๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

// ๋™๊ธฐ ์ฒ˜๋ฆฌ

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.springframework.stereotype.Service;

@Service
public class SyncTaskService {

    public String task1() throws InterruptedException {
        System.out.println("Task 1 started");
        Thread.sleep(1000);
        System.out.println("Task 1 completed");
        return "Task 1 Result";
    }

    public String task2() throws InterruptedException {
        System.out.println("Task 2 started");
        Thread.sleep(2000);
        System.out.println("Task 2 completed");
        return "Task 2 Result";
    }

    public void runTasks() throws InterruptedException, ExecutionException {
        String task1Result = task1();
        String task2Result = task2();

        System.out.println("Task 1 result: " + task1Result);
        System.out.println("Task 2 result: " + task2Result);
    }
}


// Task 1 started
// Task 1 completed
// Task 2 started
// Task 2 completed
// Task 1 result: Task 1 Result
// Task 2 result: Task 2 Result
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncTaskService {

    @Async
    public CompletableFuture<String> task1() throws InterruptedException {
        System.out.println("Task 1 started");
        Thread.sleep(1000);
        System.out.println("Task 1 completed");
        return CompletableFuture.completedFuture("Task 1 Result");
    }

    @Async
    public CompletableFuture<String> task2() throws InterruptedException {
        System.out.println("Task 2 started");
        Thread.sleep(2000);
        System.out.println("Task 2 completed");
        return CompletableFuture.completedFuture("Task 2 Result");
    }

    public void runTasks() throws InterruptedException, ExecutionException {
        CompletableFuture<String> task1Result = task1();
        CompletableFuture<String> task2Result = task2();

        System.out.println("Task 1 result: " + task1Result.get());
        System.out.println("Task 2 result: " + task2Result.get());
    }
}

// Task 1 started
// Task 2 started
// Task 1 completed
// Task 2 completed
// Task 1 result: Task 1 Result
// Task 2 result: Task 2 Result

JavaScript์—์„œ์˜ ๋น„๋™๊ธฐ

โœ” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ runtime์„ ํ†ตํ•ด ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ด์ค€๋‹ค.

โœ” Async/Await, Promise ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‹คํ–‰์ˆœ์„œ๋ฅผ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

// ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

const axios = require("axios");

async function getDataAsync() {
    const response1 = axios.get("https://jsonplaceholder.typicode.com/posts/1");
    const response2 = axios.get("https://jsonplaceholder.typicode.com/posts/2");
    const response3 = axios.get("https://jsonplaceholder.typicode.com/posts/3");

    console.log("Response 1: ", (await response1).data);
    console.log("Response 2: ", (await response2).data);
    console.log("Response 3: ", (await response3).data);
}

getDataAsync();

// Started requesting API 1
// Started requesting API 2
// API 1 response: {...}
// Processing API 1 response...
// API 2 response: {...}
// Processing API 2 response...
// ๋™๊ธฐ ์ฒ˜๋ฆฌ

const axios = require("axios");

async function getDataSync() {
    const response1 = await axios.get("https://jsonplaceholder.typicode.com/posts/1");
    const response2 = await axios.get("https://jsonplaceholder.typicode.com/posts/2");
    const response3 = await axios.get("https://jsonplaceholder.typicode.com/posts/3");

    console.log("Response 1: ", response1.data);
    console.log("Response 2: ", response2.data);
    console.log("Response 3: ", response3.data);
}

getDataSync();

// Started requesting API 1
// API 1 response: {...}
// Started requesting API 2
// API 2 response: {...}
// Processing API 1 response...
// Processing API 2 response...

๋ธ”๋Ÿญ/๋…ผ๋ธ”๋Ÿญ

โœ” Sync/Async๊ฐ€ '์ฒ˜๋ฆฌ ์ˆœ์„œ(ํ๋ฆ„)'์˜ ๊ด€์ ์ด๋ฉด Block/Nonblock์€ '์ œ์–ด'์˜ ๊ด€์ 

โœ” Block: ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

โœ” Non-blocking: ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…๋„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ” ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Async(๋น„๋™๊ธฐ) + Non-blocking(๋…ผ๋ธ”๋ก)์œผ๋กœ ์‚ฌ์šฉ

8. ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋ ˆ์ž„์›Œํฌ

โœ” ์ถ”์ƒ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ์ƒํ™”์ž‘์šฉ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ ์ „์ฒด ํ˜น์€ ์ผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•ด ๋†“์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„

โœ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ์ˆ˜ ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€๋ฆฌ

โœ” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ ธ๊ฐ„๋‹ค -> ์ œ์–ด์˜ ์—ญ์ „

โœ” ex) Angular, Vue, JWT, Spring, Spring Boot, Node.js์˜ Express.js, NestJS, ....

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

โœ” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๋Š” ๋น„ํœ˜๋ฐœ์„ฑ ์ž์›์˜ ๋ชจ์ž„ → ๊ธฐ๋Šฅ ๋ชจ์Œ

โœ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž(๊ฐœ๋ฐœ์ž)๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„๋‹ค

โœ” ex) React, jQuery, Pandas, NumPy, PyTorch, Tenserflow...

๋Œ“๊ธ€