์ •๋ณด

์ •๋ณด

๐Ÿ‘‹ ์•ˆ๋…•ํ•˜์„ธ์š”!

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž NOWIL์ž…๋‹ˆ๋‹ค.

์ฃผ๋กœ Spring Boot, Kotlin, AWS ๊ธฐ๋ฐ˜์˜ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ฒช์€ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝํ—˜๊ณผ ํ•™์Šต ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ Tech Stack

  • Backend: Spring Boot, Kotlin, Node.js
  • Database: PostgreSQL, MongoDB, Redis
  • Cloud: AWS (ECS, Lambda, RDS, S3)
  • DevOps: Docker, GitHub Actions

๐Ÿ’ผ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋ ฅ

Duurian ๋ฐฑ์—”๋“œ ๋‹ด๋‹น (2025.11 ~)

๊ฐœ์ธ ๋งž์ถคํ˜• ๋งŒ๋‚จ ์ œ๊ณต ๋งค์นญ ์„œ๋น„์Šค โ€˜Duurianโ€™ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

Restful API ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง AI ์„œ๋ฒ„ ์—ฐ๋™ ์„œ๋น„์Šค ๊ตฌํ˜„

  • ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
    • Spring ๋ฐ PostgreSQL ๊ธฐ๋ฐ˜ ์„œ๋ฒ„์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„
    • ๊ธฐ์ˆ  ํ‚ค์›Œ๋“œ: Kotlin, Spring, JPA, PostgreSQL, OpenAI, Async
    • ์•„ํ‚คํ…์ฒ˜: Hexagonal + Multi-module (api, core, domain, infrastructure)
  • ๋‹ด๋‹น ์—…๋ฌด
    • ๋ชจ๋“ˆ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์›น ์–ด๋Œ‘ํ„ฐ, ์œ ์Šค์ผ€์ด์Šค, ๋„๋ฉ”์ธ ๋ชจ๋ธ, ์˜์†์„ฑ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋ถ„๋ฆฌ
    • ๋“€๋ฆฌ์™€์˜ ๋Œ€ํ™”(OpenAI ChatGPT API ์—ฐ๋™์„ ํ†ตํ•œ ์ฑ„ํŒ… ํ›„ ๋ณด์ƒ ์ง€๊ธ‰) ํ†ตํ•ฉ ๊ตฌํ˜„
    • ๋Œ€ํ™”/์š”์•ฝ/ํŽ˜๋ฅด์†Œ๋‚˜/ํ”„๋กฌํ”„ํŠธ/๋ฆฌ์›Œ๋“œ ๋“ฑ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ์ˆ˜์ง ํ†ตํ•ฉ ๊ตฌํ˜„
    • ๋Œ€ํ™” ์ฒ˜๋ฆฌ โ†’ ์š”์•ฝ โ†’ ๋ฆฌ์›Œ๋“œ(๋ณด์ƒ) ์ง€๊ธ‰์œผ๋กœ ์ด์–ด์ง€๋Š” ํ›„์ฒ˜๋ฆฌ ์ฒด์ธ์„ ์„ค๊ณ„ยท๊ตฌํ˜„
  • ์ฃผ์š” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    • ์™ธ๋ถ€ LLM(OpenAI) ์—ฐ๋™ ์•ˆ์ •ํ™” ๋ฐ ์š”์ฒญ ๊ตฌ์กฐ ํ‘œ์ค€ํ™”
    • ๋Œ€ํ™” ์š”์•ฝ ์ƒ์„ฑ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ ํ™•๋ฆฝ (71% ์„ฑ๋Šฅ ๊ฐœ์„  ๋‹ฌ์„ฑ)
    • ๋Œ€ํ™”ยท์งˆ๋ฌธยท์š”์•ฝยทํ”„๋กฌํ”„ํŠธ ๊ธฐ๋Šฅ์„ ์—”๋“œํˆฌ์—”๋“œ๋กœ ์„ค๊ณ„/๊ตฌํ˜„
    • ๋ฆฌ์›Œ๋“œ(๋ณด์ƒ) ์ง€๊ธ‰/์กฐํšŒ ๋กœ์ง์„ ์ •๋ฆฌํ•ด ๋„๋ฉ”์ธ ํ™•์žฅ์„ฑ ๊ฐ•ํ™”
    • ํŽ˜๋ฅด์†Œ๋‚˜ ๊ณต๊ฐœ ์—ฌ๋ถ€ ๊ด€๋ จ ๋ฒ„๊ทธ ์ˆ˜์ •์œผ๋กœ ๋ฐ์ดํ„ฐ ์‹ ๋ขฐ์„ฑ ๊ฐœ์„ 
    • ๋น„๋™๊ธฐ ๊ตฌ์กฐ๋กœ ์‘๋‹ต ์ง€์—ฐ ์ตœ์†Œํ™” ๋ฐ DIP ๊ธฐ๋ฐ˜ ํ™•์žฅ์„ฑ ํ™•๋ณด

Emerdy ๋ฐฑ์—”๋“œ ๋‹ด๋‹น (2023.02 - 2023.12)

