ํ๋ก๊ทธ๋๋ฐ ์ผ๋ฐ
1. ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
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๊ฐ์ง ์์น
- SRP(Single Responsibility Principle) : ๋จ์ผ ์ฑ
์ ์์น
- ํด๋์ค๋ ๋จ ํ๋์ ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ฉฐ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ ์ด์ ๋ ๋จ ํ๋์ ์ด์ ์ด์ด์ผ ํ๋ค.
- OCP(Open-Closed Principle) : ๊ฐ๋ฐฉ-ํ์ ์์น
- ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- LSP(Liskov Substitution Principle) : ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ์์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ์ ํ์ ์ ๊ฐ์ฒด๋ก ์นํํด๋ ์์ ํ์ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ๋์ํด์ผ ํ๋ค.
- ISP(Interface Segregation Principle) : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ์ธํฐํ์ด์ค๋ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
- DIP(Dependency Inversion Principle) : ์์กด ์ญ์ ์์น
- ๊ตฌ์ฒดํ(์ ์์ค ๋ชจ๋)๊ฐ ์๋ ์ถ์ํ(๊ณ ์์ค ๋ชจ๋)์ ์์กดํด์ผ ํ๋ค.
๊ฐ์ฒด์งํฅ vs ์ ์ฐจ์งํฅ
โ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ๋ฐ์ดํฐ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ์ฝ๋๋ฅผ ํฌํจํ '๊ฐ์ฒด' ๊ฐ๋ ์ ๊ธฐ๋ฐํ ํ๋ก๊ทธ๋๋ฐ
- ๋ฌธ์ ํด๊ฒฐ์ ์ํด ๊ฐ์ฒด๋ค ๊ฐ ์ํธ์์ฉ
- ํ์ค์ธ๊ณ์ ์ํฐํฐ(์ฌ๋ฌผ)์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ก ๋ชจ๋ธ๋ง
- ์บก์ํ, ์์, ๋คํ์ฑ, ์ถ์ํ ๋ฑ์ ๊ธฐ๋ฅ ์ ๊ณต
- ex: java, python, c++
โ ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ์์ ์ ์ ์ฐจ ๋๋ ์๋ธ๋ฃจํด์ผ๋ก ๋ถํ ํด์ ๋จ๊ณ์ ์ผ๋ก ์ ๊ทผํ๋ ๋ฐฉ์์ ํ๋ก๊ทธ๋๋ฐ
- ์์ฐจ์ ์ธ ์ฒ๋ฆฌ ์ค์์
- ์ปดํจํฐ์ ์ฒ๋ฆฌ๊ตฌ์กฐ์ ์ ์ฌ -> ์๋ ↑
- ex: C์ธ์ด
3. REST API
REST
โ REST (Representational State Transfer): ์ํํธ์จ์ด ์ํคํ ์ฒ ์คํ์ผ์ ํ๋๋ก, ์น ์๋น์ค๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํ ๊ฒ
REST์ ๊ตฌ์ฑ์์
- ์์(Resources): URI
- HTTP URI(Uniform Resource Identifier)๋ฅผ ํตํด ์์(Resource)์ ๋ช ์ํ๋ค.
- ํ์(Method): HTTP Method
- HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํตํด ํด๋น ์์์ ๋ํ ํ์(Method)๋ฅผ ํํํ๋ค.
- ํํ(Representation)
- Server๋ Client์ ์์ฒญ์ ๋ํ ์๋ต(Representation)์ ๋ณด๋ธ๋ค(JSON, XML...)
REST API
โ REST ์ค๊ณ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ API
4. GIT & GITHUB
GIT
โ ํ์ผ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋กํ๊ณ ํด๋น ํ์ผ์ ๋ํ ์ฌ๋ฌ ์ฌ์ฉ์ ๊ฐ์ ์์ ์ ์กฐ์จํ๊ธฐ ์ํ ๋ถ์ฐํ ๋ฒ์ ๊ด๋ฆฌ ์์คํ (VCS : Version Control System)
โ ์์ค์ฝ๋์ ์์ ๋ด์ญ์ ๋ฐ๋ฅธ ๋ฒ์ ์ ๊ด๋ฆฌ
GITHUB
โ Git Repository๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์น ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํธ์คํ ์๋น์ค
โ ๊ฐ์ธ์ ๋ก์ปฌ ์๋ฒ ๋ฐ์์ Git ๋ฒ์ ํ๋ก์ ํธ๋ฅผ ๊ณต์ ํ๊ณ ๊ธฐ๋กํ๋ ์จ๋ผ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค
5. ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก
์ ์์ผ ๋ฐฉ๋ฒ๋ก
โ ์ ์ํ ๋ฐ๋ณต ์์ ์ ํตํด ์ค์ ์๋ ๊ฐ๋ฅํ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ์ฌ ์ง์์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐฉ์
์ ์์ผ์ 4๊ฐ์ง ์ฃผ์ ํน์ง (์ ์ธ๋ฌธ)
- ๊ฐ์ธ๊ณผ ๊ฐ์ธ ๊ฐ์ ์ํธ์์ฉ์ด ํ๋ก์ธ์ค ๋ฐ ํด๋ณด๋ค ์ฐ์
- ์๋ํ๋ ์ํํธ์จ์ด๊ฐ ํฌ๊ด์ ์ธ ๋ฌธ์๋ณด๋ค ์ฐ์
- ๊ณ ๊ฐ๊ณผ์ ํ์ ์ด ๊ณ์ฝ ํ์๋ณด๋ค ์ฐ์
- ๋ณํ์ ๋์ํ๋ ๊ฒ์ด ๊ณํ์ ๋ฐ๋ฅด๋ ๊ฒ๋ณด๋ค ์ฐ์
Scrum
โ ๋งค์ผ ์ ํด์ง ์๊ฐ, ์ฅ์์์ ์งง์ ์๊ฐ์ ๊ฐ๋ฐ์ ํ๋ ํ์ ์ํ ํ๋ก์ ํธ ๊ด๋ฆฌ ์ค์ฌ ๋ฐฉ๋ฒ๋ก
โ ์คํฌ๋ผ์์ ์๋(velocity)๋ 1๋ฒ์ ์คํ๋ฆฐํธ์์ ํ ํ์ด ์ด๋ ์ ๋์ ์ ํ ๋ฐฑ๋ก๊ทธ๋ฅผ ๊ฐ๋นํ ์ ์๋์ง์ ๋ํ ์ถ์ ์น
TDD
โ Test-Driven Development
โ ์๊ตฌ๋๋ ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ณ ๊ทธ์ ๋ง๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ํ ์คํธ๋ฅผ ํต๊ณผํ ํ์ ์ํฉ์ ๋ง๊ฒ ๋ฆฌํฉํ ๋งํ๋ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ ๋ฐฉ์
โ ๋งค์ฐ ์งง์ ๊ฐ๋ฐ ์ฌ์ดํด์ ๋ฐ๋ณต์ ์์กด
BDD
โ Behavior-Driven Development
โ TDD์ ํ์ฅ, ์ํธ๋ณด์์ ๊ด๊ณ
โ ๋น์ฆ๋์ค์ ์๊ตฌ ์ฌํญ์ ์ด์ ์ ๋ง์ถ์ด ์ฌ์ฉ์์ ํ์๋ฅผ ๊ณ ๋ คํ ํ ์คํธ ์งํ
โ Given When Then
DDD
โ Domain-Driven Design(Development)
โ ๋๋ฉ์ธ ํจํด์ ์ค์ฌ์ ๋๊ณ ์ค๊ณํ๋ ๊ฐ๋ฐ ๋ฐฉ์
โ ๋๋ฉ์ธ: ์ํํธ์จ์ด์ ์๊ตฌ์ฌํญ
โ ๋ฐ์ดํฐ ์ค์ฌ ๋์์ธ์ผ๋ก๋ถํฐ์ ํํผ
MSA
![](https://blog.kakaocdn.net/dn/dCUPcf/btrYap1LRA0/jKFdHMVUfS57Ld64hRTtlk/img.png)
โ Microservice Architecture
โ 1๊ฐ์ ์์คํ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ ๊ฐ๊ฐ์ ์๋น์ค๋ก ๋ถํ .
โ ๊ฐ๊ฐ์ ์๋น์ค๋ API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ 1๊ฐ์ ํฐ ์๋น์ค๋ฅผ ๊ตฌ์ฑ
โ ๋ชจ๋ ์์คํ ์ ๊ตฌ์ฑ์์๊ฐ ํ ํ๋ก์ ํธ์ ํตํฉ๋์ด ์๋ Monolithic Architecture์ ํ๊ณ์ ์ ๊ทน๋ณตํ๊ณ ์ ๋ฑ์ฅ
6. ๋์์ธ ํจํด
์ฑ๊ธํค ํจํด
โ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋, ์ด๋ค ํด๋์ค๊ฐ ์ต์ด ํ ๋ฒ๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น(static)ํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ํจํด
โ ํ๋์ ์ธ์คํด์ค๋ง์ ์์ฑ, ์ดํ ํด๋น ์ธ์คํด์ค๊ฐ ํ์ํ ๋ ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด์ ์์ฑ๋ ์ธ์คํด์ค ํ์ฉ
โ ์ธ์คํด์ค ์์ฑ ๋น์ฉ, ์๊ฐ ์ ๊ฐ
โ ํด๋์ค ๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ์ฉ์ด
MVC Pattern
![](https://blog.kakaocdn.net/dn/rYtoT/btrX4YRyCUr/HGU0CKF4PJurLECDInKIE1/img.png)
โ Model - View - Controller๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญํ ๊ตฌ๋ถ
โ Model
- ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ (๋ฐ์ดํฐ๋ฒ ์ด์ค)
โ View
- ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ํ๋ฉด
โ Controller
- ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์๋ ๋ค๋ฆฌ ์ญํ
- ์ด๋ฒคํธ ๋ฑ ๋ฉ์ธ ๋ก์ง ๋ด๋น
- View๋ก๋ถํฐ ์ฌ์ฉ์์ action์ ์ ๋ฌ๋ฐ์ model์ ๋ฐ์
- model์ ๋ณํ๋ฅผ view์๊ฒ ์ ๋ฌํ์ฌ ์ ๋ฐ์ดํธ
โ ์ฅ์ : ์ฌ์ฌ์ฉ์ฑ, ํ์ฅ์ฑ ์ฉ์ด
โ ๋จ์ : ์ดํ๋ฆฌ์ผ์ด์
์ด ์ปค์ง๊ณ ๋ณต์กํด์ง๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ๊ณผํ๊ฒ ๋ณต์กํด์ง๋ค
MTV Pattern
![](https://blog.kakaocdn.net/dn/bhvzPH/btrX31nLz9T/S4cL4SJNMpT2WZa9lkaUl0/img.png)
โ MVC pattern์ ๋ณํ์ผ๋ก Django์์ ์ฌ์ฉ๋๋ค
- Model - Model
- View - Template
- Controller - View
โ MVC pattern๊ณผ์ ์ฐจ์ด์
- View(Controller)์ Template(View)์ ์ฐ๊ด๊ด๊ณ๊ฐ MVC๋ณด๋ค ๋์จํ๋ค
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ถ์ ์ผ๋ก django ํ๋ ์์ํฌ ์์ฒด์์ ์ฒ๋ฆฌํด์ฃผ๊ฑฐ๋ template์์ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ ํ๋ค
- URL pattern์ ๋ฐ๋ก ์ ์ํด์ ๋งค์นญํด์ฃผ๋ URL config๊ฐ ์กด์ฌํ๋ค
MVP Pattern
![](https://blog.kakaocdn.net/dn/cH4jpB/btrX2VH9D5P/UBeMzzYxoHSbklYe4TtTak/img.png)
โ MVC pattern์์ C์ ํด๋นํ๋ ์ปจํธ๋กค๋ฌ๊ฐ Presenter๋ก ๋ฐ๋ ํจํด
- Model - Model
- View - View
- Controller - Presenter
โ View์ Presenter๋ 1:1 ๊ด๊ณ์ด๋ค
- ๊ฒฐํฉ ↑
โ View๋ Presenter๋ฅผ ํตํด์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค
- View - Model ์์กด์ฑ x
MVVM Pattern
![](https://blog.kakaocdn.net/dn/m1tPQ/btrX31BhCLF/QJfVKSTJJKfPA6g70hlBcK/img.png)
โ 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...
'โญ Personal_Study > CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CS ๋ฉด์ ์ง๋ฌธ ์ ๋ฆฌ - ์ด์์ฒด์ 2 (0) | 2023.03.03 |
---|---|
CS ๋ฉด์ ์ง๋ฌธ ์ ๋ฆฌ - ์ด์์ฒด์ 1 (3) | 2023.03.02 |
CS ๋ฉด์ ์ง๋ฌธ ์ ๋ฆฌ - ๋คํธ์ํฌ (0) | 2023.02.23 |
CS ๋ฉด์ ์ง๋ฌธ ์ ๋ฆฌ - ์๊ณ ๋ฆฌ์ฆ (0) | 2023.02.19 |
CS ๋ฉด์ ์ง๋ฌธ ์ ๋ฆฌ - ์๋ฃ๊ตฌ์กฐ (0) | 2023.02.12 |
๋๊ธ