μ°λ¦¬μ μμ²μ λ°λΌ Habrμ νλΈλ₯Ό λ§λ€μμ΅λλ€.
Kubernetes κ·Έλ¦¬κ³ μ°λ¦¬λ κ·Έκ²μ 첫 λ²μ§Έ μΆνλ¬Όμ κ²μ¬νκ² λ κ²μ κΈ°μκ² μκ°ν©λλ€. ꡬλ νλ€!
μΏ λ²λ€ν°μ€λ μ½μ΅λλ€. λꡬλ λ¨ λͺ μκ° λ§μ μ΄ κΈ°μ μ λ§μ€ν°ν μ μλλ° μνμμ μ΄ λΆμΌμμ μΌνκΈ° μν΄ λ§μ λμ μ§λΆνλ μ΄μ λ 무μμ λκΉ?
μΏ λ²λ€ν°μ€λ₯Ό κ·Έλ κ² λΉ¨λ¦¬ λ°°μΈ μ μλμ§ μμ¬μ΄ λ λ€λ©΄ μ§μ ν΄λ³΄λ κ²μ΄ μ’μ΅λλ€. μ¦, μ΄ μλ£λ₯Ό λ§μ€ν°νλ©΄ Kubernetes ν΄λ¬μ€ν°μμ λ§μ΄ν¬λ‘ μλΉμ€λ₯Ό κΈ°λ°μΌλ‘ μ ν리μΌμ΄μ
μ μ€νν μ μμ΅λλ€. μ κ° μ¬κΈ°μ κ³ κ°μκ² Kubernetesλ‘ μμ
νλ λ°©λ²μ κ°λ₯΄μΉλ λ° μ¬μ©νλ κ²κ³Ό λμΌν λ°©λ²λ‘ μ μ¬μ©νκΈ° λλ¬Έμ μ΄κ²μ 보μ₯ν μ μμ΅λλ€. μ΄ κ°μ΄λκ° λ€λ₯Έ κ°μ΄λμ λ€λ₯Έ μ μ 무μμ
λκΉ? μ¬μ€, λ§μ κ²λ€μ΄ μμ΅λλ€. λ°λΌμ μ΄λ¬ν μλ£μ λλΆλΆμ Kubernetesμ κ°λ
κ³Ό kubectl λͺ
λ Ήμ κΈ°λ₯κ³Ό κ°μ λ¨μν λ΄μ©μ λν μ€λͺ
μΌλ‘ μμλ©λλ€. μ΄ κΈ°μ¬μ μμ±μλ λ
μκ° μ ν리μΌμ΄μ
κ°λ°, λ§μ΄ν¬λ‘μλΉμ€ λ° Docker 컨ν
μ΄λμ μ΅μνλ€κ³ κ°μ ν©λλ€. μ°λ¦¬λ λ€λ₯Έ λ°©ν₯μΌλ‘ κ° κ²μ
λλ€. λ¨Όμ μ»΄ν¨ν°μμ λ§μ΄ν¬λ‘μλΉμ€λ₯Ό κΈ°λ°μΌλ‘ μ ν리μΌμ΄μ
μ μ€ννλ λ°©λ²μ λν΄ μ΄μΌκΈ°ν΄ λ³΄κ² μ΅λλ€. κ·Έλ° λ€μ κ° λ§μ΄ν¬λ‘ μλΉμ€μ λν 컨ν
μ΄λ μ΄λ―Έμ§ λΉλλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€. κ·Έλ° λ€μ Kubernetesμ λν΄ μμλ³΄κ³ Kubernetesκ° κ΄λ¦¬νλ ν΄λ¬μ€ν°μμ λ§μ΄ν¬λ‘ μλΉμ€ κΈ°λ° μ ν리μΌμ΄μ
λ°°ν¬λ₯Ό λΆμν©λλ€.
μΏ λ²λ€ν°μ€μ λν μ μ§μ μΈ μ κ·Ό λ°©μμ μ¬μ©νλ μ΄ μ κ·Ό λ°©μμ λͺ¨λ κ²μ΄ μΏ λ²λ€ν°μ€μ μ΄λ»κ² κ°λ¨νκ² λ°°μ΄λμ΄ μλμ§ μ΄ν΄νκΈ° μν΄ μΌλ°μΈμ΄ νμλ‘ νλ μν©μ λν κΉμ΄ μλ μ΄ν΄λ₯Ό μ 곡ν©λλ€. μΏ λ²λ€ν°μ€λ₯Ό λ§μ€ν°νλ €λ μ¬λμ΄λΌλ©΄ λꡬλ μ¬μ© μμΉμ λ°©λ²μ μλ€λ©΄ μΏ λ²λ€ν°μ€λ λΆλͺ λ¨μν κΈ°μ μ λλ€.
μ΄μ λ μ΄μ κ³ λ―Όνμ§ μκ³ μμ μ μμνκ³ μμ ν μμ© νλ‘κ·Έλ¨μ λν΄ μ΄μΌκΈ°νκ² μ΅λλ€.
μ€νμ μ±
μ°λ¦¬μ μμ© νλ‘κ·Έλ¨μ νλμ κΈ°λ₯λ§ μνν©λλ€. ν λ¬Έμ₯μ μ λ ₯μΌλ‘ λ°μ ν ν μ€νΈ λΆμ λꡬλ₯Ό μ¬μ©νμ¬ μ΄ λ¬Έμ₯μ λν κ°μ λΆμμ μννμ¬ νΉμ λμμ λν λ¬Έμ₯ μμ±μμ κ°μ μ νλλ₯Ό νκ°ν©λλ€.
μ΄κ²μ μ΄ μμ© νλ‘κ·Έλ¨μ κΈ°λ³Έ μ°½ λͺ¨μμ λλ€.
κ°μ λΆμ μΉ μ ν리μΌμ΄μ
κΈ°μ μ μΈ κ΄μ μμ μ ν리μΌμ΄μ μ XNUMXκ°μ λ§μ΄ν¬λ‘μλΉμ€λ‘ ꡬμ±λλ©° κ° λ§μ΄ν¬λ‘μλΉμ€λ νΉμ μμ μΈνΈλ₯Ό ν΄κ²°ν©λλ€.
- SA-Frontendλ React μ μ νμΌμ μ 곡νλ Nginx μΉ μλ²μ λλ€.
- SA-WebAppμ νλ°νΈμλμ μμ²μ μ²λ¦¬νλ Javaλ‘ μμ±λ μΉ μ ν리μΌμ΄μ μ λλ€.
- SA-Logicμ ν μ€νΈ κ°μ λΆμμ μννλ Python μ ν리μΌμ΄μ μ λλ€.
λ§μ΄ν¬λ‘μλΉμ€λ κ³ λ¦½λμ΄ μ‘΄μ¬νμ§ μλλ€λ μ μ μ μν΄μΌ ν©λλ€. κ·Έλ€μ "μ§λ¬΄ λΆλ¦¬"λΌλ μμ΄λμ΄λ₯Ό ꡬννμ§λ§ λμμ μλ‘ μνΈ μμ©ν΄μΌν©λλ€.
μ ν리μΌμ΄μ
μ λ°μ΄ν° νλ¦
μμ λ€μ΄μ΄κ·Έλ¨μμ μ ν리μΌμ΄μ μ λ°μ΄ν° νλ¦μ μ€λͺ νλ μμ€ν μ λ¨κ³ λ²νΈλ₯Ό λ³Ό μ μμ΅λλ€. κ·Έκ²λ€μ λΆν΄ν©μλ€:
- λΈλΌμ°μ κ° μλ²μμ νμΌμ μμ²ν©λλ€.
index.html
(μ΄λ μ°¨λ‘λ‘ React μ± ν¨ν€μ§λ₯Ό λ‘λν©λλ€). - μ¬μ©μλ μ ν리μΌμ΄μ κ³Ό μνΈ μμ©νλ©° μ΄λ‘ μΈν΄ Spring κΈ°λ° μΉ μ ν리μΌμ΄μ μ΄ νΈμΆλ©λλ€.
- μΉ μ ν리μΌμ΄μ μ ν μ€νΈλ₯Ό ꡬ문 λΆμνλΌλ μμ²μ Python μ ν리μΌμ΄μ μΌλ‘ μ λ¬ν©λλ€.
- Python μ ν리μΌμ΄μ μ ν μ€νΈμ κ°μ μ λΆμνκ³ μμ²μ λν μλ΅μΌλ‘ κ²°κ³Όλ₯Ό λ°νν©λλ€.
- Spring μ ν리μΌμ΄μ μ React μ ν리μΌμ΄μ μ μλ΅μ 보λ λλ€(κ²°κ³Όμ μΌλ‘ μ¬μ©μμκ² κ΅¬λ¬Έ λΆμλ ν μ€νΈμ κ²°κ³Ό νμ).
μ΄λ¬ν λͺ¨λ μμ© νλ‘κ·Έλ¨μ λν μ½λλ₯Ό μ°Ύμ μ μμ΅λλ€.
λ‘컬 λ¨Έμ μμ λ§μ΄ν¬λ‘μλΉμ€ κΈ°λ° μ ν리μΌμ΄μ μ€ν
μ ν리μΌμ΄μ μ΄ μλνλ €λ©΄ μΈ κ°μ§ λ§μ΄ν¬λ‘μλΉμ€λ₯Ό λͺ¨λ μμν΄μΌ ν©λλ€. κ°μ₯ μμ νλ°νΈ μλ μ ν리μΌμ΄μ λΆν° μμνκ² μ΅λλ€.
βλ‘컬 κ°λ°μ μν React μ€μ
React μ ν리μΌμ΄μ
μ μ€ννλ €λ©΄ μ»΄ν¨ν°μ Node.js νλ μμν¬μ NPMμ μ€μΉν΄μΌ ν©λλ€. μ΄ λͺ¨λ κ²μ μ€μΉν ν ν°λ―Έλμ μ¬μ©νμ¬ νλ‘μ νΈ ν΄λλ‘ μ΄λν©λλ€. sa-frontend
λ€μ λͺ
λ Ήμ μ€ννμμμ€.
npm install
ν΄λμμ μ΄ λͺ
λ Ήμ μ€ννλ©΄ node_modules
React μ ν리μΌμ΄μ
μ μ’
μμ±μ΄ λ‘λλλ©° κ·Έ κΈ°λ‘μ νμΌμ μμ΅λλ€. package.json
. λμΌν ν΄λμ μ’
μμ±μ λ€μ΄λ‘λν ν λ€μ λͺ
λ Ήμ μ€νν©λλ€.
npm start
κ·Έκ² λ€μΌ. μ΄μ React μ±μ΄ μ€ν μ€μ΄λ©° λΈλΌμ°μ μ£Όμλ‘ μ΄λνμ¬ μ‘μΈμ€ν μ μμ΅λλ€. localhost:3000
. κ·Έμ μ½λμμ 무μΈκ°λ₯Ό λ³κ²½ν μ μμ΅λλ€. λΈλΌμ°μ μμ μ΄λ¬ν λ³κ²½ μ¬νμ ν¨κ³Όλ₯Ό μ¦μ νμΈν μ μμ΅λλ€. μ΄λ μμ "ν«" λͺ¨λ κ΅μ²΄ λλΆμ κ°λ₯ν©λλ€. λλΆμ νλ°νΈ μλ κ°λ°μ κ°λ¨νκ³ μ¦κ±°μ΄ κ²½νμ΄ λ©λλ€.
βνλ‘λμ μ μν React μ± μ€λΉ
React μ±μ μ€μ λ‘ μ¬μ©νκΈ° μν΄μλ μ΄λ₯Ό μ μ νμΌ μΈνΈλ‘ λ³ννκ³ μΉ μλ²λ₯Ό μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈμ μ 곡ν΄μΌ ν©λλ€.
React μ±μ λΉλνλ €λ©΄ λ€μ ν°λ―Έλμ μ¬μ©νμ¬ ν΄λλ‘ μ΄λν©λλ€. sa-frontend
λ€μ λͺ
λ Ήμ μ€ννμμμ€.
npm run build
κ·Έλ¬λ©΄ νλ‘μ νΈ ν΄λμ λλ ν λ¦¬κ° μμ±λ©λλ€. build
. μ¬κΈ°μλ React μ ν리μΌμ΄μ
μ΄ μλνλ λ° νμν λͺ¨λ μ μ νμΌμ΄ ν¬ν¨λ©λλ€.
βNginxλ‘ μ μ νμΌ μ 곡
λ¨Όμ Nginx μΉ μλ²λ₯Ό μ€μΉνκ³ μ€νν΄μΌ ν©λλ€. sa-frontend/build
ν΄λλ‘ [your_nginx_installation_dir]/html
.
μ΄ μ κ·Ό λ°©μμ μ¬μ©νλ©΄ React μ ν리μΌμ΄μ
μ 쑰립νλ λμ μμ±λ νμΌμ΄ index.html
μμ μ¬μ©ν μ μμ΅λλ€ [your_nginx_installation_dir]/html/index.html
. κΈ°λ³Έμ μΌλ‘ Nginx μλ²κ° μ‘μΈμ€ν λ λ°κΈνλ νμΌμ
λλ€. μλ²κ° ν¬νΈμμ μμ λκΈ°νλλ‘ κ΅¬μ±λμμ΅λλ€. 80
, κ·Έλ¬λ νμΌμ νΈμ§νμ¬ μνλ λ°©μμΌλ‘ μ¬μ©μ μ μν μ μμ΅λλ€. [your_nginx_installation_dir]/conf/nginx.conf
.
μ΄μ λΈλΌμ°μ λ₯Ό μ΄κ³ λ€μμΌλ‘ μ΄λνμμμ€. localhost:80
. React μ± νμ΄μ§κ° νμλ©λλ€.
Nginx μλ²μμ μ 곡νλ React μ±
μ΄μ νλμ 무μΈκ°λ₯Ό μ
λ ₯νλ©΄ Type your sentence
κ·Έλ¦¬κ³ λ²νΌμ λλ₯΄μΈμ Send
- μ무κ²λ μ μΌμ΄λ κ±°μΌ. κ·Έλ¬λ μ½μμ 보면 μ€λ₯ λ©μμ§λ₯Ό λ³Ό μ μμ΅λλ€. μ΄λ¬ν μ€λ₯κ° λ°μνλ μμΉλ₯Ό μ νν μ΄ν΄νκΈ° μν΄ μ ν리μΌμ΄μ
μ½λλ₯Ό λΆμν΄ λ³΄κ² μ΅λλ€.
βνλ°νΈμλ μ ν리μΌμ΄μ μ μ½λ λΆμ
νμΌμ μ½λλ₯Ό 보면 App.js
, λ²νΌμ ν΄λ¦νλ©΄ Send
λ°©λ²μ νΈμΆ analyzeSentence()
. μ΄ λ©μλμ μ½λλ λ€μκ³Ό κ°μ΅λλ€. λμμ μμμ μ£Όμμ΄ μλ κ° νμ λν΄ λ€μκ³Ό κ°μ μ¬μ€μ μ£Όμνμμμ€. # ΠΠΎΠΌΠ΅Ρ
, μ½λ μλμ μ€λͺ
μ΄ μμ΅λλ€. κ°μ λ°©μμΌλ‘ λ€λ₯Έ μ½λ μ‘°κ°μ ꡬ문 λΆμν©λλ€.
analyzeSentence() {
fetch('http://localhost:8080/sentiment', { // #1
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
sentence: this.textField.getValue()})// #2
})
.then(response => response.json())
.then(data => this.setState(data)); // #3
}
1. POST μμ²μ΄ μ΄λ£¨μ΄μ§ URLμ λλ€. μ΄ μ£Όμλ μ΄λ¬ν μμ²μ κΈ°λ€λ¦¬λ μ ν리μΌμ΄μ μΌλ‘ κ°μ£Όλ©λλ€.
2.μ ν리μΌμ΄μ μ μ μ‘λ μμ² λ³Έλ¬Έμ λλ€. λ€μμ μμ² λ³Έλ¬Έμ μμ λλ€.
{
sentence: "I like yogobella!"
}
3.μμ²μ λν μλ΅μ λ°μΌλ©΄ κ΅¬μ± μμμ μνκ° μ
λ°μ΄νΈλ©λλ€. μ΄λ‘ μΈν΄ κ΅¬μ± μμκ° λ€μ λ λλ§λ©λλ€. λ°μ΄ν°(μ¦, μ
λ ₯ν λ°μ΄ν°μ κ³μ°λ ν
μ€νΈ μ μλ₯Ό ν¬ν¨νλ JSON κ°μ²΄)λ₯Ό μμ νλ©΄ κ΅¬μ± μμλ₯Ό μΆλ ₯ν©λλ€. Polarity
μ‘°κ±΄μ΄ μΆ©μ‘±λλ ν. κ΅¬μ± μμλ₯Ό μ€λͺ
νλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
const polarityComponent = this.state.polarity !== undefined ?
<Polarity sentence={this.state.sentence}
polarity={this.state.polarity}/> :
null;
μ½λκ° κ½€ μ μλνλ κ² κ°μ΅λλ€. μ΄μ¨λ μ¬κΈ°μ 무μμ΄ μλͺ» λμμ΅λκΉ? μμ© νλ‘κ·Έλ¨μ΄ POST μμ²μ 보λ΄λ €λ μ£Όμμ μ΄ μμ²μ μλ½νκ³ μ²λ¦¬ν μ μλ κ²μ΄ μμ§ μ무κ²λ μλ€κ³ κ°μ νλ€λ©΄ λΉμ μ μκ°μ΄ μ³μ κ²μ
λλ€. μ¦, μ£Όμλ‘ μ€λ μμ²μ μ²λ¦¬νκΈ° μν΄ http://localhost:8080/sentiment
, Spring κΈ°λ°μ μΉ μ ν리μΌμ΄μ
μ μ€νν΄μΌ ν©λλ€.
POST μμ²μ μλ½ν μ μλ Spring μ ν리μΌμ΄μ
μ΄ νμν©λλ€.
βSpring κΈ°λ° μΉ μ΄ν리μΌμ΄μ μ€μ
Spring μ ν리μΌμ΄μ μ λ°°ν¬νλ €λ©΄ JDK8 λ° Mavenκ³Ό μ μ νκ² κ΅¬μ±λ νκ²½ λ³μκ° νμν©λλ€. μ΄ λͺ¨λ κ²μ μ€μΉν νμλ νλ‘μ νΈ μμ μ κ³μν μ μμ΅λλ€.
βμμ© νλ‘κ·Έλ¨μ jar νμΌλ‘ μμΆ
ν°λ―Έλμ μ¬μ©νμ¬ ν΄λλ‘ μ΄λν©λλ€. sa-webapp
λ€μ λͺ
λ Ήμ μ
λ ₯νμμμ€.
mvn install
ν΄λμμ μ΄ λͺ
λ Ήμ μ€νν ν sa-webapp
λλ ν λ¦¬κ° μμ±λ©λλ€ target
. μ΄κ²μ νμΌλ‘ νμλλ jar νμΌμ ν¨ν€μ§λ Java μ ν리μΌμ΄μ
μ΄ μλ μμΉμ
λλ€. sentiment-analysis-web-0.0.1-SNAPSHOT.jar
.
βμλ° μ ν리μΌμ΄μ μ€ν
ν΄λλ‘ μ΄λ target
λ€μ λͺ
λ ΉμΌλ‘ μ ν리μΌμ΄μ
μ μ€νν©λλ€.
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar
μ΄ λͺ λ Ήμ μ€ννλ λμ μ€λ₯κ° λ°μν©λλ€. μμ μ μμνκΈ° μν΄ μ€ν μΆμ λ°μ΄ν°μμ μμΈ μΈλΆ μ 보λ₯Ό ꡬ문 λΆμν μ μμ΅λλ€.
Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"
μ°λ¦¬μκ² μ¬κΈ°μ κ°μ₯ μ€μν κ²μ μλ―Έλ₯Ό λͺ
νν ν μ μλ€λ μΈκΈμ
λλ€. sa.logic.api.url
. μ€λ₯κ° λ°μν μ½λλ₯Ό λΆμν΄ λ΄
μλ€.
βμλ° μ ν리μΌμ΄μ μ½λ λΆμ
λ€μμ μ€λ₯κ° λ°μν μ½λ μ€λν«μ λλ€.
@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
@Value("${sa.logic.api.url}") // #1
private String saLogicApiUrl;
@PostMapping("/sentiment")
public SentimentDto sentimentAnalysis(
@RequestBody SentenceDto sentenceDto)
{
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForEntity(
saLogicApiUrl + "/analyse/sentiment", // #2
sentenceDto, SentimentDto.class)
.getBody();
}
}
- Sμμ
entimentController
λ€νμ΄ μλ€saLogicApiUrl
. κ·Έ κ°μ μμ±μ μν΄ μ€μ λ©λλ€.sa.logic.api.url
. - μ
saLogicApiUrl
κ°κ³Ό μ°κ²°/analyse/sentiment
. κ·Έλ€μ ν¨κ» ν μ€νΈ λΆμμ μννλ λ§μ΄ν¬λ‘μλΉμ€λ₯Ό νΈμΆνκΈ° μν μ£Όμλ₯Ό νμ±ν©λλ€.
βμμ± κ° μ€μ
Springμμ μμ± κ°μ κΈ°λ³Έ μμ€λ νμΌμ
λλ€. application.properties
μμ μ°Ύμ μ μμ΅λλ€. sa-webapp/src/main/resources
. κ·Έλ¬λ κ·Έκ²μ μ¬μ©νλ κ²μ΄ μμ± κ°μ μ€μ νλ μ μΌν λ°©λ²μ μλλλ€. λ€μ λͺ
λ ΉμΌλ‘λ μ΄ μμ
μ μνν μ μμ΅λλ€.
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL
μ΄ μμ±μ κ°μ Python μ ν리μΌμ΄μ μ μ£Όμλ₯Ό κ°λ¦¬μΌμΌ ν©λλ€.
μ΄λ₯Ό ꡬμ±ν¨μΌλ‘μ¨ ν μ€νΈ ꡬ문 λΆμ μμ²μ μ€ννκΈ° μν΄ μ΄λν΄μΌ νλ μμΉλ₯Ό Spring μΉ μ ν리μΌμ΄μ μ μλ €μ€λλ€.
μ°λ¦¬μ μΆμ 볡μ‘νκ² λ§λ€μ§ μκΈ° μν΄ Python μμ© νλ‘κ·Έλ¨μ λ€μμμ μ¬μ©ν μ μλλ‘ κ²°μ ν κ²μ
λλ€. localhost:5000
κ·Έλ¦¬κ³ κ·Έκ²μ μμ§ μμΌλ €κ³ λ
Έλ ₯νμΈμ. κ²°κ³Όμ μΌλ‘ Spring μ ν리μΌμ΄μ
μ μμνλ λͺ
λ Ήμ λ€μκ³Ό κ°μ΅λλ€.
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000
μμ€ν
μ Python μ ν리μΌμ΄μ
μ΄ μμ΅λλ€.
μ΄μ Python μ ν리μΌμ΄μ μ μ€ννκΈ°λ§ νλ©΄ μμ€ν μ΄ μμλλ‘ μλν©λλ€.
βPython μ ν리μΌμ΄μ μ€μ
Python μ ν리μΌμ΄μ μ μ€ννλ €λ©΄ Python 3 λ° Pipκ° μ€μΉλμ΄ μμ΄μΌ νλ©° μ μ ν νκ²½ λ³μκ° μ¬λ°λ₯΄κ² μ€μ λμ΄ μμ΄μΌ ν©λλ€.
βμ’ μμ± μ€μΉ
νλ‘μ νΈ ν΄λλ‘ μ΄λ sa-logic/sa
λ€μ λͺ
λ Ήμ μ€νν©λλ€.
python -m pip install -r requirements.txt
python -m textblob.download_corpora
βμ± μ€ν
μ’ μμ±μ΄ μ€μΉλμμΌλ―λ‘ μ ν리μΌμ΄μ μ μ€νν μ€λΉκ° λμμ΅λλ€.
python sentiment_analysis.py
μ΄ λͺ λ Ήμ μ€ννλ©΄ λ€μκ³Ό κ°μ λ©μμ§κ° νμλ©λλ€.
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
μ΄λ μμ© νλ‘κ·Έλ¨μ΄ μ€ν μ€μ΄κ³ μμ²μ κΈ°λ€λ¦¬κ³ μμμ μλ―Έν©λλ€. localhost:5000/
βμ½λ μ°κ΅¬
μμ²μ μλ΅νλ λ°©λ²μ μ΄ν΄νκΈ° μν΄ Python μ ν리μΌμ΄μ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__) #1
@app.route("/analyse/sentiment", methods=['POST']) #2
def analyse_sentiment():
sentence = request.get_json()['sentence'] #3
polarity = TextBlob(sentence).sentences[0].polarity #4
return jsonify( #5
sentence=sentence,
polarity=polarity
)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000) #6
- κ°μ²΄ μ΄κΈ°ν
Flask
. - POST μμ²μ νκΈ° μν μ£Όμ μ§μ .
- μμ± κ²μ
sentence
μμ² λ³Έλ¬Έμμ. - μ΅λͺ
κ°μ²΄ μ΄κΈ°ν
TextBlob
κ·Έλ¦¬κ³ κ°μΉλ₯Ό μ»λpolarity
μμ² λ³Έλ¬Έμμ λ°μ 첫 λ²μ§Έ μ μμ λν΄(μ΄ κ²½μ° λΆμμ μν΄ μ μΆλ μ μΌν μ μμ λλ€). - μ μμ ν
μ€νΈμ μ΄μ λν΄ κ³μ°λ μ§νλ₯Ό ν¬ν¨νλ μλ΅μ λ°νν©λλ€.
polarity
. - λ€μμμ μ¬μ©ν μ μλ Flask μ ν리μΌμ΄μ
μ€ν
0.0.0.0:5000
(νμμ ꡬμ±μ μ¬μ©νμ¬ μ‘μΈμ€ν μλ μμ΅λλ€.localhost:5000
).
μ΄μ μ ν리μΌμ΄μ μ ꡬμ±νλ λ§μ΄ν¬λ‘μλΉμ€κ° μ€ν μ€μ λλ€. κ·Έλ€μ μλ‘ μνΈ μμ©νλλ‘ μ€μ λμ΄ μμ΅λλ€. λ€μμ μ΄ μμ λ¨κ³μμ μ ν리μΌμ΄μ λ€μ΄μ΄κ·Έλ¨μ λͺ¨μ΅μ λλ€.
μ ν리μΌμ΄μ
μ ꡬμ±νλ λͺ¨λ λ§μ΄ν¬λ‘μλΉμ€κ° μ μ μνκ° λ©λλ€.
μ΄μ κ³μνκΈ° μ μ λΈλΌμ°μ μμ React μ±μ μ΄κ³ μΌλΆ λ¬Έμ₯μ ꡬ문 λΆμν΄ λ΄
λλ€. λͺ¨λ κ²μ΄ μ¬λ°λ₯΄κ² μλ£λλ©΄ λ²νΌμ λλ₯Έ ν Send
ν
μ€νΈ μμ μλμ λΆμ κ²°κ³Όκ° νμλ©λλ€.
λ€μ μΉμ μμλ Docker 컨ν μ΄λμμ λ§μ΄ν¬λ‘μλΉμ€λ₯Ό μ€ννλ λ°©λ²μ λν΄ μ€λͺ ν©λλ€. μ΄λ Kubernetes ν΄λ¬μ€ν°μμ μ€νν μ ν리μΌμ΄μ μ μ€λΉνκΈ° μν΄ νμν©λλ€.
λ컀 컨ν μ΄λ
컨ν μ΄λ μ΄λ―Έμ§λ μ ν리μΌμ΄μ μ½λ, λ°νμ νκ²½, μμ€ν λꡬ λ° λΌμ΄λΈλ¬λ¦¬, μ€μ μ μ€ννλ λ° νμν λͺ¨λ κ²μ ν¬ν¨νλ μ ν리μΌμ΄μ μ ν¬ν¨νλ κ²½λμ μ체 ν¬ν¨ μ€ν κ°λ₯ ν¨ν€μ§μ λλ€. 컨ν μ΄λνλ νλ‘κ·Έλ¨μ Linux λ° Windows νκ²½ λͺ¨λμμ μ¬μ©ν μ μμΌλ©° μΈνλΌμ κ΄κ³μμ΄ νμ λμΌνκ² μλν©λλ€.
μ¦, νλ‘λμ μλ²λ₯Ό ν¬ν¨ν λͺ¨λ μ»΄ν¨ν°μμ 컨ν μ΄λλ₯Ό μ€νν μ μμΌλ©° λͺ¨λ νκ²½μμ 컨ν μ΄λμ ν¬ν¨λ μ ν리μΌμ΄μ μ΄ λμΌν λ°©μμΌλ‘ μλν©λλ€.
컨ν μ΄λμ κΈ°λ₯μ νμνκ³ μ ν리μΌμ΄μ μ μ€ννλ λ€λ₯Έ λ°©λ²κ³Ό λΉκ΅νκΈ° μν΄ κ°μ λ¨Έμ κ³Ό 컨ν μ΄λλ₯Ό μ¬μ©νμ¬ React μ ν리μΌμ΄μ μ μ 곡νλ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
βκ°μ λ¨Έμ μ μ¬μ©νμ¬ React μ ν리μΌμ΄μ μ μ μ νμΌ μ 곡
κ°μ λ¨Έμ μ μ¬μ©νμ¬ μ μ νμΌμ μ μ§ κ΄λ¦¬λ₯Ό ꡬμ±νλ €κ³ νλ©΄ λ€μκ³Ό κ°μ λ¨μ μ΄ μμ΅λλ€.
- κ° κ°μ λ¨Έμ μ΄ μμ ν μ΄μ 체μ μ΄κΈ° λλ¬Έμ 리μμ€λ₯Ό λΉν¨μ¨μ μΌλ‘ μ¬μ©ν©λλ€.
- νλ«νΌ μ’ μμ±. μΌλΆ λ‘컬 μ»΄ν¨ν°μμ μλνλ κ²μ΄ νλ‘λμ μλ²μμλ μ λλ‘ μλνμ§ μμ μ μμ΅λλ€.
- κ°μ λ¨Έμ μ루μ μ λλ¦¬κ³ λ¦¬μμ€ μ§μ½μ μΈ νμ₯.
κ°μ λ¨Έμ μμ μ€νλλ μ μ νμΌμ μ 곡νλ Nginx μΉ μλ²
μ μ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ»¨ν μ΄λλ₯Ό μ¬μ©νλ κ²½μ° κ°μ λ¨Έμ κ³Ό λΉκ΅ν λ λ€μκ³Ό κ°μ κ°μ μ νμΈν μ μμ΅λλ€.
- 리μμ€μ ν¨μ¨μ μΈ μ¬μ©: Dockerλ₯Ό μ¬μ©νμ¬ μ΄μ 체μ μ μμ ν©λλ€.
- νλ«νΌ λ 립μ±. κ°λ°μκ° μμ μ μ»΄ν¨ν°μμ μ€νν μ μλ 컨ν μ΄λλ μ΄λμμλ μ€νλ©λλ€.
- μ΄λ―Έμ§ λ μ΄μ΄ μ¬μ©μ ν΅ν κ²½λ λ°°ν¬.
컨ν
μ΄λμμ μ€νλλ μ μ νμΌμ μ 곡νλ Nginx μΉ μλ²
μ°λ¦¬λ κ°μ λ¨Έμ κ³Ό 컨ν
μ΄λλ₯Ό λͺ κ°μ§ μ§μ μμ λΉκ΅νμ λΏμ΄μ§λ§ κ·Έκ²λ§μΌλ‘λ 컨ν
μ΄λμ κ°μ μ λλΌκΈ°μ μΆ©λΆν©λλ€.
βReact μ±μ© 컨ν μ΄λ μ΄λ―Έμ§ λΉλ
Docker 컨ν
μ΄λμ κΈ°λ³Έ λΉλ© λΈλ‘μ νμΌμ
λλ€. Dockerfile
. μ΄ νμΌμ μμ λΆλΆμ 컨ν
μ΄λμ κΈ°λ³Έ μ΄λ―Έμ§κ° κΈ°λ‘λ λ€μ μ ν리μΌμ΄μ
μ μꡬ μ¬νμ μΆ©μ‘±νλ 컨ν
μ΄λλ₯Ό λ§λλ λ°©λ²μ λνλ΄λ μΌλ ¨μ μ§μΉ¨μ΄ ν¬ν¨λ©λλ€.
νμΌ μμ
μ μμνκΈ° μ μ Dockerfile
, Nginx μλ²μ μ
λ‘λνκΈ° μν΄ React μ ν리μΌμ΄μ
μ νμΌμ μ€λΉνκΈ° μν΄ μνν μμ
μ κΈ°μ΅νμμμ€.
- React μ± ν¨ν€μ§ λΉλ(
npm run build
). - Nginx μλ²λ₯Ό μμν©λλ€.
- λλ ν 리 λ΄μ© 볡μ¬
build
νλ‘μ νΈ ν΄λμμsa-frontend
μλ² ν΄λμnginx/html
.
μλμμ 컨ν μ΄λ μμ±κ³Ό λ‘컬 μ»΄ν¨ν°μμ μνλλ μ μμ μ¬μ΄μ μ μ¬μ μ λ³Ό μ μμ΅λλ€.
βSA-Frontend μ ν리μΌμ΄μ μ μν Dockerfile μ€λΉ
μ ν¬ν¨λ μ§μΉ¨ Dockerfile
μ μ²μ μν΄ SA-Frontend
, λ¨ λ νμΌλ‘ ꡬμ±λ©λλ€. μ¬μ€ Nginx κ°λ°νμ κΈ°λ³Έμ μΌλ‘
- Nginx μ΄λ―Έμ§λ₯Ό μ΄λ―Έμ§μ κΈ°λ°μΌλ‘ λ§λ€μ΄μΌ ν©λλ€.
- ν΄λ λ΄μ©
sa-frontend/build
μ΄λ―Έμ§ ν΄λμ 볡μ¬ν΄μΌ ν©λλ€.nginx/html
.
μ΄ μ€λͺ
μμ νμΌλ‘ μ΄λνλ©΄ Dockerfile
, κ·Έλ¬λ©΄ λ€μκ³Ό κ°μ΄ νμλ©λλ€.
FROM nginx
COPY build /usr/share/nginx/html
보μλ€μνΌ μ¬κΈ°μ λͺ¨λ κ²μ λ§€μ° κ°λ¨νμ§λ§ νμΌμ λ΄μ©μ μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ½μ΅λλ€. μ΄ νμΌμ μμ€ν
μ μ΄λ―Έμ§λ₯Ό κ°μ Έμ€λλ‘ μ§μν©λλ€. nginx
μ΄λ―Έ κ°μ§κ³ μλ λͺ¨λ κ²μ ν¬ν¨νκ³ λλ ν 리μ λ΄μ©μ 볡μ¬ν©λλ€. build
λλ ν λ¦¬λ‘ nginx/html
.
ν΄λμμ νμΌμ μ νν 볡μ¬ν μμΉλ₯Ό μλ λ°©λ²μ λν μ§λ¬Έμ΄ μμ μ μμ΅λλ€. build
, μ¦ κ²½λ‘λ μ΄λμμ μμ΅λκΉ? /usr/share/nginx/html
. μ¬μ€ μ¬κΈ°μλ 볡μ‘ν κ²μ μμ΅λλ€. μ¬μ€ κ΄λ ¨ μ 보λ λ€μμμ μ°Ύμ μ μμ΅λλ€.
βμ΄λ―Έμ§λ₯Ό μ‘°ν©νμ¬ μ μ₯μμ μ λ‘λ
μμ±λ μ΄λ―Έμ§λ‘ μμ νλ €λ©΄ μ΄λ―Έμ§ μ μ₯μμ μ΄λ―Έμ§λ₯Ό μ μΆν΄μΌ ν©λλ€. μ΄λ₯Ό μν΄ λ¬΄λ£ ν΄λΌμ°λ κΈ°λ° μ΄λ―Έμ§ νΈμ€ν νλ«νΌμΈ Docker Hubλ₯Ό μ¬μ©ν©λλ€. μ΄ μμ λ¨κ³μμ λ€μμ μνν΄μΌ ν©λλ€.
- μ€μΉ
λ컀 . - Docker Hub μ¬μ΄νΈμ λ±λ‘νμμμ€.
- ν°λ―Έλμμ λ€μ λͺ
λ Ήμ μ€ννμ¬ κ³μ μ λ‘κ·ΈμΈν©λλ€.
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
μ΄μ ν°λ―Έλμ μ¬μ©νμ¬ λλ ν λ¦¬λ‘ μ΄λν΄μΌ ν©λλ€. sa-frontend
κ±°κΈ°μμ λ€μ λͺ
λ Ήμ μ€ννμμμ€.
docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .
μ μ¬ν λͺ
λ Ήμμ μ¬κΈ°μ μλ $DOCKER_USER_ID
Docker Hubμμ μ¬μ©μ μ΄λ¦μΌλ‘ λ°κΏμΌ ν©λλ€. μλ₯Ό λ€μ΄ λͺ
λ Ήμ μ΄ λΆλΆμ λ€μκ³Ό κ°μ΅λλ€. rinormaloku/sentiment-analysis-frontend
.
μ΄ κ²½μ° μ΄ λͺ
λ Ήμ μ κ±°νμ¬ λ¨μΆν μ μμ΅λλ€. -f Dockerfile
, μ΄ λͺ
λ Ήμ μ€ννλ ν΄λμ μ΄λ―Έ μ΄ νμΌμ΄ μκΈ° λλ¬Έμ
λλ€.
μμ±λ μ΄λ―Έμ§λ₯Ό 리ν¬μ§ν λ¦¬λ‘ λ³΄λ΄λ €λ©΄ λ€μ λͺ λ Ήμ΄ νμν©λλ€.
docker push $DOCKER_USER_ID/sentiment-analysis-frontend
μλ£ν ν Docker Hubμ 리ν¬μ§ν 리 λͺ©λ‘μ νμΈνμ¬ μ΄λ―Έμ§κ° ν΄λΌμ°λ μ μ₯μμ μ±κ³΅μ μΌλ‘ νΈμλμλμ§ νμΈν©λλ€.
β컨ν μ΄λ μμνκΈ°
μ΄μ λꡬλ λ€μ΄λ‘λνμ¬ μ€νν μ μμ΅λλ€. $DOCKER_USER_ID/sentiment-analysis-frontend
. μ΄λ κ² νλ €λ©΄ λ€μ λͺ
λ Ή μνμ€λ₯Ό μ€νν΄μΌ ν©λλ€.
docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend
μ΄μ 컨ν
μ΄λκ° μ€ν μ€μ΄λ©° νμν λ€λ₯Έ μ΄λ―Έμ§λ₯Ό μμ±νμ¬ κ³μ μμ
ν μ μμ΅λλ€. νμ§λ§ κ³μνκΈ° μ μ λμμΈμ μ΄ν΄ν©μλ€. 80:80
, μ΄λ―Έμ§λ₯Ό μ€ννλ λͺ
λ Ήμ μμΌλ©° νΌλμ€λ¬μ λ³΄μΌ μ μμ΅λλ€.
- 첫 λ²μ§Έ μ«μ
80
νΈμ€νΈ(μ¦, λ‘컬 μ»΄ν¨ν°)μ ν¬νΈ λ²νΈμ λλ€. - λ λ²μ§Έ μ«μ
80
μμ²μ 리λλ μ ν΄μΌ νλ 컨ν μ΄λμ ν¬νΈμ λλ€.
λ€μ κ·Έλ¦Όμ κ³ λ €νμμμ€.
ν¬νΈ ν¬μλ©
μμ€ν
μ ν¬νΈμμ μμ²μ μ λ¬ν©λλ€. <hostPort>
ν¬νΈλΉ <containerPort>
. μ¦, ν¬νΈμ μ‘μΈμ€ 80
μ»΄ν¨ν°κ° ν¬νΈλ‘ 리λλ μ
λ¨ 80
컨ν
μ΄λ.
νꡬ μ΄ν 80
λ‘컬 μ»΄ν¨ν°μμ μμ© νλ‘κ·Έλ¨μ μ΄λ©΄ λ€μ μμΉμμ μ΄ μ»΄ν¨ν°μμ μμ© νλ‘κ·Έλ¨μ μ‘μΈμ€ν μ μμ΅λλ€. localhost:80
. μμ€ν
μ΄ Dockerλ₯Ό μ§μνμ§ μλ κ²½μ° Docker κ°μ λ¨Έμ μμ μ ν리μΌμ΄μ
μ μ€νν μ μμ΅λλ€. μ£Όμλ λ€μκ³Ό κ°μ΅λλ€. <docker-machine ip>:80
. Docker κ°μ λ¨Έμ μ IP μ£Όμλ₯Ό μ°ΎμΌλ €λ©΄ λ€μ λͺ
λ Ήμ μ¬μ©ν μ μμ΅λλ€. docker-machine ip
.
μ΄ μμ μμ νλ°νΈ μλ μ± μ»¨ν μ΄λκ° μ±κ³΅μ μΌλ‘ μμλλ©΄ λΈλΌμ°μ μμ ν΄λΉ νμ΄μ§λ₯Ό μ΄ μ μμ΄μΌ ν©λλ€.
β.dockerignore νμΌ
μ ν리μΌμ΄μ
μ΄λ―Έμ§ λΉλ SA-Frontend
, μ΄ νλ‘μΈμ€κ° λ§€μ° λ리λ€λ κ²μ μ μ μμ΅λλ€. μ΄λ μ΄λ―Έμ§ λΉλ 컨ν
μ€νΈλ₯Ό Docker λ°λͺ¬μΌλ‘ 보λ΄μΌ νκΈ° λλ¬Έμ
λλ€. λΉλ 컨ν
μ€νΈλ₯Ό λνλ΄λ λλ ν 리λ λͺ
λ Ήμ λ§μ§λ§ μΈμλ‘ μ 곡λ©λλ€. docker build
. μ°λ¦¬μ κ²½μ° μ΄ λͺ
λ Ή λμ μ μ΄ μμ΅λλ€. μ΄λ‘ μΈν΄ λ€μ κ΅¬μ‘°κ° μ΄μ
λΈλ¦¬ 컨ν
μ€νΈμ ν¬ν¨λ©λλ€.
sa-frontend:
| .dockerignore
| Dockerfile
| package.json
| README.md
+---build
+---node_modules
+---public
---src
κ·Έλ¬λ μ¬κΈ°μ μλ λͺ¨λ ν΄λ μ€μμ ν΄λλ§ νμν©λλ€. build
. λ€λ₯Έ κ²μ λ€μ΄λ‘λνλ κ²μ μκ° λλΉμ
λλ€. 무μν λλ ν°λ¦¬λ₯Ό Dockerμ μ§μ νμ¬ λΉλ μλλ₯Ό λμΌ μ μμ΅λλ€. μ΄λ₯Ό μν΄μλ νμΌμ΄ νμν©λλ€. .dockerignore
. λΉμ μ νμΌμ μ΅μνλ€λ©΄ .gitignore
, μ΄ νμΌμ ꡬ쑰λ μλ§λ μΉμν΄ λ³΄μΌ κ²μ
λλ€. μ΄λ―Έμ§ λΉλ μμ€ν
μ΄ λ¬΄μν μ μλ λλ ν°λ¦¬λ₯Ό λμ΄ν©λλ€. μ°λ¦¬μ κ²½μ° μ΄ νμΌμ λ΄μ©μ λ€μκ³Ό κ°μ΅λλ€.
node_modules
src
public
νμΌ .dockerignore
νμΌκ³Ό κ°μ ν΄λμ μμ΄μΌ ν©λλ€. Dockerfile
. μ΄μ μ΄λ―Έμ§λ₯Ό 쑰립νλ λ° λͺ μ΄κ° 걸립λλ€.
μ΄μ μλ° μ ν리μΌμ΄μ μ μ΄λ―Έμ§λ₯Ό λ€λ£¨κ² μ΅λλ€.
βμλ° μ ν리μΌμ΄μ μ© μ»¨ν μ΄λ μ΄λ―Έμ§ λΉλ
무μμ μκ³ μμΌλ©° 컨ν μ΄λ μ΄λ―Έμ§λ₯Ό λ§λλ λ° νμν λͺ¨λ κ²μ μ΄λ―Έ λ°°μ μ΅λλ€. μ΄κ²μ΄ μ΄ μΉμ μ΄ λ§€μ° μ§§μ μ΄μ μ λλ€.
νμΌ μ΄κΈ° Dockerfile
, νλ‘μ νΈ ν΄λμ μμ΅λλ€. sa-webapp
. μ΄ νμΌμ ν
μ€νΈλ₯Ό μ½μΌλ©΄ ν€μλλ‘ μμνλ λ κ°μ μλ‘μ΄ κ΅¬μ‘°λ§ λ§λ μ μμ΅λλ€. ENV
ΠΈ EXPOSE
:
ENV SA_LOGIC_API_URL http://localhost:5000
β¦
EXPOSE 8080
ν€μλ ENV
Docker 컨ν
μ΄λ λ΄μμ νκ²½ λ³μλ₯Ό μ μΈν μ μμ΅λλ€. νΉν μ°λ¦¬μ κ²½μ° ν
μ€νΈ λΆμμ μννλ μ ν리μΌμ΄μ
μ APIμ μ‘μΈμ€νκΈ° μν URLμ μ€μ ν μ μμ΅λλ€.
ν€μλ EXPOSE
Dockerμκ² ν¬νΈλ₯Ό μ΄λλ‘ μ§μν μ μμ΅λλ€. μμ© νλ‘κ·Έλ¨μ μ¬μ©νλ λμ μ΄ ν¬νΈλ₯Ό μ¬μ©ν κ²μ
λλ€. μ¬κΈ°μ λΉμ μ κ·Έκ²μ λ³Ό μ μμ΅λλ€ Dockerfile
μ μ²μ μν΄ SA-Frontend
κ·Έλ° λͺ
λ Ήμ΄ μμ΅λλ€. μ΄κ²μ λ¬Έμν λͺ©μ λ§μ μν κ²μ
λλ€. μ¦, μ΄ κ΅¬μ‘°λ λ
μλ₯Ό μν κ²μ
λλ€. Dockerfile
.
μ΄λ―Έμ§λ₯Ό λΉλνκ³ λ¦¬ν¬μ§ν λ¦¬λ‘ νΈμνλ κ²μ μ΄μ μμ μ λκ°μ΅λλ€. μμ§ μμ μ λ₯λ ₯μ μμ μ΄ μλ€λ©΄ νμΌμμ ν΄λΉ λͺ
λ Ήμ μ°Ύμ μ μμ΅λλ€. README.md
ν΄λμ sa-webapp
.
βPython μ ν리μΌμ΄μ μ© μ»¨ν μ΄λ μ΄λ―Έμ§ λΉλ
νμΌ λ΄μ©μ 보면 Dockerfile
ν΄λμ sa-logic
λΉμ μ κ±°κΈ°μμ μλ‘μ΄ κ²μ μ°Ύμ§ λͺ»ν κ²μ
λλ€. μ΄λ―Έμ§λ₯Ό λΉλνκ³ λ¦¬ν¬μ§ν λ¦¬λ‘ νΈμνλ λͺ
λ Ήμ μ΄λ―Έ μ΅μν κ²μ
λλ€. κ·Έλ¬λ λ€λ₯Έ μμ© νλ‘κ·Έλ¨μ κ²½μ°μ λ§μ°¬κ°μ§λ‘ νμΌμμ μ°Ύμ μ μμ΅λλ€. README.md
ν΄λμ sa-logic
.
β컨ν μ΄λνλ μ ν리μΌμ΄μ ν μ€νΈ
ν μ€νΈνμ§ μμ κ²μ μ λ’°ν μ μμ΅λκΉ? λλ λͺ»ν΄. 컨ν μ΄λλ₯Ό ν μ€νΈν΄ λ³΄κ² μ΅λλ€.
- μ ν리μΌμ΄μ
컨ν
μ΄λλ₯Ό μμνκ² μ΅λλ€.
sa-logic
ν¬νΈμμ μμ λκΈ°νλλ‘ κ΅¬μ±5050
:docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
- μ ν리μΌμ΄μ
컨ν
μ΄λλ₯Ό μμνκ² μ΅λλ€.
sa-webapp
ν¬νΈμμ μμ λκΈ°νλλ‘ κ΅¬μ±8080
. λν νκ²½ λ³μλ₯Ό μ¬ν λΉνμ¬ Python μ ν리μΌμ΄μ μ΄ Java μ ν리μΌμ΄μ μ μμ²μ μμ ν ν¬νΈλ₯Ό μ€μ ν΄μΌ ν©λλ€.SA_LOGIC_API_URL
:$ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app
컨ν
μ΄λ λλ Docker VMμ IP μ£Όμλ₯Ό μ°Ύλ λ°©λ²μ νμΌμ μ°Έμ‘°νμμμ€.
μ ν리μΌμ΄μ
컨ν
μ΄λλ₯Ό μμνκ² μ΅λλ€. sa-frontend
:
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend
μ΄μ λͺ¨λ κ²μ΄ λΈλΌμ°μ μμ μ£Όμλ‘ μ΄λν μ€λΉκ° λμμ΅λλ€. localhost:80
μ±μ ν
μ€νΈν©λλ€.
ν¬νΈλ₯Ό λ³κ²½νλ κ²½μ° sa-webapp
λλ Docker VMμ μ€ν μ€μΈ κ²½μ° νμΌμ νΈμ§ν΄μΌ ν©λλ€. App.js
ν΄λμμ sa-frontend
λ©μλμμ IP μ£Όμ λλ ν¬νΈ λ²νΈλ₯Ό λ³κ²½νμ¬ analyzeSentence()
μ€λλ λ°μ΄ν° λμ νμ¬ μ 보λ₯Ό λ체νμ¬. κ·Έλ° λ€μ μ΄λ―Έμ§λ₯Ό λ€μ 쑰립νκ³ μ¬μ©ν΄μΌ ν©λλ€.
μ΄κ²μ΄ νμ¬ μ ν리μΌμ΄μ λ€μ΄μ΄κ·Έλ¨μ λͺ¨μ΅μ λλ€.
컨ν
μ΄λμμ μ€νλλ λ§μ΄ν¬λ‘μλΉμ€
μμ½: Kubernetes ν΄λ¬μ€ν°κ° νμν μ΄μ λ 무μμ λκΉ?
λ°©κΈ νμΌμ κ²ν νμ΅λλ€. Dockerfile
, μ΄λ―Έμ§λ₯Ό λΉλνκ³ Docker 리ν¬μ§ν 리μ νΈμνλ λ°©λ²μ λν΄ μ΄μΌκΈ°νμ΅λλ€. λν νμΌμ μ¬μ©νμ¬ μ΄λ―Έμ§ 쑰립 μλλ₯Ό λμ΄λ λ°©λ²μ λ°°μ μ΅λλ€. .dockerignore
. κ²°κ³Όμ μΌλ‘ μ°λ¦¬μ λ§μ΄ν¬λ‘μλΉμ€λ νμ¬ Docker 컨ν
μ΄λμμ μ€νλκ³ μμ΅λλ€. μ¬κΈ°μ μΏ λ²λ€ν°μ€κ° νμν μ΄μ μ λν μμ ν μ λΉν μ§λ¬Έμ΄ μμ μ μμ΅λλ€. μ΄ μ§λ¬Έμ λν λ΅μ μ΄ μλ£μ λ λ²μ§Έ λΆλΆμμ λ€λ£° κ²μ
λλ€. κ·Έ λμ λ€μ μ§λ¬Έμ κ³ λ €νμμμ€.
ν
μ€νΈ λΆμ μΉ μ ν리μΌμ΄μ
μ΄ μ μΈκ³μ μΌλ‘ μΈκΈ°λ₯Ό μ»μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. λ§€λΆ μλ°±λ§ κ±΄μ μμ²μ΄ κ·Έμκ² μ΅λλ€. μ΄λ λ§μ΄ν¬λ‘μλΉμ€κ° sa-webapp
ΠΈ sa-logic
μμ²λ μ€νΈλ μ€λ₯Ό λ°κ² λ©λλ€. λ§μ΄ν¬λ‘μλΉμ€λ₯Ό μ€ννλ 컨ν
μ΄λλ₯Ό νμ₯νλ λ°©λ²μ 무μμ
λκΉ?
μΆμ² : habr.com