๋”ฅ๋Ÿฌ๋‹๊ณผ ์Œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์œ„๊ธ‰ ์ƒํ™ฉ ๋Œ€์‘ ์•ฑ โ€˜Emerdyโ€™ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

์•„ํ‚คํ…์ฒ˜ยท์ธํ”„๋ผ ์„ค๊ณ„ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ด๊ด„ AI ์„œ๋ฒ„ ์—ฐ๋™ ์„œ๋น„์Šค ๊ตฌํ˜„

  • ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
    • Nest.js ๋ฐ MySQL ๊ธฐ๋ฐ˜ ์„œ๋ฒ„์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„
  • ๋‹ด๋‹น ์—…๋ฌด
    • ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
    • Restful API ๊ตฌํ˜„
    • ์Œ์„ฑ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
    • ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ์œ„์น˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ 
    • ์ธํ”„๋ผ ๋ฐ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • ์‹œ์Šคํ…œ ์„ค๊ณ„
    • ์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜์—ฌ MySQL ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„
  • ์‹ค์‚ฌ์šฉ ํ…Œ์ŠคํŠธ
    • 50๋ช…์˜ ์ž ์žฌ ๊ณ ๊ฐ์„ ๋Œ€์ƒ์œผ๋กœ ์Œ์„ฑ ๋…น์Œ ์‹œ์ž‘ ๋™์ž‘ ํŠธ๋ฆฌ๊ฑฐ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ
    • ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ๊ฐœ์„  ์ฃผ๋„
  • ์ฃผ์š” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    • GeoJSON ํ˜•์‹์œผ๋กœ ์œ„์น˜ ๋ฐ์ดํ„ฐ ์ €์žฅ
    • FFMPEG๋ฅผ ํ†ตํ•ด ์Œ์„ฑ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ตœ์ ํ™”๋กœ ์Œ์„ฑ ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ ์‹œ๊ฐ„ 3์ดˆ ๋‹จ์ถ•
    • ์Œ์„ฑ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• (S3 โ†’ AWS Transcribe โ†’ ML ์„œ๋ฒ„ โ†’ DB)
    • Socket.io๋ฅผ ํ†ตํ•œ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ์œ„์น˜ ๋ฐ์ดํ„ฐ ํ†ต์‹  ๊ตฌํ˜„
    • Message Queue์ธ Bull.js๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ Push Notification ๊ตฌํ˜„ํ•˜์—ฌ ์ž‘์—… ๋ถ„๋ฆฌ๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ตœ์†Œํ™”
  • ์ธํ”„๋ผ ๋ฐ ๋ฐฐํฌ
    • Naver Clova โ†’ AWS Transcribe๋กœ ์ „ํ™˜ํ•˜์—ฌ ์Œ์„ฑ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์œ„๊ธ‰ ์ƒํ™ฉ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •ํ™•๋„ ํ–ฅ์ƒ
    • Docker, Docker-compose, GitHub Actions ๊ธฐ๋ฐ˜ AWS ์ธํ”„๋ผ ์šด์˜
    • Nginx Reverse Proxy๋ฅผ ํ†ตํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐ SSL ์ฒ˜๋ฆฌ

Devigation ๋ฐฑ์—”๋“œ ๋‹ด๋‹น (2023.08 - 2023.11)

๊ฐœ๋ฐœ์ž ์ปค๋ฆฌํ˜๋Ÿผ ๊ณต์œ  ์›น ํ”Œ๋žซํผ โ€˜Devigationโ€™ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ด๊ด„ Restful API ๊ฐœ๋ฐœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ‘œ์ค€ํ™” ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™” ์ •์ฐฉ

  • ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
    • Spring 2.7(SpringBoot) ๋ฐ MySQL ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„
  • ๋‹ด๋‹น ์—…๋ฌด
    • DDD ๊ธฐ๋ฐ˜ ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
    • ์ธ์ฆ ๋ฐ ๋ณด์•ˆ ๋„๋ฉ”์ธ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
    • Restful API ๊ตฌํ˜„
    • ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋„๋ฉ”์ธ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
    • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • ์ธ์ฆ ๋ฐ ๋ณด์•ˆ
    • Spring Security๋ฅผ ํ†ตํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
    • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜์—ฌ Stateless ์ธ์ฆ์œผ๋กœ ํ™•์žฅ์„ฑ ํ™•๋ณด
    • OAuth2(Github) ๋กœ๊ทธ์ธ ์ง€์› ๊ตฌํ˜„
  • ์‹œ์Šคํ…œ ์„ค๊ณ„
    • ๊ฐ์ฒด ์ง€ํ–ฅ ๊ธฐ๋ฐ˜์˜ ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ
    • DDD ์›์น™์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‘์ง‘๋„ ํ–ฅ์ƒ
    • ์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜์—ฌ MySQL ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„
    • RestControllerAdvice๋ฅผ ํ†ตํ•œ ์—๋Ÿฌ ์‘๋‹ต ์ฝ”๋“œ ํ•ธ๋“ค๋ง
  • ํ’ˆ์งˆ ๊ด€๋ฆฌ
    • JUnit์„ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ ๋งŒ์กฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ
    • GitHub Actions๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ ๊ณผ์ •์˜ ๋ถˆํ™•์‹ค์„ฑ๊ณผ ๋น„ํšจ์œจ์„ ํ•ด๊ฒฐ
    • Swagger๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ ๋ฌธ์„œํ™”ํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์—… ๊ฐ•ํ™”

