์ฟ ๋ฒ๋คํฐ์ค ๋ณด์ ๊ด๋ จ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๋ฉด ์๋ง ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ , ๊ฐ์ฅ ๋ง์ด ๋ณด์ด๋ ๊ฒ์ด ํ๋ ์์ต๋๋ค. ์๋ง ์ฟ ๋ฒ๋คํฐ์ค ๋ฟ๋ง ์๋๋ผ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๋ชจ๋๊ฐ ์ ๊ฒฝ์จ์ผ ํ๋ ๋ถ๋ถ์ด์ฃ . ๋ฐ๋ก ๋ฃจํธ ๊ณ์ ๋นํ์ฑํ ์ ๋๋ค. ์ฆ, ์ปจํ ์ด๋ ๋ด ํ๋ก์ธ์ค์์ ๋ฃจํธ ๊ถํ์ ๋ชจ๋ ๋นํ์ฑํ ํ๋ ๊ฒ์ด์ฃ . ์ปจํ ์ด๋ ๋ด๋ถ์์ ์๋ฌด๋ ๋ฃจํธ ๊ถํ์ ์ฌ์ฉํ๊ฒ ํ๋ค๋ ๊ฒ์ ๋ชจ๋ฅด๋ ์ฌ๋์๊ฒ ์ง ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ๊ณผ ๋ค๋ฆ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปจํ ์ด๋์ ์ ์ํ ํ uname -a ๋ช ๋ น์ด๋ฅผ ์ณ๋ณด๋ฉด ํธ์คํธ์ OS ๋ฒ์ ์ ๋ณผ ์ ์์ต๋๋ค. ๋ฃจํธ ๊ถํ ๋นํ์ฑํ๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ๋๋ ์ค์ ํ ์ ์๊ณ , k8s ๋ก ํ๋๋ฅผ ๋ฐฐํฌํ ๋๋ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ด๋ป๊ฒ ๋ฃจํธ ๊ณ์ ์ ๋นํ์ฑํํ๊ณ ์์ ํ ํ๋๋ฅผ ๋ง๋๋์ง ์์..
์ง๋ ๋์์์ฟ ์์๋ [๋์์์ฟ ] ์ํ ์ง๊ธฐ feat. ๋ฏธ๋ PC ์กฐ๋ฆฝ์ ์งํํ๊ณ , ์ด๋ฒ ๊ธ์์๋ Proxmox ์ Kubernetes ๋ฅผ ์ค์นํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ผ ๋ฐ๋ก Proxmox ๋ฅผ ์ค์นํด์ค์๋ค. Proxmox ์ค์น Proxmox ๋ Window ์ IOS ์ฒ๋ผ OS ์ ํ ์ข ๋ฅ์ ๋๋ค. ์ฐจ์ด์ ์ด๋ผ๋ฉด Proxmox ๋ ๊ฐ์ ๋จธ์ ๊ณผ ์นํ์ ์ธ ํ๊ฒฝ์ ์ ๊ณตํด์ค๋๋ค. Proxmox ์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์. ์ฐ์ Proxmox ๋ฅผ ์ฌ๊ธฐ์ ๋ค์ด๋ฐ์ต๋๋ค. ์ดํ Rufus ๋ฅผ ์ด์ฉํด์ ๋ค์ด๋ฐ์ ISO ๋ฅผ dd ๋ชจ๋๋ก USB ์ ๊ตฌ์์ค๋๋ค. ๊ทธ๋ฐ ๋ค์ USB ๋ฅผ ๋ฏธ๋ PC ์ ๊ผฝ์ผ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค. ํฌ๊ฒ ํน๋ณํ ๋ถ๋ถ์ ์์ต๋๋ค. ubuntu ์ค์นํ๋ฏ ์ค์นํด์ฃผ์๋ฉด ๋ฉ๋๋ค. ์ค์น๊ฐ ์๋ฃ๋๋ฉด..
์ฟ ๋ฒ๋คํฐ์ค์๋ Audit ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ค๋ค ๋์น ์ฑ์ จ๊ฒ ์ง๋ง, Kube Api Server ์ ์ด๋ค API ๋ฅผ ํธ์ถํ๋์ง ๊ฐ์ํ๋ ๊ธฐ๋ฅ์ด์ฃ . ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ผ๋ก Audit ๊ธฐ๋ฅ์ ํ์ฑํ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ Audit ๊ธฐ๋ฅ์ ํ์ฑํํด์ ๋๊ฐ, ์ด๋ค ํ์๋ก, ์ด๋ค ๋ฆฌ์์ค๋ฅผ ํธ์ถ ํ๋์ง ๊ฐ์ํด๋ณด๊ฒ ์ต๋๋ค! ๋ ์ธ ๋๋์ฝ๋! Audit ๊ธฐ๋ฅ ํ์ฑํ control plane & data plane v1.26.1 ์์ ์งํ๋์์ต๋๋ค ์ฟ ๋ฒ๋คํฐ์ค ๊ณต์ ๋ฌธ์๋ฅผ ์ด๋ํ ํ Audit ์ ๊ฒ์ํด์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ฆญํด์ ๋ฌธ์๋ฅผ ํ์ธํฉ๋๋ค. ๋ฐ์ผ๋ก ์ญ์ญ ๋ด๋ ค์ ๋ก๊ทธ ๋ฐฑ์๋ ์น์ ์ผ๋ก ์ด๋ํฉ๋๋ค. /etc/kubernetes/manifests/kube-apis..
CKA ์ ์ด์ด CKS ๋ ์ทจ๋์ ์ฑ๊ณตํ์ต๋๋ค. CKS ๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ จ ์๊ฒฉ์ฆ ์ค ๊ฐ์ฅ ๋์ ๋ ๋ฒจ์ ์๊ฒฉ์ฆ์ ๋๋ค. ๋ฐ๋ผ์ ๋์ด๋๋ ๊ฝค ์๋ ํธ์ด์์ต๋๋ค. CKA ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์์ด์ 30๋ถ๋ ์๊ฑธ๋ ธ๋๋ฐ CKS ๊ฐ์ ๊ฒฝ์ฐ๋ 2์๊ฐ์ ๋ค ์ฐ๊ณ ๋ ์ด 16๋ฌธ์ ์ค 2๋ฌธ์ ๋ฅผ ๋ชปํ์์ด์.. ์ํ ์์ฒด๊ฐ ์์ด๋ก ์งํ๋๊ณ , ์๋ฌด๋๋ ์ ๋๋ก ๋ฌธ์ ๋ฅผ ํ์๋์ง ํ์ธํด์ผ ํ๋ Validation ๋ถ๋ถ์์ ๊ฝค๋ ์๊ฐ์ ๋ง์ด ์์์ผ ํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ง ์์ฒญ ์ด๋ ต๋ค๋ ๋๋๋ณด๋ค๋ ์ฃผ์ด์ง ์๊ตฌ์ฌํญ์ ์ ์ง์ผฐ๋์ง ํ์ธ(Validation) ํ๋ ๊ณผ์ ์ ๊ฝค ์๊ฐ์ ์์์ต๋๋ค. ํด์ํ์๋ฉด ์ด๋ ์ต๋๋ค. ์ด ์๊ฒฉ์ฆ์ ์ทจ๋ํ ์ฌ๋์ ์๋ จ๋ Kubernetes ์ค๋ฌด์์ ๋๋ค(CKA ์๊ฒฉ์ฆ ๋ณด์ ๋ก ์ ์ฆ๋จ). ์๊ฒฉ ์ทจ๋์๋ ๋น๋, ..
๋งค์ฐ๋งค์ฐ๋งค์ฐ ์ค์! Karpenter v0.32 ๋ฒ์ ๋ถํฐ ๋ฆฌ์์ค ์ด๋ฆ๋ค์ด ๋ณ๊ฒฝ๋์ด ์ฐธ๊ณ ๋ฐ๋๋๋ค. ๊ฐ๋ ์ ๋๊ฐ์ต๋๋ค. (ex. Provisioners -> NodePools) AWS EKS ๋ฅผ ํตํด ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๋ฉด Data Plane (์ดํ Node) ๋ฅผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ถํ ์ ์์ต๋๋ค. Managed Node Group, Fargate ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ AWS Auto Scaling, Karpenter ๊ฐ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ Karpenter ๋ฅผ ํตํด AWS Auto Scaling ๋ณด๋ค ์ ์ฐํ๊ฒ Node ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ ์ ํฉ๋๋ค. ์ฐ์ ๊ฐ๋จํ๊ฒ ์์๋ณด๋๋ก ํ์ฃ . ๋ ์ธ ๋๋์ฝ๋! Karpenter ๊ฐ ๋ญ์ฃ ? ์ฌ๊ธฐ์ ๋งํ๋ ๋ ธ๋ == ์ธ์คํด์ค ..
ํ์ด์ฌ์๋ ์ ๋ง ์ ์ฉํ ํจ์๊ฐ ๋ง์ต๋๋ค. ๊ทธ ์ค Counter ๋ ์ ๊ฐ ์๊ฐํ๊ธฐ์ ๊ฐ์ฅ ์ ์ฉํ ํจ์ ์ค์ ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Collections ๋ชจ๋ ์ค ํ๋์ธ Counter ํจ์์ ๋ํด์ ์์๋ณด๊ณ 2019 ์นด์นด์ค ๊ฒจ์ธ ์ธํด์ฝ ํํ ์ ๋ฐ๋ก ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋! Collections ์ Counter() Counter ๋ ๋ฆฌ์คํธ๋ ๋ฌธ์์ด์ ๊ฐฏ์๋ฅผ dict ํ์ ์ผ๋ก ๋ฐํํด์ฃผ๋ ํจ์์ ๋๋ค. ๋ง๋ก ๋ฐฑ๋ฒ ์ค๋ช ํ๋ ๊ฒ๋ณด๋ค ํ๋ฒ์ ์์ ๊ฐ ๋ณด๋ ๊ฒ์ด ๋ ์ข๊ฒ ์ฃ ? Counter(["I", "am", "Iron", "man", "!", "!"]) # Counter({'!': 2, 'I': 1, 'am': 1, 'Iron': 1, 'man': 1}) Counter(["I", "am", "..
๋๊ตฌ๋ ํ๋ฒ ์ฏค์ ์๋ขฐ๋ฉ๊ฑฐ์ ๊ณ ์์ด์ ๋ํด์ ๋ค์๊ฑฐ๋ ๊ด๋ จ ๋ฐ์ ๋ณด์ จ์ ๊ฒ๋๋ค. ๊ทธ๋๋ ํน์ ๋ชจ๋ฅด์๋ ๋ถ๋ค์ ์ํด ๊ฐ๋จํ ์๋ ค๋๋ฆฌ์ฃ . ๊ณ ์์ด๋ฅผ ๋ณด์ด์ง ์๋ ์์์ ๋ฃ๊ณ , ๊ทธ ์์ 50:50 ํ๋ฅ ๋ก ๊ณ ์์ด๋ฅผ ์ฃฝ์ด๋ ๋ ๊ทน๋ฌผ์ ๋ฃ์์ ๋ ๊ณ ์์ด๋ ์ฃฝ์๊น์? ์ด๊น์? ์ผ๋ฐ ์ธ๊ณ์์๋ ์ฃฝ์๋ค, ์ด์๋ค ๋ผ๊ณ ํํํ์ง๋ง ์์์ญํ ์ธ๊ณ์์๋ ์ด๋ฅผ ์ฃฝ์๊ณผ ์ถ์ด ์ค์ฒฉ๋ ์ํ๋ผ๊ณ ํํํฉ๋๋ค. ์ฆ, ์ด์์์ผ๋ฉด์ ์ฃฝ์ด์๋ค ๋ผ๊ณ ํฉ๋๋ค. ์ค๋ ๊ธ์์ ์๊ฐํ Fargate (ํ๊ฒ์ดํธ) ๋ํ ์๋ขฐ๋ฉ๊ฑฐ์ ๊ณ ์์ด์ ๋น์ทํ ๊ฐ๋ ์ ๋๋ค. (๋๋ง ๊ทธ๋ ๊ฒ ์๊ฐํ ์๋..) Fargate ๋ ๋ฌด์์ผ๊น? ์ฐ๋ฆฌ๋ ๋ณดํต AWS ๋ฅผ ์ด์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ค๊ณ ํ๋ฉด EC2 ๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ธ์คํด์ค ๋ด๋ถ์ ์ปจํ ์ด๋๋ ์ง์ ํ๋ก์ธ์ค๋ก..
ํ์ด์ฌ์์ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ฃ . ๊ทธ ์ค ์ ๊ทํํ์์ ์ด์ฉํ๋ฉด ์ข ๋ ๋ค์ํ๊ณ ์ฝ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ ํ์ด์ฌ์์ ์ ์ฉํ ๋ชจ๋ ์ค ์ ๊ท์์ ์ฒ๋ฆฌํด์ฃผ๋ re ๋ชจ๋์ ์ด์ฉํด์ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฐฐ์ด๊ฑธ ํ ๋๋ก ์นด์นด์ค ๋ฌธ์ ์ธ [3์ฐจ] ํ์ผ๋ช ์ ๋ ฌ์ ์ ์ฉํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋! re ๋ชจ๋์ ํจ์๋ค re ๋ชจ๋์๋ ๋ค์ํ ํจ์๋ค์ด ์กด์ฌํฉ๋๋ค. ๊ทธ ์ค ์๊ณ ๋ฆฌ์ฆ ํ์ด์ ์ ์ฉํ ๊ฒ ๊ฐ์ ํจ์๋ค์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. search match fullmatch findall finditer sub subn split search() ๋ฌธ์์ด์์ ํจํด์ด ์ผ์นํ๋ ์ง ํ์ธํฉ๋๋ค. print(re.search("A", "..
์ค์!! ARC ๊ฐ Github Official ํ๋ก์ ํธ๊ฐ ๋จ์ ๋ฐ๋ผ ์๋์์ ๋ณด์ฌ๋๋ฆฐ ARC ๊ด๋ จํ ๋ฆฌ์์ค๋ค์ ์ ๋ถ ๊ตฌ ๋ฒ์ ์ ๋๋ค. ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์! Action Controller Runner (์ดํ ARC) ๋ ํ๋ ๋จ์ Self Hosted Runner ์ ๋๋ค. ์ฆ, ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ํ๋๋ฅผ Self Hosted Runner ๋ก ์ง์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์คํ์์ค์ฃ . ARC ์ ๋ํ ์ ๋ณด๋ ์ฌ๊ธฐ๋ฅผ ํ์ธํด์ฃผ์ธ์. ๊ทผ๋ฐ ARC ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์์ต๋๋ค. ๋ฐ๋ก ARC ์ ์ํด ๋ง๋ค์ด์ง๋ ํ๋๋ Github Action ์ Job ์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ ์ ๊ฑฐ๋๊ณ ๋ค์ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ HostPath ๋ EFS ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด Job ์ ์คํํ ๋ ์์ฑํ๋ Java SDK, N..
ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ด์ํ ๋ ์จํ๋ก๋ฏธ์ค๋ณด๋ค ํธํ ์ ์ค ํ๋๊ฐ ๋ฐ๋ก ๋ณผ๋ฅจ ๊ด๋ฆฌ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. EBS CSI Driver ๋ฅผ ์ค์น ํ Storage Class, PV ๊ทธ๋ฆฌ๊ณ PVC ๋ฅผ ํตํด ์ฝ๊ฒ AWS EBS ๋ฅผ ํตํด ๋ณผ๋ฅจ์ ์ธ์ ์ด๋์๋ ๊ฐ์ ธ๋ค ์ธ ์ ์์ฃ . ํํธ, ์ฟ ๋ฒ๋คํฐ์ค์์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ณผ๋ฅจ์ ์ฌ์ฉํ ์ ์๋๋ฐ์. ์ปจํ ์ด๋๊ฐ ๊ณต์ ๋ฅผ ๊ฐ๋ฅ์ผ ํด์ฃผ๋ EmptyDir, ๋ ธ๋์ ๋ณผ๋ฅจ์ ํตํด ํ๋๊ฐ ๊ณต์ ๋ฅผ ๊ฐ๋ฅ์ผ ํด์ฃผ๋ HostPath, NFS ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ NFS ๊ธฐ๋ฅ ๋ฑ์ด ์์ต๋๋ค. ๊ทธ๋ผํ๋๋ฅผ ๋ ธ๋์ ๋ฐฐํฌํ ๋, ๊ทธ๋ผํ๋์ ์ค์ ํ์ผ์ ๊ทธ๋ผํ๋๊ฐ ๋ฐฐํฌ๋ ๋ ธ๋์ ๋ณผ๋ฅจ์ ์ ์ฅ์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ง์ฝ ๊ทธ๋ผํ๋ ํ๋๊ฐ ๋ค๋ฅธ ๋ ธ๋์ ๋ฐฐํฌ๊ฐ ๋ ๊ฒฝ์ฐ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ ๊ทธ๋ผํ๋ ์ค์ ์ ..
๊ทธ๋์ ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋๋ฅผ ์ด์ฉํด์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํ๊ฒฝ์ ๊ตฌ์ถํ์ต๋๋ค. ๋ฌธ์ ์์ด ์ ์ฌ์ฉํ๊ณ ์์์ง๋ง, ์ญ์๋ ๋ฌธ์ ๋ ๋น์ฉ์ด์์ต๋๋ค. ๋ง์คํฐ ๋ ธ๋, ์์ปค ๋ ธ๋ ์ด 2๋๋ง ๋์ด๋์๋ ์กฑํ ๋ฌ์ 5๋ง์ ์ด์์ ๋์์ฃ ๐ข playground ๋ฅผ ์ฌ์ฉํ๋คํด๋ ์๋๊ฐ ๋๋ฆฌ๊ณ ์๋ฌด๋๋ ํ๋ฐ์ฑ์ด๋ค ๋ณด๋ ๋ถํธํจ์ด ๋ง์์ต๋๋ค. ๊ทธ๋์ ๊ฒฐ๊ตญ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ PC ๋ฅผ ํ๋ ์ฅ๋งํด์ผ๊ฒ ๋ค ์๊ฐ์ ํ๊ณ , A to Z ๊น์ง ๊ตฌ์ฑ์ ํด๋ณด๊ณ ์ถ์ด PC ๋ํ ๋ถํ๋ณ๋ก ๊ตฌ๋งคํ์ฌ ์กฐ๋ฆฝํ๊ณ ์ ํ์ต๋๋ค. ์ด๋ค ๋ถํ๋ค์ด ์์๊น? ๋ถํ์ ์๋์ ๊ฐ์ต๋๋ค. AMD Ryzen 5700G 16core ASRock DeskMini X300 ๋ฒ ์ด๋ณธ ์ผ์ฑ PM9A1 M.2 NVMe SSD 1TB ์ผ์ฑ DDR4 PC-25600 32G ๋ ธํธ๋ถ์ฉ..
์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ Action Controller Runner (์ดํ ARC) ๋ฅผ ์ด์ฉํด์ ํ๋๋ฅผ Self Hosted Runner ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ARC ๊ตฌ์กฐ๋ ์์ ๊ฐ์ต๋๋ค. Self Hosted Runner ๋ก ์ฌ์ฉํ ํ๋๋ฅผ RunnerDeployment ๋๋ RunnerSet ์ผ๋ก ๋ฐฐํฌํ ์ ์์ฃ . RunnerDeployment ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ Deployment ์ ๋์ผํ๊ฒ ๋์ํ๊ณ , RunnerSet ์ StatefulSet ๊ณผ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. ๋ํ ๋ฐฐํฌํ๊ฒ ๋๋ฉด ํ๋ ์์ 2๊ฐ์ง ์ปจํ ์ด๋ ๋์ํ๊ฒ ๋๋๋ฐ, ํ๋๋ Github Action Job ์ ์ฒ๋ฆฌํ๋ Runner ์ปจํ ์ด๋, ๋ ํ๋๋ Docker ๊ด๋ จ ์ผ์ ์ฒ๋ฆฌํ๋ Docker ์ปจํ ์ด๋์ ๋๋ค. ์ต์ ์ ํตํด Runner..
Istio ๋ ํํ K8S ํด๋ฌ์คํฐ ๋ด์์ ์๋น์ค ๋ฉ์ ์ญํ ์ ํด์ค๋๋ค. ์๋น์ค ๋ฉ์ ๋ฟ๋ง ์๋๋ผ Nginx Ingress, ELB Ingress ์ฒ๋ผ Ingress ์ญํ ๋ํ ํด์ค๋๋ค. Istio Ingress Gateway ๊ฐ ์ ์ ๋ช ์นญ์ด๋ ์ฝ๊ฒ Istio Ingress ๋ก ์ง์นญํ๋๋ก ํ์ฃ ๐ค EKS ์ ๊ฐ์ ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋๋ฅผ ์ด์ฉํด์ Load Balancer Service ๋ฅผ ์์ฑํด์ฃผ๋ฉด ์๋์ผ๋ก CLB ๊ฐ ํ ๋น๋ฉ๋๋ค. ๋ฐ๋ผ์ Istio Ingress ๋ํ CLB ๋ก ํ ๋น์ด ๋ฉ๋๋ค. CLB ๋ ์์ผ๋ก AWS ์์ deprecated ๋๊ธฐ ๋๋ฌธ์ Network Load Balancer(์ดํ NLB) ๋ Application Load Balancer(์ดํ ALB) ๋ก ๋์ฒด๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธ์..
Nginx ๊ธฐ๋ฐ์ Pod ๋ด์์ S3 ์ Mount ํ๊ธฐ ์ํด goofys ๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ์์ต๋๋ค. (goofys ๋ง๊ณ EBS ๋ EFS ๋ ์์๋ฆฌ์คํธ์ ์์์ง๋ง, goofys ๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ํ๋จํ์ฌ goofys ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค) ๊ทธ๋ฆผ์ผ๋ก ํํํ์๋ฉด ์๋์ ๊ฐ์ฃ . Nginx ๊ฐ provisioning ๋ ๋ ConfigMap ์ผ๋ก init.sh ๋ฅผ ์ฃผ์ด goofys ๋ฅผ ๋ง์ดํธ ํ ํ ์คํ๋๋๋ก ํ์ต๋๋ค. ์ด๋ฐ์์ผ๋ก ๋ง์ด์ฃ . #!/usr/bin/env sh set -eu wget https://github.com/kahing/goofys/releases/latest/download/goofys chmod +x goofys /goofys /var/nginx ... nginx -g 'daemo..
์ฟ ๋ฒ๋คํฐ์ค๋ ๋ค๋ฅธ ํ๋ซํผ์ฒ๋ผ ์ธ์ฆ(Authentication)/์ธ๊ฐ(Athorization) ๋ฅผ ์ ๊ณตํด์ค๋๋ค. ๋ฐ๋ผ์ ์ธ์ฆ๋ฐ์ง ๋ชปํ ์ฌ์ฉ์๋ผ๋ฉด 401 (UnAuthorized) ๋ฅผ ์๋ต ๋ฐ๊ณ , ์ธ์ฆ์ ๋์์ง๋ง ๊ถํ์ด ์๋ค๋ฉด 403(Forbidden) ์๋ต์ ๋ฐ๊ฒ ๋์ฃ . ์์ฃผ ํ๋ฒํ ์ธ์ฆ/์ธ๊ฐ ํ๋ก์ธ์ค์ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ๊ฐ ์๋ฃ๋์๋ค๊ณ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์ ๋ฐ๋ก ์ ์ฉํ ์ ์๋ ๊ฑด ์๋๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ์์ฒญ์ ์ ์ฉํ๊ธฐ ์ง์ ํ ๊ตฐ๋ฐ๋ฅผ ๋ ๋ค๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก Adimission Controller ์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Adimission Controller ์ ๋ํ ๊ฐ๋ ์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ณ , Adimission Controller ๋ฅผ ๊ตฌํํด๋ณผ ์๊ฐ์ ๋๋ค. ๐ Admission Controller ๊ฐ..
Iptables ๋ฅผ ์์๋ณด๊ธฐ ์ ์ ๋จผ์ Netfilter ์ ๋ํด ์์๋ณด์ฃ ! Netfilter ์ Iptables AWS EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ Security Group ์ด๋ผ๋ ๊ฒ์ ์ค์ ํฉ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ์ธ๋ถ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์กฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐฉํ๋ฒฝ ๊ธฐ๋ฅ์ด์ฃ . EC2 ์ธ์คํด์ค ์๋จ์ ์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ์๋ง ๋ฌผ๋ฆฌ์ ์ธ ๊ธฐ๊ณ๊ฐ ์์ด์ ์ด๋ค ํธ๋ํฝ์ ํ์ฉํ๊ณ , ์ด๋ค ํธ๋ํฝ์ ๊ฑฐ๋ถํ๊ฒ ์ฃ . Security Group ์ด ํ๋์จ์ด ๋ฐฉํ๋ฒฝ ์ด๋ผ๋ฉด Netfilter ๋ ์ํํธ์จ์ด ๋ฐฉํ๋ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. Netfilter ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค. ์ํํธ์จ์ด ๋ฐฉํ๋ฒฝ ํจํท ํํฐ๋ง ๋ฆฌ๋ ์ค ์ปค๋ ๋ด๋ถ์ ํ๋ ์์ํฌ ํฌํธ ์ฃผ์, ๋ณํ, ํฌํธ ํฌ์๋ฉ ๋ฐ ํจํท ๋ณ๊ฒฝ ๋ผ์ฐํ ์ ํ์ ๋ฐ์ดํฐ ๋ฐ..
ํ ๋ผํผ์ Code ๋ก ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ๋์์ฃผ๋ IaC Tool ์ ๋๋ค. ํนํ AWS ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ๋ ์ฐธ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ฃ . module ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์๊ฒ VPC, EKS, ELB ๋ฅผ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ํ ๋ผํผ์ ์ด์ฉํด EKS ๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์์ ๊ฒช์ ๋ฌธ์ ์ ๊ณผ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณผ๊น ํฉ๋๋ค. ์ฐ์ Apply!! terraform-aws-eks ์ ๊ฐ๋ณด๋ฉด ์์ฃผ ์น์ ํ๊ฒ ํ ๋ผํผ์ ์ด์ฉํด EKS ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ ค์ค๋๋ค. ๋ฌด์์ eks ๋ชจ๋์ import ํ๊ณ example ๊ณผ EKS Best Practices Guides ์ฐธ๊ณ ํ์ฌ ํ ๋ผํผ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. provider "kubernetes" { h..
์ Helm ์ ์ฌ์ฉํ๋์? Helm ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ ์ ์ ์ ํ์ํ์ง ๋จผ์ ์์๋ณด์ฃ ! ๐ง Consistency ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ์๋ ์ด๋ฏธ์ง์ฒ๋ผ yaml ๋ก ์์ฑํด์ฃผ์ด์ผํฉ๋๋ค. yaml ์ด 1,2 ๊ฐ๋ผ๋ฉด ๊ด๋ฆฌ๊ฐ ์ด๋ ต์ง ์๊ฒ ์ง๋ง 10๊ฐ ์ ๋๋ง ๋๋ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ํ๋ค๊ณ ๋ถํธํด์ง๋๋ค. ๋ํ kubectl edit์ ํตํด ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธ ํด์ค ์ ์๋๋ฐ, ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ค๋ฉด ์ผ๊ด์ฑ(Consistency) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Revision History ์ด๋ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด Deploy, ConfigMap, Service, Ingress yaml ๋ก ๋ฐฐํฌ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์ฃ . ์ด๋ ConfigMap ๊ณผ Service ๊ฐ ์ ๋ฐ์ดํธ ๋์ด์ yaml ์ด ๋ณ..
EFS (Elastic File System) ์ AWS ์ ํ์ผ ์์คํ ์๋น์ค์ ๋๋ค. EBS, S3 ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ๊ฐ ์ฐ์์ ๋ชฉ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ชฉ์ ์ ๋ง๊ฒ ์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค. EFS S3 EBS ์ฌ์ฉ ์ผ์ด์ค ํ๋ผ์ด๋น ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ฐ์ดํฐ ๋ฐฑ์ ์น ์๋น์ค ๋ฐ ์ปจํ ์ธ EC2 ์ ๋ถํ ๋ณผ๋ฅจ ๊ทธ๋ฆฌ๊ณ AWS DataSync ๋ฅผ ์ด์ฉํ๋ฉด ์ ์ฅ์์ ๋ฐ์ดํฐ๋ค์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค. ๊ฐ์ VPC ๋ด ์ ์ฅ์๋ ๋ฌผ๋ก ๋ค๋ฅธ VPC, ๊ต์ฐจ ๊ณ์ ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค. โ ๋ค๋ฅธ VPC, ๊ต์ฐจ ๊ณ์ ์ ์๋ก์ VPC ๊ฐ Peering ๋๊ฑฐ๋ TGW ๋ก sharing ๋ ์ํ์ฌ์ผ ํฉ๋๋ค ์์ธํ ๋์ ๋ฐฉ์์ ํ์ธํ๋ ค๋ฉฐ ์ฌ๊ธฐ๋ฅผ ๋๋ฌ์ฃผ์ธ์ ๊ทธ๋ผ ๊ฐ๋จํ๊ฒ ํ๋ฒ DataSy..
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ฒ์ User Account ์ Service Account ๋ฅผ ์ ํ์ ๋ ๋จ์ํ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์๊ฒ ์๊ฒฉ ์ฆ๋ช ํ๋ ๋ฆฌ์์ค์ธ๊ฐ๋ณด๋ค ํ๊ณ ๋์ด๊ฐ๋ ์ ์ด ์์ต๋๋ค. ์ดํด๊ฐ ์๋์ ๊ทธ๋ฅ ๋์ด๊ฐ๋.. ๊ทธ๋์ User Account ๋ Service Account ๋ ๋น์ทํ๊ฑฐ !! ๊ฐ์ ๊ฑฐ !! ๋ผ๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์์์ฃ .. ํ์ง๋ง ์ด ๋์ ๋ถ๋ช ๋ค๋ฆ ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ด์ ์กด์ฌํ๋ ์์์ ๋ํ ์ ๊ทผ์ ์ํ 2๊ฐ์ง์ account ํ์ ์ด ์กด์ฌํฉ๋๋ค. User Account Service Account ์ฟ ๋ฒ๋คํฐ์ค ๊ณต์ ๋ฌธ์์๋ ์ด์ ๊ฐ์ด ๋์์์ต๋๋ค. ์ฌ์ฉ์ ์ด์นด์ดํธ๋ ์ฌ๋์ ์ํ ๊ฒ์ด๋ค. ์๋น์ค ์ด์นด์ดํธ๋ ํ๋์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ํ ๊ฒ์ด๋ค. 100% ๋ง๋ ๋ง์ด์ง๋ง..
๐ eksctl ๊นํ ๐ eksctl ๊ณต์ ๋ฌธ์ ๐ eksctl config file example eksctl ์ค์น curl --silent --location "(uname -s)_arm64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin eksctl version EKS ๊ตฌ์ฑ eks ๋ ์๋ง์กด์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ด๋ฉฐ, eksctl ์ eks ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์ปค๋งจ๋ ํด eksctl ๊ณต์ ๋ฌธ์๋ ๊ต์ฅํ ์น์ ํ ํธ์ด๋ผ๊ณ ์๊ฐ ๐ก eksctl ์ EKS ๋ฅผ ์ํ ์ปค๋งจํธ ํด์ด๋ฏ๋ก aws configure ๊ฐ ๋ ์ํ์ฌ์ผ ํจ aws ๋ก๊ทธ์ธ aws configure 1. Using Config Files (๊ฐ์ฅ ๊ธฐ๋ณธ) apiVersi..
S3๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ฒํท ๋ด ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ํ ํ ์ ์์ต๋๋ค. ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ํ์ฑํ ํ๊ฒ ๋๋ฉด ์์์ ์์ ํ๊ฒ ๋ณดํธํ ์ ์์ง๋ง, ์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํด s3 ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ S3๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ํ๋ฉด์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ฃผ๋๋ฐ, ๊ทธ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ณ ์ ํฉ๋๋ค. Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)/๋ค์ด๋ก๋(GET) ํ๊ธฐ Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)๋ฅผ ์งํํ๊ณ , ๋ค์ด๋ก๋๋ ์๋ฒ๋ฅผ ํ๋ก์๋ก ๋์ด ์๋ฒ์์ S3์ ์ ๊ทผํ์ฌ ๋ค์ด๋ก๋(GET)ํ๊ธฐ Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)๋ฅผ ์งํํ๊ณ , ๋ค์ด๋ก๋๋ goofys๋ฅผ ์ฌ์ฉํ์ฌ S3..
์ด ๊ธ์ ๋ด์ฉ์ [์ดํํฐ๋ธ ์ฝํ๋ฆฐ]์ ์ฐธ๊ณ ํฉ๋๋ค. ๋๋ก๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ฌํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ ์ฝ๋์ฒ๋ผ ๋ง์ด์ฃ . data class Player( val id: Int, val name: String, val points: Int ) val player = Player(0, "Gecko", 9999) data ํ์ ์๋ ์๋์ ํจ์๋ค์ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค. toString equals ์ hashCode copy componentN(component1, component2 ๋ฑ) toString ํด๋์ค์ ์ด๋ฆ๊ณผ ๊ธฐ๋ณธ ์์ฑ์ ํํ๋ก ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ์ถ๋ ฅ ํด์ค๋๋ค. ์ฃผ๋ก ๋ก๊ทธ ์ถ๋ ฅ์ด๋ ๋๋ฒ๊น ํ ๋ ์ฌ์ฉํฉ๋๋ค. println(player) // Player(id=0, name=Gecko, p..
์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ (์งํ) ๊ตฌํ AuthController @RestController @RequestMapping("/auth") class AuthController( private val authService: AuthService ) { /** * token ์์ฑํด์ ๋ณด๋ด์ฃผ๊ธฐ */ @GetMapping("/login") fun login(@AuthenticationPrincipal oAuth2User: OAuth2User): ResponseEntity { return ResponseEntity.ok(authService.login(oAu..
์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ (์งํ) JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ๊ตฌํ JwtFilter class JwtFilter( private val jwtProvider: JwtProvider ) : OncePerRequestFilter() { override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain ) { val jwt = jwtProvider.resolveToken(request) if (StringUtils.hasText(jwt) && ..
์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ (์งํ) ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ๊ตฌํ @Component class JwtProvider( private val memberRepository: MemberRepository ) { companion object { private const val AUTHORITIES_KEY = "auth" private const val BEARER_TYPE = "bearer" private const val ACCESS_TOKEN_EXPIRE_TIME = (1000 * 60 * 30) private const val REFRESH_TOKEN_EXPIRE_TIME..
์ด๋ฒ ๊ธ์์๋ Spring Security + Google Oauth2 + JWT๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. ์งํํ๊ธฐ ์์ Google Oauth2 Client_ID, Client_Secret๋ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์ผ์๊ธธ ๋ฐ๋๋๋ค :) ์๋์ ๊ฐ์ ์์๋ก ์งํ๋ฉ๋๋ค. JWT ์์ฑํ๊ธฐ (์งํ) JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ์ด๋ฒ ๊ธ์์๋ JWT ์์ฑํ๋ ๋ถ๋ถ์ ๋ํด ์งํํฉ๋๋ค. ๊ตฌํ build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.6.8" id("..
์ฌ์ฌ์ฉ์ ์ํ ๊ณผ๋ํ ์ ์ฐ์ฑ ๋ค์ํ ํ์ ์ ๋์ผํ ๋ก์ง์ ์ ์ฉํ๊ธฐ ์ํด ์ฝ๋ ์ฌ์ฌ์ฉ์ ๊ณผ๋ํ๊ฒ ํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ถ Any๋ก ๋ฐ๋ ๊ฒ์ด ๋ํ์ ์ธ ์์์ ๋๋ค. open class Car class K3 : Car() class Avante : Car() //โ์ฐจ์ ๋ํ ์ค๋ช ์โ ํจ์ fun getInstruction(car: Array) { println("car = ${car.size}") } ๋ง์ด ๊ทน๋จ์ ์ธ ์์ ์ด๊ธฐ๋ ํฉ๋๋ค.. open class Fruit class Apple : Fruit() fun main() { val k3 = K3("k3", "๊ธฐ์") val avante = Avante("์๋ฐ๋ผ", "ํ๋") val fruits: Array = arrayOf(Apple())..
์ง๋ ํฌ์คํ ์์๋ OCP์ DIP๊ฐ ์๋ฐฐ ๋๋ ๊ฒฝ์ฐ์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์ด๋ฒ์๋ ์คํ๋ง์ด ์๋ ์์ ์๋ฐ๋ก ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค. ์ ๊น ์ง๋ ๊ธ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. public class DriverImpl implements Driver{ Car car = new K3(); Engine engine = new Electronic(); @Override public void findOwnCarDetail() { car.findCarName(); car.findCarBrand(); engine.WayToMove(); } } DriverImpl ์ญํ ์ ๊ตฌํ์ฒด๊ฐ ์ง์ new ํค์๋๋ก ์ ์ธ ๋์ด ์์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ผํ๋ณด๋ฉด OCP์ DIP๋ฅผ ์ ์งํจ ๊ฒ ๊ฐ์ง๋ง ์ฌ์ค ์๋๋ผ๊ณ ์ง๋ ํฌ์คํ ์์ ..
๋ฐ๋๊ณผ ์ค์ฒ๋ผ ์๋ฐํ๋ฉด ๋ฐ๋ก ๋ ์ค๋ฅด๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ๋ก "๊ฐ์ฒด ์งํฅ ์ธ์ด" ๋ผ๋ ๊ฒ์ ๋๋ค. "๊ฐ์ฒด ์งํฅ"์ด๋ ๋ ๊ณ ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ ๊ณ ๋ธ๋ก๋ค์ ์กฐ๋ฆฝํ์ฌ ์ฐ๋ฆฌ๋ ๋ฌด์์ด๋ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ๊ณ ๋ฅผ ์ด์ฉํด์ ๋๋ฌผ์์ ๋ง๋ค์๋ค๊ณ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ๋๋ฌผ์์๋ ๋ ๊ณ ๋ก ๋ง๋ค์ด์ง ์ฌ์๋ ์๊ณ , ํธ๋์ด๋ ์๊ณ , ์ฝ๋ผ๋ฆฌ๋ ์๊ณ , ์ ๊ฐ ์ข์ํ๋ ํ๋ค๋ ์์ต๋๋ค. ํ์ง๋ง ์ฌํ๊ฒ๋ ๋ ์ด์ ํธ๋์ด๊ฐ ์ธ๊ธฐ๊ฐ ์์ด์ ๊ณ ๋ฆด๋ผ ๋ ๊ณ ๋ก ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์ฝ๊ฒ ๋๋ฌผ์์์ ํธ๋์ด ๋ ๊ณ ๋ฅผ ๋นผ๊ณ ๊ณ ๋ฆด๋ผ ๋ ๊ณ ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํธ๋์ด, ๊ณ ๋ฆด๋ผ๊ฐ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ ๋๋ค. ํธ๋์ด๋ฅผ ๋บ ๋ค๊ณ ํด์ ๊ธฐ์กด์ ์๋ ์ฌ์๋ ํ๋ค ๋ ๊ณ ๋ ์ ํ ์ํฅ์ด ์์ต๋๋ค. ๋ง์ฝ ๋ผ์ด๊ฑฐ ๋ ๊ณ ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๊ณ , ํธ๋์ด์ ์ฌ์๋ฅผ ๋ง๊ตฌ์ก..