Skip to main content
๐Ÿง‘๐Ÿปโ€๐Ÿ’ป

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
์†Œ๊ฐœ
๋ณดํ—˜ ์‹œ์žฅ์—์„œ ๊ฐ€์ž…์ž๋“ค์€ ์„ค๊ณ„์‚ฌ๋“ค์˜ ์„ค๋ช…์— ๋”ฐ๋ผ ๋ณดํ—˜์„ ๊ฐ€์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ—˜ ์„ค๊ณ„์—์„œ ๊ณ ๋ คํ•  ์ ์€ ๋‚˜์ด๋Œ€, ๋ณด์žฅ, ๋ณด์žฅ๊ธˆ์•ก, ๋งŒ๊ธฐ ๋“ฑ ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๊ณ , ๋˜ํ•œ 1๊ฐœ ์ƒํ’ˆ์œผ๋กœ ํ•„์š” ๋ณด์žฅ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์—†์–ด ์—ฌ๋Ÿฌ ๋ณดํ—˜ ์ƒํ’ˆ์˜ ์กฐํ•ฉ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๊ฐ์ด ์•Œ๊ธฐ ํž˜๋“  ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์„ค๊ณ„์‚ฌ์™€ ์†Œ๋น„์ž ๊ฐ„์˜ ์ •๋ณด ๋น„๋Œ€์นญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๊ฐ ์ •๋ณด์™€ ๋ณดํ—˜ ์ƒํ’ˆ ์ •๋ณด๋“ค์„ ํ† ๋Œ€๋กœ ํ•œ ๊ฐœ์ธํ™”๋œ ๋ณดํ—˜ ์ง„๋‹จ๊ณผ ํ•„์š” ๋ณดํ—˜ ์ƒํ’ˆ ๋ฌถ์Œ์„ ์ถ”์ฒœํ•˜๋Š” ๋ณดํ—˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ์ด์œ 
์ดˆ๊ธฐ ๋ณดํ—˜ ์†”๋ฃจ์…˜์€ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ๋™์ž‘ํ•˜๊ณ  ์ฝ”๋“œ์™€ ERD์˜ ๋ณต์žก๋„๊ฐ€ ์‹ฌํ•œ๋ฐ๋‹ค, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ์ž ๋ถ„์˜ ๊ฐœ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ด ์šด์˜๋˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ์ž ๋ถ„์ด ํ‡ด์‚ฌํ•˜์…จ๊ณ , ์•„๋ฌด๋„ ์†”๋ฃจ์…˜์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ƒํƒœ๊ฐ€ ๋˜์—ˆ๊ณ , ํ…Œํฌ ๋ฆฌ๋“œ ๋ถ„๋“ค์ด ์ˆ˜์ฐจ๋ก€ ์ž…์‚ฌํ•ด ์‹œ๋„ ํ–ˆ์ง€๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๊ฐ‘์ž๊ธฐ ๋ณดํ—˜์‚ฌ์™€ ๋ณดํ—˜ ์†”๋ฃจ์…˜ ๋‚ฉํ’ˆ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ๋น ๋ฅธ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด์„œ ๊ธ‰ ๊ฐœ๋ฐœ์„ ๋งก๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ๊ณ„ํš
์šฐ์„  ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—”์ง„ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ธํžˆ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ—˜ ์—”์ง„์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ณ ๊ฐ์ด ๊ฐ€์ง„ ๋ณดํ—˜์— ๋Œ€ํ•œ ์ง„๋‹จ๊ณผ ๊ณ ๊ฐ์—๊ฒŒ ํ•„์š”ํ•œ ๋ณดํ—˜ ์ƒํ’ˆ ์กฐํ•ฉ์„ ์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ—˜ ์ง„๋‹จ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ 2๊ฐ€์ง€ ์‚ฌ์ „ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ML ๋ชจ๋ธ์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ›ˆ๋ จ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณดํ—˜ ์ง„๋‹จ ์†”๋ฃจ์…˜์˜ ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํŒŒ์‹ฑ ๋ฐ ๊ตฌ์กฐํ™” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๋ณดํ—˜ ์ƒํ’ˆ ์กฐํ•ฉ ์ถ”์ฒœ์€ ๋ณดํ—˜ ์ƒํ’ˆ ์กฐํ•ฉ์„ ํ†ตํ•œ ๋ณด์žฅ๊ณผ ๋ณด์žฅ๊ธˆ์•ก์˜ ๋ฌถ์Œ์„ ๋„์ถœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง„๋‹จ์„ ํ†ตํ•ด ์–ป์€ ๊ณ ๊ฐ์˜ ๋ณดํ—˜ ์ƒํƒœ์™€ ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ผ์ • ๊ธฐ์ค€์— ๋งž๊ฒŒ ๋ถ€์กฑํ•œ ๋ณด์žฅ์„ ๋„์ถœํ•˜๊ณ  ์ƒํ’ˆ๋“ค๋กœ ์ฒด์›Œ์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
ML ๋ชจ๋ธ๊ณผ ์†”๋ฃจ์…˜ ๊ฐœ๋ฐœ
๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ถ„์„ ํ›„, ๋ณดํ—˜ ์„ค๊ณ„ ์—ฐ๊ตฌ์›๋ถ„๋“ค๊ณผ ํ˜‘์—…์„ ํ†ตํ•ด ์ง„๋‹จ์— ์‚ฌ์šฉํ•  ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ํ”Œ๋žซํผ์„ ํ†ตํ•ด ์Œ“์ธ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋น„์‹๋ณ„ํ™”ํ•˜๊ณ  ์ •์ œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ •์ œ๋œ ๋ฐ์ดํ„ฐ๋กœ ์‹ค์ œ ์„ค๊ณ„์‚ฌ ๋ถ„๋“ค๊ณผ ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ ์ˆ˜๋ฅผ ๋„์ถœํ–ˆ๊ณ , ์ ์ˆ˜ ๊ธฐ์ค€์— ๋”ฐ๋ผ 3๊ฐœ์˜ ์ง„๋‹จ ํด๋ž˜์Šค์˜ ๊ธฐ์ค€์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋กœ Sklearn์„ ํ™œ์šฉํ•ด ๋‹ค์ค‘ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ๋ณดํ—˜ ์ƒํ’ˆ์— ๋Œ€ํ•ด ๊ณ ๊ฐ ์ •๋ณด์— ๋”ฐ๋ผ 3๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ํŒ๋‹จ๋˜๋„๋ก ๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ›„ ๋ชจ๋ธ์˜ ๊ฒ€์ฆ๊ณผ ํ…Œ์ŠคํŠธ, ์ ์ˆ˜ ๋ณ€๊ฒฝ, ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ ๋“ฑ์˜ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๊ณ  ๋ณดํ—˜ ์—ฐ๊ตฌ์›๋ถ„๋“ค๊ณผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํŒ๋‹จ๋˜๋Š” ๋ชจ๋ธ์ด ์™„์„ฑ๋˜์–ด ์ˆ˜์‹์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์†”๋ฃจ์…˜์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์ธ ์‹ ์šฉ์ •๋ณด์› ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์—ˆ๊ณ , ๋„์ถœ๋œ ์ˆ˜์‹๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์ง„๋‹จ์„ ์™„๋ฃŒํ•˜๊ณ  ์†”๋ฃจ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ๊ฒฐ๊ณผ๋ฅผ API ์š”์ฒญ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์‹ ๊ทœ ์†”๋ฃจ์…˜์œผ๋กœ ํ”Œ๋žซํผ์— ์—…๋ฐ์ดํŠธํ•˜์˜€๊ณ , ๋ณดํ—˜์‚ฌ์—์„œ ์›ํ•˜๋Š” ์ง„๋‹จ ๊ธฐ์ค€๊ณผ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ปค์Šคํ…€ํ•˜๋ฉฐ ๋‚ฉํ’ˆ์šฉ ์—”์ง„๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํƒ€ํ˜‘๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •
๋ณดํ—˜ ์ถ”์ฒœ์˜ ๋ชฉ์ ์€ ํ•„์š”ํ•œ ๋ณด์žฅ๊ณผ ๊ธˆ์•ก ๊ธฐ์ค€์„ ๊ฐ€์„ฑ๋น„ ์ข‹์€ ์ƒํ’ˆ์„ ์ด์šฉํ•ด ์ถฉ์กฑ์‹œ์ผœ ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์žฅ์„ ์ถฉ์กฑ์‹œ์ผœ์ฃผ๋ ค๋‹ค ๋ณด๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด์žฅ์˜ ์ข…๋ฅ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•˜๊ณ , ๊ธˆ์•ก ๊ธฐ์ค€๋„ ๋‹ค์–‘ํ•œ๋ฐ๋‹ค ์ƒํ’ˆ์˜ ํŠน์•ฝ์— ๋”ฐ๋ผ ์ƒํ’ˆ์˜ ์„ฑ๊ฒฉ๋„ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠน์„ฑ์„ ๋‹ค ๊ณ ๋ คํ•˜๊ธฐ์—๋Š” ์ œํ•œ ์‹œ๊ฐ„์— ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