์ฐฐ๋ฆฌ์™€ ๊ฑท๊ธฐ ๋ฐฑ์—”๋“œ ๋‹ด๋‹น (2022.08 - 2023.02)

์บ๋ฆญํ„ฐ ์œก์„ฑ์„ ํ†ตํ•œ ์†Œ์…œ ๋งŒ๋ณด๊ธฐ ์•ฑ โ€˜Charlieโ€™ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

์•„ํ‚คํ…์ฒ˜ยท์ธํ”„๋ผ ์„ค๊ณ„ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ด๊ด„ Restful API ๊ฐœ๋ฐœ ์ธํ”„๋ผ ๊ตฌ์„ฑ

  • ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
    • Nest.js ๋ฐ MySQL ๊ธฐ๋ฐ˜ ์„œ๋ฒ„์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„
  • ์‹œ์Šคํ…œ ์„ค๊ณ„
    • ์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜์—ฌ MySQL ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋ฐœ
    • ์ผ๊ฐ„ ๊ฑธ์Œ ์ˆ˜๋ฅผ ํ†ตํ•œ ๋น„๋งŒ๋„ ๋ ˆ๋ฒจ ๊ณ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋ฐœ
  • ์ธํ”„๋ผ ๋ฐ ๋ฐฐํฌ
    • Docker, Docker-compose, GitHub Actions ๊ธฐ๋ฐ˜ AWS ์ธํ”„๋ผ ์šด์˜
    • AWS ECS ๊ธฐ๋ฐ˜ ์ž๋™ํ™” CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์œผ๋กœ ๋ฐฐํฌ ์†Œ์š” ์‹œ๊ฐ„ 10๋ถ„ ๋‚ด๋กœ ๋‹จ์ถ•
  • ์ฃผ์š” ์„ฑ๊ณผ
    • App Store ๊ฑด๊ฐ• ๋ฐ ํ”ผํŠธ๋‹ˆ์Šค ์นดํ…Œ๊ณ ๋ฆฌ ๋ฌด๋ฃŒ ์ธ๊ธฐ ์•ฑ 1์œ„ ๋‹ฌ์„ฑ
    • App Store ์ „์ฒด ์ธ๊ธฐ ๋ฌด๋ฃŒ ์•ฑ 43์œ„ ๋‹ฌ์„ฑ
    • (2022.12 ๊ธฐ์ค€) ์›”๊ฐ„ ํ™œ์„ฑ ์‚ฌ์šฉ์ž 2,000๋ช… ์ด์ƒ ํ™•๋ณด

๋ชจ๋ธŒ ๋ฐฑ์—”๋“œ ๋‹ด๋‹น (2020.11 - 2022.05)

์—ฌ์„ฑ ์›”๊ฒฝ ์ฃผ๊ธฐ ํŠธ๋ž˜ํ‚น ๋ฐ ํ˜ธ๋ฅด๋ชฌ ์‚ฌ์ดํด ๊ธฐ๋ฐ˜ ๋‹ค์ด์–ดํŠธ ์•ฑ โ€˜Mauveโ€™ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

์•„ํ‚คํ…์ฒ˜ยท์ธํ”„๋ผ ์„ค๊ณ„ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง Restful API ๊ฐœ๋ฐœ

  • ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
    • Express.js ๋ฐ MongoDB ๊ธฐ๋ฐ˜ ์„œ๋ฒ„์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„
  • ์‹œ์Šคํ…œ ์„ค๊ณ„
    • ์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜์—ฌ MongoDB ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋ฐœ
    • ์‚ฌ์šฉ์ž์˜ ์›”๊ฒฝ ์‹œ์ž‘์ผ ๋ฐ ์ข…๋ฃŒ์ผ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์›”๊ฒฝ ์ฃผ๊ธฐ ๋ฐ ํ˜ธ๋ฅด๋ชฌ ์‚ฌ์ดํด ์˜ˆ์ธก ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋ฐœ
  • ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 
    • socket.io๋ฅผ ํ†ตํ•œ ์ฑ„ํŒ… ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • Message Queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Bull.js๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ Push Notification ๊ตฌํ˜„
  • ๋ฐฐํฌ ๋ฐ ์ธํ”„๋ผ
    • ECS์˜ Dynamic Port Mapping์„ ์ด์šฉํ•œ Blue/Green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
    • Docker, Docker-compose, GitHub Actions๋ฅผ ํ†ตํ•œ AWS ECS ์ž๋™ํ™” CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

๐Ÿ“ซ Contact


์ด ๋ธ”๋กœ๊ทธ์˜ ๋ชจ๋“  ๊ธ€์€ ๊ฐœ์ธ์ ์ธ ํ•™์Šต๊ณผ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ยฉ NOWIL. ์ผ๋ถ€ ๊ถŒ๋ฆฌ ๋ณด์œ 

Powered by Jekyll with Chirpy theme