Skip to content
@thought-corner

Thought-Corner

  • Korea, South

๐Ÿงฉ Thought Corner

์ƒ๊ฐ์„ ์ฝ”๋“œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

"์™œ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€"๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋ฉฐ ์ดํ•ดํ•˜๊ณ ,
๋ถ€๋ถ„์ด ์•„๋‹Œ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์ƒํ˜ธ์ž‘์šฉ ๊ด€์ ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค.


๐Ÿ”ญ Interests

ํ…Œ์ŠคํŠธ์™€ ์ฝ”๋“œ ํ’ˆ์งˆ

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

๊ธฐ์ˆ ๋ณด๋‹ค ๋ณธ์งˆ

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

๊ธฐํš์„ ์„ค๊ณ„๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •

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

์‹คํŒจ๋ฅผ ๊ฐ€์ •ํ•œ ์„ค๊ณ„

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

๐Ÿ—๏ธ Featured

order-system โ€” RabbitMQ ๋น„๋™๊ธฐ ์ฃผ๋ฌธ ์‹œ์Šคํ…œ

์ฃผ๋ฌธ API๊ฐ€ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ์ฆ‰์‹œ ์‘๋‹ตํ•˜๊ณ , ์ปจ์Šˆ๋จธ๊ฐ€ ์žฌ๊ณ  ์ฐจ๊ฐยท์ฃผ๋ฌธ ์ƒ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • MySQL Named Lock(์ฃผ๋ฌธ ๋‹จ์œ„) + JPA ๋น„๊ด€์  ๋ฝ(์žฌ๊ณ  ๋‹จ์œ„) ์ด์ค‘ ๋ฝ์œผ๋กœ ๋™์‹œ์„ฑ ์ œ์–ด
  • k6 ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ: 4,000 VUs์—์„œ TPS 2.23k, ์‹คํŒจ 0๊ฑด, ์žฌ๊ณ  ์ •ํ•ฉ์„ฑ ์˜ค์ฐจ 0 ์‹ค์ธก ๊ธฐ๋ก
  • Dead Letter Queue + ์žฌ๋ฐœํ–‰์œผ๋กœ ์‹คํŒจ ๋ฉ”์‹œ์ง€ ์œ ์‹ค ๋ฐฉ์ง€, prefetchยท์ปจ์Šˆ๋จธ ์ˆ˜ ํŠœ๋‹ ๊ณผ์ • ๋ฌธ์„œํ™”

query-performance โ€” ๋Œ€์šฉ๋Ÿ‰ ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„  (SQL ํŠœ๋‹ โ†’ Redis ์บ์‹ฑ)

30๋งŒ ๊ฑด ๋ฐ์ดํ„ฐ์—์„œ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์œผ๋กœ ์ตœ๋Œ€ 14์ดˆ ๊ฑธ๋ฆฌ๋˜ ํ•„ํ„ฐ๋ง ์กฐํšŒ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • EXPLAIN์œผ๋กœ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”(type: ALL) ํ™•์ธ โ†’ ๊ฐ€๊ฒฉ ์ธ๋ฑ์Šค ์ ์šฉ์œผ๋กœ ์กฐํšŒ ์‹œ๊ฐ„ 70.5% ๋‹จ์ถ• (1s โ†’ 0.295s)
  • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ๋„ ๋™์ž‘ํ•˜์ง€ ์•Š๋˜ ์›์ธ ๋ถ„์„ โ€” ๋‚ฎ์€ ์นด๋””๋„๋ฆฌํ‹ฐ(LocalDate ์ผ ๋‹จ์œ„ ์ €์žฅ + ์ค‘๋ณต๋„ ๋†’์€ ๋”๋ฏธ ๋ฐ์ดํ„ฐ)๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ๋ฒ„๋ฆฌ๋Š” ์ƒํ™ฉ์„ ๊ทœ๋ช…ํ•˜๊ณ , ํƒ€์ž…ยท๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ๋ฐ”๋กœ์žก์•„ 82.25% ๋‹จ์ถ• (2s โ†’ 0.355s)
  • ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ ์—†๋Š” SQL ํŠœ๋‹์„ ๋จผ์ €, ๊ทธ ์œ„์— Redis Cache-Aside๋ฅผ ์–น์–ด ์ถ”๊ฐ€ 45.7% ๊ฐœ์„  (1.01s โ†’ 0.548s) โ€” ์บ์‹œ-DB ์ •ํ•ฉ์„ฑ ํ•œ๊ณ„๊นŒ์ง€ ๋ฌธ์„œํ™”