ํƒ€ํ˜‘์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•„์š” ๋ณด์žฅ ๊ธฐ์ค€์—์„œ ํ•„์ˆ˜ ๋ณด์žฅ์„ ์„ ์ •ํ•˜๊ณ  ๊ธˆ์•ก ๊ธฐ์ค€๋„ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉฐ ๋ฒ”์œ„๋ฅผ ์ขํ˜€๊ฐ”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ์† ์„ค๊ณ„์‚ฌ ๋ถ„๋“ค์ด ๊ฐ€์ž… ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ’ˆ๋“ค์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ณดํ—˜ ์—ฐ๊ตฌ์›๋ถ„๋“ค๊ณผ ์—ฐ๊ตฌ๋ฅผ ํ†ตํ•ด ์•ˆ ์ข‹์€ ๊ทœ์•ฝ์ด ์—†๋Š” ์ข‹์€ ์ƒํ’ˆ๋“ค๋งŒ ์—”ํŠธ๋ฆฌ์— ๋‘๋„๋ก ๋งค๋‹ฌ ์ƒํ’ˆ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ์ค€์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ถ”์ฒœ์„ ์œ„ํ•ด ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์ถฉ์กฑํ•œ ๋ณด์žฅ๋“ค์„ ์ œ์™ธํ•˜๊ณ  ํ•„์š” ๋ณด์žฅ๊ณผ ๊ธˆ์•ก์˜ ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๊ณ , ์ด๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์žฅ๊ณผ ๊ธˆ์•ก์„ ๊ฐ€์ง„ ์ƒํ’ˆ ์กฐํ•ฉ๋“ค์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 12๊ฐœ์˜ ๋ณด์žฅ๊ณผ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ณด์žฅ ๊ธˆ์•ก ๊ธฐ์ค€์ด ์žˆ์—ˆ๊ณ , ์ถฉ์กฑ์„ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋งŒ๋“ค๊ณ  ๊ฐ€์žฅ ์ €๋ ดํ•œ ์กฐํ•ฉ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ณด์žฅํ•  ๊ธˆ์•ก์ด A,B,C ๋ณด์žฅ ๋ชจ๋‘ 5000๋งŒ์›์ด๊ณ  A,B,C ๋ณด์žฅ์ด 0~5000๋งŒ์›๊นŒ์ง€ 1000๋งŒ์› ๋ณ€ํ™”๊ฐ’์ด๋ฉด, ์ด 3๊ฐœ ๋ณด์žฅ์˜ ์กฐํ•ฉ์„ ๋ชจ๋‘ ๋งŒ๋“ค๋ฉด, (000),(001),...(555)๊นŒ์ง€ 216๊ฐœ์˜€๊ณ , ์ด์ œ 216๊ฐœ์—์„œ [[(555)],[(001)(554)],[(101)(222)(232)],... ์ด๋Ÿฐ์‹์œผ๋กœ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 2^216 ์ด์—ˆ์Šต๋‹ˆ๋‹ค. 10์ง„์ˆ˜๋กœ ๋ณด๋ฉด 10^64~10^65 ์‚ฌ์ด์˜€์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ์กฐํ•ฉ์„ ๋งŒ๋“ค๋‹ค๊ฐ€ ์ปดํ“จํ„ฐ๊ฐ€ ์—ฐ์‚ฐ์„ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ๋ชจ๋“  ์กฐํ•ฉ์ด ์•„๋‹Œ ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์„ ๋จผ์ € ์„ ๋ณ„ํ•ด ๊ณ„์‚ฐํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. 216๊ฐœ์˜ ์กฐํ•ฉ์„ ์ˆœํšŒํ•˜๋ฉฐ, ์šฐ์„  (555)๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ๋งŒ ์ฐพ์•„๋‚ด๋‹ˆ, ๊ฐœ์ˆ˜๊ฐ€ 42738๊ฐœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ ์กฐํ•ฉ ์ƒ์„ฑ์ด ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๊ณ , ๊ทธ ์กฐํ•ฉ์„ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธ๋œ ์ƒํ’ˆ๋“ค์—์„œ ์ฐพ์•„๋‚ด ๊ฐ€๊ฒฉ์„ ๋น„๊ตํ•˜๊ณ  ๊ฐ€์žฅ ์ €๋ ดํ•œ ์ƒํ’ˆ ์กฐํ•ฉ์„ ๊ตฌ์„ฑํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ฐœ์ธํ™”๋œ ๋ณดํ—˜ ์ƒํ’ˆ ์กฐํ•ฉ์„ ๋„์ถœํ•˜๋Š” ์†”๋ฃจ์…˜์ด ๊ฐœ๋ฐœ๋์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ ์„ฑ๊ณผ
๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•ด ๊ฐœ๋ฐœํ•˜์—ฌ ๋…๋ฆฝ๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์—ฌ๋Ÿฌ API ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ์— ์šฉ์ดํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋๊ณ , ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ์•„๋‹Œ ๋‹จ๋… ์„œ๋ฒ„ ๋™์ž‘์œผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์—”์ง„ ์†”๋ฃจ์…˜ ๋‚ฉํ’ˆ์—๋„ ์ˆ˜์›”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณต์žกํ•œ ERD๊ฐ€ ์‰ฝ๊ฒŒ ๊ฐœ์„ ๋๊ณ , DB์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์™€ ๋กœ๊ทธ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋˜๊ณ , DB ํ†ต์‹ ๋„ ์ตœ์†Œํ™”ํ•˜์˜€์œผ๋ฉฐ, ์†”๋ฃจ์…˜ ๋กœ์ง์ด ๊ฐœ์„ ๋˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋™์ž‘์„ ์ œ๊ฑฐํ•ด ๊ธฐ์กด ๋Œ€๋น„ ํ‰๊ท  40๋ฐฐ ๊ฐ€๋Ÿ‰ ์†๋„๊ฐ€ ๊ฐœ์„  ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ตฌ์› ๋ถ„๋“ค์ด ์ˆ˜๋™์œผ๋กœ ํ•˜๋˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ ๊ฐ€๊ณต ์ž‘์—…๋„ ๋ฆฌ๋‰ด์–ผ ๋˜๋ฉด์„œ ReactJS, ExpressJS๋กœ ๊ด€๋ฆฌ์ž ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋งŽ์€ ๋ถ€๋ถ„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ด€๋ จ ์ž‘์—…์— ๋Œ€ํ•ด ์—…๋ฌด ์†Œ์š” ์‹œ๊ฐ„์„ 85% ์ ˆ๊ฐ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

Job Experience.

ํ•œ๊ตญ์•„์ดํ๋น„์•„์†”๋ฃจ์…˜์Šค(์ฃผ)

๋ฏธ๊ตญ IMSํ—ฌ์Šค์™€ ํ€ธํƒ€์ผ์ฆˆ๊ฐ€ ํ•ฉ๋ณ‘ํ•ด ๋งŒ๋“  ์™ธ๊ตญ ์ƒ์žฅ ํšŒ์‚ฌ๋กœ์„œ ์ตœ๋Œ€ ๊ทœ๋ชจ์˜ ๋ณด๊ฑด์˜๋ฃŒ ๋ฐ์ดํ„ฐ, ๋งž์ถคํ˜• ์†”๋ฃจ์…˜ ๋ฟ ์•„๋‹ˆ๋ผ ํ™˜์ž ๊ด€๋ฆฌ ๊ฐœ์„ ์„ ์œ„ํ•œ ๋จธ์‹  ๋Ÿฌ๋‹, ์ •ํ™•ํ•œ ์ƒ์—… ์ „๋žต ๋“ฑ์„ ํฌํ•จํ•ด ํœด๋จผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค ํ™œ์šฉ์— ๊ธฐ์—ฌํ•˜๋Š” ํšŒ์‚ฌ๋กœ์„œ, ๋งค์ถœ์•ก 850์–ต ์ด์ƒ์œผ๋กœ ํ—ฌ์Šค์ผ€์–ด ๋ฐ์ดํ„ฐ ํ†ต๊ณ„ ๋ถ„์„๊ณผ ์ปจ์„คํŒ…์„ ์ง€์›ํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ํ—ฌ์Šค์ผ€์–ด ๋น…๋ฐ์ดํ„ฐ ๊ธฐ์—…

AA, DS
์ธํ”„๋ผ ๋ฐ ์„œ๋น„์Šค ์šด์˜
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.10~2024.12
  • KINX Cloud ๋ฒ ์–ด ๋ฉ”ํƒˆ ์„œ๋ฒ„ ๋ฐ NAS ์žฅ๋น„ ๊ด€๋ฆฌ ๋ฐ KT, Azure Cloud ๊ฐ€์ƒํ™” ์ธํ”„๋ผ ๊ด€๋ฆฌ
  • ๊ฐ ์„œ๋น„์Šค์˜ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๊ณ ๊ฐ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ฅธ ๊ฐœ์„ (NuxtJS, ExpressJS, Scala, Playframework, AngularJS)
  • ์‚ฌ๋‚ด ๋ฐ์ดํ„ฐ ETL ์ž‘์—…(MSSQL) ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ ์œ ์ง€ ๊ด€๋ฆฌ(MSSQL, PostgreSQL, MySQL)
  • IT ๊ธฐ์ค€๊ณผ ๋ณด์•ˆ ๊ทœ์ • ์ค€์ˆ˜๋ฅผ ์œ„ํ•œ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ์†”๋ฃจ์…˜ ์ ์šฉ
  • Script๋ฅผ ํ†ตํ•œ ์ธํ”„๋ผ ๊ด€๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ(Python, Powershell, NodeJS)
  • ๊ณต๊ณต ๋ฐ์ดํ„ฐ(API, Crawler) ์ž๋™ ์ˆ˜์ง‘ ์•ฑ ๊ฐœ๋ฐœ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•(Selenium, Celery, Django, Redis, PostgreSQL, MSSQL)
๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ
๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ์‹œ๊ฐํ™”
2024.10~2024.12
  • ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ถ„๋“ค๊ณผ์˜ ํ˜‘์—…์„ ์œ„ํ•œ Nifi, Airflow, MageAI๋ฅผ ํ™œ์šฉํ•œ ETL ๊ตฌ์„ฑ ๋ฐ ๊ฐœ์„ 
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ†ตํ•ฉ์„ ์œ„ํ•œ Snowflake -> Azure MI SQL Server๋กœ์˜ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • ์ œ์•ฝ์‚ฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ PowerBI, Spotfire๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ ๋”œ๋ฆฌ๋ฒ„๋ฆฌ
๋ถ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2024.07~2024.11
  • ๋ถ„์‚ฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•œ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์ž๋™ํ™” ๋ฐ ์„œ๋น„์Šค ์„œ๋ฒ„ ๊ฐœ๋ฐœ(Go, Fiber, Asynq, Redis, PostgreSQL, MySQL)
  • ๊ด€๋ฆฌ์ž ๋ฐ ์„œ๋น„์Šค ์›น ์•ฑ ๊ฐœ๋ฐœ(Typescript, NextJS, NextUI)
  • ์„œ๋น„์Šค ์ธํ”„๋ผ ๋ฐ CI/CD ๊ตฌ์„ฑ(Nginx, Jenkins, KT Cloud)
์‚ฌ๋‚ด ์ธํ”„๋ผ๋ฅผ ํ†ตํ•œ ๋น„์šฉ ์ ˆ๊ฐ ๋ฐ ๋กœ๊ทธ ์‹œ์Šคํ…œ ์ ์šฉ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2024.03~2024.06
  • Spotfire Server ๊ด€๋ จ KT Cloud ๊ฐ€์ƒํ™” ์ž์‚ฐ์„ Azure Cloud์˜ ์‚ฌ๋‚ด ๋ฌผ๋ฆฌ ์ž์‚ฐ์— ๋‹ค์‹œ ๊ตฌ์„ฑํ•ด ์š”๊ธˆ ์ ˆ๊ฐ(Spotfire, KT Cloud, Azure)
  • KINX ๋ฌผ๋ฆฌ NAS ์žฅ๋น„ ์ค‘ ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํฌ๋ฆฝํŠธ๋กœ ์„ ๋ณ„ํ•ด Azure SA๋กœ ์ด๊ด€(Synology NAS, Azure Storage Account / File Share)
  • ์œ ์ € ํ–‰๋™๋ถ„์„์„ ์œ„ํ•œ ์„œ๋น„์Šค ๋กœ๊ทธ ์ ์šฉ ๋ฐ Windows, Linux ์„œ๋ฒ„ ๋‚ด ์˜ค๋ฅ˜ ๋กœ๊ทธ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ๋ฐ ์ ์šฉ(Python, NuxtJS, ExpressJS)
์‚ฌ๋‚ด ์ธํ”„๋ผ ์ด์šฉ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ์ž‘์—… ๋ฐ ์„œ๋น„์Šค ๋ฒ„๊ทธ ํ•ด๊ฒฐ ๋ฐ ๊ฐœ์„ 
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2023.12~2024.02
  • ์‚ฌ๋‚ด Spotfire Server ์ธํ”„๋ผ์™€ ์„œ๋น„์Šค ๊ฐ„ JWT ํ† ํฐ ์ธ์ฆ์œผ๋กœ Authentication ์—ฐ๊ฒฐ ์ ์šฉ(Spotfire, ExpressJS)
  • ์ขŒํ‘œ ๋ฐ์ดํ„ฐ ๊ฐ„ ์ง์„ , ๋„๋ณด ๊ฑฐ๋ฆฌ ๋กœ์ง ๊ฐœ์„ ์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค ๋ณต์žก๋„์™€ ์‹œ๊ฐ„, ์š”๊ธˆ ์ ˆ๊ฐ(Python, MSSQL)
  • SOAP API ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์„œ๋ฒ„ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ(Scala, Playframework, AngularJS, NuxtJS, ExpressJS)
๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์ž๋™ํ™” ๋ฐ ์š”๊ธˆ ์ ˆ๊ฐ์„ ์œ„ํ•œ ๋Œ€์‹œ๋ณด๋“œ ์•ฑ ๊ฐœ๋ฐœ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2023.08~2023.11
  • ์‹ ๊ทœ Spotfire Analyst ์ธํ”„๋ผ์˜ ์š”๊ธˆ ์ ˆ๊ฐ์„ ์œ„ํ•ด Dashboard ๋ชจ๋ฐ”์ผ/๋ฐ์Šคํฌํƒ‘ ์•ฑ๊ณผ ์„œ๋ฒ„ ๊ฐœ๋ฐœ(Flutter, Flet, Fastapi)
  • ์„œ๋ฒ„ ์ธํ”„๋ผ ๋ฐ CI/CD ๊ตฌ์„ฑ(Jenkins)
  • ์›น์‚ฌ์ดํŠธ ์ฃผ๊ธฐ์  ํฌ๋กค๋Ÿฌ ์›น ์•ฑ ๋ฐ ์„œ๋ฒ„ ๊ฐœ๋ฐœ(Selenium, Celery, Django, Redis, React)
  • ๊ธฐ์กด Spotfire Server ๋ฐ Analyst์˜ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์šด์˜(Spotfire)
์‚ฌ์ด๋ฒ„ ๊ณต๊ฒฉ ๋Œ€์‘๊ณผ ๋ณด์•ˆ ๋ฐ ๋ฐฑ์—… ์‹œ์Šคํ…œ ๊ฐœ์„ , Spotfire ์ธํ”„๋ผ ๋ฉ”์ด์ € ์—…๊ทธ๋ ˆ์ด๋“œ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2023.05~2023.07
  • ์‚ฌ์ด๋ฒ„ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ๋ฐ ์„œ๋ฒ„ ๋ณต๊ตฌ, ๋ฐฑ์—… ์‹œ์Šคํ…œ ์ถ”๊ฐ€ ๊ฐœ์„ (Bash Script)
  • letencrypt ssl ์ธ์ฆ์„œ ๊ฐฑ์‹  ๋ฐ ๋„๋ฉ”์ธ ๋งตํ•‘ ์ž๋™ํ™”(Bash Script, Nginx, Docker)
  • ์‚ฌ์ด๋ฒ„ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ Windows ์„œ๋ฒ„ ๋กœ๊ทธ ๋ถ„์„ ๋ฐ ๋ฐฉํ™”๋ฒฝ ๋กœ๊ทธ ๋ถ„์„(Python, Bash Script)
  • ๊ณต๊ณต ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ETL์„ ์ž๋™ํ™”(Python, Golang)
  • Spotfire 7.11 -> 11.4 ์ธํ”„๋ผ ์—…๊ทธ๋ ˆ์ด๋“œ, ํ…Œ์ŠคํŠธ ๋ฐ ์šด์˜(Spotfire)
  • Global VPN์„ ํ†ตํ•œ Cloud VPN ์ ‘์† ๊ตฌ์„ฑ(KT Cloud, Azure)
๋ฐ์ดํ„ฐ ๋ถ„์„ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ ๋ฐ ๋ฐ์ดํ„ฐ ๊ตฌ์ถ• ํ”„๋กœ์„ธ์Šค ๊ฐ„์†Œํ™”, ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ๊ฐ•ํ™”
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2023.03~2023.05
  • ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ํ†ต๊ณ„ ๊ตฌ์„ฑ ๋ฐ Spotfire Server ์ธํ”„๋ผ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ(Spotfire, MSSQL)
  • TMAP API ๋ฐ์ดํ„ฐ ๊ตฌ์ถ• ์ž๋™ํ™” ๋ฐ ๊ธฐ์กด ๊ตฌ์„ฑ ๊ฐ„์†Œํ™” ๋ฐ ์†๋„ ๊ฐœ์„ (Python, MSSQL)
  • ๊ธ€๋กœ๋ฒŒ๊ณผ ํ˜‘์—…์„ ํ†ตํ•œ KT, KINX ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฐœ์„  ๋ฐ ๋ณด์•ˆ ๊ฐ•ํ™”, ๋„คํŠธ์›Œํฌ/๋ฐฉํ™”๋ฒฝ/ํฌํŠธํฌ์›Œ๋”ฉ ์žฌ๊ตฌ์„ฑ
  • KT, KINX์— ๋ถˆํ•„์š”ํ•œ ์ž์‚ฐ์„ ์ œ๊ฑฐํ•ด ์š”๊ธˆ ์ ˆ์•ฝ
๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ ๋ฐ ํด๋ผ์šฐ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์›น ์•ฑ ๊ฐœ๋ฐœ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2023.01~2023.02
  • ์‚ฌ๋‚ด Spotfire Server ์ธํ”„๋ผ๋ฅผ ํ™œ์šฉํ•ด SK Chemical ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ(Spotfire, MSSQL)
  • KT Cloud ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์›น ์•ฑ ๊ฐœ๋ฐœ(SvelteJS, Fastapi)
  • ํด๋ผ์ด์–ธํŠธ ์›น์‚ฌ์ดํŠธ UI ํ†ต์ผ ์ž‘์—…(NuxtJS, NestJS)
  • ๊ด€๋ฆฌ์ž ์›น์‚ฌ์ดํŠธ ํ”„๋กœ์ ํŠธ, ๋ถ„์„ ๋งตํ•‘ ๊ฐœ์„ (NuxtJS, ExpressJS)
  • ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ†ตํ•œ ์ž˜๋ชป๋œ ์›๋ณธ ๋ฐ์ดํ„ฐ ๊ฒ€์ถœ ๋ฐ ๊ฐ€๊ณต(Python, Spark, Pandas, MSSQL)
๊ธ€๋กœ๋ฒŒ ๋ณด์•ˆ ์†”๋ฃจ์…˜ ์ ์šฉ ๋ฐ ์‹ ๊ทœ ์„œ๋น„์Šค ๊ฐœ๋ฐœ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.10~2022.12
  • ๊ธ€๋กœ๋ฒŒ ๋ณด์•ˆ ์ค€์ˆ˜ ์‚ฌํ•ญ ๋ฐ ์†”๋ฃจ์…˜ ์ ์šฉ
  • ๋ณด์•ˆ ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋งž๋Š” ๊ธฐ์กด ์›น ์„œ๋น„์Šค OAuth ์žฌ๊ตฌ์„ฑ(NuxtJS, ExpressJS)
  • ์‹ ๊ทœ ์„œ๋น„์Šค PP์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต, ๋ถ„์„ ์‹œ๊ฐํ™”(Spotfire, NuxtJS, ExpressJS)
  • ํด๋ผ์ด์–ธํŠธ ์›น์‚ฌ์ดํŠธ UI ๊ฐœ์„  ๋ฐ ์‹ ๊ทœ ๋ถ„์„ ํŽ˜์ด์ง€ ์ถ”๊ฐ€(NuxtJS, ExpressJS)
  • ๊ด€๋ฆฌ์ž ์›น ์‹ธ์ดํŠธ ๊ฒ€์ƒ‰ ๋ฐ ์œ ์ € ๊ถŒํ•œ ์„ค์ • ๊ฐœ์„ (NuxtJS, NestJS)
์ธํ”„๋ผ ๋ฐ ์„œ๋น„์Šค์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.10~2022.10
  • KT, KINX์˜ OS ๋ฐ EOL ์ง€๋‚œ ์†Œํ”„ํŠธ์›จ์–ด(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ์—…๊ทธ๋ ˆ์ด๋“œ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฉ”์ด์ € ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(MSSQL, PostgreSQL)

์•„์ด์ง€๋„ท

100๋งŒ ์œ ์ €์™€ ๋ณดํ—˜ ์ค‘๊ฐœ์•ก ์„ฑ์žฅ๋ฅ  3๋…„ ์•ˆ์— 3000% ์„ฑ์žฅ ๋ฟ ์•„๋‹ˆ๋ผ ๋ณดํ—˜ ๊ฐ€์ž… ์œ ์ง€์œจ์ด 99%๋กœ ์—…๊ณ„ ํ‰๊ท ์ธ 70%๋ฅผ ํฌ๊ฒŒ ์›ƒ๋Œ๊ณ  ์žˆ๋Š” ๋ˆ„์  ์ค‘๊ฐœ์•ก 3000์–ต์„ ๋ŒํŒŒํ•˜๊ณ  ๋ˆ„์  ํˆฌ์ž์•ก 221์–ต ์ด์ƒ์˜ Series C ์ธ์Šˆ์–ด ํ…Œํฌ ์Šคํƒ€ํŠธ์—…

์•ฑ๊ฐœ๋ฐœ(์„ ์ž„์—ฐ๊ตฌ์›), ๋ฐ์ดํ„ฐ์—ฐ๊ตฌ์‹ค(์ฑ…์ž„์—ฐ๊ตฌ์›), ๊ธฐ์ˆ ๊ฐœ๋ฐœ์‹ค(ํ”„๋กœ)
์ฆ๊ถŒ์‚ฌ ๋ณดํ—˜ ์—”์ง„v4 ๊ฐœ๋ฐœ
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ
2022.07~2022.09
  • ์ฆ๊ถŒ์‚ฌ ์š”๊ตฌ์— ๋”ฐ๋ผ ๋ณดํ—˜ ๋ถ„์„ ๋ฐ ์ถ”์ฒœ ์—”์ง„ ๊ฐœ๋ฐœ(ExpressJS, PKG)
  • ๋ณดํ—˜ ๋ถ„์„ ์—”์ง„ ์ ์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช… ์„ธ๋ถ„ํ™” ๊ฐœ๋ฐœ(ExpressJS, Pandas, ๋ณดํ—˜ ๋„๋ฉ”์ธ ์—ฐ๊ตฌ)
  • ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ฐ ๋‹ค์ค‘ ๋ถ„๋ฅ˜๋ฅผ ํ†ตํ•ด ์‹ ๊ทœ ๋ถ„์„ ์—”์ง„ ๋ชจ๋ธ ๊ฐœ๋ฐœ(Keras)
  • ์—”์ง„์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ด๋ฐ์ดํ„ฐ์˜ ์‹ ๊ทœ ๋ฐ์ดํ„ฐ ํฌ๋งท์„ ๊ทœํ•ฉ(Pandas)
  • ์‹ ๊ทœ ์—”์ง„์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌ์ถ•(ExpressJS)
๋ณดํ—˜ ์—”์ง„v3 ์‹ ๊ทœ ๋ฒ„์ „ ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.04~2022.08
  • ๋‹ด๋ณด ๋‹จ์œ„์˜ ๋ถ„์„์„ ํ†ตํ•œ ๊ณ ๊ฐ ๋ณดํ—˜ ๋ถ„์„ ์—”์ง„ ๊ฐœ๋ฐœ(Golang, Python, Keras, Pandas)
  • ์‹ ๊ทœ ์—”์ง„์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์— ๋งž๋„๋ก ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์žฌ๊ตฌ์ถ•(ExpressJS)
  • API Service(SaaS) ์„œ๋น„์Šค ์šด์˜์„ ์œ„ํ•œ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ตฌ์ถ•(NestJS, NextJS)
์ž์ฒด ๋ณดํ—˜ ์ฒญ๊ตฌ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.02~2022.05
  • ๊ธฐ์กด ์ด์šฉํ•˜๋˜ ๋ณดํ—˜ ์ฒญ๊ตฌ API๋ฅผ ๋ถ„์„ํ•ด ๊ธฐ๋Šฅ ์„ค๊ณ„
  • ์ž…๋ ฅ์— ๋”ฐ๋ฅธ PDF ์ƒ์„ฑ ์ž๋™ํ™” ๋ฐ ๋ฉ”์ผ, ํŒฉ์Šค ์ „์†ก ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ(Golang)
  • BToB ์†”๋ฃจ์…˜์„ ์œ„ํ•œ API Service(SaaS)์— ์ฒญ๊ตฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€(ExpressJS)
  • ๋ณดํ—˜ ์ฒญ๊ตฌ ๊ด€๋ จ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ(NestJS, NextJS)
API Service ์„œ๋น„์Šค ์›น ์•ฑ ๊ฐœ๋ฐœ ๋ฐ ์•ฝ๊ด€ ๋ถ„์„ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2021.11~2022.01
  • ์™ธ๋ถ€ API Service๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜์—ฌ ๋ณดํ—˜ API Service์˜ ์†Œ๊ฐœ / ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์›น ์•ฑ ๊ฐœ๋ฐœ(Hugo)
  • ๊ฐ„ํŽธํ•œ ์ •๋ณด์„ฑ ํŽ˜์ด์ง€์™€ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์‚ฌ๋‚ด ์›น ํ”„๋ก ํŠธ์—”๋“œ ํ…œํ”Œ๋ฆฟ ๊ฐœ๋ฐœ(NextJS, TailwindCSS, Storybook, Recoil)
  • ์ „ ๋ณดํ—˜์‚ฌ์˜ ์•ฝ๊ด€์„ ๋ถ„์„ํ•ด ๊ณ ๊ฐ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์•ฝ๊ด€์˜ ๊ธฐ๋Šฅ/๋ณด์ƒ์  ํŠน์ง•์„ ์žก์•„๋‚ด ์ œ๊ณตํ•˜๋Š” ์‹ ๊ทœ API Service ์—ฐ๊ตฌ ๋ฐ ๊ฐœ๋ฐœ(Python, Pandas, ExpressJS)
  • ์•ฝ๊ด€ ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ณด์ƒ์„ ๊ตฌ์ฒดํ™”ํ•˜๊ธฐ ์œ„ํ•ด KOICD ์งˆ๋ณ‘์ฝ”๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์„ฑ์„ ์ฐพ์•„ ๋งตํ•‘ํ•˜์—ฌ ๊ณ ๊ฐ์—๊ฒŒ ํ•„์š”ํ•œ ๋ณดํ—˜์„ ์ถ”์ฒœํ•˜๋Š” ์—”์ง„ ๊ฐœ๋ฐœ(ExpressJS, Pandas)
๋ณดํ—˜์‚ฌ ๋ณดํ—˜ ์—”์ง„v2.1 ๊ฐœ๋ฐœ ๋ฐ API Service ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2021.05~2021.08
  • ๋ณดํ—˜ ์ง„๋‹จ/์ถ”์ฒœ ์—”์ง„ ์†”๋ฃจ์…˜ ๊ฐœ๋ฐœ ๋ฐ ๋‚ฉํ’ˆ, ํƒ€์‚ฌ์— ์—”์ง„ ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ปจ์„คํŒ…(Golang)
  • API Service ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ(NestJS, NextJS)
  • 44๊ฐœ ๋ณดํ—˜์‚ฌ ๊ณต์‹œ์‹ค ํŒŒ์ผ ์ˆ˜์ง‘ ์„œ๋ฒ„ ๋ฐ ๋Œ€์‹œ๋ณด๋“œ ์›น ์•ฑ ๊ฐœ๋ฐœ(Selenium, Celery, Django, React)
  • ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์—…๋ฌด๋ฅผ ์œ„ํ•œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ(ExpressJS)
  • API Service๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ์˜ ์„œ๋น„์Šค ๋ถ„๋ฆฌ ๊ฐœ๋ฐœ(ExpressJS)
  • API Service์˜ GCP ์„œ๋น„์Šค๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ(GCP, API Gateway, Cloud Run, Cloud Logging, BigQuery)
  • API Service ์„ค๊ณ„์™€ ํ† ํฐ์„ ํ†ตํ•œ ๊ณ ๊ฐ ์‚ฌ์šฉ๋Ÿ‰ ์ฒดํฌ ๋ฐ ๊ณผ๊ธˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ(ExpressJS)
๋ณดํ—˜ ์—”์ง„v2 ๊ฐœ๋ฐœ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„ 
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2020.11~2021.01
  • ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ†ตํ•ด ์‹ ๊ทœ ๋ณดํ—˜ ๋ถ„์„ ์—”์ง„ ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ(Sklearn, Pandas, ExpressJS)
  • ์—”์ง„ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ(ExpressJS, ReactJS)
  • ์—”์ง„์˜ ๋ฐฉ๋Œ€ํ•œ ๋กœ๊ทธ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ Elastic Search๋กœ ๋ถ„๋ฆฌ ์ €์žฅํ•˜์—ฌ ์„œ๋น„์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ๊ฐœ์„ (ElasticSearch, Logstash, Kibana, MongoDB, PostgreSQL, ExpressJS)
  • ๋ณดํ—˜ ์—”์ง„์˜ ๋ถˆํ•„์š”ํ•œ ๋กœ์ง ์ œ๊ฑฐ์™€ ์ค‘๋ณต ์ž‘์—… ์ œ๊ฑฐ, ๋กœ์ง ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ†ตํ•ด ๊ธฐ์กด ๋Œ€๋น„ 40๋ฐฐ ๊ฐ€๋Ÿ‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ(ExpressJS)
  • ์—”์ง„ ์œ ์ง€๋ฅผ ์œ„ํ•œ ์ฃผ๊ธฐ์  ๋ฐ์ดํ„ฐ ์—…๋ฌด ์ž๋™ํ™”๋ฅผ ํ†ตํ•ด ๊ด€๋ จ ์—…๋ฌด ์‹œ๊ฐ„ 85% ์ ˆ๊ฐ(ExpressJS)
๋งˆ์ด๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€๋น„ํ•œ ์‚ฌ์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ๊ด€๋ฆฌ์ž ๋ฐ ํšŒ์‚ฌ ์†Œ๊ฐœ ์›น ์•ฑ ๊ฐœ๋ฐœ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2020.04~2020.08
  • Laravel๊ณผ ExpressJS, MySQL๋กœ ๊ตฌ์„ฑ๋œ ๊ธฐ์กด ๋ณดํ—˜ ์—”์ง„ ๋ฐ ์„œ๋น„์Šค ์„œ๋ฒ„๋ฅผ ExpressJS, MongoDB๋กœ ๊ตฌ์„ฑ๋œ ์‹ ๊ทœ ๋ณดํ—˜ ์—”์ง„์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Laravel, ExpressJS, Koscom Cloud, NCP)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ MySQL -> MongoDB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(MySQL, MongoDB)
  • ํ†ตํ•ฉ ๊ด€๋ฆฌ์ž/ํ”Œ๋ž˜๋„ˆ ์›น ์•ฑ ๋ฐ ํšŒ์‚ฌ ์†Œ๊ฐœ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ(ReactJS, ExpressJS)
์‹ฌํ™” ์ฒญ๊ตฌ ์„œ๋น„์Šค ๊ฐœ๋ฐœ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๊ฐœ์„ 
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2019.11~2020.03
  • ๋ชจ๋ฐ”์ผ ์•ฑ ๋ฐ Webview(์›น ์•ฑ) ๊ฐ„ ํ†ต์‹  ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ๋ฐ ์•ฑ ๋‚ด ๊ด‘๊ณ  ํšจ์œจ ์ธก์ •์„ ์œ„ํ•œ ์• ๋“œ๋ธŒ๋ฆญ์Šค ์ ์šฉ(Adbrix, React Native, ReactJS, ExpressJS)
  • ๋”ฅ๋งํฌ๋ฅผ ํ™œ์šฉํ•œ ํ”Œ๋ž˜๋„ˆ ๊ฐœ์ธ ๊ณ ๊ฐ ์ „์šฉ ํ”„๋กœ์„ธ์Šค ๊ฐœ๋ฐœํ•ด ์•ฑ ๋‚ด ๊ณ ๊ฐ ํ™•๋ณด(Adbrix, ReactJS, ExpressJS)
  • ์•ˆ๋‚ด ํŒ์—… ๋ฐ ์•ฑ ํ‘ธ์‹œ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ๊ด‘๊ณ  ๋ฐ ์œ ์ € ๋ฆฌํ…์…˜ ์ฆ๋Œ€(ExpressJS, ReactJS, Onesignal, Adbrix)
  • ๊ฐ„ํŽธ ์ฒญ๊ตฌ์™€ ์ฒญ๊ตฌ ์ƒ๋‹ด, ๋ถ„์Ÿ์กฐ์ •์‚ฌ๋ก€ ๋ฐ ๋ณด์ƒ์‚ฌ๋ก€๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ณ ๊ฐ์˜ ์ฒญ๊ตฌ์— ๋”ฐ๋ผ ์ •๋ณด๋„ ๊ฐ™์ด ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค ๊ฐœ๋ฐœ(AWS, ExpressJS, ReactJS, Pandas, Pyautogui)
  • ์•ฑ ๋‚ด ๊ณต์ง€, ์ด๋ฒคํŠธ ๊ฒŒ์‹œํŒ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ(ExpressJS, ReactJS)
  • ๊ณต์ง€, ์ด๋ฒคํŠธ ๊ฒŒ์‹œํŒ ์ปจํ…์ธ  ์ž‘์„ฑ์„ ์œ„ํ•œ ์—๋””ํ„ฐ ๊ตฌ์ถ•(Github, ReactJS, ExpressJS)
  • ReactJS ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ Class Component -> Functional Component๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(ReactJS)
  • React Native ๊ฐœ๋ฐœ ์ฝ”๋“œ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ(React Native)
  • Google-Referrer ์ •์ฑ… ์—…๋ฐ์ดํŠธ ๋ฐ ์Šคํ† ์–ด ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋”ฐ๋ฅธ ์ˆ˜์ •(React Native)

๋น„๋งํฌํ—ฌ์Šค์ผ€์–ด

100๋งŒ ๋ช…์˜ ๊ฑด๊ฐ•๊ฒ€์ง„ ๋น…๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํ‘œ์ค€ํ™”์™€ ์˜๋ฃŒ์ง€์‹ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•์„ ํ†ตํ•œ ์˜๋ฃŒ์ •๋ณด์ปจํ…์ธ ์™€ ๊ฑด๊ฐ•๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ—ฌ์Šค์ผ€์–ด ์„œ๋น„์Šค ์‹ ์ƒ ์Šคํƒ€ํŠธ์—…

ํ—ฌ์Šค์ผ€์–ด๋น…๋ฐ์ดํ„ฐ๋ถ„์„ํŒ€(์ฃผ์ž„์—ฐ๊ตฌ์›)
๊ฑด๊ฐ•๊ฒ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2019.08~2019.10
  • ๊ฑด๊ฐ•๊ฒ€์ง„ PDF ํŒŒ์ผ ๊ณต์œ  ๋ฐ ์ „์†ก์„ ์œ„ํ•œ ์™ธ๋ถ€ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ(ReactJS, ExpressJS, MySQL)
  • 100๋งŒ ๊ฑด๊ฐ•๊ฒ€์ง„ PDF ํŒŒ์ผ์„ ์ด์šฉํ•ด ์ž๋™ ํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœ ๋ชจ๋ธ ๊ฐœ๋ฐœ ํ›„ ๊ฒ€์ฆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ(Pyautogui, Django, Selenium, Chrome)
  • ์ž๋™ ํ…์ŠคํŠธ ์ถ”์ถœ ๋ชจ๋ธ ์‹คํŒจ ์‹œ ์ง„ํ–‰ํ•  ์ด๋ฏธ์ง€๋ฅผ ์กฐ์ž‘ ๋ฐ ์ˆ˜๋™ ์ž…๋ ฅ๊ณผ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•œ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ(ReactJS, ExpressJS, MySQL)
  • ์†Œ๊ทœ๋ชจ ๋ณ‘์›์—์„œ ์‚ฌ์šฉํ•  ํ†ต๊ณ„ ์ œ๊ณต์šฉ ์›น ์•ฑ ๊ฐœ๋ฐœ(ReactJS, ExpressJS, MySQL)
ํ”„๋กœํ† ํƒ€์ž… ์•ฑ ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2019.08~2019.08
  • ํˆฌ์ž ์œ ์น˜๋ฅผ ์œ„ํ•œ ์‹œ์—ฐ์šฉ ํ”„๋กœํ† ํƒ€์ž… ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ(React Native)
  • ์›น/๋ชจ๋ฐ”์ผ ์•ฑ, ์„œ๋ฒ„, DB ๊ฐœ๋ฐœ(React Native, ReactJS, Django, ExpressJS, MySQL, GCP)

ํ…์Šคํ† ๋ฆฌ

10๋งŒ๋ช… ์ด์ƒ์˜ ๋ฆฌํ…์…˜ ๋†’์€ ์œ ๋ฃŒ ์œ ์ €๋“ค์„ ๋ณด์œ ํ•œ ๋Œ€๋Ÿ‰ ๋ฉ”์‹œ์ง€ ์„œ๋น„์Šค ๊ธฐ์ˆ  ๊ธฐ๋ฐ˜์˜ ๋ฉ”์‹œ์ง€ ํ”Œ๋žซํผ ์Šคํƒ€ํŠธ์—…

์›น๊ฐœ๋ฐœํŒ€(์—ฐ๊ตฌ์›)
์Œ์„ฑ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ํ™˜๊ฒฝ ๊ตฌ์ถ•
๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด
2019.06~2019.07
  • SRT ๋‚ด ์Œ์„ฑ ์ˆ˜์ง‘ ๋ฌผ๋ฆฌ ์žฅ์น˜ ์„ค์น˜
  • ์—ํŠธ๋ฆฌ ์Œ์„ฑ ๋ถ„์„ ์—”์ง„์„ ์œ„ํ•œ ํ•„์š” ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๋ฐ ์ „๋‹ฌ(Python)
  • ์—ํŠธ๋ฆฌ ์Œ์„ฑ ๋ถ„์„ ์—”์ง„ ๋„์ž…์„ ์œ„ํ•œ ๊ณ ์‚ฌ์–‘ ๋ฐ์Šคํฌํƒ‘ ์…‹ํŒ…(Tensorflow GPU)
ํฌ์ธํŠธ์Šคํ† ๋ฆฌ ์•ฑ ๊ฐœ๋ฐœ
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2019.04~2019.05
  • ์‹ ๊ทœ ์„œ๋น„์Šค ๋ฐœ๊ตด์„ ์œ„ํ•œ ์‹œ์žฅ ์กฐ์‚ฌ
  • ํฌ์ธํŠธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒ์ ๊ณผ ํ˜‘์—…ํ•ด ํฌ์Šค๊ธฐ ์žฅ๋น„์˜ ๊ตฌ๋งค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“ˆ ๊ตฌ์ถ•(Dotnet)
  • ๊ณ ๊ฐ ๊ด€๋ฆฌ, ๋ฉ”์‹œ์ง€ ์ „์†ก, ์˜ˆ์•ฝ ์ „์†ก, ํฌ์ธํŠธ ๊ด€๋ฆฌ, ์ด๋ฒคํŠธ ์ „์†ก ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋ฐ์Šคํฌํƒ‘ ์•ฑ์œผ๋กœ ๊ฐœ๋ฐœ(ElectronJS, ReactJS, ExpressJS)
์Šˆํผ๋ฉ”์‹œ์ง€ ์•ฑ ๊ฐœ๋ฐœ
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2019.01~2019.03
  • ์‹ ๊ทœ ์„œ๋น„์Šค ๋ฐœ๊ตด์„ ์œ„ํ•œ ์‹œ์žฅ ์กฐ์‚ฌ
  • ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœ์„ ํ†ตํ•œ UI/UX ๊ฒ€์ฆ(Kakao Oven)
  • ์—ฌ๋Ÿฌ ๋Œ€์˜ ์Šค๋งˆํŠธํฐ์„ ํ•˜๋‚˜์˜ ์•„์ด๋””๋กœ ์—ฐ๊ฒฐํ•ด ์Šค๋งˆํŠธํฐ ๋‹น ๋ฌธ์ž ํšŸ์ˆ˜ ์ œํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•œ ๊ณ ๊ฐ ๊ด€๋ฆฌ ๋ฐ์Šคํฌํƒ‘ ์•ฑ ๊ฐœ๋ฐœ(ElectronJS, ReactJS, ExpressJS)
  • ์„œ๋น„์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ด€๋ฆฌ์ž ์›น ์•ฑ ๊ฐœ๋ฐœ(ReactJS, ExpressJS)
์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(ํ”„๋ก ํŠธ์—”๋“œ/๋ฐฑ์—”๋“œ)
ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2018.12~2019.01
  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” Marionettejs -> Reactjs๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(ReactJS)
  • ๋ฐฑ์—”๋“œ๋Š” Backbonejs -> Expressjs๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(ExpressJS)

Freelancer Experience.

Grablo

์ฝ”๋”ฉ ์—†์ด ์›น์„ ํ†ตํ•ด ๋‚˜๋งŒ์˜ IOT ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ.

Freelancer
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2023.12~2024.12
  • ์›น ์•ฑ ๊ฐœ๋ฐœ ๊ด€๋ จ ์ด์Šˆ ํ•ด๊ฒฐ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ์ œ์‹œ(NextJS, NestJS, GraphQL)
  • ์›น ์•ฑ ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ธฐํš ๋ฐ ๊ฐœ๋ฐœ(NextJS, NestJS)
  • Kubernetes๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ, ๋ผ์ด๋ธŒ ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜(Kubernetes, GCP, Jenkins)
  • ๊ธฐ์กด ์›น ์ฝ”๋“œ๋ฅผ ์‹ ๊ทœ ์ฝ”๋“œ์™€ ์ธํ”„๋ผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(GCP, Kubernetes, NestJS, NextJS, Fastify, GraphQL, MikroORM)
  • ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฐ์Šคํฌํƒ‘ ์•ฑ ๊ฐœ๋ฐœ(PyQt, Flet, Windows, Mac, Linux)

Vectorspace

MZ๋“ค์˜ ์ทจ๋ฏธ ๊ธฐ๋ฐ˜์˜ ์†Œํ†ต์„ ์œ„ํ•œ SNS.

Freelancer
PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.08~2022.12
  • ๋ชจ๋ฐ”์ผ/์›น ์•ฑ์˜ ์ด์Šˆ ํ•ด๊ฒฐ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ์ œ์‹œ(Flutter, NestJS, NextJS)
  • Retool์„ ์ด์šฉํ•œ ๊ด€๋ฆฌ์ž ์›น ๋Œ€์‹œ๋ณด๋“œ ๊ฐœ๋ฐœ(Retool)
  • ํ…Œ์ŠคํŠธ, ๋ผ์ด๋ธŒ ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜(Docker, GCP, Jenkins)
  • ์ „์ฒด ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ๋ฆฌํŽ™ํ† ๋ง, ๊ฐœ๋ฐœ ๊ด€๋ จ ์ปจ๋ฒค์…˜ ๊ตฌ์„ฑ(JS->TS, ์žฌ์‚ฌ์šฉ ์ฝ”๋“œ, Swagger ๋ฐ ๋ฌธ์„œ ์ž‘์„ฑ, Pre-commit, Slack)
  • ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ ๋ณ„ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ฐœ๋ฐœ(NestJS)
  • ์•ฑ ๋‚ด ๋”ฅ๋งํฌ ๋ฐ ์Šคํ‚ค๋งˆ ์ ์šฉ(NestJS)

๋ฆฌ์–ผ๋ฆฌํ‹ฐ๋งค์ง

15๋…„์ด์ƒ AAA๊ธ‰ PC/์ฝ˜์†”/๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„๋“ค์„ ๊ฐœ๋ฐœํ•ด์˜จ ๊ฐœ๋ฐœ์ž๋“ค์— ์˜ํ•ด ์„ค๋ฆฝ๋˜์–ด, ์„ธ๊ณ„์  ์ˆ˜์ค€์˜ ๊ฒŒ์ž„ ํƒ€์ดํ‹€๋“ค์„ ๊ณต๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

freelancer
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ
2021.08~2021.12
  • ์–ด๋“œ๋ฏผ ์›น ์•ฑ ๊ฐœ๋ฐœ(ReactJS)
  • ์„ค๊ณ„, ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ ์ž‘์„ฑ
  • ๋ณ€๊ฒฝ ์š”์ฒญ ์‚ฌํ•ญ ์ ์šฉ(ReactJS)
  • ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์„ค๊ณ„ ๋ฌธ์„œ ์ž‘์„ฑ(IA, ์™€์ด์–ดํ”„๋ ˆ์ž„, UI/UX)

Side Project Experience.

Dabinsa

๊ฒฐํ˜ผ์‹์—์„œ QR์„ ํ†ตํ•ด ๋‹ต๋ก€ํ’ˆ์„ ์„ ํƒํ•˜๊ณ  ๋ฐฐ์†กํ•ด ์ฃผ๋Š” ๊ฐ„ํŽธ ๋‹ต๋ก€ํ’ˆ ์ „์†ก ์„œ๋น„์Šค.

PM, ํ’€์Šคํƒ ๊ฐœ๋ฐœ
2022.05~2023.05
  • ์›น/๋ชจ๋ฐ”์ผ ์•ฑ์˜ ์ดˆ๊ธฐ ๊ธฐํš ๋ฐ ๊ฐœ๋ฐœ(Flutter, SvelteJS, NestJS, Figma)
  • ์ธํ”„๋ผ ๊ตฌ์„ฑ(Oracle Cloud)

Skill.

ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ  ์Šคํƒ๋งŒ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

(โฌ‡๏ธ์•„๋ž˜ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํŽผ์ณ์„œ ํ™•์ธํ•˜์„ธ์š”.)

ํ”„๋ก ํŠธ์—”๋“œ
NodeJS(TS)
NextJS, NuxtJS, NextUI, Recoil, Tailwindcss, Shadcn, SvelteJS, ReactJS, VueJS, Redux, MUI
Dart
Flutter
๋ฐฑ์—”๋“œ
NodeJS(TS)
ExpressJS, NestJS, BullMQ, TypeORM, MikroORM, Mongoose, GraphQL, Socket.io
Golang
Fiber, Asynq, GORM, Beego, Gin
Rust
Rocket, ActiX
Python
FastApi, Django, Celery, Sqlalchemy
๋ฐ์ดํ„ฐ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
PostgreSQL, MSSQL, SQLlite, MongoDB, ElasticSearch, Redis
์ˆ˜์ง‘ ๋ฐ ์ž๋™ํ™”
Selenium, BeautifulSoup, Pyautogui, Scrapy
ETL
MageAI, Airflow, Nifi, Pandas
์‹œ๊ฐํ™”
Spotfire, PowerBI, Plotly, Retool, Tooljet, Redash
๋ถ„์„
Torch, Tensorflow, Keras, Huggingface, Transformers, Sklearn
์ธํ”„๋ผ
GCP
GCE, LB, GCS, GKE, SQL, Cloud Run, Artifact Registry, Cloud Armor, Google Domains, Cloud DNS, BigQuery
AWS
Route53, EC2, ACM, RDS, S3, LB, API Gateway, Lambda
AZURE
Network, Azure MI SQL Server, ContainerInstances, StorageAccount(FileShare, BlobStorage), VM, Network, LB
KT Cloud
VM, Networking, NAS, ObjectStorage
3rd Party
Jenkins, GitlabCI, SynologyNAS, Pusher, AlgoliaSearch, Heroku, Netlify, Vercel, Firebase, CloudFlare, ElasticCloud, RedisLab, MongoDBAtlas
Cloud Native
Kubernetes, Helm, Istio, Prometheus, ArgoCD, Telepresence, Infisical
ํฌ๋กœ์Šคํ”Œ๋žซํผ ์•ฑ
NodeJS(Typescript)
ReactNative, Expo
Dart
Flutter
Python
Flet

Education.

  • 2018.04~2018.11 - ์ธํฌ๋ ˆํŒŒ์Šค - ๋”ฅ๋Ÿฌ๋‹์„ ํ™œ์šฉํ•œ ์›น ๊ฐœ๋ฐœ ๊ต์œก ๊ณผ์ •(์ˆ˜๋ฃŒ)
  • 2008.03~2015.02 - ๋‚จ์„œ์šธ๋Œ€ํ•™๊ต - ์ „์ž๊ณตํ•™๊ณผ(์กธ์—…)