Skip to content
View config25's full-sized avatar

Organizations

@chewingchat

Block or report config25

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don't include any personal information such as legal names or email addresses. Markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this userโ€™s behavior. Learn more about reporting abuse.

Report abuse
config25/README.md

Backend Developer

์ €์‚ฌ์–‘ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ถ€ํ„ฐ ํ™•์žฅ์„ฑ ์žˆ๋Š” ๊ตฌ์กฐ๊นŒ์ง€, ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ ๋„ˆ๋จธ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‹ About Me

1GB ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ฒ„์—์„œ JVM ํŠœ๋‹์„ ํ•ด๋ณธ ๊ฒฝํ—˜๋ถ€ํ„ฐ, ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ตฌ์กฐ ์„ค๊ณ„์™€ AI ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™๊นŒ์ง€ โ€” "๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ" ๋„ˆ๋จธ์˜ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ฏผํ•ฉ๋‹ˆ๋‹ค. ์‹ค์„œ๋น„์Šค ๊ฒฐ์ œ ๋ชจ๋“ˆ์—์„œ ๋ฉฑ๋“ฑ์„ฑยท๋ถ„์‚ฐ ๋ฝยทDLQ ๊ฐ™์€ ๋ฐฉ์–ด๋กœ์ง์„ ๋‹ค๋ค˜๊ณ , Spring ์ƒํƒœ๊ณ„ ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๊ณผ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Š Stats

๐ŸŒ Open Source Contributions

spring-projects/spring-batch

Issue Description Related PR
#5366 ExitStatus#setExitException breaks immutability contract #5367

๐Ÿงฐ Tech Stack



๐Ÿ† Achievements

  • ๐Ÿ“ฑ ๋“œ๋ฅด๋ฅต (drr) โ€” iOS App Store ์ •์‹ ์ถœ์‹œ (2025)
  • ๐Ÿฅˆ 2025 ํ•œ์–‘๋Œ€ ์บก์Šคํ†ค ๋””์ž์ธ ์šฐ์ˆ˜์ƒ โ€” Drr
  • ๐Ÿฅˆ 2025 9ITHON ์šฐ์ˆ˜์ƒ (2์œ„) โ€” RoomGenie
  • ๐Ÿฅ‡ 2023 ์ „๊ตญ ๋Œ€ํ•™์ƒ SW์ฐฝ์—… ์•„์ด๋””์–ดํ†ค ๊ฒฐ์„  ์ง„์ถœ