๐Ÿงช Playground

๋ถ„๋ฅ˜ ์ €์žฅ์†Œ ํ•œ ์ค„ ์š”์•ฝ BACKLOG & FIX
Software Design law-of-demeter Tell-Don't-Ask๋กœ getter๋ฅผ ์ œ๊ฑฐํ•œ ์บก์Аํ™” ๋„๋ฉ”์ธ ์„ค๊ณ„ โ€” ํ˜‘๋ ฅ์„ ๋ฉ”์‹œ์ง€๋กœ ๊ฐ•์ œํ•˜๊ณ  ํ…Œ์ŠคํŠธ 31๊ฐœ๋กœ ํšŒ๊ท€ ๋ฐฉ์ง€ DOCS(๋ช…์„ธ์„œ ์ˆ˜์ •)
Software Design monolithic-architecture ํ—ฅ์‚ฌ๊ณ ๋‚ ยทDDD๋กœ ๋„๋ฉ”์ธ ๊ฒฝ๊ณ„๋ฅผ ๋ถ„๋ฆฌํ•œ ์„ค๊ณ„ โ€” ํฌํŠธ&์–ด๋Œ‘ํ„ฐยท๊ฐ’ ๊ฐ์ฒดยท์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋กœ ๊ทœ์น™์˜ ์œ„์น˜๋ฅผ ๋ช…ํ™•ํ™”
Software Architecture distributed-transactions ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ •ํ•ฉ์„ฑ ํŒจํ„ด์„ ๋‹จ๊ณ„์ ์œผ๋กœ ๊ตฌํ˜„ โ€” ๋‹จ์ผ ACID โ†’ TCC โ†’ Saga(Choreography, Kafka) โ†’ Saga(Orchestration)๋กœ ์ง„ํ™”์‹œํ‚ค๋ฉฐ, requestId ๋ฉฑ๋“ฑ์„ฑ ์ฒดํฌยทRedis ๋ถ„์‚ฐ๋ฝยท์ฃผ๋ฌธ ์ƒํƒœ๋จธ์‹ ์œผ๋กœ "์ •ํ™•ํžˆ 1ํšŒ ์‹คํ–‰" ๋ณด์žฅ, @Version ๋‚™๊ด€์  ์ž ๊ธˆ + @Retryable ์žฌ์‹œ๋„, Kafka afterCommit()์œผ๋กœ ์œ ๋ น ์ด๋ฒคํŠธ ์ฐจ๋‹จ, Testcontainers E2E ๊ฒ€์ฆ FIX(monolithic)
Software Architecture realtime-chat-platform KotlinยทSTOMP WebSocket ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… โ€” ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ SimpleBroker ํ•œ๊ณ„๋ฅผ Redis Pub/Sub ์ฑ„๋„ ๋ฆด๋ ˆ์ด๋กœ ํ•ด์†Œํ•ด ์ˆ˜ํ‰ ํ™•์žฅ, JWT๋ฅผ STOMP ์ฑ„๋„ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ ์ธ์ฆ, ๋ฉ”์‹œ์ง€ ์ฝ์Œ ์ƒํƒœ ์ €์žฅยท์‹ค์‹œ๊ฐ„ ์ „ํŒŒ
Software Architecture service-communication-patterns-with-rest-api ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปคยทํด๋ฐฑ degrade๋กœ ์žฅ์•  ์ „ํŒŒ๋ฅผ ๊ฒฉ๋ฆฌํ•œ MSA ํ†ต์‹  ์„ค๊ณ„ โ€” ๋‹ค์šด์ŠคํŠธ๋ฆผ ์žฅ์• ๊ฐ€ ์ƒ์œ„ ๊ฐ€์šฉ์„ฑ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด
Software Architecture service-communication-patterns-with-graphql client-facing REST + ์„œ๋น„์Šค ๊ฐ„ GraphQL๋กœ ์ „์†ก ๊ณ„์ธต์„ ๋ถ„๋ฆฌ โ€” ํ†ต์‹  ๋ฐฉ์‹ ๊ต์ฒด์—๋„ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋กœ ์‹คํŒจ ํŒ์ • ๊ธฐ์ค€์„ ์ผ๊ด€ ์œ ์ง€
Software Architecture service-communication-patterns-with-grpc gRPC blocking stub ์ „ํ™˜๊ณผ status ๊ธฐ๋ฐ˜ ์„œํ‚ท ๋ธŒ๋ ˆ์ดํ‚น โ€” ์žฌ์‹œ๋„ ์†Œ์ง„ ์‹œ ๋ถ€๊ฐ€ ์กฐํšŒ 200 degradeยทํ•„์ˆ˜ ์กฐํšŒ 503+Retry-After๋กœ ์ข…์ฐฉ ๋ถ„๊ธฐ ์„ค๊ณ„
Data Engineering spring-batch-settlement ์ฒญํฌ ๊ธฐ๋ฐ˜ ๋ฐฐ์น˜๋กœ ๋Œ€๋Ÿ‰ ๊ฑฐ๋ž˜๋ฅผ ์žฌ์ฒ˜๋ฆฌยท์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ •์‚ฐ โ€” Clock ์ฃผ์ž…์œผ๋กœ ์‹œ๊ฐ„ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•ด ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ŠคํŠธ๋กœ ๊ณ ์ • (Jenkins+Docker)
Machine Learning spring-ai-chat-bot RAG ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์‚ฌ๋‚ด ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์‘๋‹ต ๊ตฌํ˜„ โ€” Tikaโ†’์ฒญํ‚นโ†’BGE-M3โ†’Elasticsearch์— ๋‹ค์ค‘ ์ฟผ๋ฆฌ ํ™•์žฅ์œผ๋กœ recall ๋ณด๊ฐ•, ๋Œ€ํ™” ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋งฅ๋ฝ ์œ ์ง€ (๋กœ์ปฌ Ollama)
Software Testing test-driven-development outside-in TDD๋กœ E-์ปค๋จธ์Šค API ๊ณ„์•ฝ์„ ๋ช…์„ธํ™” โ€” 35๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋กœ ํšŒ์›๊ฐ€์ž…ยทํ† ํฐยท๊ฑฐ๋ž˜ ์ž…์ถœ๋ ฅ(์ƒํƒœ์ฝ”๋“œยท์‘๋‹ตยทJWT)์„ @TddApiTest๋กœ ๊ณ ์ •
Release Engineering deploy-to-s3-with-jenkins Jenkins ์„ ์–ธํ˜• ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ •์  ์‚ฌ์ดํŠธ ๋ฐฐํฌ ์ž๋™ํ™” โ€” Docker agent ๊ฒฉ๋ฆฌยทcredential ์ฃผ์ž…ยทIAM ์ตœ์†Œ๊ถŒํ•œ์œผ๋กœ s3 sync --delete ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
Release Engineering deploy-to-ecs-with-jenkins Jenkins ์„ ์–ธํ˜• ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ Spring Boot ์ปจํ…Œ์ด๋„ˆ ECS(Fargate) ๋ฐฐํฌ ์ž๋™ํ™” โ€” ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ Docker ๋นŒ๋“œยทECR pushยทjq๋กœ task-def ์ด๋ฏธ์ง€ ์ฃผ์ž… ํ›„ ๋ฆฌ๋น„์ „ ๊ณ ์ •(๋นŒ๋“œ๋ฒˆํ˜ธ ํƒœ๊ทธ)ยทservices-stable ๋Œ€๊ธฐ๋กœ ๋ฌด์ค‘๋‹จ ๋กค๋ง ๋ฐฐํฌ BACKLOG(Application Load Balancer)
Observability elk-prometheus-grafana-monitoring ELK๋กœ ๋กœ๊ทธ ์ˆ˜์ง‘, PrometheusยทGrafana๋กœ ๋ฉ”ํŠธ๋ฆญ ๊ด€์ธก โ€” ํŠน์ • ์˜ˆ์™ธ์— ๋Œ€ํ•ด Discord ์•Œ๋ฆผ์„ pending periodยทincrease ์‹œ๊ฐ„์ฐฝ๊นŒ์ง€ ๋งž์ถฐ ์˜คํƒ ์—†์ด ๋ฐœํ™”

GitHub Activity Graph

Pinned Loading

  1. backend-roadmap backend-roadmap Public

    ๐Ÿ’ป์„œ๋ฒ„ ์ „๋ฐ˜์„ ๋‹ค๋ฃจ๋Š” ํ•™์Šต ์ €์žฅ์†Œ

    Java 1

  2. high-performance-java-persistence high-performance-java-persistence Public

    Forked from vladmihalcea/high-performance-java-persistence

    The High-Performance Java Persistence book and video course code examples

    Java

Repositories

Showing 10 of 21 repositories

People

This organization has no public members. You must be a member to see who’s a part of this organization.

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