๐ง๐ปโ๐ป
Alex | ํ์
์ ์ํ๋ ๊ฐ๋ฐ์
8๋
์ฐจ, ํ๋ก์ ํธ ๊ฒฝํ์ด ๋ง๊ณ ํญ์ ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ํํ๊ท์
๋๋ค.
#BE #FE #Typescript #Go #Python #NestJS #NextJS #ExpressJS #Gin #Fiber #FastAPI #Django #Pandas #Torch #k8s #GCP #AWS #Azure
Main Skill ๐ฏ
- ํฌ์ค์ผ์ด, ๋ณดํ, ์ ์ฝ ๋๋ฉ์ธ์ ๋ํ ์ดํด
- SQL, Selenium, Nifi, Airflow, Pandas, Torch ๋ฑ์ ํ์ฉํ ๋ฐ์ดํฐ ์์ง/ETL/ML.
- ํด๋ผ์ฐ๋(GCP, AWS, Azure ๋ฑ) ํ๊ฒฝ๊ณผ On-prem ํ๊ฒฝ์์์ ์๋น์ค ๊ตฌ์ถ ๋ฐ ์ด์.
- FastAPI, ExpressJS ๋ฅผ ํ์ฉํ ML ๋ชจ๋ธ ์๋น.
- Fiber(Go) ๋๋ FastAPI, Celery, Redis๋ฅผ ํ์ฉํ ๋ถ์ฐ ์ฒ๋ฆฌ ์๋ฒ ๊ตฌ์ถ ๋ฐ ์ด์.
- Pandas, Torch๋ฅผ ํ์ฉํ ML ๋ชจ๋ธ ๊ฐ๋ฐ ๋ฐ ์๋น์ค ์ด์ ๊ฒฝํ.
- NextJS, NuxtJS ๋ฑ์ ํ์ฉํ ํ๋ก ํธ์๋ ๊ฐ๋ฐ.
- ReactNative, Flutter, Flet(Python)์ ํ์ฉํ ํฌ๋ก์คํ๋ซํผ ์ฑ ๊ฐ๋ฐ.
Introduce.
๋ค์ํ ํฌ์ง์
๊ณผ ๋ค์์ ํ๋ก์ ํธ ๊ฒฝํ
์คํํธ์
๊ฒฝํ์ด ๋ง๊ณ ๋ฐฑ์๋๋ฅผ ๋ฉ์ธ์ผ๋ก ํ๋ ํ์คํ ๊ฐ๋ฐ์์
๋๋ค.
์ด๊ธฐ ๊ธฐํ๋ถํฐ ์ฐธ์ฌํ์ฌ ๊ฐ๋ฐ, ๋ฐฐํฌ, ์ด์๊น์ง End-To-End๋ก ํ๋ก์ ํธ๋ฅผ ์ํํ ๊ฒฝํ์ด ์์ต๋๋ค. ๋ํ ํ์ ์ PM ์ญํ ๋ ๊ฒธํ์ต๋๋ค.
์คํํธ์
ํน์ฑ์ ๊ธฐ์ ์ ์ผ๋ก ๋ค์ํ ํฌ์ง์
์ ๊ฒฝํํ๊ณ , ํ์ ์ ํผ์ ํ๋ก์ ํธ๋ฅผ ์์ํด ์๋ฃํ ๊ฒฝํ๋ ์์ต๋๋ค.
๊ทธ๋์ ํฌ์ง์
๋ค๋ง๋ค์ ๊ณ ์ถฉ๊ณผ ๊ฐ๋ฐ ํ์์ฌํญ๋ค์ ๋ํด ์ดํดํ๊ณ ์์ต๋๋ค.
ํ์
์์ ์ฌ๋ฌ ํฌ์ง์
์ ๋๋ฃ๋ค์๊ฒ ์๋ ค์ผ ํ ์ง์ ์ ์๊ณ ํจ์จ์ ์ธ ์
๋ฌด ์ํ์ ์ํด ๋ฅ๋์ ์ผ๋ก ๋
ธ๋ ฅํฉ๋๋ค.
๋ํ ํ๋ก์ ํธ ์ ๊ณผ์ ์ ์ง์ ๊ด๋ฆฌํ๊ณ ๊ฐ๋ฐํด ๋ดค๊ธฐ ๋๋ฌธ์, ํ๋ก์ ํธ ์ํ์ ํจ์จ์ ์ผ๋ก ํ๋ ํธ์
๋๋ค.
์
๋ฌด ์๋ํ๋ฅผ ํตํ ๋ฆฌ์์ค ์ ์ฝ
๋ฐ๋ณต์ ์ธ ์ผ์ ์๋ํํ๊ณ ๋นํจ์จ์ ์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
๋ฐ์ดํฐ ์ฐ๊ตฌํ์ ๋ฐ๋ณต์ ์ธ ๋ฐ์ดํฐ ์์ง, ๊ฒ์ฆ ์
๋ฌด๋ฅผ ์นํฌ๋กค๋ง, RPA ๋ฑ์ ๊ธฐ์ ์ ํ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๊ณ ,
2๋ช
์ด 2์ฃผ ์ ๋ ์์ ๋๋ ์์ง/๊ฒ์ฆ ์
๋ฌด๋ฅผ ๋ฐ ์๋ํํ์ฌ 2์ผ๋ก ์ค์ฌ ์
๋ฌด๋ฅผ 85% ๊ฐ๋ ์ ๊ฐ์ํจ ๊ฒฝํ์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋์ผ๋ก ์์งํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์งํ๋ ์ฑ์ ๊ฐ๋ฐํด ๋งค ๋
๋ฐ์ํ๋ ๋ฐ์ดํฐ ์์ง ํ๋ฆฌ๋์ ๋น์ฉ์ ์ ์ฝ ํ์ต๋๋ค.
์ด๋ฅผ ํตํด ์ด์ ๋ณด๋ค ์๋ฌ๊ฐ ์ค์ด ์ ๋ณด๋ค ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋ ์๊ณ ๋น ๋ฅด๊ฒ ์์งํ ์ ์๊ฒ ๋์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ์ธํ๋ผ์ ์ฝ๋๋ฅผ ๊ฒํ ํด ๋ถํ์ํ ๊ตฌ์ฑ๊ณผ ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํ๊ณ ๊ฐ์ ํ์ฌ ๋งค์ ์๊ธ์ 35.5% ์ ์ฝํ ๊ฒฝํ๋ ์์ต๋๋ค.
1์ธ ๊ฐ๋ฐ๊ณผ ๋ฆฌ๋ ๊ฒฝํ
์ค์ค๋ก ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ๊ฒ์ ์ต์ํฉ๋๋ค. ์ด์ ์ ๋ค๋ ํ์ฌ๋ค์ ์
์ฌ ํ ๊ธฐ์กด ๊ฐ๋ฐ์๋ค ๋ชจ๋ ์์ ๋ ํด์ฌ๋ฅผ ํ ์ผ์ด ๋ง์์ต๋๋ค.
์ด๋ก ์ธํด ์ธ์์ธ๊ณ ์์ด ํผ์ ์์ํ๊ฒ ๋๋๋ฐ, ์ด๊ฒ์ด ์ ์
๋๋ถํฐ ์ฑ
์๊ฐ์ ๊ฐ๊ณ ๋ฅ๋์ ์ผ๋ก ์ผ ํ๋ ๊ณ๊ธฐ๊ฐ ๋์ต๋๋ค.
์์๋ถํฐ ํผ์ ์ฌ๋ฌ ์๋น์ค๋ฅผ ์ด์ํ๊ณ , ์ฒ์ ๋ณด๋ ์ธ์ด, ํ๋ ์์ํฌ๋ฅผ ๊ณต๋ถํ๋ฉฐ ๋น ๋ฅด๊ฒ ๋ฐฐ์ ๋๊ฐ์ต๋๋ค.
์ฌ๋ด ์ ์ผํ ๊ฐ๋ฐ์๋ก ์์ํด ๊ธฐ์กด ์๋น์ค ์ด์๊ณผ ๋ฒ๊ทธ ์์ ๋ฐ ์๋น์ค ๊ฐ์ , ์ ๊ท ์๋น์ค ๋ฐ์นญ, ๊ธฐ์กด ๊ธฐ๋ฅ ๊ณ ๋ํ๊น์ง ์ํํ์ต๋๋ค.
์ดํ ์๋ฆฌ์ฆ A์์ 200์ต์ด ๋๋ ์๋ฆฌ์ฆ C ํฌ์ ์ ์น๊น์ง, ๊ทธ๋ฆฌ๊ณ 15๋ช
๊ท๋ชจ์ ๊ฐ๋ฐํ์ผ๋ก ์ฑ์ฅํ ๋๊น์ง ๊ธฐ์ ์ ์๋ฌด๋ค์ ์ํ ๋ฐ ๋ฆฌ๋ํ ๊ฒฝํ์ด ์์ต๋๋ค.
์ฝ๋์ ์ธํ๋ผ ๊ฐ์ ์ ํตํ ์ฑ๋ฅ ์ต์ ํ
์ด์ ์ค์ธ ์๋น์ค์ ์๋ก์ด ๋ก์ง, ๊ธฐ์ , ์๋ฃจ์
๋ค์ ์ ์ฉํด ์ฑ๋ฅ ํฅ์์ ๊ฐ๋ฐ ์์
์ ๊ฐ์ํํฉ๋๋ค.
๋ง์ ์๋ฃจ์
๋ค์ ๊ณต๋ถํด ๋น๊ตํ๊ณ ํ
์คํธ๋ฐ ๋ฒค์น๋งํฌ๋ฅผ ์งํํด, ๋์ ์ธํ๋ผ์ ์ฝ๋๋ก ๊ฐ์ ํด ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋๋ค๋ ์ฃผ๊ธฐ์ ์ธ ๋ฆฌํํ ๋ง์ ํตํด ๊ธฐ๋ฅ ๋จ์๋ก ์ฌ๊ตฌ์ฑํ์ฌ ๋ณต์กํ๊ฒ ์ฝํ ์๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํ ํ์ต๋๋ค.
์ด๋ฐ ์ต๊ด ๋์ ์ด๋ฏธ ๋ฆฌํํ ๋ง์ ํตํด ๊ธฐ๋ฅ ๋จ์๋ก ๋ถ๋ฆฌ๋ ๊ธฐ์กด ์๋ฃจ์
์ API ๋น ์๊ธ์ ๋ถ๊ณผํ๋ API ๋น์ง๋์ค ์๊ตฌ์ฌํญ๊ณผ
์ฐ๊ฒฐ๋๋ฉด์ ๋น ๋ฅด๊ฒ API Service๋ฅผ ๋ฐ์นญํด ํ์ฌ ๋งค์ถ์ ๊ธฐ์ฌํ ์ ์์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ฝ๋ ๋ด์ ๋ถํ์ํ ํ๋ก์ธ์ค๋ฅผ ์ค์ด๊ณ ๋ก์ง์ ๊ฐ์ ํด ๊ธฐ์กด ์ฑ๋ฅ ๋๋น 40๋ฐฐ ์ ๋ ๊ฐ์ ๋๊ณ , ์ธํ๋ผ ๊ตฌ์ฑ๋ ๊ธฐ๋ฅ ๋จ์๋ก
๋ถ๋ฆฌํด ์๊ธ์ ์ ๊ฐํ ์ ์์์ต๋๋ค.
ํ์ฌ ํ์ฌ์์์ ๊ฒฝํ
ํ ํ์ฌ์์๋, ์
์ฌ ํ ์ผ๋ง ์ง๋์ง ์์ ๊ธฐ์กด ๊ฐ๋ฐ์๋ค์ด ๋ชจ๋ ํด์ฌํ๊ณ ํผ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ ์๊ฐํ ์น ์๋น์ค๋ฅผ ๊ฐ๋ฐ ๋ฐ ์ ์ง๋ณด์ํ๊ฒ ๋์์ต๋๋ค.
๋ํ ๊ธ๋ก๋ฒ ๊ธฐ์ค์ ๊ท์ ๊ณผ ๋ณด์์ ์ ์ฉํ๊ณ , ์ถฉ์กฑํ๊ธฐ ์ํด ๊ธ๋ก๋ฒ ๋๋ฃ๋ค๊ณผ ๊ธฐ์ ์ ์ํต์ ์ด์ด๊ฐ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ์๊ฐํ ์๋น์ค๊ฐ ๋ฉ์ธ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ณด๋ค ๋ง์ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ์
๋ฌด๋ฅผ ํ์คํ ์
๋ฌด์ ๊ฒธํ์ฌ ์ํํ๊ณ ์์ต๋๋ค.
์
๋ฌด ์ธ์ ์ผ๋ก Kubernetes๊ณผ ML, ์น, ์ฑ ๊ฐ๋ฐ ๊ด๋ จ ์ฌ์ด๋ ํ๋ก์ ํธ๋ค์ ์ง์์ ์ผ๋ก ๋ณํํ๋ฉฐ ์ฑ์ฅํ๊ณ ์์ต๋๋ค.
Main Project Experience.
๋ถ์ฐ ์ค์ผ์ค๋ฌ๋ฅผ ํตํ ๋ฐ์ดํฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ ์๋น์ค ์๋ฒ ๊ฐ๋ฐ
2024.07~2024.10
ํ์คํ ๊ฐ๋ฐ
#Go #Fiber #Asynq #Redis #NextJS #Postgres #Scala #Playframework #AKKA #AngularJS #CoffeeScript #MySQL #NuxtJS
์๊ฐ
์์ฝํ์ ์ข
๋ฅ๋ ์์ฃผ ๋ง๊ณ , ๊ด๋ จ ํนํ์ ์์ก์ ํ์ฌ๋ ๊ณ์ ์งํ์ค์
๋๋ค. ํนํ์ ํ๊ฐ, ๊ทธ๋ฆฌ๊ณ ์์ก ๋ฑ์ ๊ณผ์ ๋ค์ ํ๋์ ๋ณผ ์ ์๋ ํนํ ์์ก ๋ชจ๋ํฐ๋ง ์๋น์ค์
๋๋ค.
๊ฐ๋ฐ ์ด์
Scala, Playframework๋ก ๊ฐ๋ฐํ ๊ฐ๋ฐ์๋ค์ ๋ชจ๋ ํด์ฌํ๊ณ , ์ต์์น ์์ ์ธ์ด์ด๊ธฐ์ ์์ฒญ์ ๋ฐ๋ผ ๊ฐ๋จํ ์์ ๋ง ํ๊ณ ์์์ต๋๋ค. 2023๋
์ค์ ์ฏค ๋ณด์ํ์์ EOL์ด ์ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์
๊ทธ๋ ์ด๋๋ฅผ ์ง์ ๋ฐ์์ต๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ๊ธด๊ธ ์ด์๋ค์ด ๋ง์ ์ฐ์ ์์๊ฐ ๋ฐ๋ฆฌ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ํ ์๋ํํฐ API๊ฐ ๋ฉ์ด์ ์
๋ฐ์ดํธ ๋๋ฉด์ ํฐ ๊ท๋ชจ์ ์ฝ๋ ์
๋ฐ์ดํธ๊ฐ ๋ถ๊ฐํผํด์ง๋ฉฐ ๊ฐ๋ฐ์ด ์์๋์ต๋๋ค. ๊ฐ๋ฐ ๊ฒํ
๋งค์ผ ์ค์ผ์ค๋ ์๊ฐ๋์ ๋๋์ API๋ฅผ ์์ฒญํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ์์งํ๊ณ ์์๋๋ฐ, ์ด๋ฅผ ์ํํ ๋ AKKA ๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ต๋๋ค. 3๊ฐ์ง ์ด์๋ฅผ ํด๊ฒฐํด์ผ ํ์ต๋๋ค. ์ฒซ์งธ๋ ์๋ํํฐ API ๋ฉ์ด์ ์
๋ฐ์ดํธ, ๋์งธ๋ ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ, ์
์งธ๋ ์ ๋ฃ AKKA ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ฒดํ๋ ๊ฒ์ด์์ต๋๋ค. Scala-Playframework์์ ์ฒซ์งธ, ๋์งธ, ์
์งธ๋ฅผ ์๋ํด ๋ดค์ง๋ง, ์์ ๊ธฐ๋ฅ์ ์์ ํด ๊ฐ๋ ๊ฒ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ 1๊ฐ๋ฅผ ์ต์ ํํ๋ ๊ฒ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ์ํฉ์ด์์ต๋๋ค. ์ฐจ๋ผ๋ฆฌ ๋ก์ง์ ์ ๋ฆฌํด ์๋ก ๋ง๋๋ ๊ฒ์ผ๋ก ๊ฒฐ๋ก ์ ๋์ต๋๋ค. ๊ทธ๋์ ์ฐ์ md ํ์ผ์ ์ด์ด ์๋น์ค ๊ตฌํ์ ํ์ํ ๋ด๋ถ ๋ก์ง, UI, API๋ฅผ ๋ฌธ์๋ก ์ ๋ฆฌํ์ต๋๋ค. ๊ฐ๋ฐ ๊ณํ
์ฌ์ ์์ฑํ ๋ฌธ์๋ ๊ธฐํ์ ์ฒ๋ผ ์ด์ดํด์ก๊ณ , ์ค์ ๊ฐ๋ฐ์ ์ด๋ฏธ ํ ๊ฒ์ฒ๋ผ ํด์ผ ํ ์ผ์ด ๋จธ๋ฆฌ์ ๊ทธ๋ ค์ก์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ๋ด๋ถ์ ์ธ ์ค์ผ์ค๋ฌ์ ํจ๊ป ๋์ํ๋ ๋น๋๊ธฐ ๋ถ์ฐ ์ฒ๋ฆฌ ๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋์ ๋น๋๊ธฐ ๋ถ์ฐ ์ฒ๋ฆฌ์ ์ข์ ์๋ฒ ์กฐํฉ์ ๋น๊ตํด ๋ดค์ต๋๋ค. ์กฐํฉ๋ค์ ๊ฐ๋จํ ๊ตฌ์ฑํด ๋ฒค์น๋งํฌ๋ฅผ ๋๋ ค๋ณด๋ฉด ์ข๊ฒ ์ง๋ง ์ฌ์ ๊ฐ ์์ด, ๊ฒ์์ ํตํด ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ์ฝ๊ณ ์ฑ๋ฅ์ด ์ข์ผ๋ฉด์ ์ฝ๋ ๊ฐ๋
์ฑ๋ ์ข์ Go๋ฅผ ์ ํํ์ต๋๋ค. Go๋ก ๋ง๋ค๊ฒ ๋ ์กฐํฉ์ผ๋ก Fiber, Asynq๋ฅผ ์ ํ ํ์ต๋๋ค. Asynq๋ AsynqMon๊ณผ ์ธํธ๋ก ์์ด Task ์ํ ํํฉ์ ์ฝ๊ฒ ํ์
ํ๊ณ ์กฐ์ํ ์ ์์ด์ ์ข์์ต๋๋ค. ์ด์ ๊ฐ๋ฐ์ ํ์ํ ์์
์ Infra๋ฅผ ๊ตฌ์ฑ, DB ๋ง์ด๊ทธ๋ ์ด์
์๋ํ ์คํฌ๋ฆฝํธ, ์ค์ผ์ค ํ์คํฌ ๋์, ๊ด๋ฆฌ์ API/UI ๊ฐ๋ฐ์ด์์ต๋๋ค. Docker ํ๊ฒฝ ๊ตฌ์ฑ
๋น ๋ฅธ ํ๊ฒฝ ๊ตฌ์ฑ๊ณผ ํ ๋ด ํธ๋ฆฌํ ๊ณต์ ๋ฅผ ์ํด ๋ก์ปฌ๊ณผ ๋ฐฐํฌ ํ๊ฒฝ์ Docker ์ค์ ํ์ผ์ ์ ์ํ์ต๋๋ค. Postgres, Redis, Asynqmon, Fiber(App)์ ๋ํด ์ ์ํ๊ณ , ๊ณต์ ๋ฌธ์์ ์ ์๋ค์ด ์์ด ์ด๋ฅผ ์ฐธ๊ณ ํด ์์ํ๊ฒ ๊ตฌ์ฑํ์ต๋๋ค.
DB ๋ง์ด๊ทธ๋ ์ด์
์คํฌ๋ฆฝํธ ๊ฐ๋ฐ
๋ก์ปฌ๊ณผ ๋ฐฐํฌ ํ๊ฒฝ์์ ๋ฐ์ดํฐ์ ํ๋ก์์ ธ ๋ฑ์ ์ฐธ์กฐํ๋ฉฐ ํ๋ก์ธ์ค๊ฐ ์งํ๋๊ธฐ์, ํ์ํ DB ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ ์ฉํ๋ ์คํฌ๋ฆฝํธ ์์ฑ์ ํ์์์ต๋๋ค. ์ฐ์ ์ด์ DB์ ํ
์ด๋ธ, ๋ทฐ, ํ๋ก์์ ๋ฅผ ํ์ํด, ๊ผญ ํ์ํ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ณํ๋ ์์
์ ์งํํ์ต๋๋ค. ์ด ๊ณผ์ ์์ ๊ทธ ๋์ ๋ฐฉ์น๋๋ ๋ถํ์ํ ๋ฐ์ดํฐ ํ๋ค๊ณผ ์ ์๋ค์ ๋์ด๋ผ ์ ์์์ต๋๋ค. ์ ๋ณ๋ ๋ด์ฉ์ ํ ๋๋ก ์ด์ DB์์ ๋ก์ปฌ ์ปจํ
์ด๋ DB๋ก ์์ ๋จ์์ ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
์ ํ
์คํธํ๊ณ , ๋ก๊ทธ๋ฅผ ํ์ธํ๋ฉฐ ๋์ ์ ํ์ธํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค ์ ์๋ค์ 3๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋ด์ต๋๋ค. ์ ์ฒด ํ์ ์ฎ๊ธธ ๋ฐ์ดํฐ ๊ทธ๋ฃน, ํน์ ์๊ฐ๋๋ง ๊ฐ์ ธ์ฌ ๊ทธ๋ฃน, ์ปค์คํ
์ฟผ๋ฆฌ๊ฐ ํ์ํ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค. ๊ทธ๋ ๊ฒ ์ค์๊ฐ์ผ๋ก ๋ก๊ทธ๋ฅผ ํ์ธํ๋ฉฐ, ์ด์ DB๋ฅผ ์์ ํ๊ฒ ๋ง์ด๊ทธ๋ ์ด์
ํ ์ ์์์ต๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค ๊ฐ๋ฐ
๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ์ด ๋๋๊ณ , ๋ก์ปฌ DB๋ก ์ ์ํด GORM ์์ ์ ๊ณตํ๋ Gen ํด์ ํ์ฉํด DB ๊ตฌ์ฑ์ Go์์ ์ฌ์ฉํ struct๋ก ์๋ ์์ฑํ์ต๋๋ค. ํ์ง๋ง GORM ํด์์ ์์ ํ ๋ชจ๋ ๊ตฌ์ฑ์ ๊ฐ์ ธ์ค์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ Cascade ์ค์ ๊ณผ Json ์ฒ๋ฆฌ ๋ฑ๊ณผ ๊ฐ์ด ์ปค์คํ
์ด ํ์ํฉ๋๋ค. ๋จผ์ ํ์ํ ์๋ํํฐ API ์์ฒญ์ ๊ฐ๋ฐํ๊ณ ๋ฐ์ดํฐ ํ์ธ๊ณผ ํ
์คํธ๋ฅผ ์ํด Swagger ์ค์ ํ ๋ค, ํ
์คํธ๋ฅผ ์งํํ์ต๋๋ค. ์๋ํํฐ API์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ ์ ๊ณผ ํ๋ก ๋น๊ตํด ๊ฐ์ ๋งตํํ์ต๋๋ค. ์๋ํํฐ API ๊ฐ๋ฐ์ ๋๋ด๊ณ , Asynq๋ฅผ ํ์ฉํด Task์์ ์ฌ์ฉํ Client, Inspector, Scheduler, Server(Worker)๋ฅผ ๊ตฌ์ฑ ํ์ต๋๋ค. API ์์ฒญ๊ณผ DB ๋ฐ์ดํฐ์ ์ฐ๋๋ ๊ฐ๊ณต ์์
์ Task๋ก ๋๋์ด ์ ์ํ๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋ Task์ ์์ Task๋ค์ ์ค์ผ์ค๋ฌ์ ๋ฑ๋กํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค ์ ์ฒด ๋์์ ์ฒ๋ฆฌ ๊ณผ์ ์ ํ
์คํธ ํ์ต๋๋ค. Worker๋ฅผ 12๊ฐ~24๊ฐ๊น์ง ๋๋ฆฌ๋ฉฐ ๋ฆฌ์์ค ์ฌ์ฉ๊ณผ ์ํ ์๋๋ฅผ ๋น๊ต ํ๊ณ 24๊ฐ๊ฐ ์ ์ ํ์ฌ ์ ์ ํ์ต๋๋ค. ์ค ๋์ ๊ฐ๋ฐ์ ์๋ฃํ๊ณ , ์ํํ Task๊ฐ ์์ ๋๋ 24๊ฐ์ Worker๊ฐ Task๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ผ ์๊ฐํ์ต๋๋ค. ๊ทธ๋์ ์์ฒญ์ด ์ ์ ๋๋ 2๊ฐ์ Worker๊ฐ Task๋ฅผ ์ํํ๊ณ , Inspector๋ก ํ์ธํด Pending Task๊ฐ 20๊ฐ ์ด์์ด๋ฉด 24๊ฐ๋ก Scalingํ๊ณ 20๊ฐ ๋ฏธ๋ง์ผ๋ก ๋ด๋ ค์ค๋ฉด ๋ค์ 2๊ฐ๋ก ์ค์ด๋ Auto Scaling์ ๊ตฌํํ์ต๋๋ค. ์ด ์์
์ ์ํํ๋ฉด์ AsynqMon์์ ์ ๊ณตํ๋ ๋์๋ณด๋๋ฅผ ์์ฃผ ํ์ธํ๋ฉฐ ์๋ฌ ์ฒดํฌ๋ ํ๊ณ Task ๊ด๋ฆฌ๋ ํ๋๋ฐ, ๊ต์ฅํ ์ ์ฉํด์ ๋ฐฐํฌ ํ๊ฒฝ์๋ ์ถ๊ฐํ๊ฒ ๋์ต๋๋ค. ๊ด๋ฆฌ์ ์น API/UI ๊ฐ๋ฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ์ ์น ์ฑ ๊ฐ๋ฐ์ ์์ํ์ต๋๋ค. ์ฌ์ ์ ์กฐ์ฌํ UI ํ์ ํญ๋ชฉ์๋ Table, DatePicker, Breadcrumb, ... ๋ฑ์ด ์์๋๋ฐ, NextJS, TailwindCSS, NextUI, Flowbite๋ฅผ ์ด์ฉํ๋ฉด ๋ชจ๋ ๋ง์กฑํ ์ ์์ด ๊ทธ๋ ๊ฒ ๊ฐ๋ฐ์ ์์ํ์ต๋๋ค. ๊ธฐ์กด DB ๊ตฌ์ฑ์ ๊ฑฐ์ ์ ์งํ๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ์ฝ๋์์ ์ฌ์ฉํ๋ UI ์ฝ๋์์ ์ด์ฉํ๋ ๋ฐ์ดํฐ ํ๋ ์ด๋ฆ์ ์ฐธ๊ณ ํด ๊ฐ๋ฐํ์ต๋๋ค. ๋๋ถ์ API ๊ฐ๋ฐ ์ ๋ฐ์ดํฐ ํ๋ ์ด๋ฆ์ ๋ํ ํผ์ ์ด ์ค์๊ณ , ํต์ ์ RestAPI - Json ํํ๋ก ์ฃผ๊ณ ๋ฐ์ NextJS์์ ๋น ๋ฅด๊ฒ ์ ์ฉํ ์ ์์์ต๋๋ค. NextUI์์ Dark, Light ํ
๋ง ์ ์ฉํ๋๋ฐ, ๊ธฐ๋ณธ ์ ์ค์ ์ธ Primary, Secondary, Success๋ฑ์ ์ค์ ์ ๋ฐ๋ฅด๋ฉด ์๋์ผ๋ก ํ
๋ง ๋ณ๊ฒฝ ์ ์ ์ ์ฉ์ด ๋์ง๋ง, ์ปค์คํ
์ปฌ๋ฌ๋ ๋ณ๊ฒฝ ์ dark๋ ๊ฐ์ด ์ค์ ํด์ค์ผ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํผ์จ๋ฅผ ์ฃผ๋ก ์ด์ฉํ์ง๋ง ๋ชจ๋ฐ์ผ์์๋ ๋ณผ ์ ์์ด์, ๋ชจ๋ฐ์ผ ๋จผ์ UI๋ฅผ ๊ฐ๋ฐ ํ, ํผ์จ ํ๋ฉด ํฌ๊ธฐ์ผ ๋์ UI ์ค์ ํ๋ ์์ผ๋ก ๊ฐ๋ฐํ์ต๋๋ค. ๊ฐ๋ฐ ํ๊ณ ๋ฐ ์ํ
๊ฐ๋ฐ ์ ๋ฐฑ์๋ ์๋ฒ์ ์ค์ ์ ๋์๊ณ , API ๊ฐ๋ฐ ์ด์ ์ ๋ถ์ฐ ์ฒ๋ฆฌ ๋ถ๋ถ ๊ฐ๋ฐ ๋ ๊ด๋ฆฌ์ ์น์ UI๋ฅผ ๋ณํํ์ฌ ๊ฐ๋ฐํด์ Global State ๊ด๋ฆฌ, ์ ์ฉํ Hook, StoryBook ๋ฑ์ ์ค์ ํ์ง ์๊ณ ์์ํ์ต๋๋ค. ์ถํ Recoil์ ํ์ฉํด State ๊ด๋ฆฌ๋ฅผ ํตํฉํ ์์ ์
๋๋ค. NextJS 14์์๋ Html์ meta ํ๊ทธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ , Metadata์ ์ค์ ํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ๋๋๋ฐ, ์ฌ์ ๊ฐ ์์ด ๋จ์ ๋ณ๊ฒฝ ์ ์ฉ์๋ง ์ง์คํ์ต๋๋ค. ์ถํ ๋ง์ผํ
๋ถ์์ ํ์ํด ๋ณ๊ฒฝํ ์์ ์
๋๋ค. ๋น์ฉ๊ณผ ์๊ฐ์ ์ฌ์ ๊ฐ ์์ด ์์ฌ์ด ์ ์ด ๋ง์ง๋ง, ๊ทธ๋๋ ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๊ณ ๊ฐ์ ์ ์ ์ ์ ์๋ ํ๋ก์ ํธ์์ต๋๋ค.
์์ฒด ๋ณดํ ์ฒญ๊ตฌ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ
2022.02~2022.05
PM, ํ์คํ ๊ฐ๋ฐ
#Go #ExpressJS #NextJS #NestJS
์๊ฐ
์ฑ์์ ๋ณดํ ๊ฐํธ ์ฒญ๊ตฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ด๋ฅผ ์ด์ฉํด ์ฒญ๊ตฌ์๋ฅผ ์์ฑํ๊ณ ๋ณดํ์ฌ๋ก ์ ๋ฌํ๋ ์๋ฃจ์
์
๋๋ค.
๊ฐ๋ฐ ์ด์
๊ธฐ์กด์๋ ์ฑ์ ํ์ฌ์ API๋ฅผ ํ์ฉํด ๊ฐํธ ์ฒญ๊ตฌ๋ฅผ ํ๋๋ฐ, ๊ทธ ํ๋ก์ธ์ค๊ฐ ๊ฐ๋จํ์ต๋๋ค. ๊ณ ๊ฐ์ด ์ฑ์์ ์ฒญ๊ตฌ๋ฅผ ์ํด ํ
์คํธ ์
๋ ฅ๊ณผ ํ์ผ ์
๋ ฅ์ ํ๋ฉด ํ
์คํธ ์
๋ ฅ์ ๋ณดํ์ฌ ์ฒญ๊ตฌ์ ์์์ ํน์ ์์น์ ๋ฃ์ด์ฃผ๊ณ , ์ฒจ๋ถ ์ด๋ฏธ์ง ํ์ผ์ ๋ณด๋ด์ฃผ๋ ๋ก์ง์ด์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ API๋ ๊ฐ๋ ์ ์ก ์คํจ๋ ์์ฑ ์คํจ ๋ฑ์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋์ ๋น์ฉ์ ๊ฐ๊ณผ ์๋น์ค ์์ ํ๋ฅผ ์ํด ์์ฒด API ๊ฐ๋ฐ ๋ฐฉ๋ฒ์ ์์๋ดค์ต๋๋ค.
๊ฐ๋ฐ ๊ณผ์
์ฌ์ฉ ์ค์ธ API๋ฅผ ํตํด 40๊ฐ ๋ณดํ์ฌ์ ์ฒญ๊ตฌ์ ์์ PDF ํ์ผ๋ค๊ณผ ํฉ์ค ๋ฒํธ, ์ด๋ฉ์ผ์ ์ ์ ์์์ต๋๋ค. PDF ํ์ผ์์ ์ํ๋ ์์น์ ํ
์คํธ๋ฅผ ์ฝ์
ํ๋ ๊ฒ๊ณผ ๋ณดํ์ฌ ์ฒญ๊ตฌ์ ์์์ PNG๋ก ๋ณํํ ํ์ผ์์ ํ
์คํธ๋ฅผ ์ฝ์
ํ๋ ๊ฒ์ ๋น๊ตํด ๋ดค์ต๋๋ค. Python๊ณผ Go์ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ
์คํธ ํ๊ณ , Go ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋น๊ต์ ๋นจ๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ PDF์์ ๋ฐ๋ก ํ
์คํธ๋ฅผ ์ฝ์
ํ๋ ์์
์ PDF๋ฅผ ํด์ ์๊ฐ์ด ์ค๋ ์์๋๊ณ , ๋ฐ๋ฉด์ PNG์์ ํ
์คํธ๋ฅผ ์ฝ์
ํ๋ ์์
์ ๋นจ๋์ต๋๋ค. ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์๋น์ค์์ API๋ฅผ ์ฌ์ฉ์ ๋ฌด๋ฆฌ๊ฐ ์์ผ๋ PNG์์ ์์
์๋ฃ ํ, PNG -> PDF ๋ณํ์ผ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ชจ๋ ์ฒญ๊ตฌ์ PDF๋ฅผ PNG๋ก ๋ณํํ๊ณ Go์ Imagor ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ํน์ ํฌ์ง์
์ Text ๋ผ๋ฒจ์ ์ฝ์
ํ๊ณ PNG๋ก ์ฒญ๊ตฌ์ ์์์ ์์ฑํ์ต๋๋ค. ์์ฑ๋ PNG๋ Go์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๋ค์ PDF๋ก ๋ณํํ๊ณ , Node Mailer๋ฅผ ์ด์ฉํด PDF ํ์ผ์ ์ฒจ๋ถํด ๋ณดํ์ฌ ๋ฉ์ผ๋ก ๋ณด๋ผ ์ ์์์ต๋๋ค. Go๋ฅผ ์น์๋ฒ๋ก ๋ง๋ค์๋๋ฐ Beego ํ๋ ์์ํฌ๋ฅผ ํ์ฉํด ๊ฐ๋ฐํ๊ณ , ๋ฉ์ธ ์๋ฒ์ธ NestJS ์๋ฒ์์ ํต์ ํด ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ฒ ํ์ต๋๋ค. ๊ฐ๋ฐ ํ๊ณ ๋ฐ ์ํ
๊ฐ๋ฐ์ด ๋๋๊ณ ๊ฐ๋ฐ๋ ์๋น์ค๋ฅผ ์ด์ฉํ๋๋ฐ ์ฌ๋ฌ ํ๊ณ์ ์ด ์์์ต๋ ๋ค. ์ฒญ๊ตฌ์ ์์์ด ๋ณ๊ฒฝ ์ ๋๊ตฐ๊ฐ ์์ ๊ด๋ฆฌํด์ผ ํ์ต๋๋ค. ๊ทธ๋์ ๊ด๋ฆฌ์ ์น ์ฑ์ NextJS์ NestJS๋ฅผ ๊ฐ๋จํ ๋ง๋ค์ด, ์ฒญ๊ตฌ์ ์์์ด ๋ณ๊ฒฝ ์ ์
๋ ฅ ํ
์คํธ์ ์ขํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋ง๋ค์์ต๋๋ค. ๋ค์์ ๊ธฐ์กด์ ์ฒญ๊ตฌ ์๋น์ค ์ธ๋ถ ์
์ฒด์ ์์๊ธ์ผ๋ก ๊ณ์ฝ๋์ด ์ฒญ๊ตฌ API ์๊ธ์ด ์ ๋ ดํ ์ํ์์ต๋๋ค. ํ์ง๋ง Node Mailer๋ฅผ ์ด์ฉํด ๋ณด๋ด๋ ๋ฉ์ผ๋ ์ด์์์๋ ์ ๋ฃ ๋ฉ์ผ, ํฉ์ค API๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ฒญ๊ตฌ ํ์๊ฐ ๋ง๋ค๋ฉด ์คํ๋ ค ์ธ๋ถ API ์ฌ์ฉ ๋ณด๋ค ๋น์ธ์ง๋ ๊ฒ์ ์๊ฒ ๋์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ฒญ๊ตฌ ๋ก์ง์ ์ํํ๋ Beego์๋ฒ์ ์๋ฒ๋น์ ์๋น์ค ์ ์ง๋ฅผ ์ํ ์ด์ ์ธ์ ๋น์ฉ์ ์๊ฐํ๋ ์ ์ ๋ ํ๊ณ์ ์ด ๋๊ปด์ก์ต๋๋ค. ๋ํ ๊ฐํธ ์ฒญ๊ตฌ๋ฅผ ํตํด ์์ต์ผ๋ก ์ด์ด์ง๊ธฐ ๋ณด๋ค ๋ฌด์ ์๋น์ค ๊ธฐ๋ฅ์ด์ด์ ์ธ๋ถ ์
์ฒด ์๋น์ค ๋ถ์์ ์ ๋์ํ๊ธฐ ์ํด ํฌ์ํ๊ธฐ์๋ ์ข์ง ๋ชปํ์ต๋๋ค. ์ฒ์์๋ ๊ฐ๋ฐ ๊ฐ๋ฅ์ฑ์ ์์๋ณด๋ ๊ฒ์ด์์ง๋ง, ๋
ผ์๋ฅผ ํ๋ค ๋ณด๋ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ๊ฒ ๋์ต๋๋ค. ํ์ง๋ง ๊ฐ๋ฐ๊ณผ ๋น์ฉ์ ๋ ๊ณ ๋ คํ ๊ตฌํ์ ๋ชฉ์ ์ ๋ ๊ฐ๋ฐ์ด ๋์์ต๋๋ค. ์ถํ์๋ ๊ฐ๋ฐ ์์ ์ ์ ์ง ๊ด๋ฆฌ, ๋น์ฉ์ ๋ ์๊ฐํ๊ฒ ๋ ๊ณ๊ธฐ๊ฐ ๋์ต๋๋ค.
๋ณดํ์์งv2
2020.11~2021.01
PM, ํ์คํ ๊ฐ๋ฐ
#Typescript #Python #ExpressJS #Pandas #Sklearn