Experience

  • ๐Ÿข (์ฃผ)ํ€€ํ…€์—๋“€์†”๋ฃจ์…˜ ํ˜„์žฅ์‹ค์Šต (2025.09 ~ 2026.02)

    • Impact Design Canvas ํ’€์Šคํƒ ๋‹จ๋… ๊ฐœ๋ฐœ โ€” Spring Boot ยท MariaDB ยท OpenAI
    • Unicast (https://unicast.kr) ๊ตฌ๋… ๊ฒฐ์ œ ๋ชจ๋“ˆ โ€” PayPal + NHN KCP ์—ฐ๋™
      • ๋ฐฉ์–ด๋กœ์ง: ๋ฉฑ๋“ฑ์„ฑ / ์ด์ค‘๊ฒฐ์ œ ๋ฐฉ์ง€ / ๋ถ„์‚ฐ ๋ฝ / DLQ / ์ƒํƒœ์ „์ด ๊ฒ€์ฆ / ์›นํ›… ์ค‘๋ณต๋ฐฉ์ง€
      • GitHub Actions ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•, PG์‚ฌ ๊ฒฐ์ œ๋ชจ๋“ˆ ์‹ฌ์‚ฌ ๋Œ€์‘
    • CX-INNOVATOR ๋””์ž์ธ ์”ฝํ‚น ํ”Œ๋žซํผ ์œ ์ง€๋ณด์ˆ˜ โ€” http://www.abl-cxinno.kr/main
      • ํ•™์ƒ ์ •๋ณด ๊ด€๋ จ ํ™”๋ฉด/DB ์ถ”๊ฐ€, ํŒ€์› ํƒญยท๋Œ€ํ‘œ์ž‘์„ฑ์ž ์™•๊ด€ ํ‘œ์‹œ ๊ธฐ๋Šฅ
      • PDF ๋ณด๊ณ ์„œ ์—ฐ๋™ ๋ฒ„๊ทธ ์ˆ˜์ •
      • C-3 / F-1 / B-1 ๋‹จ๊ณ„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€, chatbot / ๋ฌธ์ œ์—ฌ์ •์ง€๋„ ์ž‘์—…
  • ๐ŸŒฑ ๊ตฌ๋ฆ„ํ†ค ์œ ๋‹ˆ๋ธŒ 4๊ธฐ ๋ฐฑ์—”๋“œ (2025.03 ~ 2025.09)

    • ๋ฐฑ์—”๋“œ BํŒ€ ์Šคํ„ฐ๋””์žฅ
    • ๊ฒฝ๊ธฐ๋ถ๋ถ€ ํ•ด์ปคํ†ค 9ITHON, ๊ตฌ๋ฆ„ํ†ค ์‹œ์ฆŒํ†ค ์ฐธ์—ฌ

๐Ÿš€ Projects

๐Ÿ’ณ Unicast ๊ฒฐ์ œ ๋ชจ๋“ˆ โ€” PayPal ๋ณด๊ฐ• + KCP ์‹ ๊ทœ ์—ฐ๋™ + PG ์‹ฌ์‚ฌ ๋Œ€์‘ (์šด์˜ ์ค‘) ๐Ÿ”ฅ

์˜์ƒ ์ž๋ง‰ ์ถ”์ถœยท๋ฒˆ์—ญยท๋”๋น™ ๋””์ง€ํ„ธ ์ฝ˜ํ…์ธ  ์„œ๋น„์Šค์˜ ๊ฒฐ์ œ ๋ชจ๋“ˆ ๋‹จ๋… ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๋ฐฉ์–ด๋กœ์ง ๋ณด๊ฐ•

  • Role: ๊ธฐ์กด ์šด์˜ ์„œ๋น„์Šค์˜ ๊ฒฐ์ œ ๋ชจ๋“ˆ ๋‹จ๋… ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๋ฐฉ์–ด๋กœ์ง ๋ณด๊ฐ• (ํ˜„์žฅ์‹ค์Šต)
  • Scope: PayPal/KCP ๊ฒฐ์ œ ํ๋ฆ„, ์›นํ›… ์ฒ˜๋ฆฌ, ์ •๊ธฐ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ, PG ์‹ฌ์‚ฌ ๋Œ€์‘ (์„œ๋น„์Šค ๋ณธ์ฒด ๊ธฐ๋Šฅ์€ ๋ฒ”์œ„ ์™ธ), paypal์˜ ๊ฒฝ์šฐ ๊ตญ๋‚ด๊ฒฐ์ œ๊ฐ€ ์•ˆ๋˜์„œ ์ถ”ํ›„ ์ถ”๊ฐ€์˜ˆ์ •
  • Tech: Spring Boot ยท Next.js ยท MongoDB ยท Redis(๋ถ„์‚ฐ ๋ฝ) ยท NHN KCP ยท Webhook ยท DLQ ยท State Machine ยท GitHub Actions ยท Docker
  • Service: https://unicast.kr (์šด์˜ ์ค‘)

Key Work

  • KCP ์ •๊ธฐ๊ฒฐ์ œ ์‹ ๊ทœ ์—ฐ๋™ โ€” ๋ฐฐ์น˜ํ‚ค ๋ฐœ๊ธ‰ โ†’ ์Šค์ผ€์ค„๋Ÿฌ ์ž๋™๊ฒฐ์ œ โ†’ ๊ตฌ๋… ์ทจ์†Œ/๋ฐฐ์น˜ํ‚ค ์‚ญ์ œ๊นŒ์ง€ ํ”„๋ก ํŠธ+๋ฐฑ์—”๋“œ ์ „์ฒด ํ๋ฆ„ ๊ตฌํ˜„
  • ๊ฒฐ์ œ ๋ฐฉ์–ด๋กœ์ง ๊ฐ•ํ™” โ€” ์šด์˜ ์ค‘ ๋ฐœ๊ฒฌ๋œ race condition / ๋ˆ„๋ฝ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋ฉฑ๋“ฑ์„ฑยท๋ถ„์‚ฐ ๋ฝยทDLQยท์ƒํƒœ ์ „์ด ๊ฒ€์ฆ ๋„์ž…
  • PG์‚ฌ ๊ฐ€๋งน ์‹ฌ์‚ฌ ๋Œ€์‘ โ€” NHN KCP ์‹ฌ์‚ฌ ํ†ต๊ณผ๋ฅผ ์œ„ํ•œ ๊ฒฐ์ œ ํ”Œ๋กœ์šฐ ๋ณด์™„, ์•ฝ๊ด€/ํ™˜๋ถˆ๊ทœ์ •/ํ†ต์‹ ํŒ๋งค์—…๋ฒˆํ˜ธ ๋“ฑ๋ก
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์‹ ๊ทœ ๊ตฌ์ถ• โ€” GitHub Actions ๊ธฐ๋ฐ˜ ์ž๋™ ๋นŒ๋“œยท๋ฐฐํฌ

Troubleshooting

  • KCP ๋ฐฐ์น˜ํ‚ค ๋ฐœ๊ธ‰ โ†” ์ฒซ ๊ฒฐ์ œ ์‚ฌ์ด ๊ณต๋ฐฑ ์ œ๊ฑฐ (d7e9637, f9fedff) : KCP ์ •๊ธฐ๊ฒฐ์ œ ์ดˆ๊ธฐ ๊ตฌํ˜„์€ "๋ฐฐ์น˜ํ‚ค ๋ฐœ๊ธ‰ โ†’ ๋‹ค์Œ ์Šค์ผ€์ค„๋Ÿฌ ์ฃผ๊ธฐ์— ์ฒซ ๊ฒฐ์ œ ์‹คํ–‰" ๊ตฌ์กฐ์˜€์Œ. ๊ฐ€์ž… ์งํ›„ ๊ฒฐ์ œ๊ฐ€ ์ฆ‰์‹œ ์ผ์–ด๋‚˜์ง€ ์•Š์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์œ ๋ฃŒ ๊ธฐ๋Šฅ์„ ๋ชป ์“ฐ๊ณ  ๊ฒฐ์ œ ๋ˆ„๋ฝ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” UX ๋ฌธ์ œ ๋ฐœ์ƒ. โ†’ ๋ฐฐ์น˜ํ‚ค ๋ฐœ๊ธ‰ ํŠธ๋žœ์žญ์…˜ ์งํ›„ ์ฒซ ๊ฒฐ์ œ๋ฅผ ์ฆ‰์‹œ ๋™๊ธฐ ์‹คํ–‰ํ•˜๊ณ , ์Šค์ผ€์ค„๋Ÿฌ ๋‹ค์šด/๋ฐฐํฌ ๋ˆ„๋ฝ ๋“ฑ์œผ๋กœ ๋น ์ง„ ๊ฒฐ์ œ๋Š” nextBillingDate ๊ธฐ์ค€ ๋ฐ€๋ฆฐ ๊ฒฐ์ œ ๋ณต๊ตฌ ์žก์œผ๋กœ ๋ณ„๋„ ๋ณด๊ฐ•.

  • ๊ฒฐ์ œ ์š”์ฒญ ๋ฉฑ๋“ฑ์„ฑ + ์Šค์ผ€์ค„๋Ÿฌ ๋ถ„์‚ฐ ๋ฝ + DLQ ๋„์ž… (0ec22b4) : โ‘  ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ œ ๋ฒ„ํŠผ์„ ๋น ๋ฅด๊ฒŒ ๋‘ ๋ฒˆ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ์žฌ์‹œ๋„๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋™์ผ ์š”์ฒญ์ด ๋‘ ๋ฒˆ ์ฒ˜๋ฆฌ๋˜์–ด ์ด์ค‘ ๊ฒฐ์ œ ์œ„ํ—˜. โ‘ก ์ •๊ธฐ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ ๊ฐ™์€ ์‹œ๊ฐ์— ๋™์‹œ์— ๋Œ๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค‘๋ณต ์ฒญ๊ตฌ๋  ์ˆ˜ ์žˆ์Œ. โ‘ข webhook ์ฒ˜๋ฆฌ๊ฐ€ ์ผ์‹œ ์‹คํŒจํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์‹ค๋จ. โ†’ โ‘  IdempotencyKey ์ปฌ๋ ‰์…˜์— (memberId + operation) ํ‚ค๋ฅผ MongoDB ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋กœ ๊ฐ•์ œํ•˜๊ณ  24h TTL๋กœ ์ž๋™ ์ •๋ฆฌ, โ‘ก SchedulerLock ์ปฌ๋ ‰์…˜์˜ _id unique ์ œ์•ฝ์„ ํ™œ์šฉํ•œ MongoDB ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ๋ฝ์œผ๋กœ ์ •๊ธฐ๊ฒฐ์ œ ์Šค์ผ€์ค„๋Ÿฌ ์ค‘๋ณต ์‹คํ–‰ ์ฐจ๋‹จ(10๋ถ„ TTL ์•ˆ์ „์žฅ์น˜ ํฌํ•จ), โ‘ข webhook ์ฒ˜๋ฆฌ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋Š” PaymentDeadLetter๋กœ ๊ฒฉ๋ฆฌ ํ›„ ์žฌ์‹œ๋„ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์ž๋™ ์žฌ์ฒ˜๋ฆฌ + ์šด์˜์ž ์ˆ˜๋™ ๊ฐœ์ž… ๊ฐ€๋Šฅ.

  • ๊ตฌ๋… ์ƒํƒœ ์ „์ด ๊ฒ€์ฆ โ€” ๋น„์ •์ƒ ์ „์ด ์ฐจ๋‹จ (0ec22b4) : webhook ์ˆœ์„œ ์—ญ์ „์ด๋‚˜ ์šด์˜์ž ์ˆ˜๋™ ๊ฐœ์ž… ์‹œ CANCELLED โ†’ ACTIVE์ฒ˜๋Ÿผ ๋น„์ •์ƒ ์ƒํƒœ ์ „์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์˜€์Œ. โ†’ SubscriptionStatus enum์— ํ—ˆ์šฉ ์ „์ด ๊ทœ์น™(PENDING โ†’ ACTIVE/CANCELLED, ACTIVE โ†’ CANCELLED/SUSPENDED/PENDING ๋“ฑ)์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ๋กœ ์ •์˜ํ•˜๊ณ , canTransitionTo() ๊ฒ€์ฆ์„ ๊ฑฐ์น˜์ง€ ์•Š์€ ์ƒํƒœ ๋ณ€๊ฒฝ์€ ๋„๋ฉ”์ธ ์˜ˆ์™ธ๋กœ ์ฐจ๋‹จ.

  • FREE ํฌ๋ ˆ๋”ง ์ผ๊ด„ ๋ฐฐ์น˜ โ†’ ์‚ฌ์šฉ์ž๋ณ„ ๊ฐœ๋ณ„ ์ฃผ๊ธฐ ์ „ํ™˜ (30cb3d8) : ๋ชจ๋“  FREE ์‚ฌ์šฉ์ž์˜ ํฌ๋ ˆ๋”ง์„ ๋งค์›” 1์ผ(cron 0 0 3 1 * *) ์ผ๊ด„ ์ง€๊ธ‰ํ•˜๋˜ ๊ธฐ์กด ๊ตฌ์กฐ๋Š” โ‘  1์ผ์— ๋ถ€ํ•˜๊ฐ€ ๋ชฐ๋ฆฌ๊ณ , โ‘ก ์›” ์ค‘๊ฐ„ ๊ฐ€์ž…์ž๊ฐ€ ํ•œ ๋‹ฌ์น˜ ํฌ๋ ˆ๋”ง์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ํ˜•ํ‰์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Œ. โ†’ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋งค์ผ ์‹คํ–‰(cron 0 0 3 * * *)์œผ๋กœ ๋ฐ”๊พธ๊ณ , nextBillingDate <= today์ธ FREE+ACTIVE ๊ตฌ๋…๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝ. ์‚ฌ์šฉ์ž๋ณ„ ๊ฐ€์ž…์ผ ๊ธฐ์ค€ ๊ฐœ๋ณ„ ์ฃผ๊ธฐ๋กœ ์ „ํ™˜๋˜์–ด ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋™์‹œ์— ๊ฐœ์„ .

  • LocalDate.now() ํƒ€์ž„์กด ๋ˆ„๋ฝ์œผ๋กœ ๊ฒฐ์ œ์ผ ์–ด๊ธ‹๋‚จ (d7e9637) : ๊ฒฐ์ œ์ผ/๊ตฌ๋… ๋งŒ๋ฃŒ์ผ์— LocalDate.now()๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ UTC ๊ธฐ์ค€์ด๋ผ KST ์ž์ • ์งํ›„ ๊ฒฐ์ œ๊ฐ€ ์ „๋‚ ๋กœ ์ธ์‹๋˜๋Š” ์ผ€์ด์Šค ๋ฐœ์ƒ. ํƒ€์ž„์กด ๋ถˆ์ผ์น˜๋กœ nextBillingDate ๊ณ„์‚ฐ์ด ํ•˜๋ฃจ์”ฉ ์–ด๊ธ‹๋‚จ. โ†’ ๋ชจ๋“  LocalDate.now() ํ˜ธ์ถœ์„ LocalDate.now(ZoneId.of("Asia/Seoul"))๋กœ ๋ช…์‹œ ๋ณ€๊ฒฝ, ๊ฒฐ์ œ์ผ ๊ณ„์‚ฐ์„ KST ๊ธฐ์ค€์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ํ†ต์ผ.๊ณ„์ • ๋ฐœ๊ธ‰

  • ์‹ฌ์‚ฌ ํ†ต๊ณผ ํ›„ ์‹ค์„œ๋น„์Šค ์˜คํ”ˆ

๐Ÿ”— Unicast

๐ŸŽจ Impact Design Canvas โ€” AI ๊ธฐ๋ฐ˜ ์„ฑ๊ณผ ์„ค๊ณ„ ๊ต์œก ํ”Œ๋žซํผ

๊ต์œก ํ˜„์žฅ์—์„œ ํ•™์Šต ์„ฑ๊ณผ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” AI ๊ธฐ๋ฐ˜ ํ”Œ๋žซํผ

  • Role: ํ’€์Šคํƒ ๋‹จ๋… ๊ฐœ๋ฐœ
  • Period: 2026.01 ~ 2026.02
  • Tech: Spring Boot, Spring Security(JWT), MariaDB, OpenAI API, GitHub Actions

Key Features

  • 6๋‹จ๊ณ„ ์บ”๋ฒ„์Šค ์›Œํฌํ”Œ๋กœ์šฐ โ€” Impact Check โ†’ Identity โ†’ Flow โ†’ Quick Win โ†’ Build Win โ†’ Review๋กœ ํ•™์Šต์ž์˜ ์„ฑ๊ณผ ์„ค๊ณ„๋ฅผ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ
  • AI ์ž๋™ ๋ฆฌํฌํŠธ ์ƒ์„ฑ โ€” ํŒ€๋ณ„ ์บ”๋ฒ„์Šค ๋ฐ์ดํ„ฐ๋ฅผ OpenAI GPT-4.1๋กœ ๋ถ„์„ํ•˜์—ฌ ๋น„์ „/๋ฏธ์…˜/SWOT ๋“ฑ ์ข…ํ•ฉ ๋ฆฌํฌํŠธ ์‚ฐ์ถœ
  • ๊ฐ•์‚ฌ์šฉ ํ†ตํ•ฉ ๊ด€๋ฆฌ โ€” ์ˆ˜์—…/ํŒ€(์ตœ๋Œ€ 6ร—10๋ช…) ๊ด€๋ฆฌ, ํ•™์ƒ ์ง„ํ–‰๋„ ์ถ”์ , ๋ฒŒํฌ PDF ๋‹ค์šด๋กœ๋“œ

Troubleshooting

  • OpenAI ์‘๋‹ต ์ง€์—ฐ โ†’ ํ†ฐ์บฃ ์Šค๋ ˆ๋“œ ๋ˆ„์ˆ˜ : CompletableFuture 4-fan-out ๋ณ‘๋ ฌํ™” + executor(60s) / HTTP read(50s) cascade ํƒ€์ž„์•„์›ƒ์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ ์ •๋ฆฌ ๋ณด์žฅ, fallback ์‘๋‹ต์œผ๋กœ ์žฅ์•  ๊ฒฉ๋ฆฌ
  • 1์ฝ”์–ด / 1GB RAM ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ• : ํž™ 256MB ยท HikariCP 5 ยท Tomcat 30 ยท ioExecutor ํ’€ 5 + ํ 50(CallerRunsPolicy)๋กœ ๋ฐฑํ”„๋ ˆ์…” ์„ค๊ณ„, ๋ฌด์ œํ•œ ํ์˜ OOM ์œ„ํ—˜ ์ฐจ๋‹จ
  • storageยทexternal ๊ฐ•๊ฒฐํ•ฉ ์œ„ํ—˜ : domain ๋ ˆ์ด์–ด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค(Repository, AiClient, ExternalFileClient)์—๋งŒ ์˜์กดํ•˜๋„๋ก DIP ์ ์šฉ, JPA ์—”ํ‹ฐํ‹ฐ โ†” ๋„๋ฉ”์ธ ๋ชจ๋ธ(POJO) ๋ถ„๋ฆฌ๋กœ LLM ์ œ๊ณต์ž/์Šคํ† ๋ฆฌ์ง€ ๊ต์ฒด ๊ฐ€๋Šฅ

๐Ÿ”— back ยท front ยท API Docs ยท WEB

๐Ÿ’ฌ ๋“œ๋ฅด๋ฅต (AI ๋ฉ”์‹ ์ €) โ€” SNS + AI ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค ๐Ÿ†

์นœ๊ตฌ์™€์˜ ๋Œ€ํ™”๋ฅผ AI๊ฐ€ ํ•™์Šตํ•˜์—ฌ, AI ํด๋ก ์„ ํ†ตํ•ด ์นœ๊ตฌ์˜ ๋‹ต๋ณ€์„ ์˜ˆ์ธกํ•ด๋ณด๋Š” ๋ฉ”์‹ ์ € ์„œ๋น„์Šค (iOS ์ถœ์‹œ)

  • Role: ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ยท ํŒ€ 5์ธ
  • Period: 2024.09 ~ 2025.06
  • Tech: Kotlin, Spring Boot 3, WebSocket(STOMP), MySQL, MongoDB, Spring Security(JWT), NCP Object Storage, OpenAI, Docker, GitHub Actions

Key Features

  • 3์ข… ์ฑ„ํŒ…๋ฐฉ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜ โ€” Direct(1:1) / Group / AI ์ฑ„ํŒ…๋ฐฉ์„ ๋ณ„๋„ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋˜, ๋ฉ”์‹œ์ง€ยท์‹œํ€€์Šคยท์ฝ์Œ ์ฒ˜๋ฆฌ ๋กœ์ง์€ ๊ณตํ†ต ์ถ”์ƒํ™”
  • AI ํด๋ก  ์‘๋‹ต ํŒŒ์ดํ”„๋ผ์ธ โ€” ์‚ฌ์šฉ์ž ๋Œ€ํ™” ํŒจํ„ด์„ OpenAI์— ์œ„์ž„, ๋ถ€์žฌ ์ƒํ™ฉ์—์„œ AI๊ฐ€ ๋ณธ์ธ ๋Œ€์‹  ์‘๋‹ต
  • ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ์‹œํ€€์‹ฑ โ€” MongoDB ๊ธฐ๋ฐ˜ ์ฑ„ํŒ…๋ฐฉ๋ณ„ sequence/์ฝ์Œ ์ƒํƒœ ๊ด€๋ฆฌ, STOMP /topic + /user/{id} ์ด์ค‘ ์ฑ„๋„๋กœ ๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ๋™๊ธฐํ™”
  • ํ”ผ๋“œ(SNS) โ†” ์ฑ„ํŒ… ์—ฐ๋™ โ€” ์นœ๊ตฌ ํ”ผ๋“œ์— ๋Œ“๊ธ€์„ ๋‹ฌ๋ฉด ์ž๋™์œผ๋กœ 1:1 ์ฑ„ํŒ…๋ฐฉ์œผ๋กœ ์ „์†ก๋˜๋Š” cross-domain ์ธํ„ฐ๋ž™์…˜

Architecture

  • 5๊ฐœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ (api / domain / storage / external / common) + REST Docs ์ „์šฉ ๋ชจ๋“ˆ๋กœ ๊ณ„์ธต ๋ถ„๋ฆฌ, ์˜์กด ๋ฐฉํ–ฅ: api โ†’ domain โ† storage / external
  • DDD lean ๋„๋ฉ”์ธ + Service / Facade / Aggregator 3๊ณ„์ธต โ€” Service๋Š” ๋‹จ์ผ ์ฑ…์ž„, Facade๋Š” ์œ ์Šค์ผ€์ด์Šค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜, Aggregator๋Š” ์ด์ข… ๋ฐ์ดํ„ฐ ์กฐ๋ฆฝ(DirectChatRoomAggregator๋กœ ์ฑ„ํŒ…๋ฐฉ + ์ตœ์‹  ๋ฉ”์‹œ์ง€ ๊ฒฐํ•ฉ)
  • DIP ์ ์šฉ โ€” domain์€ RepositoryยทExternalAiClientยทExternalPushNotificationClient ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด, JPA/Mongo Entity โ†” ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ถ„๋ฆฌ

Troubleshooting

  • ์ด๊ธฐ์ข… DB(MySQL + MongoDB) ํŠธ๋žœ์žญ์…˜ ์˜๋„์  ๋ฐฐ์ œ โ†’ Saga ์Šคํƒ€์ผ ์กฐํ•ฉ : ์ฑ„ํŒ…๋ฐฉ ์ƒํƒœ(MySQL)ยท๋ฉ”์‹œ์ง€ ๋กœ๊ทธ(MongoDB)ยท์™ธ๋ถ€ ์•Œ๋ฆผ(FCM/Expo)์ด ํ•œ ์œ ์Šค์ผ€์ด์Šค์—์„œ ๊ฐ™์ด ๋ณ€๊ฒฝ๋จ. @Transactional์„ ๊ฑธ๋ฉด MySQL๋งŒ ๋กค๋ฐฑ๋˜๊ณ  Mongoยทํ‘ธ์‹œ๋Š” ๋‚จ๋Š” ๊ฐ€์งœ ์•ˆ์ •๊ฐ๋งŒ ์ฃผ๋Š” ๋ฌธ์ œ โ†’ Facade์—์„œ ํŠธ๋žœ์žญ์…˜์„ ๋นผ๊ณ , ๊ฐ ์ž‘์€ service๋งŒ ์ž์‹ ์˜ ์ €์žฅ์†Œ ํŠธ๋žœ์žญ์…˜์„ ์ฑ…์ž„์ง€๋„๋ก ๊ฒฝ๊ณ„ ์ถ•์†Œ. ์‹คํŒจ ์‹œ chatErrorMessages()๋ฅผ ๊ฐ™์€ ์•Œ๋ฆผ ์ฑ„๋„๋กœ ํ˜๋ ค๋ณด๋‚ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ค๋ฅ˜ ์ƒํƒœ๋ฅผ ์ธ์ง€ยท์žฌ์‹œ๋„ํ•˜๋Š” eventual consistency ํŒจํ„ด์œผ๋กœ ์ „ํ™˜.

  • ์‹œํ€€์Šค ์ฆ๊ฐ€ race condition (5e49963) : ์ฑ„ํŒ…๋ฐฉ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ ์—†์ด sequence๋ฅผ ๋จผ์ € ์ฆ๊ฐ€์‹œํ‚ค๋‹ค ๋ณด๋‹ˆ, ์‚ญ์ œ๋œ ๋ฐฉ์— ๋Œ€ํ•ด ์‹œํ€€์Šค๋งŒ ์ฆ๊ฐ€ํ•˜๋Š” ์œ ๋ น ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒ โ†’ increaseDirectChatRoomSequence ํ˜ธ์ถœ ์ „์— ์ฑ„ํŒ…๋ฐฉ ์กด์žฌ ๊ฒ€์ฆ์„ ์„ ํ–‰ํ•˜๋„๋ก Facade ๋กœ์ง ์žฌ๋ฐฐ์น˜, ์‹œํ€€์Šค ์นด์šดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ ํšŒ๋ณต.

  • MongoDB ์ธ๋ฑ์Šค ์ „๋žต ์žฌ์„ค๊ณ„ (4ec7f92) : ์ดˆ๊ธฐ partial index({chatRoomId, type, message})๋Š” ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์›Œ ์ฑ„ํŒ… ๋กœ๊ทธ ๋ฒ”์œ„ ์กฐํšŒ / ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ๋‘˜ ๋‹ค ๋ชป ์žก์•„๋จน์Œ โ†’ โ‘  ๋ฒ”์œ„ ์กฐํšŒ์šฉ ๋ณตํ•ฉ ์ธ๋ฑ์Šค {chatRoomId: 1, sequence: -1}, โ‘ก ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์šฉ text ์ธ๋ฑ์Šค {message: 'text'} ๋‘ ๊ฐ€์ง€๋กœ ๋ถ„๋ฆฌ. ํŽ˜์ด์ง€๋„ค์ด์…˜๊ณผ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ๋ชจ๋‘ ์ธ๋ฑ์Šค๋ฅผ ํƒ€๊ฒŒ ๋จ.

  • MySQL ํ•ซํŒจ์Šค ์ธ๋ฑ์Šค ๋ถ€์žฌ (33b1acb) : 1:1 ์ฑ„ํŒ…๋ฐฉ ๋ชฉ๋ก ์กฐํšŒ(userAId/userBId ร— status), ์นœ๊ตฌ ์ฆ๊ฒจ์ฐพ๊ธฐ ์กฐํšŒ ๋“ฑ ํ•ซํŒจ์Šค๊ฐ€ ํ’€์Šค์บ” โ†’ direct_chat_room์— (userA/userB, status) ๋ณตํ•ฉ ์ธ๋ฑ์Šค 3์ข…, friend_ship์— (user_id, favorite) ์ธ๋ฑ์Šค ์ถ”๊ฐ€๋กœ ์‘๋‹ต ์‹œ๊ฐ„ ๊ฐœ์„ .

  • STOMP ํ•ธ๋“œ์…ฐ์ดํฌ ์ธ์ฆ ํ๋ฆ„ ์ •๋น„ (0e8a3d2, ca8e2e8) : ํ•ธ๋“œ์…ฐ์ดํฌ ์‹œ์ ์—๋Š” HTTP ํ—ค๋”์— JWT๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด ์ธ์ฆ ๋ˆ„๋ฝ โ†’ CustomHandshakeHandler + StompChannelInterceptor์—์„œ CONNECT ํ”„๋ ˆ์ž„ ์‹œ์ ์— Authorization ํ—ค๋” ๊ฒ€์ฆ, JWT์—์„œ ์ถ”์ถœํ•œ userId๋ฅผ Principal๋กœ ์ฃผ์ž…ํ•ด ์ดํ›„ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์ ‘๊ทผ.

  • ์ด๋ฏธ์ง€ ํŠธ๋ž˜ํ”ฝ ์ ˆ๊ฐ (42ded85) : ์ฑ„ํŒ… ์ฒจ๋ถ€ ์ด๋ฏธ์ง€ ์›๋ณธ ๊ทธ๋Œ€๋กœ NCP ์—…๋กœ๋“œ โ†’ ๋Œ€์—ญํญ/๋ชจ๋ฐ”์ผ ๋ฐ์ดํ„ฐ ๋ถ€๋‹ด โ†’ Scrimage ๊ธฐ๋ฐ˜ WebP ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ ๋„์ž…, ์—…๋กœ๋“œ ๋‹จ๊ณ„์—์„œ ์†์‹ค ์••์ถ• ์ ์šฉ.

๐Ÿ”— GitHub ยท API Docs ยท App Store

๐Ÿงน RoomGenie โ€” AI ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜ ๋ฐฉ ์ •๋ฆฌ ์„œ๋น„์Šค ๐Ÿ†

AI๊ฐ€ ๋ฐฉ ์‚ฌ์ง„์„ ๋ถ„์„ํ•˜์—ฌ ์ •๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜๋Š” ์„œ๋น„์Šค

  • Role: ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ยท ํŒ€ 5์ธ
  • Period: 2025.05 ~ 2025.07
  • Tech: Java 17, Spring Boot 3.5, Spring Security(JWT), JPA/MySQL, AWS S3, OpenAI GPT-4 Vision, YOLO, LAMA, NCP Sens(SMS)

Key Features

  • 3์ข… AI ํŒŒ์ดํ”„๋ผ์ธ โ€” YOLO(๊ฐ์ฒด ๊ฐ์ง€) โ†’ LAMA(์ธํŽ˜์ธํŒ…)๋กœ "์ •๋ฆฌ๋œ ๋ฐฉ" ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ด๋ฏธ์ง€ ์ƒ์„ฑ + GPT-4 Vision์œผ๋กœ ๋‹จ๊ณ„๋ณ„ ์ •๋ฆฌ ๊ฐ€์ด๋“œ ์ œ๊ณต
  • AI ๊ธฐ๋ฐ˜ ๋ฏธ์…˜ ์ž๋™ ๊ฒ€์ฆ โ€” before/after ์ด๋ฏธ์ง€๋ฅผ GPT-4 Vision์œผ๋กœ ๋น„๊ต, ์‘๋‹ต ํ† ํฐ([RESULT:SUCCESS]) ํŒŒ์‹ฑ์œผ๋กœ ๋ฏธ์…˜ ์ƒํƒœ๋จธ์‹  ์ž๋™ ์ „์ด
  • ํœด๋Œ€ํฐ OTP 2๋‹จ๊ณ„ ์ธ์ฆ โ€” NCP Sens HMAC-SHA256 + Caffeine ์บ์‹œ ๊ธฐ๋ฐ˜ OTP ๊ฒ€์ฆ ํ›„ JWT ๋ฐœ๊ธ‰

Architecture

  • 6๊ฐœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ(api/domain/storage/external/common/api-docs) ๊ณ„์ธต ๋ถ„๋ฆฌ
  • DIP ์ ์šฉ โ€” domain์ด ExternalAiClient/ExternalFileClient ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด, JPA Entity โ†” Domain POJO ๋ถ„๋ฆฌ๋กœ LLMยท์Šคํ† ๋ฆฌ์ง€ ๊ต์ฒด ๊ฐ€๋Šฅ
  • DDD Value Object โ€” UserId, MissionId, PostId๋กœ ์‹๋ณ„์ž ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด
  • Facade ํŒจํ„ด์œผ๋กœ AI ๋ถ„์„ยท๋ฏธ์…˜ ๊ฒ€์ฆยท์ด๋ฏธ์ง€ ์ƒ์„ฑ ์œ ์Šค์ผ€์ด์Šค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜

Troubleshooting

  • LAMA ์ธํŽ˜์ธํŒ… ๊ฐ€์žฅ์ž๋ฆฌ ์ž”์ƒ : YOLO bounding box๋ฅผ ๊ทธ๋Œ€๋กœ mask๋กœ ์‚ฌ์šฉํ•˜๋‹ˆ ๊ฐ์ฒด ๊ฒฝ๊ณ„์— ํ”์ ์ด ๋‚จ๋Š” ๋ฌธ์ œ โ†’ ๋ฐ•์Šค๋ฅผ 20px ํ™•์žฅ + fillRoundRect + AntiAliasing์œผ๋กœ ๋งˆ์Šคํฌ ํ›„์ฒ˜๋ฆฌ ์ ์šฉํ•˜์—ฌ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฐ๊ฒฝ ๋ณต์› ๋‹ฌ์„ฑ
  • LAMA ์„œ๋ฒ„ multipart ์ง๋ ฌํ™” ์‹คํŒจ : ๊ธฐ๋ณธ RestTemplate์ด binary mask + form ํŒŒ๋ผ๋ฏธํ„ฐ ๋™์‹œ ์ „์†ก์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•จ โ†’ FormHttpMessageConverter / ByteArrayHttpMessageConverter ๋ฅผ ๋“ฑ๋กํ•œ ์ „์šฉ RestTemplate ๋ถ„๋ฆฌ๋กœ ํ•ด๊ฒฐ
  • Private S3 โ†” GPT-4 Vision ์—ฐ๋™ ๋ถˆ๊ฐ€ : ๋น„๊ณต๊ฐœ ๋ฒ„ํ‚ท์ด๋ผ OpenAI๊ฐ€ ์ด๋ฏธ์ง€ URL์„ ์ง์ ‘ fetch ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ โ†’ S3์—์„œ ๋‹ค์šด๋กœ๋“œ ํ›„ Base64 data URL ๋กœ ๋ณ€ํ™˜ํ•ด ์ „๋‹ฌ, ๋ณด์•ˆ๊ณผ AI ํ˜ธ์ถœ์„ ๋ชจ๋‘ ๋งŒ์กฑ
  • OpenAI 429 ์žฅ์•  ๊ฒฉ๋ฆฌ : HttpClientErrorException.TooManyRequests ๋ฅผ ๋ณ„๋„ ์บ์น˜ํ•˜์—ฌ AI_RATE_LIMIT_EXCEEDED ๋„๋ฉ”์ธ ์˜ˆ์™ธ๋กœ ๋ž˜ํ•‘, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ์žฌ์‹œ๋„ ๋ฉ”์‹œ์ง€ ๋…ธ์ถœ

๐Ÿ”— GitHub

๐ŸŒฑ FutureFinder โ€” ์ฒญ๋…„ ๋งž์ถคํ˜• ๊ธˆ์œตยท์ง„๋กœ ํ†ตํ•ฉ ํ”Œ๋žซํผ

์ฒญ์•ฝยท์ž์‚ฐยท์ทจ์—…ยท๊ฒฝ์ œ์ •๋ณด๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„ ์ฒญ๋…„์—๊ฒŒ ๋งž์ถคํ˜• ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ†ตํ•ฉ ํ”Œ๋žซํผ

  • Role: ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ยท ํŒ€ 5์ธ
  • Period: 2025.08 ~ 2025.09 (์ดํ›„ ๊ฐœ์ธ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰)
  • Tech: Java 17, Spring Boot 3.5, Spring Security(JWT), JPA/MySQL(RDS), AWS S3, WebFlux WebClient, OpenAI

Key Features

  • ํ™ˆ ๋Œ€์‹œ๋ณด๋“œ ํ†ตํ•ฉ ์ง‘๊ณ„ โ€” KRX ์ฃผ์‹ ๊ธ‰๋“ฑ๋ฝ Top3 + ๋„ค์ด๋ฒ„ ๊ฒฝ์ œ ๋‰ด์Šค + ๊ณต๊ณต๊ธฐ๊ด€ ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ(GET /api/home)๋กœ ๋ฌถ์–ด ์ œ๊ณต, HomeFacade๋กœ ์ด์ข… ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์กฐ๋ฆฝ
  • ์ฃผ๊ฑฐ ๊ธˆ์œต ๊ด€๋ฆฌ + AI ์ฑ—๋ด‡ โ€” ์ฒญ์•ฝ ๊ณ„์ขŒยท์ž…๊ธˆ ๋‚ด์—ญยทํ˜„์žฌ/๊ด€์‹ฌ ๊ฑฐ์ฃผ์ง€ ๊ด€๋ฆฌ + OpenAI ๊ธฐ๋ฐ˜ ์ฃผ๊ฑฐ ๊ธˆ์œต Q&A ์ฑ—๋ด‡, ์‚ฌ์šฉ์ž๋ณ„ ๋Œ€ํ™” ์ด๋ ฅ ์˜์†ํ™”๋กœ ์ปจํ…์ŠคํŠธ ์—ฐ์†์„ฑ ํ™•๋ณด
  • AI ๋งž์ถค ์ทจ์—… ์ถ”์ฒœ โ€” ํ•™๋ ฅยท๋Œ€์™ธํ™œ๋™ยท์ˆ˜์ƒ ์ด๋ ฅ์„ ์ž…๋ ฅ์œผ๋กœ OpenAI์— ์œ„์ž„, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ๋Œ€์™ธํ™œ๋™ยท์ฑ„์šฉ ๊ณต๊ณ  ์‚ฐ์ถœ
  • ๊ฒฝ์ œ ์‚ฌ์ „ + ์นด์นด์˜ค OAuth โ€” ํ•œ๊ตญ์€ํ–‰ ECOS ๊ธฐ๋ฐ˜ ๊ฒฝ์ œ ์šฉ์–ด ๊ฒ€์ƒ‰ยท์Šคํฌ๋žฉยท์ธ๊ธฐ ๋‹จ์–ด, ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ + JWT Access/Refresh ์ด์ค‘ ํ† ํฐ

Architecture

  • 5๊ฐœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ(api / domain / external / storage / common) ๊ณ„์ธต ๋ถ„๋ฆฌ, ์˜์กด ๋ฐฉํ–ฅ: api โ†’ domain โ† storage / external
  • CQRS ์Šคํƒ€์ผ ๋„๋ฉ”์ธ ๊ตฌํ˜„ โ€” ์„œ๋น„์Šค๋ฅผ AppenderยทReaderยทUpdaterยทValidatorยทRemover๋กœ ๋ถ„ํ•ดํ•ด ๋‹จ์ผ ์ฑ…์ž„ ๊ฐ•์ œ
  • Facade ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ โ€” HomeFacade(์ด์ข… ๋ฐ์ดํ„ฐ ์ง‘๊ณ„)ยทAccountFacade(ํšŒ์›/OAuth)ยทAcademicFacade๋กœ ์œ ์Šค์ผ€์ด์Šค ์กฐ๋ฆฝ, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์–‡๊ฒŒ ์œ ์ง€
  • DIP ์ ์šฉ โ€” domain์€ ExternalOAuthClientยทExternalNewsClientยทExternalStockClientยทOpenAIService ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด, ์™ธ๋ถ€ ๋ฒค๋”(์นด์นด์˜ค/๋„ค์ด๋ฒ„/ECOS/KRX/OpenAI) ๊ต์ฒด ๊ฐ€๋Šฅ
  • Value Object โ€” UserId ๋“ฑ ์‹๋ณ„์ž ํƒ€์ž… ์•ˆ์ „์„ฑ + JPA Entity โ†” ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ถ„๋ฆฌ

Troubleshooting

  • ์™ธ๋ถ€ API ํ˜ธ์ถœ ํญ์ฆยท์ง€์—ฐ โ†’ TTL ์บ์‹œ ๋ ˆ์ด์–ด ๋„์ž… (c07de21) : ํ™ˆ ๋Œ€์‹œ๋ณด๋“œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ ์‹œ KRX(์ฃผ์‹ ๊ธ‰๋“ฑ๋ฝ)ยท๋„ค์ด๋ฒ„(๋‰ด์Šค)ยท๊ณต๊ณต์ฑ„์šฉ API๊ฐ€ ๋™์‹œ์— ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ์‘๋‹ต ์ง€์—ฐ์ด ๋ˆ„์ ๋˜๊ณ , ์ผ์ผ ์ฟผํ„ฐ ํ•œ๋„๊นŒ์ง€ ์œ„ํ˜‘ํ•˜๋Š” ๊ตฌ์กฐ์˜€์Œ. ํ‚ค์›Œ๋“œยท๋‚ ์งœ ๋‹จ์œ„๋กœ ์‘๋‹ต์ด ๊ฑฐ์˜ ๋™์ผํ•จ์—๋„ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์™ธ๋ถ€๋ฅผ ์ง์ ‘ ๋•Œ๋ฆฌ๋Š” ์„ค๊ณ„๊ฐ€ ์›์ธ. โ†’ ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ ์•ž๋‹จ์— TtlCache ๋ ˆ์ด์–ด๋ฅผ ๋„์ž…ํ•ด ๋™์ผ ํ‚ค ์š”์ฒญ์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํก์ˆ˜, ์™ธ๋ถ€ ํ˜ธ์ถœ ๋นˆ๋„์™€ ํ™ˆ ๋Œ€์‹œ๋ณด๋“œ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋™์‹œ์— ์ ˆ๊ฐ.

  • External ๋ชจ๋“ˆ 800์—ฌ ์ค„ ์ค‘๋ณต ์ œ๊ฑฐ โ€” ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐœ์„  (c07de21) : 6๊ฐœ ์™ธ๋ถ€ API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ์ž HTTP ์ „์†กยทJSON ํŒŒ์‹ฑยทHTML ๋ฉ”ํƒ€ ์Šคํฌ๋ž˜ํ•‘ยท์บ์‹ฑ ๋กœ์ง์„ ๊ฐœ๋ณ„ ๋ณด์œ ํ•ด, ExternalNewsClientImpl์ด ~400์ค„๊นŒ์ง€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ๋™์ผ ๋ฒ„๊ทธ๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ๋ฐ˜๋ณต ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ƒํƒœ์˜€์Œ. โ†’ ๊ณตํ†ต ์ฑ…์ž„์„ ArticleMetaScraper / GovApiJsonParser / ExternalClientUtils / TtlCache 4๊ฐœ ์œ ํ‹ธ๋กœ ์ถ”์ถœํ•˜๊ณ  ์„ค์ •๊ฐ’์„ *Properties ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ. News -309 / JobAI -254 / Recruitment -176 / Stock -102 ์ค„ ์Šฌ๋ฆผํ™”ํ•˜์—ฌ, ์ƒˆ ์™ธ๋ถ€ API ์ถ”๊ฐ€ ์‹œ ๋น„์šฉ๋„ ํ•จ๊ป˜ ๊ฐ์†Œ.

  • ์ปจํŠธ๋กค๋Ÿฌ ๋น„๋Œ€ํ™” โ€” ๋„๋ฉ”์ธ ๋กœ์ง ๋ˆ„์ˆ˜ ํ•ด์†Œ (c07de21) : HouseController / JobController์— ๋น„์ฆˆ๋‹ˆ์Šค ๋ถ„๊ธฐยทDTO ์กฐ๋ฆฝยทRepository ์ง์ ‘ ํ˜ธ์ถœ์ด ๋ฐ•ํ˜€ ์žˆ์–ด ์žฌ์‚ฌ์šฉยท๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ๋™์ผ ๋กœ์ง์ด ๋‹ค๋ฅธ ์œ ์Šค์ผ€์ด์Šค์—์„œ๋„ ๋ณต์ œ๋˜๋Š” ์œ„ํ—˜์ด ์žˆ์—ˆ์Œ. โ†’ ๋กœ์ง์„ HouseService / JobService๋กœ ์ด๋™, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ธ์ฆยท์š”์ฒญ ๊ฒ€์ฆยท์‘๋‹ต ๋ณ€ํ™˜๋งŒ ๋‹ด๋‹นํ•˜๋Š” ์–‡์€ ๊ณ„์ธต์œผ๋กœ ์ •๋ฆฌ(์ปจํŠธ๋กค๋Ÿฌ -130์—ฌ ์ค„). ์ดํ›„ HomeFacade ๊ฐ™์€ ์กฐํ•ฉ ์œ ์Šค์ผ€์ด์Šค์—์„œ ๋™์ผ ์„œ๋น„์Šค๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง.

๐Ÿ”— GitHub

๐Ÿ“ซ Contact

Blog Email

Pinned Loading

  1. 2025_SEASONTHON_TEAM_85_BE 2025_SEASONTHON_TEAM_85_BE Public

    Forked from 9oormthon-univ/2025_SEASONTHON_TEAM_85_BE

    ๊ฒฝ์ œ ์ง„๋กœ ๊ณ ๋ฏผ์„ ํ•จ๊ป˜ ํ•ด๊ฒฐํ•˜๋ฉฐ ์‚ฌํšŒ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์ฒซ ๊ฑธ์Œ์„ ๋•๋Š” ์ฒญ๋…„ ๋งž์ถคํ˜• ์ปค๋ฆฌ์–ด ๊ฐ€์ด๋“œ ํ”Œ๋žซํผ, futurefinder-BE Repository

    Java

  2. 9-RoomGenie-BE 9-RoomGenie-BE Public

    Forked from 9ITHON/9-RoomGenie-BE

    ๋ฐฉ์ •๋ฆฌ ์š”์ • RoomGenie ๋ฐฑ์—”๋“œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

    Java

  3. Back-end Back-end Public

    Forked from Chewing-Chat/Back-end

    ์†Œํ†ต์„ ๋”์šฑ ์›ํ™œํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” AI ๋ฉ”์‹ ์ €, ๋“œ๋ฅด๋ฅต

    Kotlin

  4. goorum-jpa goorum-jpa Public

    Java

  5. Impact-design-back Impact-design-back Public

    Impact design ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

    Java

  6. Impact-design-front Impact-design-front Public

    Impact design ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

    JavaScript