νκ° μκ°μ λ Έλ²¨λ¬Ένμ μμκ³Ό ν¨κ» λ μμ λ°λμ΄ λΆμ΄μ€κ³ μμ΅λλ€. λ§ μ± μ μ½κΈ° μμν νΈκΈ°μ¬ λ§μ μ΄λ³΄ λ μκ°λ€, μ€λ μκ° μ± μμ λΉ μ Έ μ΄μμ¨ λ μκ°λ€ λͺ¨λλ₯Ό μν νλ«νΌ 'μ± λ‘ μλ°'μ μκ°ν©λλ€.
μ± λ‘ μλ°μ μλ§μ λμ λͺ©λ‘μ μ 곡νκ³ , μμ μ΄ μ½μ μ± μ λν μμ€ν κ°μμ 곡μ νλ κ²μμ κ·ΈμΉμ§ μκ³ , μ± μΌλ‘λΆν° μ»μ νλΆν μκ°μ λλ μ μλ μ₯μλ₯Ό μ 곡ν©λλ€.
μΉ΄μΉ΄μ€ μμ λ‘κ·ΈμΈμ ν΅ν΄ λ³΄λ€ νΈνκ² μλΉμ€μ μ κ·Όν μ μμ΅λλ€.
μλΌμ€ν± μμΉλ₯Ό μ΄μ©ν΄ λ³΄λ€ μ ννκ³ λΉ λ₯Έ λμ κ²μ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
μ€μκ°μΌλ‘ μμ±κ³Ό μ°Έμ¬κ° κ°λ₯ν λ
μ ν λ‘ λ°©μ μ΄μ©ν μ μμ΅λλ€.
μ± μ κ³ λ₯΄κΈ° μ΄λ €μΈ λ λμ μ·¨ν₯μ λ§λ μ± μ Gemini AIμμ λνλ₯Ό ν΅ν΄ μ°Ύμ μ μμ΅λλ€.
κΉμκΈ° | κΉμ§λ―Ό | μ΄μμ | μ μμ§ | μ΅λν | νλμ£Ό |
- main: λ°°ν¬μ© branch
- develop: μ€μ§μ main branch
- feature: κ° κΈ°λ₯μ κ°λ°νλ branch
- λΈλμΉλͺ
μ 'νκ·Έ/λλ©μΈ/#μ΄μλ²νΈ' μ νμμ λ°λ₯Έλ€.
- μ) feat/user/#12
- κΈ°λ₯ λ¨μλ‘ λΈλμΉλ₯Ό μμ±νλ©°, μ»€λ° λ¨μλ κ°λ₯ν μκ² μ‘°μ νλ€. ν λ²μ μ¬λ¬ ν΄λμ€λ₯Ό 컀λ°νμ§ μκ³ , Pull Requestμ λ무 λ§μ 컀λ°μ΄ ν¬ν¨λμ§ μλλ‘ νλ€.
- μ΄μ ν νλ¦Ώμ νμ©νμ¬ λ€λ₯Έ μ¬λμ΄ μκΈ° μ½κ² μ΄μλ₯Ό μμ±νλ€.
- μ΄μ μμ± ν λ°κΈλ #μ΄μλ²νΈλ₯Ό μ΄μ©ν΄ λΈλμΉλ₯Ό μμ±νλ€.
- Pull Requestμ μ λͺ©μ 'νκ·Έ/λλ©μΈ κ°λ° λ΄μ©' μ νμμ λ°λ₯Έλ€.
- μ) feat/user κ°λ° λ΄μ©
- νκ·Έ
feat
: κΈ°λ₯ κ°λ°
fix
: λ²κ·Έ μμ
docs
: λ¬Έμ μμ± λ° μμ
style
: μ½λ 리ν©ν λ§ λ± λ΄μ©μ λ³κ²½μ΄ μλ κ²½μ°
test
: ν μ€νΈ μ½λ
chore
: μμν μμ μ¬ν - μ»€λ° λ©μμ§λ 'νκ·Έ: #μ΄μλ²νΈ λ΄μ©' μ νμμ λ°λ₯Έλ€.
- μ) docs: #43 ReadMe μμ
- ν΄λμ€λͺ : PascalCase
- λ©μλλͺ , νλλͺ : camelCase
public class User{
public void fetchUserInfo(){
private Long userId;
private String userName;
}
}
- DTOλͺ
: ~DTO μ)
UserRequestDTO
- κΈ°ν λͺ¨νΈν λ¨μ΄λ λλ©μΈ μ μμμ μμ±νλ€.
- κ°λ μ±μ μν΄ ν΄λμ€ μ²« μ€μ λμ΄μ°κ³ , μλ―Έ μλ 곡백μ μ€μΈλ€.
- μ΅λ tap depth = 2
- magic number μ¬μ© μμ , μμν
- μ»€λ° μ μ λ ¬(
ctrl + alt + L
) - μ»€λ° μ μ¬μ©νμ§ μλ importλ¬Έ μμ (
ctrl + alt + o
)
λ©μΈ νμ΄μ§
λμ μΆμ² μ±λ΄
- μ±ν μ°½μ μ¬μ©μκ° λ©μμ§λ₯Ό μ λ ₯ν΄ μ±λ΄μκ² λ³΄λ΄λ©΄ μ±λ΄μ΄ κ·Έ μ±ν μ λν΄ μλ§μ λ΅λ³μ μλ΅νμ¬ λ°μμ¨ ν μμ μ±ν μ°½μ κ·Έ λ΄μ©μ΄ λνλλ€.
- μ¬μ©μκ° μλ‘κ² νμ΄μ§μ λ€μ΄μ€λλΌλ μ΄μ μ μ±λ΄κ³Ό λλλ μ±ν μ΄ μ±ν μ°½μ λνλλ€.
μλΌμ€ν± μμΉλ₯Ό νμ©ν κ²μ
μ±ν κΈ°λ₯μ μ΄μ©ν λ μν λ‘ λ°©
- μ±ν λ°© μ λͺ©κ³Ό λμ ID, μ΅λ μΈμμ μ ν΄ μ±ν λ°©μ μμ±νλ€.
- μ€μκ°μΌλ‘ λ€μμ μ μ κ° μ±ν μ μ§ννλ€.
- κΈ°μ‘΄ μ±ν λ΄μ©μ΄ μ μ₯λμ΄ μκ³ μ±ν λ°©μ λκ°λ©΄ νμ¬ μ±ν λ°© μΈμμ΄ μ€μ΄λ λ€.
λ‘κ·ΈμΈ & λ‘κ·Έμμ
- μ¬μ©μκ° λ‘κ·ΈμΈ λ²νΌμ λλ₯΄λ©΄ μλ²λ‘ λ‘κ·ΈμΈ url μμ²μ 보λΈλ€.
- μλ²λ μΉ΄μΉ΄μ€ μΈμ¦ μλ²μκ² λ‘κ·ΈμΈ urlμ μμ²ν΄ μ¬μ©μμκ² μ λ¬νκ³ , μ¬μ©μκ° λ‘κ·ΈμΈνλ©΄ μΉ΄μΉ΄μ€ μΈμ¦ μλ²κ° μΈκ° μ½λλ₯Ό μλ²μ μ λ¬νλ€.
- μλ²λ μΈκ° μ½λλ₯Ό μ΄μ©ν΄ μΉ΄μΉ΄μ€ μΈμ¦ μλ²λ‘λΆν° νμν μ 보λ₯Ό μ»κ³ , DBμ μ¬μ©μλ₯Ό νμκ°μ λλ λ‘κ·ΈμΈ μ²λ¦¬νλ€. κ·Έλ¦¬κ³ μλ²μμ μμ±ν μλΉμ€ μ체 ν ν°μ ν¨κ» 보λΈλ€.
- λ‘κ·Έμμ μ μλ²μμ ν ν°μ μμ νλ€.
λμ λͺ©λ‘
λμ μμΈνμ΄μ§
리뷰
- λμ μμΈνμ΄μ§μμ 리뷰λ₯Ό μμ±ν μ μλ€.
- 리뷰λ₯Ό μμ± μ€μ μ·¨μνμ¬ λμ μμΈνμ΄μ§λ‘ μ΄λν μ μλ€.
- 리뷰λ₯Ό μμ ν μ μλ€.
- 리뷰λ₯Ό μ΅μ μμ΄λ λ³μ μμΌλ‘ μ λ ¬ν μ μλ€.
- 리뷰λ₯Ό μμ ν μ μλ€.
- 리뷰λ₯Ό μ κ³ ν μ μκ³ μ κ³ λ²νΌμ μλͺ» ν΄λ¦ νλ€λ©΄ μ·¨μν μλ μλ€.
πk8s Menifests Manage Repository
Jenkins Pipeline
pipeline {
agent any
tools {
gradle 'gradle' // Jenkinsμμ μ€μ λ Gradle λ²μ
jdk 'openJDK17' // Jenkinsμμ μ€μ λ JDK λ²μ
}
environment {
DOCKERHUB_CREDENTIALS = credentials('DOCKERHUB_PASSWORD')
GITHUB_URL = 'https://github.com/MENDITTZO/MENDITTZO-DEBOOK.git' // GitHub URL μ
λ ₯
FRONTEND_IMAGE = 'debook_vue_project' // νλ‘ νΈμλ Docker μ΄λ―Έμ§ κ²½λ‘
BACKEND_IMAGE = 'debook_boot_project' // λ°±μλ Docker μ΄λ―Έμ§ κ²½λ‘
MANIFESTS_GITHUB_URL = 'https://github.com/MENDITTZO/k8s.git' // k8s github κ²½λ‘λ‘
GIT_USERNAME = 'junguijin'
GIT_EMAIL = '[email protected]'
}
stages {
stage('Preparation') {
steps {
script {
if (isUnix()) {
sh 'docker --version'
} else {
bat 'docker --version'
}
}
}
}
stage('Source Build') {
steps {
git branch: 'main', url: "${env.GITHUB_URL}"
script {
// νλ‘ νΈμλ λΉλ
dir('MENDITTZO-Frontend') {
if (isUnix()) {
sh 'npm install'
sh 'npm run build'
} else {
bat 'npm install'
bat 'npm run build'
}
}
// λ°±μλ λΉλ
dir('MENDITTZO-Backend') {
if (isUnix()) {
sh "chmod +x ./gradlew"
sh "./gradlew clean build -x test"
} else {
bat "gradlew.bat clean build -x test"
}
}
}
}
}
stage('Container Build and Push') {
steps {
script {
withCredentials([usernamePassword(credentialsId: 'DOCKERHUB_PASSWORD', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
// νλ‘ νΈμλ Docker μ΄λ―Έμ§ λΉλ λ° νΈμ
dir('MENDITTZO-Frontend') {
if (isUnix()) {
sh "docker build --no-cache -t ${DOCKER_USER}/${FRONTEND_IMAGE}:latest ."
sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASS}"
sh "docker push ${DOCKER_USER}/${FRONTEND_IMAGE}:latest"
} else {
bat "docker build --no-cache -t ${DOCKER_USER}/${FRONTEND_IMAGE}:latest ."
bat "docker login -u %DOCKER_USER% -p %DOCKER_PASS%"
bat "docker push ${DOCKER_USER}/${FRONTEND_IMAGE}:latest"
}
}
// λ°±μλ Docker μ΄λ―Έμ§ λΉλ λ° νΈμ
dir('MENDITTZO-Backend') {
if (isUnix()) {
sh "docker build -t ${DOCKER_USER}/${BACKEND_IMAGE}:latest ."
sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASS}"
sh "docker push ${DOCKER_USER}/${BACKEND_IMAGE}:latest"
} else {
bat "docker build -t ${DOCKER_USER}/${BACKEND_IMAGE}:latest ."
bat "docker login -u %DOCKER_USER% -p %DOCKER_PASS%"
bat "docker push ${DOCKER_USER}/${BACKEND_IMAGE}:latest"
}
}
}
}
}
}
}
post {
always {
script {
if (isUnix()) {
sh 'docker logout'
} else {
bat 'docker logout'
}
}
}
success {
echo 'Pipeline succeeded!'
}
failure {
echo 'Pipeline failed!'
}
}
}
νμ | νκ³ λ΄μ© |
---|---|
κΉμκΈ° | μ΄λ² λ°λΈμ΅μ€ νλ‘μ νΈμμ μ±ν κΈ°λ₯ κ°λ°μ λ§‘κ² λμ΄ WebSocket + STOMP + Redisλ₯Ό λͺ¨λ λ€λ£¨μ΄λ³΄κ² λμλ€. μΈ κ°μ§ λͺ¨λ μ²μμ΄μκ³ νλ‘μ νΈ κΈ°κ°μ΄ 짧μκΈ° λλ¬Έμ μ±ν κΈ°λ₯ κ°λ°μμ μ±ν λ°© κ΄λ¦¬λ κ°κ²°ν μ½λ μμ±κ³Ό κ°μ λν μΌμ μ±κΈ°μ§ λͺ»ν΄μ μμ¬μ λ€. λ¬Όλ‘ μ’μλ μ λ μμλ€. λ¨Όμ , κΈ°μ‘΄μ κ²½ννλ HTTP ν΅μ μμ λ λμκ° μ€μκ° ν΅μ μ΄ μ΄λ»κ² μ§νλλμ§ κ·Έ κ³Όμ μ κ²½νν΄λ³Ό μ μμλ€. λ€νΈμν¬μͺ½ μ§μμ΄ λΆμ‘±νλ λμκ²λ μ‘°κΈ λ μλ―Έμλ μκ°μ΄μλ€. λν STOMPλ₯Ό μ΄μ©ν΄ μ€μκ° ν΅μ μ λ μ½κ² λ§λ€μ΄μ£Όκ³ Redisλ₯Ό μ΄μ©ν΄ λΉ λ₯Έ λ°μ΄ν° μ²λ¦¬λ₯Ό νμ¬ λ€μμ μ¬μ©μκ° μ±ν μ ν μ μλ κΈ°λ₯μ κ°λ°νλ©΄μ μ±ν κ³Ό μ€μκ° ν΅μ μ μ λ°μ μ΄ νλ‘μΈμ€λ₯Ό μ΄ν΄ν μ μμλ€. λ λμκ° SockJSλ₯Ό μ΄μ©ν λΈλΌμ°μ μ μκ΄μμ΄ ν΅μ μ΄ κ°λ₯νκ² νμ₯μ ν΄λ³΄κ³ μΆκ³ μ±ν κΈ°λ₯μ λν μΌμ λ μ΄λ € κΈ°μ‘΄μ κΈ°λ₯μ λ λ벨λ‘ν΄λ΄μΌκ² λ€. μ΄λ² νλ‘μ νΈμμλ CI/CD λν κ²½νν΄λ³Ό μ μμλλ° Docker, Kubernetes, Jenkinsλ₯Ό μ΄μ©νμ¬ νμ ν΄μΈ githubμ νλ‘μ νΈλ₯Ό μλ λΉλ λ° λ°°ν¬νλ κ³Όμ μ κ²½νν΄λ³Ό μ μμλ€. CI/CDμ μ λ°μ μΈ κ³Όμ μ μ μ΄ν΄νμ§ λͺ»νκ³ μ§νν κ±° κ°μμ μ΅μ’ νλ‘μ νΈμλ μ§μ ν΄λ³΄λ©΄μ κ³Όμ λ€μ λͺΈμΌλ‘ μ΅λν΄λ³΄μμΌκ² λ€. μλ‘μ΄ νμλ€κ³Ό μ§ννλ νλ‘μ νΈμΈλ° κΈ°κ°λ 짧μμ λ무 μ΄μμ ν νλ‘μ νΈκ° λμλ κ±° κ°μλ° μ΅μ’ νλ‘μ νΈμμλ νμ μ λμ± κ²¬κ³ ν νμ¬ λ μ§μμ μλ νλ‘μ νΈλ₯Ό κ°λ°ν΄λ³΄μμΌκ² λ€. |
κΉμ§λ―Ό | μ΄λ² νλ‘μ νΈλ 짧μ μκ°λμ νλ‘ νΈμλμ λ°±μλλ₯Ό κ°μ΄ λ§λ€μ΄μΌνκ³ κ±°κΈ°λ€κ° λ컀κΉμ§ μ°κ²°νμ¬ CI/CDκΉμ§ ν΄μΌν΄μ μ²μ μμν λλ λ§λ§νκ² μκ°νλ€. κ·Έλ¦¬κ³ μ λ² νλ‘μ νΈμμ ν΄μΌνλ κΈ°λ₯λ€μ μ λλ‘ λ€ νμ§ λͺ»νκ³ ν μ μλ λΆλΆκΉμ§λ§ νκΈ° λλ¬Έμ μ΄λ²μλ μ νκ³ μΆμ μκ°μ κ°κ³ μμκΈ°μ λ λΆλ΄μ΄ μμλ€. νμ§λ§ μ λ²μ νλ νλ‘μ νΈκ° κ²½νμ΄ λμλμ§ μ²μ νλ‘μ νΈ νμ λ보λ€λ μμνκ² μ§νν μ μμ΄μ λ€νμ΄μλ€. μ΄λ²μ 맑μ λΆλΆμ λμ λͺ©λ‘μ λ§λ€κ³ λμ λͺ©λ‘μμ μ± μ μ ννλ©΄ λμ μμΈνμ΄μ§λ‘ μ΄λνκ² λ§λ€κ³ λμ μμΈνμ΄μ§ μμμ μ± μ 보λ₯Ό axiosλ₯Ό ν΅ν΄ λ°±μλμμ λ°μμ€κ³ λμ μμΈνμ΄μ§ μμ λ±λ‘λ 리뷰 μ 보λ₯Ό axiosλ‘ λ°μμ€κ³ , 리뷰 μμ±, μμ , μμ λ₯Ό νλ λΆλΆμ 맑μλ€. νΉλ³ν λ€λ₯Έ λΆλΆμ λΉν΄ μ΄λ €μ΄ λΆλΆμ μμ΄μ μ λ²λ³΄λ€λ μ²μ ꡬμ±νλ νΌκ·Έλ§μ μΌμΆ λΉμ·νκ² λ§λ€ μ μμ΄μ λ€νμ΄μλ€. κ·Έλ¦¬κ³ κ΅¬μνλ κΈ°λ₯λ€λ λ€ ν¬ν¨ν μ μμ΄μ μ΄λ²μλ μ λ²λ³΄λ€ μ’ λ λ°μ λ λͺ¨μ΅μ λ³΄μΈ κ±° κ°μ μμ¬νλ€. λͺ¨λ₯΄λ λΆλΆμ μΈν°λ·λ μ°Ύμλ³΄κ³ νμλΆλ€κ³Ό κ°μ΄ μλ Όνκ³ λ¬Όμ΄λ³΄λ©΄μ ν΄κ²° ν μ μμκ³ νμλΆλ€μ λμμ΄ μμλ€λ©΄ μ΄λ κ²κΉμ§ ν μλ μμμ κ±° κ°λ€. λ컀 μͺ½μ μμ μ λ€μμ§λ§ μμ§λ μ΄ν΄κ° μ μλμ΄μ λμμ λͺ» λλ Έμ§λ§ λ€λ₯Έ λΆλΆμμ μ΅μ μ λ€νκ³ μ νκ³ νΌκ·Έλ§μμ ꡬμνλ μ¬μν μ»΄ν¬λνΈλ CSSλ μΆκ°νλ λ± μ΄μ¬ν νμ§λ§ λ©μΈνμ΄μ§μμ 리뷰λ§μ μμΌλ‘ λμλ₯Ό μ λ ¬νκ³ μ νμμ§λ§ λκ° λ¬Έμ μΈμ§ 리뷰μ μ΄ μλ₯Ό λͺ» λ°μμμ μ λ ¬μ λͺ» νλ κ²μ΄ μμ½λ€. λκ° μ’ λ ν΄λ³΄λ©΄ λ κ²κ°μμ§λ§ μκ°μ΄ λΆμ‘±ν κ΄κ³λ‘ ν¬κΈ°ν μλ°μ μμ΄μ λ§μμ λ¨μ§λ§ λ€μμ λ€μ μ΄μ λΉμ·ν λ΄μ©μ ν΄λ³Ό μ μμΌλ©΄ λκΉμ§ ν΄μ μμ±ν΄λ³΄κ³ μΆλ€. κ·Έλλ νμν κΈ°λ₯λ€λ λ€ λ§λ€κ³ λΉλ‘ 리뷰 μμ λ₯Ό νλ©΄ λ°λ‘ 리μ€νΈμμ μμ΄μ§μ§ μμ§λ§ μ΄λ μ λ μμ±μ νκΈ° λλ¬Έμ νλ‘μ νΈνλ©΄μ μ¬λ°κ² ν μ μμ΄μ μ’μλ€. λ€μμλ μ΄λ²λ³΄λ€ λ μ ν μ μλλ‘ μ€λ ₯λ ν€μ°κ³ μ΄μ¬ν λ λ Έλ ₯ν΄μ μμ±λλ₯Ό λμ¬μΌκ² λ€. |
μ΄μμ | μ΄μ νλ‘μ νΈμμ μλΉμ€ μ체 νμκ°μ , λ‘κ·ΈμΈμ ν¬ν¨ν μ¬λ¬ κΈ°λ₯μ ꡬννλ€. νμκ°μ /λ‘κ·ΈμΈμ λ€λ₯Έ νμλ€μκ²λ λ°λμ νμν κΈ°λ₯μ΄κΈ° λλ¬Έμ μ€μλκ° λμλ°, λ¨μν μ΄λ©μΌ, μνΈν λ λΉλ°λ²νΈλ₯Ό DBμ μ μ₯νκ³ λ‘κ·ΈμΈ μ λ§λμ§ λ§€μΉνλ μμ€μ΄λΌ μμ¬μμ΄ λ¨μλ€. κ·Έλμ λ€μ κΈ°νκ° μκΈ°λ©΄ μ’ λ λ°μ μν€κ² λ€κ³ λ€μ§νλ€. μλ‘ λ§λ νμλ€κ³Ό μ νλ‘μ νΈλ₯Ό νκ² λμκ³ , λλ λ΄κ° νμκ°μ κΈ°λ₯μ ꡬννκ² λ€κ³ λ§νλ€. μΌμ£ΌμΌμ΄ μλλ 짧μ κΈ°κ° μμ λ°±μλ, νλ‘ νΈμλ κ°λ°μ λ§μ³μΌ νκΈ° λλ¬Έμ, ν λ² ν΄ λ³Έ μλΉμ€ μ체 νμκ°μ μ λ ν기보λ€λ μΉ΄μΉ΄μ€ μμ λ‘κ·ΈμΈμ λμ νκ³ , redisμ ν ν°μ μ¬μ©νκΈ°λ‘ νλ€. μλΉμ€ μ체 νμκ°μ λ³΄λ€ μ‘°κΈ μ΄λ €μΈ κ±°λΌκ³ μμμ νμ§λ§ μκ°λ³΄λ€ λ κΉλ€λ‘μ λ€. μΉ΄μΉ΄μ€μμ μ 곡νλ λ¬Έμλ₯Ό μ΄μ¬ν μ½μΌλ©° μλν¬μΈνΈλ§λ€ postmanμΌλ‘ ν μ€νΈνλ©΄μ μΉ΄μΉ΄μ€ λ‘κ·ΈμΈμ νλ¦μ μ΄ν΄νλ€. κ·Έλ¦¬κ³ νμν κΈ°λ₯λΌλ¦¬ λ¬ΆμΌλ©΄μ νλ‘ νΈμλμ μ°κ²°νλ€. μ΄ κ³Όμ μμ μλΉμ€μ²΄ ν ν°μ μμ±νκ³ , redisμ μ μ₯νκ³ , api μμ²λ§λ€ ν ν°μ ν¨κ» 보λ΄μΌ νλλ°, 볡μ‘ν΄μ μκ°μ λ§μ΄ μΌλ€. νμ§λ§ λλΆμ OAuth2μ ν ν°μ λν΄ λ°°μΈ μ μμλ€. κ·Έλ¦¬κ³ μΉ΄μΉ΄μ€ μΈμ¦ μλ²μμ 보λ΄μ£Όλ μΈκ° μ½λλ₯Ό λ°±μλμ νλ‘ νΈμλ μ΄λ μͺ½μμ μ²λ¦¬ν΄μΌν μ§μ κ°μ λ¬Έμ λ₯Ό κ³ λ―Όνλ μκ°μ κ°μ§ μ μμμλ€. κ·Έλ¦¬κ³ μ΄ νλ‘μ νΈμμ λ€λ₯Έ νμμ μ μμΌλ‘ gitμ λ λ§μ΄ νμ©νλ€. μ격 λ ν¬μ§ν 리μ main λΈλμΉ μλμ develop μ΄λΌλ λΈλμΉλ₯Ό λ§λ€μκ³ , λ°λμ 2λͺ μ΄μμ Pull Request μΉμΈμ λ°μμΌ developμ λ³ν©ν μ μλλ‘ μ€μ νλ€. μ΄λ‘ μΈν΄ λ€λ₯Έ μ¬λμ μ½λλ₯Ό μ‘°κΈμ΄λΌλ λ λ³΄κ² λμκ³ , 컀λ°κ³Ό λ³ν© μ κ²½κ°μ¬μ κ°μ§ μ μμλ€. νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μμ¬μ΄ μ μ΄ μλ€λ©΄ 리νλ μ ν ν°μ μ μ νκ² μ¬μ©νμ§ λͺ»νλ€λ μ κ³Ό, λΉμ₯ μλΉμ€κ° μλνκ² νλ λ°μ κΈκΈν΄ 쿼리 νλΌλ―Έν°μ ν ν°μ λ£λ λ± λ³΄μμ μ κ²½μ μ°μ§ λͺ»νλ€λ κ²μ΄λ€. λν, νμλ€μ΄ κ°μμ κΈ°λ₯μ κ°λ°ν ν μλ‘ λ§μΆ°λ³΄κ³ μ λ¬Έμ κ° μκΈ°λμ§ ν μνλ μκ°μ΄ λ무 짧μλ€. λ μ’μ κΈ°νκ° μκΈ΄λ€λ©΄ λμ νμμ΄ μ΄λ€ apiλ₯Ό κ°λ°νλ€κ° μ΄λ€ λ¬Έμ κ° μμκ³ , μ΄λ»κ² ν΄κ²°νλμ§ μκ°μ λ΄μ΄ μ΄μΌκΈ° νκ³ μΆλ€. |
μ μμ§ | μ΄λ² DevOps νλ‘μ νΈλ₯Ό ν΅ν΄ μ§κΈκΉμ§ νμ΅νλ λ°±μλμ νλ‘ νΈμλ κ°λ°μμ μμνμ¬, νλ‘μ νΈλ₯Ό μ€μ λ‘ λ°°ν¬νλ κ³Όμ κΉμ§ μ λ°μ μΌλ‘ κ²½νν μ μμμ΅λλ€. μ§μ κ°λ°ν νλ‘ νΈμλμ λ°±μλ νλ‘μ νΈλ₯Ό Docker μ΄λ―Έμ§λ‘ λ³ννκ³ , νμ κ³Όμ μμ μ¬μ©ν GitRepositoryμ Jenkinsλ₯Ό WebhookμΌλ‘ μ°λνμ¬ κ°λ° μ μλμΌλ‘ λΉλ, ν μ€νΈ, Docker Hubμ λ±λ‘κΉμ§ μ΄λ£¨μ΄μ§λ CI/CD νκ²½μ ꡬννμμ΅λλ€. λν, Docker μ΄λ―Έμ§λ₯Ό κΈ°λ°μΌλ‘ μμ±λ Kubernetes νμΌλ€μ GitHub λ ν¬μ§ν λ¦¬λ‘ κ΄λ¦¬νλ©°, ArgoCDμ μ°κ³νμ¬ λ°°ν¬ κ³Όμ μ μλννλ μμ€ν μ ꡬμΆνμμ΅λλ€. μ΄λ¬ν CI/CD νκ²½μ ꡬννλ©° νλ‘μ νΈμ μ 체μ μΈ νλ¦κ³Ό DevOpsμ ν΅μ¬ κ°λ μ μ§μ 체νν μ μμ΄ λμμ΄ λ§μ΄ λμλ νλ‘μ νΈμμ΅λλ€. μ΄λ² κ²½νμ λ°νμΌλ‘ μ»μ κ²½νμ μ΅μ’ νλ‘μ νΈμ μ λͺ©μμΌ λμ± λ°μ λ νλ‘κ·Έλ¨μ λ§λ€μ΄λ³΄κ³ μΆμ΅λλ€. |
μ΅λν | μ΄λ² νλ‘μ νΈλ μ§κΈκΉμ§ μ§ννλ νλ‘μ νΈμ λ€λ₯΄κ² μ£Όμ΄μ§ μκ°μ΄ κ°μ₯ 짧μλ€. 짧μ μκ°λμ μ€κ³λΆν° λ°°ν¬κΉμ§ μμ±μ νλ λ΄μ€ μλ ꡬμ±μ μꡬνλ νλ‘μ νΈμλ€. λ΄μ€μλ ꡬμ±μ νλ μ€ μ΄ν ν¬μΈνΈλ‘ μ¬λ¬κ°μ§λ₯Ό μ‘κ² λμλλ° λ΄κ° νκ² λ μν μ΄ μλΌμ€ν± μμΉλΌλ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©νλ μμ μ΄μλ€. κ°λ¨νκ² μ 리νλ©΄ μλΌμ€ν± μμΉλ κΈ°μ‘΄ RDBμ μ‘°νλ³΄λ€ ν¨μ¬ λΉ λ₯΄κ² κ²μμ ν μ μλ μ₯μ μ΄ μλ€. κ·Έ λΆλΆμ νμ©ν΄ λ§μ μμ μ 보λ₯Ό λΉ λ₯΄κ² μ‘°νν μ μλ κΈ°λ₯κ³Ό λλΆμ΄ μ€μ κ²μμμ§μμ νμ©νλ― κ²μμ΄λ₯Ό μμ±ν΄κ°μ λ°λΌ λ°μ΄ν°μ μ‘°νλ₯Ό λΉ λ₯΄κ² ν΄μμ μλμμ± κΈ°λ₯κΉμ§ μΆκ°νκ² λμλ€. μ²μ κΈ°μ‘΄ μ€κ³λ μλΌμ€ν± μμΉνλ©΄ νμ λ°λΌμ€λ ELK(μλΌμ€ν±μμΉ, λ‘κ·Έ μ€νμ, ν€λ°λμ μ€μλ§)μ κΈ°λ₯μ€ μλΌμ€ν± μμΉμ λ‘κ·Έ μ€νμλ₯Ό μ°λν΄μ μμ μ νκ³ μ νλ€. μ€νλ§μμ μλΌμ€ν± μμΉμ μμ²μ νλ©΄ νμν κ°μ μ°Ύμ 리ν΄ν΄μ£Όλ κΈ°λ³Έμ μΈ κ΅¬μ‘°μμ λ°μ΄ν°λ₯Ό μΈλ±μ±ν΄μ£Όλ μν μ νλ κ²μ΄ λ‘κ·Έμ€νμμλ€. νμ§λ§ λλΉ μ°λμ νμν jarνμΌ μΈμμ΄ λ‘κ·Έμ€νμμμ μλμ΄ μ€νλ§μμ μΈλ±μ± ν μμ μ μ§ννλ μμΌλ‘ λ°κΎΈμλ€. λ°μ΄ν° μλ λ§μ λΉλκΈ°μ²λ¦¬λ₯Ό νκ³ , κ±°κΈ°μ λμ€μ νμλ€κ³Ό μ½λλ₯Ό ν©μΉλ©΄μ μκ°μ§λ λͺ»νλ CORS μ€μ κΉμ§ νκ² λμλ€. μ§κΈκΉμ§ λμ κ°λ°μ 무μμ μ λ₯Ό λ§λ€μ΄ λκ°λ κ²μ΄μμ§λ§ μ΄λ² νλ‘μ νΈλλ μλ‘κ² λ§λ€μ΄μ§ κΈ°μ μ νλ‘μ νΈμ μ μ©μ νλ κ³Όμ μ΄ κ΅μ₯ν μλ€λ₯Έ κ²½νμ΄μκ³ μ¦κ±°μ λ€. μΆνμ νμλ€κ³Ό μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ¬μ©κ° λΆλͺν λ¬Έμ λ€μ 곡μ νκ³ κ°μ΄ μ±μ₯νκ³ μΆλ€λ μκ°μ΄ λ€μλ€. |
νλμ£Ό Β Β Β Β Β Β Β Β Β Β Β Β | μ΄λ² νλ‘μ νΈμμλ λμλ₯Ό μΆμ²ν΄μ£Όλ μ±λ΄μ ꡬκΈμ Gemini APIλ₯Ό μ΄μ©ν΄ λ€λ€λ³΄κΈ°λ‘ νμ΅λλ€. μμ μ²μ λ€λ€λ³΄λ κΈ°λ₯μ΄λΌ μμ보며 곡λΆλ ν΄λ³΄κ³ μ²μμλ μ±GPT APIλ₯Ό μ΄μ©νλ €κ³ νλ€κ° μλ΅ ν ν° μκ° λ무 μ μ΄ μ μμ μΈ μ΄μ©μ΄ μ΄λ €μΈκ² κ°μ ν ν°μ μλμ μΌλ‘ μ¬μ μκ² μ 곡ν΄μ£Όλ ꡬκΈμ Gemini APIλ‘ AIλ₯Ό λ°κΎΈλ κ³Όμ μμ μκ°μ΄ μλͺ¨λκΈ°λ νμμ΅λλ€. νμ§λ§ λ€λ£¨λ κ³Όμ μμ API νΈμΆμ λν΄ λ μμΈν μκ²λμκ³ , AIμκ²λ μ€μ μ λΆμ¬νμ¬ λ΄κ° μνλ λλ΅μ μ΄λμ΄ λΌ μ μλλ°, μ΄ μ€μ μ λΆμ¬νλ instructorλ₯Ό λ€λ£¨λ λ°©λ²μ λν΄ μμΈν μκ²λ κ² κ°μ΅λλ€. μμ¬μ΄μ μ νλ°νΈ λΆλΆμμ μ±λ΄μ΄ μ 곡ν μ± μ λͺ©μ νμ΄νΌ λ§ν¬λ₯Ό κ±Έμ΄ κ·Έ μ± μ μμΈ μ λ³΄λ‘ μ΄λν μ μλλ‘ νκ³ μΆμλλ° κ·Έλ¬μ§ λͺ»νμ μ΄ λ§μ΄ μμ¬μ μ΅λλ€. κ·Έλ¦¬κ³ μ κ° κΉνλΈλ±μ λ€λ£¨λ νμ μ μμ§ μ μνμ§ λͺ»ν΄ λ―Έμνμλλ° μ΄λ² νκ³Ό νλ‘μ νΈλ₯Ό νλ©΄μ νμ μ λ΅μ μ’λ λν μΌνκ² μΈμ°λ©° μ΄λ₯Ό μ μ©νλ κ³Όμ μμ λ§μ΄ λ°°μ°κ³ μ μνκ² λμ΄ μ λ€λ£° μ μκ² λ κ² κ°μ΅λλ€. |