Skip to content

Latest commit

ย 

History

109 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์šฐํƒ€๋ง (Utaring)

์•ฑ ์ด๋ฆ„์€ ์šฐํƒ€๋ง์ž…๋‹ˆ๋‹ค. ๆญŒ(์šฐํƒ€, ๋…ธ๋ž˜)์— -ring์„ ๋ถ™์ธ ๊ฒƒ์œผ๋กœ, ํ•œ๊ตญ์–ด ํ™”์ž๊ฐ€ ํ•œ๋ˆˆ์— ์ฝํžˆ๊ณ  ๋ฌด์—‡์„ ํ•˜๋Š” ์•ฑ์ธ์ง€ ์†Œ๋ฆฌ๋กœ ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ ์ด๋ฆ„ Just์™€ ๋ฒˆ๋“ค ID com.coby.just๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค โ€” ๋ฐ”๊พธ๋ฉด ๊ธฐ๊ธฐ์˜ ์•ฑ ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœ๋น„์ €๋‹์ด ํ•จ๊ป˜ ๋Š๊น๋‹ˆ๋‹ค.

์ข‹์•„ํ•˜๋Š” ์ผ๋ณธ ์•„์ด๋Œ โ€” KAWAII LAB. ๋‹ค์„ฏ ๊ทธ๋ฃน, iLiFE!, =LOVE โ€” ์˜ ๋…ธ๋ž˜ ๊ฐ€์‚ฌ๋กœ ์ผ๋ณธ์–ด๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” iPhone / iPad ์•ฑ.

๋…ธ๋ž˜ ํ•œ ๊ณก์ด ํ•™์Šต ํ•œ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์‚ฌ ์ค„์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์ค„์ด ๋‹จ์–ด๋กœ ์ชผ๊ฐœ์ง€๊ณ , ๋‹ด์€ ๋‹จ์–ด๋Š” ์‹ค์ œ๋กœ ๋‚˜์˜จ ๊ฐ€์‚ฌ๋ฅผ ์˜ˆ๋ฌธ ์‚ผ์•„ ๊ฐ„๊ฒฉ ๋ฐ˜๋ณต ๋ณต์Šต์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

๋งŒ๋“œ๋Š” ๋ฒ•

tuist generate

Xcode 26.6 ์ด์ƒ, iOS 26 SDK, Swift 6.3 ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

์‹คํ–‰ ์ „ ์ค€๋น„ (ํ•œ ๋ฒˆ๋งŒ)

Apple Music์€ ์•ฑ์— ๋ถ™์—ฌ๋„ฃ์„ API ํ‚ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  App ID์— ์„œ๋น„์Šค๋ฅผ ์ผœ ์ฃผ์–ด์•ผ MusicKit์ด ๊ฐœ๋ฐœ์ž ํ† ํฐ์„ ์Šค์Šค๋กœ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Apple Developer ๊ณ„์ •์˜ Identifiers ์—์„œ com.coby.just App ID๋ฅผ ๋งŒ๋“ค๊ณ  MusicKit์„ ์ผญ๋‹ˆ๋‹ค.
  2. Xcode์—์„œ Just ํƒ€๊นƒ โ†’ Signing & Capabilities โ†’ ํŒ€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—๋Š” Apple Music ๊ณ„์ •์ด ์—†์–ด ์นดํƒˆ๋กœ๊ทธ ๊ฒ€์ƒ‰๊ณผ ์žฌ์ƒ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒซ ์‹คํ–‰ ์‹œ ์•ฑ์ด Apple Music ์ ‘๊ทผ ๊ถŒํ•œ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

ํ™”๋ฉด

์•„์ด๋Œ โ”€โ”€โ”€โ”€โ”ฌโ”€ ์ด์–ด์„œ ๊ณต๋ถ€ํ•˜๊ธฐ (์ง„๋„ ํ‘œ์‹œ)
          โ””โ”€ ๊ทธ๋ฃน ์นด๋“œ โ€” ์•„ํ‹ฐ์ŠคํŠธ ์‚ฌ์ง„ ์œ„์— ๊ทธ๋ฃน ์ƒ‰ (KAWAII LAB. / iLiFE! / =LOVE)
             โ†“ ๊ทธ๋ฃน ์„ ํƒ
          ๊ทธ๋ฃน์˜ ๊ณก ๋ชฉ๋ก
             โ†“ ๊ณก ์„ ํƒ

๋‚ด ๋…ธ๋ž˜ โ”€โ”€โ”€โ”€โ”€ ๋‚ด๊ฐ€ ์—ฐ ๊ณก ์ „๋ถ€, ์ตœ์‹ ์ˆœ. ์ง„๋„์™€ ํ•จ๊ป˜. ๊ธธ๊ฒŒ ๋ˆŒ๋Ÿฌ ๋ชฉ๋ก์—์„œ ๋นผ๊ธฐ
          ํ”Œ๋ ˆ์ด์–ด โ”€โ”€โ”ฌโ”€ ์‹ฑํฌ ๊ฐ€์‚ฌ + ํ›„๋ฆฌ๊ฐ€๋‚˜ โ†’ ์ค„ ํƒญ โ†’ ๋‹จ์–ด ์นด๋“œ
                    โ”œโ”€ ๊ฐ€์‚ฌ ์‹ฑํฌ ์กฐ์ ˆ (๊ณก๋ณ„๋กœ ์ €์žฅ)
                    โ”œโ”€ ํ•œ ์ค„ ๊ตฌ๊ฐ„ ๋ฐ˜๋ณต
                    โ”œโ”€ ๊ฐ€์‚ฌ ์ „์ฒดํ™”๋ฉด / ๊ฐ€์‚ฌ ํฌ๊ธฐ 4๋‹จ๊ณ„
                    โ””โ”€ ๋‹จ์–ด ์ผ๊ด„ ๋‹ด๊ธฐ ยท ์ด ๊ณก์˜ ๋‹จ์–ด
                    โ†“ ๋‚ด๋ฆฌ๋ฉด
          ๋ฏธ๋‹ˆํ”Œ๋ ˆ์ด์–ด (ํƒญ ๋ฐ” ์œ„) โ€” โฎ โ–ถ โญ, ์—ด์—ˆ๋˜ ๋ชฉ๋ก ์•ˆ์—์„œ ์ด์ „/๋‹ค์Œ ๊ณก

๋‹จ์–ด์žฅ โ”€โ”€โ”€โ”€โ”ฌโ”€ CSV ๋‚ด๋ณด๋‚ด๊ธฐ (Ankiยท์Šคํ”„๋ ˆ๋“œ์‹œํŠธ)
          โ”œโ”€ ํ†ต๊ณ„ + JLPT ๋ถ„ํฌ ์ฐจํŠธ
          โ””โ”€ JLPT ํ•„ํ„ฐ + ์ •๋ ฌ โ†’ ๋‹จ์–ด ์ƒ์„ธ

์—ฐ์Šต โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€ ๋ณต์Šต ์นด๋“œ (FSRS)
          โ”œโ”€ ์–ด๋ ค์šด ๋‹จ์–ด ์ง‘์ค‘ ยท ๋žœ๋ค ๋ฏน์Šค
          โ”œโ”€ ๋นˆ์นธ ์ฑ„์šฐ๊ธฐ ยท ๋œป ๋ณด๊ณ  ์“ฐ๊ธฐ ยท ์‚ฌ์ง€์„ ๋‹ค
          โ””โ”€ ๋“ฃ๊ณ  ๋ฐ›์•„์“ฐ๊ธฐ

์ด ์•ฑ์€ ์ผ๊ณฑ ๊ทธ๋ฃน๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์ด ์—†๋Š” ๊ฒƒ์ด ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ผ ์ •์˜์ž…๋‹ˆ๋‹ค โ€” ์ข‹์•„ํ•˜๋Š” ๊ทธ๋ฃน์ด ์ฒซ ํ™”๋ฉด์— ์žˆ๊ณ  ๋‘ ๋ฒˆ ๋ˆŒ๋Ÿฌ ๊ณก์— ๋‹ฟ๋Š” ๊ฒƒ์ด ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฃน Apple Music ID
FRUITS ZIPPER 1617607581
CANDY TUNE 1671095780
SWEET STEADY 1729116371
CUTIE STREET 1763185226
MORE STAR 1855752654
iLiFE! 1578837625
=LOVE 1273762750

๊ทธ๋ฃน ์นด๋“œ์˜ ์‚ฌ์ง„๋„ Apple Music ์•„ํ‹ฐ์ŠคํŠธ ์กฐํšŒ์—์„œ ์˜ต๋‹ˆ๋‹ค โ€” ๊ณก ๋ชฉ๋ก๊ณผ ๊ฐ™์€ ์š”์ฒญ์ด๋ผ, ์นด๋“œ๋ฅผ ๊ทธ๋ฆฐ ๋’ค ๊ทธ๋ฃน์„ ์—ด๋ฉด ๋‘ ๋ฒˆ ๋ฌป์ง€ ์•Š์Šต๋‹ˆ๋‹ค(GroupArtworkStore๊ฐ€ ์‹คํ–‰ ์ค‘ ํ•œ ๋ฒˆ๋งŒ ๋ฐ›์•„ ๋‘ก๋‹ˆ๋‹ค). ์‚ฌ์ง„์ด ์—†๊ฑฐ๋‚˜ ์•„์ง ์•ˆ ์™”์œผ๋ฉด ๊ทธ๋ฃน ์ƒ‰ ๊ทธ๋ผ๋ฐ์ด์…˜์ด ์นด๋“œ ์ž์ฒด๋ผ, ์•„๋ฌด๊ฒƒ๋„ ๊นœ๋นก์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…๋‹จ๋งŒ ์•ฑ์— ์žˆ๊ณ  ๊ณก์€ Apple Music ์•„ํ‹ฐ์ŠคํŠธ ์กฐํšŒ๋กœ ์˜ต๋‹ˆ๋‹ค โ€” ์ƒˆ ์‹ฑ๊ธ€์ด ๋‚˜์˜ค๋ฉด ์•ฑ ์—…๋ฐ์ดํŠธ ์—†์ด ๋œน๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ID๋กœ ์ฐพ๋Š” ์ด์œ ๋Š” ๋™๋ช…์ด์ธ์ž…๋‹ˆ๋‹ค.

๋ชฉ๋ก๊ณผ ๊ทธ๋ฃน ํ™”๋ฉด์€ ๋ฐ๊ณ  ํ™”์‚ฌํ•˜๊ฒŒ, ํ”Œ๋ ˆ์ด์–ด์™€ ๊ฐ€์‚ฌ๋Š” ๋‹คํฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์‚ฌ๋Š” ์–ด๋‘์šด ๋ฐฐ๊ฒฝ์—์„œ ์ฝ๊ธฐ๊ฐ€ ํ›จ์”ฌ ํŽธํ•˜๊ณ , ์ด ์•ฑ์—์„œ ๊ฐ€์žฅ ๊ธด ์‹œ๊ฐ„์ด ๊ฐ€์‚ฌ๋ฅผ ์ฝ๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

๋‘ ํ†ค์€ ํŒ”๋ ˆํŠธ ํ•˜๋‚˜๊ฐ€ ์ƒ‰์ƒ ๋ชจ๋“œ๋ฅผ ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. JustTheme.Ink์™€ Surface๊ฐ€ ๋‹คํฌยท๋ผ์ดํŠธ ๊ฐ’์„ ๊ฐ๊ฐ ๊ฐ–๊ณ  ๊ทธ๋ฆฌ๋Š” ์ž๋ฆฌ์—์„œ ํ•ด์„๋˜๋ฏ€๋กœ, ๋ชฉ๋ก ํ™”๋ฉด์€ ๋ฃจํŠธ์— .environment(\.colorScheme, .light) ํ•œ ์ค„์„ ๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ ๋’ค์ง‘ํžˆ๊ณ  ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ๋ผ๋ฒจ์ด ๋”ฐ๋ผ์˜ต๋‹ˆ๋‹ค. ํ™”๋ฉด๋งˆ๋‹ค ์ˆ˜์‹ญ ๊ฐœ์˜ ์ƒ‰ ์ฐธ์กฐ๋ฅผ ๊ณ ์น˜๋Š” ๋Œ€์‹  ํ•œ ๊ณณ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค.

์•ฑ ์•„์ด์ฝ˜์€ ํ•˜ํŠธ ์•ˆ์˜ ใ€ŒๆญŒใ€์— ๋ฐ˜์ง์ž„ ์…‹์ž…๋‹ˆ๋‹ค(Scripts/make-icon.py). ํ•œ์ž๋งŒ์œผ๋กœ๋Š” ์ผ๋ณธ์–ด๋ฅผ ๋งํ•˜๊ณ  ์•„์ด๋Œ์„ ๋งํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ํ•˜ํŠธ๋งŒ์œผ๋กœ๋Š” ๊ทธ ๋ฐ˜๋Œ€์˜€์Šต๋‹ˆ๋‹ค. ๋งํ’์„  ๊ผฌ๋ฆฌ๋„ ์‹œ๋„ํ–ˆ๋‹ค๊ฐ€ ๋บ์Šต๋‹ˆ๋‹ค โ€” ํ•˜ํŠธ๋Š” ์ด๋ฏธ ๋พฐ์กฑํ•œ ๋์ด ์žˆ์–ด์„œ ๊ผฌ๋ฆฌ๋ฅผ ๋ถ™์ด๋ฉด ๋์ด ๋‘˜์ด ๋˜๊ณ , ์ž‘์€ ํฌ๊ธฐ์—์„œ ๋ Œ๋”๋ง ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ์ฝํ˜”์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ

Just (์•ฑ)
 โ”œโ”€โ”€ JustCore     ๋„๋ฉ”์ธ ๋ชจ๋ธ, SwiftData ์Šคํ‚ค๋งˆ, FSRS ์Šค์ผ€์ค„๋Ÿฌ
 โ”œโ”€โ”€ JustDesign   ํŒ”๋ ˆํŠธ ์ถ”์ถœ, ๋ฉ”์‹œ ๋ฐฐ๊ฒฝ, ํ›„๋ฆฌ๊ฐ€๋‚˜ ์กฐํŒ
 โ”œโ”€โ”€ JustMusic    MusicKit ๊ฒ€์ƒ‰ + ApplicationMusicPlayer
 โ”œโ”€โ”€ JustLyrics   LRCLIB ํด๋ผ์ด์–ธํŠธ, LRC ํŒŒ์„œ
 โ””โ”€โ”€ JustSensei   ํ˜•ํƒœ์†Œ ๋ถ„์„, ์ฝ๊ธฐ, ์˜จ๋””๋ฐ”์ด์Šค ํ•ด์„ ์—”์ง„

๋ฐ์ดํ„ฐ ์ถœ์ฒ˜

์ถœ์ฒ˜ ๋น„๊ณ 
๊ณกยท์•จ๋ฒ”ยท์•„ํŠธ์›Œํฌ Apple Music (MusicKit) ํ‚ค ๋ถˆํ•„์š”, ์ฟผํ„ฐ ์—†์Œ
์žฌ์ƒ ApplicationMusicPlayer ๊ตฌ๋… ์—†์œผ๋ฉด 30์ดˆ ๋ฏธ๋ฆฌ๋“ฃ๊ธฐ๋กœ ๋Œ€์ฒด
๊ฐ€์‚ฌ LRCLIB ๋ฌด์ธ์ฆ, ์‹ฑํฌ LRC
ํ•ด์„ Apple Intelligence (์˜จ๋””๋ฐ”์ด์Šค) ๋น ๋ฅด๊ฒŒ/์ •ํ™•ํ•˜๊ฒŒ ์„ ํƒ, ์‚ฌ์ „ + ์‹œ์Šคํ…œ ๋ฒˆ์—ญ
ํ•œ์ž ์Œํ›ˆ ๋ฒˆ๋“ค (1,591์ž) ํ•œ๊ตญ์–ด ํ•™์Šต์ž์šฉ

๊ฐ€์‚ฌ ์‹ฑํฌ

๋‘ ๊ฐ€์ง€๊ฐ€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๊ณ  ์›์ธ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ๋“ฃ๊ธฐ์—์„œ๋Š” ๊ฐ€์‚ฌ๊ฐ€ ๋”ฐ๋ผ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋…์ด ์—†์œผ๋ฉด ์žฌ์ƒ์€ 30์ดˆ ํด๋ฆฝ์ด๊ณ , ๊ทธ ํด๋ฆฝ์€ ๊ณก ์ค‘๊ฐ„์—์„œ ์ž˜๋ ค ๋‚˜์˜ต๋‹ˆ๋‹ค(๋ฏธ๋ฆฌ๋“ฃ๊ธฐ ์ฒซ 1์ดˆ์˜ ํ‰๊ท  ์Œ๋Ÿ‰์ด ํด๋ฆฝ ์ „์ฒด ํ‰๊ท ๊ณผ 0.3~3.5dB ์ฐจ์ด๋ฟ - ๊ณก์˜ ์‹œ์ž‘์ด๋ผ๋ฉด ๋ฌด์Œ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค). Apple์€ ์–ด๋””์„œ ์ž˜๋ž๋Š”์ง€ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํด๋ฆฝ ์‹œ๊ฐ„์„ ๊ณก ์‹œ๊ฐ„์œผ๋กœ ํ™˜์‚ฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ™˜์‚ฐํ•˜์ง€ ์•Š๊ณ , ๊ฐ•์กฐยท์ž๋™ ์Šคํฌ๋กคยท์ค„ ํƒญ ์ด๋™ยท๊ตฌ๊ฐ„ ๋ฐ˜๋ณต์„ ๋ชจ๋‘ ๋ฉˆ์ถ”๊ณ  ์ด์œ ๋ฅผ ํ•œ ์ค„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์‚ฌ๋Š” ๊ทธ๋Œ€๋กœ ์ฝ๊ณ  ๋ˆŒ๋Ÿฌ ๋œป์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๊ณก ์žฌ์ƒ์—์„œ ๋ช‡ ์ดˆ ์–ด๊ธ‹๋‚˜๋Š” ๊ฒƒ์€ ์‹œํŠธ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ ํžŒ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œํŠธ๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์ด ํ•œ ์ค„์˜ ์‹œ์ž‘์„ ์–ด๋””๋กœ ์žก์•˜๋Š”์ง€(์ฒซ ๋ฐ•, ์ฒซ ์Œ์ ˆ, ๊ทธ ์•ž์˜ ์ˆจ)๋Š” ๋ฐ์ดํ„ฐ์— ์—†๊ณ , ๋Œ€์กฐํ•  ๋‘ ๋ฒˆ์งธ ์ถœ์ฒ˜๋„ ์—†์–ด์„œ ์ž๋™์œผ๋กœ๋Š” ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ณก๋ณ„๋กœ StudySong.lyricsOffset์— ์ €์žฅ๋˜๋Š” ๋ณด์ •๊ฐ’์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•ฉ๋‹ˆ๋‹ค - ๋‹ค์ด์–ผ๋กœ 0.1/0.5์ดˆ์”ฉ ๋ฐ€๊ฑฐ๋‚˜, ์ง€๊ธˆ ๋“ค๋ฆฌ๋Š” ์ค„์„ ๋ˆŒ๋Ÿฌ ํ•œ ๋ฒˆ์— ๋งž์ถฅ๋‹ˆ๋‹ค. ์•ฑ์ด ์งš๊ณ  ์žˆ๋Š” ์ค„์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ๋“ค๋ฆฌ๋Š” ์ค„์„ ๋ˆŒ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(์งš๊ณ  ์žˆ๋Š” ์ค„์€ ์ •์˜์ƒ ํ‹€๋ฆฐ ์ค„์ž…๋‹ˆ๋‹ค). ยฑ5์ดˆ๋ฅผ ๋„˜๊ธฐ๋ฉด ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค - ๊ทธ๊ฑด ํƒ€์ด๋ฐ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํŽธ์ง‘๋ณธ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๊ด‘๊ณ 

๊ด‘๊ณ ๋Š” ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค โ€” ๊ณก์„ ๋ถ„์„ํ•˜๋ฉฐ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ „๋ฉด ๊ด‘๊ณ  ํ•œ ๋ฒˆ. ๊ฐ€์‚ฌ๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜๊ณ  ๋ฌด์—‡์„ ํ•ด๋„ ๋Œ€๊ธฐ๊ฐ€ ์ค„์ง€ ์•Š๋Š”, ํ™”๋ฉด์„ ์“ฐ์ง€ ์•Š๋Š” ์œ ์ผํ•œ ์ˆœ๊ฐ„์ž…๋‹ˆ๋‹ค.

๋ชฉ๋ก ์•„๋ž˜์— ๋ถ™์–ด ์žˆ๋˜ ๋ฐฐ๋„ˆ๋“ค์€ ๊ฑท์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ํ–‰ ๋ฐ‘์˜ ๋ ๋Š” ๋ชจ๋“  ํ™”๋ฉด ๋์˜ ์žก๋™์‚ฌ๋‹ˆ๋กœ ์ฝํ˜”๊ณ , ๋ฒŒ์ด๋„ ์ ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ณก๋‹น ํ•œ ๋ฒˆ, ๊ทธ๋ฆฌ๊ณ  2๋ถ„ ์•ˆ์— ๋‘ ๋ฒˆ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน์˜ ๊ณก์„ ๋„˜๊ฒจ ๋ณด๋Š” ๋…์ž๊ฐ€ ๋งค ๊ณก ๊ด‘๊ณ ๋ฅผ ๋ณด๋Š” ์ผ์€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GADApplicationIdentifier์™€ ๊ด‘๊ณ  ๋‹จ์œ„ ID๋Š” Google ๊ณต๊ฐœ ํ…Œ์ŠคํŠธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์ˆ˜์ต์—๋Š” ๊ณ„์ • ๋ณด์œ ์ž์˜ ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งž์ถค ๊ด‘๊ณ ๋Š” ์“ฐ์ง€ ์•Š์œผ๋ฏ€๋กœ App Tracking Transparency ํ”„๋กฌํ”„ํŠธ๋„ ๋„์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Apple Music API๋Š” ๊ฐ€์‚ฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Œ์•… ์•ฑ์— ๊ฐ€์‚ฌ๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๋ณ„๊ฐœ๋กœ ๊ณต๊ฐœ API์—๋Š” ์—ด๋ ค ์žˆ์ง€ ์•Š์•„, ์‹ฑํฌ ๊ฐ€์‚ฌ๋Š” LRCLIB์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ์ €์žฅ

๊ณก์„ ์—ด๋ฉด ๊ทธ ๊ณก์— ๋”ธ๋ฆฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๊ธฐ์— ๋‚จ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์œ„์น˜ ๋น„๊ณ 
๊ฐ€์‚ฌ (LRC) StudySong.lyricsData ์˜คํ”„๋ผ์ธ ์žฌ์—ด๋žŒ ๊ฐ€๋Šฅ
์ค„๋ณ„ ํ•ด์„ ์ „์ฒด StudySong.analysisData ๋ฒˆ์—ญ + ๋‹จ์–ด + ๋ฌธ๋ฒ•. ๋ชจ๋ธ์€ ๊ณก๋‹น ํ•œ ๋ฒˆ๋งŒ ๋ˆ๋‹ค
๋‚œ์ด๋„ ํžˆ์Šคํ† ๊ทธ๋žจ StudySong.levelCounts ๋ชฉ๋ก์—์„œ ํ•ด์„์„ ๋””์ฝ”๋“œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ๋น„์ •๊ทœํ™”
๋‹จ์–ดยท๋ณต์Šต ์ผ์ • VocabEntry / ReviewState
์•จ๋ฒ”์•„ํŠธ Caches/Artwork URL ํ•ด์‹œ ํŒŒ์ผ๋ช…. ์‹œ์Šคํ…œ์ด ํšŒ์ˆ˜ ๊ฐ€๋Šฅ

๊ณก์„ ์ฒ˜์Œ ์—ด๋ฉด ์ „๊ณก ํ•ด์„์ด ์ž๋™์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ค„๋งˆ๋‹ค ๋ˆŒ๋Ÿฌ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  ํ•œ ๋ฒˆ์— ๋งŒ๋“ค์–ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ง„ํ–‰๋ถ„์€ ์ฆ‰์‹œ ๊ธฐ๋ก๋˜๋ฏ€๋กœ ์ค‘๊ฐ„์— ๋‹ซ์•„๋„ ๋ฒ„๋ ค์ง€์ง€ ์•Š๊ณ , ๋‹ค์‹œ ์—ด๋ฉด ๋‚จ์€ ์ค„๋ถ€ํ„ฐ ์ด์–ด์„œ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์„์„ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ ์„ธ ๊ฐ€์ง€๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„๋ ด์ฒ˜๋Ÿผ ๊ฐ™์€ ์ค„์ด ๋ฐ˜๋ณต๋˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ชจ๋ธ์— ๋ฌป๊ณ  ๋‚˜๋จธ์ง€ ์ธ๋ฑ์Šค์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์„ธ์…˜์€ ์ค„๋งˆ๋‹ค ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  8์ค„๋งˆ๋‹ค ์žฌํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค โ€” ๋งค๋ฒˆ ๋งŒ๋“ค๋ฉด ์—ด๋‹ค์„ฏ ์ค„์งœ๋ฆฌ ์ง€์‹œ๋ฌธ์„ ๊ทธ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ์€ ๋‹ค์„ฏ ์ค„๋งˆ๋‹ค ํ•ฉ๋‹ˆ๋‹ค(๋งค ์ค„ ์ €์žฅ์€ ๊ณก ๊ธธ์ด์— ๋Œ€ํ•ด ์ œ๊ณฑ์œผ๋กœ ๋Š˜์–ด๋‚จ).

๊ณก์„ ์—ด ๋•Œ ์•„์ง ๋ฒˆ์—ญํ•  ์ค„์ด ๋‚จ์•„ ์žˆ์œผ๋ฉด **ใ€Œ์–ด๋–ป๊ฒŒ ๋ฒˆ์—ญํ• ๊นŒ์š”?ใ€**๋ฅผ ๋จผ์ € ๋ฌป์Šต๋‹ˆ๋‹ค โ€” ใ€Œ๋น ๋ฅด๊ฒŒใ€(๋ช‡ ์ดˆ, ๋œปยท๋ฌธ๋ฒ•์€ ์ •ํ™•, ๋ฌธ์žฅ์€ ์ง์—ญ์— ๊ฐ€๊นŒ์›€)์™€ ใ€ŒAI๋กœ ์ •ํ™•ํ•˜๊ฒŒใ€(์•ž๋’ค ์ค„๊นŒ์ง€ ์ฝ์–ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ, ๋ช‡ ๋ถ„) ๋‘ ์นด๋“œ์— ๊ฐ๊ฐ ํ•œ ๋ฌธ์žฅ ์„ค๋ช…์ด ๋ถ™์Šต๋‹ˆ๋‹ค. ์„ค์ •์— ๋ฌปํžŒ ์„ ํƒ๊ธฐ๋Š” ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์•„๋ฌด๋„ ์ฐพ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋‹ต์ด ํ•„์š”ํ•œ ๊ทธ ์ˆœ๊ฐ„์— ๋ฌป์Šต๋‹ˆ๋‹ค. ใ€Œ๋‹ค์Œ์—๋„ ์ด๊ฑธ๋กœ ์—ด๊ธฐใ€๋ฅผ ์ผœ๋ฉด ๋” ๋ฌป์ง€ ์•Š๊ณ , ์„ค์ •์—์„œ ๋‹ค์‹œ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‹ค ๋ฒˆ์—ญ๋œ ๊ณก์€ ๋ฌป์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๋‹ต์ด ๋ฐ”๊ฟ€ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด ๋ฌธ๊ตฌ์—๋Š” ๊ธฐ์ˆ  ์šฉ์–ด๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ใ€ŒAI ๋ฒˆ์—ญใ€๊ณผ ใ€Œ๋น ๋ฅธ ๋ฒˆ์—ญใ€, ใ€Œ๊ฐ„๋‹จ ๋ฒˆ์—ญใ€์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์ค„ ์นด๋“œ์˜ ๋ฒ„ํŠผ๋„ ใ€Œ์ •ํ™•ํ•˜๊ฒŒ ๋‹ค์‹œ ๋ฒˆ์—ญใ€์ž…๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์‹ซ์œผ๋ฉด **'์ง€๊ธˆ ๋“ฃ๊ธฐ'**๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๋‚จ์€ ์ค„์€ ๋“ค์œผ๋ฉด์„œ ์ด์–ด์„œ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ๊ธด ๊ณก์€ ์•Œ์•„์„œ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค โ€” ์ฒซ ๋‘ ์ค„์„ ๋„˜๊ธด ๋’ค ๋‚จ์€ ์‹œ๊ฐ„์ด 30์ดˆ๋ฅผ ๋„˜์œผ๋ฉด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋จผ์ € ์—ด๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ๋’ค์—์„œ ์ฑ„์›๋‹ˆ๋‹ค(WaitBudget). ์™„์„ฑ๋œ ๊ณก์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ์ด๊ณ , ๋นจ๋ฆฌ ๋๋‚˜๋Š” ๊ณก์€ ๋๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค โ€” ์‚ฌ๋žŒ์—๊ฒŒ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๊ธฐ์™€ ๊ธฐ๊ธฐ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๊ธฐ๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

์˜์–ด ์ค„์€ ๋ฒˆ์—ญ ํ•œ ์นธ๋งŒ ๋ฌป์Šต๋‹ˆ๋‹ค. ๋‹จ์–ด์™€ ๋ฌธ๋ฒ•์€ ์–ด์ฐจํ”ผ ๋ฒ„๋ฆฌ๋ฏ€๋กœ, ๋ฒ„๋ฆด ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋А๋ผ ๊ธฐ๋‹ค๋ฆด ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ž๋™ ํ•ด์„ ์‹œ์ ์€ ์„ค์ •์—์„œ ๊ณ ๋ฆ…๋‹ˆ๋‹ค โ€” ํ•ญ์ƒ / ์ €์ „๋ ฅ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ ๋•Œ(๊ธฐ๋ณธ) / ์•ˆ ํ•จ. ๊ธฐ๋ณธ๊ฐ’์ด ์ €์ „๋ ฅ ๋ชจ๋“œ๋ฅผ ๋”ฐ๋ฅด๋Š” ์ด์œ ๋Š”, ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์‹œ์Šคํ…œ์— ์—๋„ˆ์ง€ ์‚ฌ์šฉ ๋ฐฉ์นจ์„ ๋งํ•ด ๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•™์Šต ์•ฑ์ด ๊ทธ๊ฑธ ์•ž์งˆ๋Ÿฌ ํŒ๋‹จํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•ด์„์ด ๋น ์ง€๋Š” ์ค„์„ ์—†์• ๋Š” ์„ธ ์ธต

์˜์–ด ๊ตฌ์ ˆ์€ ๋ฒˆ์—ญ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. J-POP์€ ํ›„๋ ด์ด ํ†ต์งธ๋กœ ์˜์–ด์ธ ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค„๋„ ๋…ธ๋ž˜์˜ ์ผ๋ถ€๋ผ ๋œป์€ ์•Œ๋ ค์ฃผ์ง€๋งŒ, ๊ฑฐ๊ธฐ์„œ ์™ธ์šธ ์ผ๋ณธ์–ด ๋‹จ์–ด๋Š” ์—†์Šต๋‹ˆ๋‹ค โ€” baby์— ๊ฐ€๋‚˜ ์ฝ๊ธฐ๋ฅผ ์ง€์–ด ๋ถ™์ธ ์นด๋“œ๋Š” ๋ณต์Šต ์ผ์ •์— ๋“ค์–ด๊ฐ€์„œ ๊ณ„์† ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ๊ฐ€๋‚˜๋‚˜ ํ•œ์ž๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ์ผ๋ณธ์–ด๋กœ ๋ณด๊ณ (๋น„์œจ์ด ์•„๋‹™๋‹ˆ๋‹ค โ€” ์˜์–ด ์ค„์— ์„ž์ธ ์ผ๋ณธ์–ด ํ•œ ๋‹จ์–ด๋„ ๋ฐฐ์šธ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค), ์„ž์ธ ์ค„์—์„œ๋Š” ์ผ๋ณธ์–ด ๋‹จ์–ด๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค.

์‹คํŒจํ•œ ์ค„์€ ์ง„์ „์ด ์žˆ๋Š” ๋™์•ˆ ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋‚จ์€ ์ค„์ด ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋Œ๋ฉด ํ•ญ์ƒ ์‹คํŒจํ•˜๋Š” ์ค„์—์„œ ์˜์›ํžˆ ๋Œ์•„์˜ค์ง€ ์•Š์œผ๋ฏ€๋กœ, ์กฐ๊ฑด์€ ์™„๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง„์ „์ž…๋‹ˆ๋‹ค โ€” ํ•œ ๋ฐ”ํ€ด๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค. ํ•œ ์ค„๋‹น ์ตœ๋Œ€ ํ•œ ๋ฐ”ํ€ด์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋๋‚ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋‚จ์€ ์ค„์€ ์‹œ์Šคํ…œ ๋ฒˆ์—ญ์œผ๋กœ ์ฑ„์›๋‹ˆ๋‹ค. Apple Intelligence๋Š” ์ตœ์‹  ๊ธฐ๊ธฐ๋ฅผ ์š”๊ตฌํ•˜์ง€๋งŒ Apple ๋ฒˆ์—ญ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ „ ๊ธฐ๊ธฐ์—์„œ๋Š” ํ•ด์„์ด ์‚ฌ์ „ ๋œป์—์„œ ๋ฉˆ์ถ”๊ณ  ๋ฒˆ์—ญ์ด ์•„์˜ˆ ์—†์—ˆ๋Š”๋ฐ, ๊ทธ๊ฒŒ ์ •์ž‘ ํ•„์š”ํ•œ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๋‰˜์•™์Šค๋Š” ์—†๋Š” ์ง์—ญ์ด์ง€๋งŒ ๋ฒˆ์—ญ์€ ๋ฒˆ์—ญ์ž…๋‹ˆ๋‹ค.

ํ•ด์„ ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€๊ณ , ๊ณ ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ์งˆ๋ฌธ โ€” ๋‹จ์–ด๊ฐ€ ๋ฌด์Šจ ๋œป์ธ์ง€, ์–ด๋–ค ๋ฌธ๋ฒ•์„ ์“ฐ๋Š”์ง€, ์ค„์ด ๋ฌด์Šจ ๋ง์ธ์ง€ โ€” ์— ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด ๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๋น ๋ฅด๊ฒŒ ์ •ํ™•ํ•˜๊ฒŒ
๋‹จ์–ด ๋ฒˆ๋“ค ์‚ฌ์ „ ๋ชจ๋ธ + ์‚ฌ์ „์ด ์‚ฌ์‹ค ๊ต์ •
๋ฌธ๋ฒ• ํŒจํ„ด ๋งค์นญ ํŒจํ„ด ๋งค์นญ
๋ฌธ์žฅ ์‹œ์Šคํ…œ ๋ฒˆ์—ญ(์ง์—ญ) ๋ชจ๋ธ์ด ์•ž๋’ค ์ค„๊นŒ์ง€ ์ฝ๊ณ  ํ•ด์„
ํ•œ ๊ณก ๋ช‡ ์ดˆ ๋ช‡ ๋ถ„

์›๋ž˜๋Š” ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ๊ธฐ ์‚ฌ์–‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. Apple Intelligence๊ฐ€ ์—†์œผ๋ฉด ์‚ฌ์ „์œผ๋กœ ๋–จ์–ด์ง€๊ณ , ์žˆ์œผ๋ฉด ๊ฑฐ์ ˆํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ํด๋ฐฑ์€ ๊ตฌํ˜• ๊ธฐ๊ธฐ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค โ€” ํ›„๋ ด์„ ์ง€๊ธˆ ๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ, ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์•„๊นŒ์šด ์‚ฌ๋žŒ, ์ด๋ฏธ ํ•œ ๋ฒˆ ์ฝ์€ ๊ณก์„ ๋‹ค์‹œ ์—ฌ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋А๋ฆฐ ์ชฝ์€ ์„ ํƒํ•˜์ง€ ์•Š์€ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํด๋ฐฑ์ด ๋ชจ๋“œ๊ฐ€ ๋˜๊ณ , ๋ชจ๋“œ๊ฐ€ ์„ค์ •์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋น ๋ฅด๊ฒŒ๋กœ ํ•ด์„ํ•œ ๊ณก์„ ์ •ํ™•ํ•˜๊ฒŒ๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์‹œ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „ ๊ฒฐ๊ณผ๋„ ๋ฒˆ์—ญ์„ ๊ฐ–๊ณ  ์žˆ์–ด์„œ, ๋ฒˆ์—ญ์ด ์žˆ์œผ๋ฉด ์™„๋ฃŒ๋ผ๋Š” ๊ธฐ์กด ๊ทœ์น™๋งŒ์œผ๋กœ๋Š” ๋น ๋ฅด๊ฒŒ ์ฝ์€ ๊ณก์ด ์˜์›ํžˆ ๋น ๋ฅธ ์ƒํƒœ๋กœ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์€ ๋Œ€์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค โ€” ๋น ๋ฅด๋ ค๊ณ  ์ด๋ฏธ ๋ฐ›์€ ๋” ์ข‹์€ ๋‹ต์„ ๋ฒ„๋ฆด ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•์€ ๋ฌผ์–ด๋ณด์ง€ ์•Š๊ณ  ์ฐพ์Šต๋‹ˆ๋‹ค

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

๊ทธ๋ž˜์„œ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ผ๋ณธ์–ด ๋ฌธ๋ฒ• ํŒจํ„ด์€ ์œ ํ•œํ•˜๊ณ  ์ž˜ ์ •๋ฆฌ๋œ ์ง‘ํ•ฉ์ด๊ณ , ์–ด๋–ค ์ค„์ด ใ€Œใ€œใฆใ—ใพใ†ใ€๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€๋Š” ํŒ๋‹จ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์‹ค์ด๋ฉฐ, ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€๋Š” ๊ณก์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์˜ ๋‚˜๋จธ์ง€๊ฐ€ ์ด๋ฏธ ํ•˜๋Š” ๋ถ„์—…๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค โ€” ํŒ๋‹จ์€ ๋ชจ๋ธ, ์‚ฌ์‹ค์€ ๊ณ ์ • ๋ฐ์ดํ„ฐ.

์ค„์— ๋งž์ถ˜ ์„ค๋ช…์„ ํฌ๊ธฐํ•˜๋Š” ๋Œ€์‹ , ํ•ญ์ƒ ์ž‘๋™ํ•˜๊ณ  ํ•ญ์ƒ ๊ฐ™์€ ๋ง์„ ํ•˜๊ณ  ์ƒ์„ฑ ๋น„์šฉ์ด 0์ž…๋‹ˆ๋‹ค. ๊ธด ํŒจํ„ด์€ ์ž๊ธฐ๊ฐ€ ํฌํ•จํ•œ ์งง์€ ํŒจํ„ด์„ ๊ฐ€๋ฆฝ๋‹ˆ๋‹ค โ€” ใ€Œใชใใ‚ƒใ€๋Š” ใ€Œใชใ„ใ€์— ๋Œ€ํ•œ ์ˆ˜์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•œ ์ค„์— ์ตœ๋Œ€ 3๊ฐœ์ธ๋ฐ, ์งง์€ ๊ฐ€์‚ฌ ํ•œ ์ค„์— ๋…ธํŠธ ์—ฌ๋Ÿ ๊ฐœ๋Š” ์ˆ˜์—…์ด ์•„๋‹ˆ๋ผ ์†Œ์Œ์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ์ด ์žˆ๋Š” ๊ธฐ๊ธฐ์—์„œ๋Š” ๋ชจ๋ธ์ด ๋จผ์ € ๋‹ค ์‹œ๋„ํ•œ ๋’ค์— ๋‚จ์€ ์ค„๋งŒ ์ฑ„์›๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ์œ„์˜ ์žฌ์‹œ๋„๊ฐ€ ๋ฌด์˜๋ฏธํ•ด์ง€๊ณ  ์ผ์‹œ์  ์‹คํŒจ๊ฐ€ ์ง์—ญ์œผ๋กœ ๊ตณ์Šต๋‹ˆ๋‹ค.

Translation ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ทฐ ๋ฐ–์—์„œ init(installedSource:target:)๋งŒ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ, ์–ธ์–ดํŒฉ ๋‹ค์šด๋กœ๋“œ๋Š” ์„ค์ • ํ™”๋ฉด์˜ ๋ฒ„ํŠผ(.translationTask)์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค โ€” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋œจ๋Š” ์ผ์ด๋ผ ํ•ด์„ ๋„์ค‘์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ ํ™”๋ฉด์— ์žˆ์–ด์•ผ ๋งž์Šต๋‹ˆ๋‹ค. ์Šค์œ„์น˜๋กœ ๋Œ ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋ณธ์€ ์ผฌ์ž…๋‹ˆ๋‹ค.

ํ•ด์„ ํ’ˆ์งˆ ์ธก์ •

Report/SenseiReport.swift๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ธก์ • ์žฅ์น˜์ž…๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ๊ฐ€์‚ฌ์— ์‹ค์ œ ํ•ด์„๊ธฐ๋ฅผ ๋Œ๋ ค ๋‚˜์˜จ ๊ฒƒ์„ ์ฐ๊ณ , ์…€ ์ˆ˜ ์žˆ๋Š” ์‹คํŒจ(์ด์›ƒ ์ค„ ์นจ๋ฒ”, ๊ธˆ์ง€์–ด, ๋ฒˆ์—ญ์— ๋‚จ์€ ์ผ๋ณธ์–ด, ๋ถ€ํ’€๋ฆผ, ์‚ฌ์ „์œผ๋กœ ๋Œ€์ฒด๋œ ์ค„)์™€ ์†Œ์š” ์‹œ๊ฐ„์„ ํ‘œ๋กœ ๋ƒ…๋‹ˆ๋‹ค. ํ’ˆ์งˆ์€ ๋‹จ์–ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ด ์ˆซ์ž๋“ค์€ ๋‹จ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋‘ ์‹คํ–‰์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กฌํ”„ํŠธ๋‚˜ ๋ฌถ์Œ ๋ณ€๊ฒฝ์„ ํŒ๋‹จํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ณ„๋„ ํƒ€๊นƒ(JustReport)์ด๊ณ  ์•ฑ์ด ํ˜ธ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค๊ธฐ๊ธฐ์—์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜จ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ ์ž์‚ฐ์€ ํ•˜๋ฃจ์— ์„ธ ๋ฒˆ ์‚ฌ๋ผ์กŒ๊ณ , ๊ทธ๋•Œ๋งˆ๋‹ค ๋ณด๊ณ ์„œ๋Š” ใ€Œ๋ชจ๋“  ์ค„์ด ์‚ฌ์ „์œผ๋กœ ๋Œ€์ฒด๋์Šต๋‹ˆ๋‹คใ€๋ผ๊ณ  ์Šค์Šค๋กœ ๋งํ•ฉ๋‹ˆ๋‹ค.

# ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ
xcodebuild -workspace Just.xcworkspace -scheme JustReport \
  -destination 'platform=iOS Simulator,name=iPhone 17' test

# ์‹ค๊ธฐ๊ธฐ (๋ชจ๋ธ์ด ์ง„์งœ์ธ ๊ณณ). ๊ธฐ๊ธฐ ์ž ๊ธˆ์„ ํ’€์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
xcodebuild -workspace Just.xcworkspace -scheme JustReport \
  -destination 'platform=iOS,name=Coby' -allowProvisioningUpdates test

๊ธฐ๋ณธ Just ์Šคํ‚ด์˜ ํ…Œ์ŠคํŠธ๋Š” JustTests๋งŒ ๋Œ๋ฆฝ๋‹ˆ๋‹ค. ์œ ๋‹› ํ…Œ์ŠคํŠธ๋Š” 1์ดˆ ๋ฏธ๋งŒ์ด๊ณ  ๋งค ๋ณ€๊ฒฝ๋งˆ๋‹ค ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด๋ผ, ๊ทธ ์•ž์— ์•ฑ ์‹คํ–‰์„ ์–น์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํƒ€๊นƒ์„ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

์˜ค๋งค์นญ์„ ์žฌ๋Š” ๋ˆˆ

์ปค๋ฒ„๋ฆฌ์ง€ ๋ณด๊ณ ์„œ์— **ใ€Œ๊ฐ€๋‚˜ ํ‘œ๊ธฐ๊ฐ€ ํ•œ์ž ํ‘œ์ œ์–ด๋กœ ์žกํžŒ ๊ฒƒใ€**์„ ์…‰๋‹ˆ๋‹ค. ๊ฐ€์‚ฌ๊ฐ€ ๊ฐ€๋‚˜๋กœ ์“ด ๋ง์ด ํ•œ์ž ๋‹จ์–ด๋กœ ๋Œ์•„์˜จ ๊ฒฝ์šฐ์ธ๋ฐ, ์˜ณ์„ ๋•Œ๋„(ใ‚†ใ‚ โ†’ ๅคข) ์žˆ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค โ€” ๋ถ€์ • ์–ด๋ฏธ ใ€Œใชใ„ใ€๊ฐ€ 119์ค„์—์„œ ใ€Œๆณฃใ(์šธ๋‹ค)ใ€๋กœ, ใ€ŒใพใŸใ€๊ฐ€ ใ€Œๅพ…ใคใ€๋กœ, ใ€Œใ„ใ„ใ€๊ฐ€ ใ€Œ่จ€ใ†ใ€๋กœ ์žกํ˜”์Šต๋‹ˆ๋‹ค. ๊ฐ€๋‚˜ ๋‹จ์–ด๋ฅผ ํ™œ์šฉ ๋˜๋Œ๋ฆฌ๊ธฐ๋กœ ๋‹ค๋ฅธ ๊ฐ€๋‚˜๋กœ ๊ตฌ๋ถ€๋ฆฐ ๋’ค ์ฝ๊ธฐ ์ธ๋ฑ์Šค์—์„œ ํ•œ์ž ๋™์‚ฌ๋ฅผ ์ฐ์–ด ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ธก์ •: ์˜ค๋งค์นญ 227 โ†’ 25, ๋‚จ์€ 25๊ฑด์€ ์ „๋ถ€ ์˜ณ์€ ๋งค์นญ์ž…๋‹ˆ๋‹ค. ์ปค๋ฒ„๋ฆฌ์ง€๋Š” 66% โ†’ 63%๋กœ ๋‚ด๋ ค๊ฐ”๋Š”๋ฐ, ๋น ์ง„ 3์ ์ด ๊ฐ€์งœ ์ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒˆ๋“ค ์‚ฌ์ „

Modules/JustSensei/Resources/seed-dictionary.json์€ ์ƒ์„ฑ๋ฌผ์ž…๋‹ˆ๋‹ค.

python3 Scripts/build-dictionary.py

Scripts/build-dictionary.py๋Š” ์˜† ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ง์ „ ๋นŒ๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ํ•ญ๋ชฉ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ์ด์ „๋ณด๋‹ค 10% ๋„˜๊ฒŒ ์ค„๋ฉด ์“ฐ๊ธฐ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋งŒ ๋‚ด๊ณ  ์ง„ํ–‰ํ•˜๋˜ ๋•Œ์—๋Š” 6,900๊ฐœ ์‚ฌ์ „์ด 179๊ฐœ๋กœ ๋ฎ์—ฌ ์“ฐ์˜€๊ณ  ์•ฑ์€ ์–ดํœ˜ ๋Œ€๋ถ€๋ถ„์„ ์žƒ์€ ์ฑ„๋กœ ๊ณ„์† ๋Œ์•˜์Šต๋‹ˆ๋‹ค โ€” ์˜† ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋“  ๊ธฐ๊ณ„์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ์ธต์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. Scripts/curated.json์˜ 149๊ฐœ๋Š” ์†์œผ๋กœ ํ™•์ธํ•œ ๊ฒƒ์ด๋ผ ํ’ˆ์‚ฌ์™€ JLPT ๋“ฑ๊ธ‰๊นŒ์ง€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋จธ์ง€ 6.8์ฒœ๊ฐœ๋Š” ์˜† ํ”„๋กœ์ ํŠธ์ธ jlpt-app์˜ ์ผํ•œ ๋‹จ์–ด ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๋œป๊ณผ ์ฝ๊ธฐ๋งŒ ์”๋‹ˆ๋‹ค โ€” ์›๋ณธ์˜ lv ํ•„๋“œ๋Š” ๋‚œ์ด๋„๊ฐ€ ์•„๋‹ˆ๋ผ ๊ต์žฌ ์†Œ์† ํƒœ๊ทธ๋ผ(์ „ ํ–‰์ด n1, ์•ˆ๊ฒฝ๊ณผ ๋„์„œ๊ด€๊นŒ์ง€) ๋“ฑ๊ธ‰์œผ๋กœ ์“ฐ๋ฉด ์—†๋А๋‹ˆ๋งŒ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์„ ํŒŒ์ดํ”„๋ผ์ธ

๊ฐ€์‚ฌ ํ•œ ์ค„
 โ”œโ”€ CFStringTokenizer   ๋ฌธ๋งฅ ์ธ์‹ ๋ถ„์ ˆ + ์ฝ๊ธฐ
 โ”œโ”€ NLTagger            ์‚ฌ์ „ํ˜•(lemma) ยท ํ’ˆ์‚ฌ
 โ”œโ”€ FoundationModels    ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ ยท ๋œป ยท ๋‰˜์•™์Šค (guided generation)
 โ””โ”€ ๋ฒˆ๋“ค ์‚ฌ์ „ ๊ต์ฐจ๊ฒ€์ฆ   ํ‘œ์ œ์–ด ยท ์ฝ๊ธฐ ยท ํ’ˆ์‚ฌ ยท JLPT ๋“ฑ๊ธ‰ ๋ฎ์–ด์“ฐ๊ธฐ
                        (๊ฐ€์‚ฌ์— ์“ฐ์ธ ํ‘œ๊ธฐ๋ฅผ ์ฝ๊ธฐ๋ณด๋‹ค ์šฐ์„ )

ํ”„๋กฌํ”„ํŠธ์—๋Š” ๊ทธ ์ค„ ๋‹จ์–ด์˜ ์‚ฌ์ „ ๋œป์ด ํ•จ๊ป˜ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค(<words>). ๋ชจ๋ธ์€ ๋ฌธ์žฅ์„ ์ฝ๋Š” ๋ฐ๋Š” ๊ฐ•ํ•˜๊ณ  ๋‹จ์–ด๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ๋Š” ์•ฝํ•ด์„œ, ็ฉบ์„ ใ€Œ๊ณต๊ธฐใ€(็ฉบๆฐ—)๋กœ ์˜ฎ๊ธฐ๋Š” ์ผ์ด ๋ฐ˜๋ณต๋์Šต๋‹ˆ๋‹ค โ€” ์‚ฌ์ „์€ ใ€Œํ•˜๋Š˜ใ€๋กœ ์ •ํ™•ํžˆ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ ์•„๋ฌด๋„ ๋ชจ๋ธ์—๊ฒŒ ๋งํ•ด์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋„ฃ๋Š” ๊ฐœ์ˆ˜๋Š” ๋„ค ๊ฐœ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋งฅ ์ฐฝ์ด ์„ธ ์ค„์—์„œ ๋„˜์น˜๋Š” ์ƒํ™ฉ์—์„œ ์ค„ ๊ธธ์ด์— ๋”ฐ๋ผ ๋Š˜์–ด๋‚˜๋Š” ๋ชฉ๋ก์€ ๊ทธ ์‹œ์ ์„ ์•ž๋‹น๊น๋‹ˆ๋‹ค.

๋ฒˆ์—ญ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ์กฐ๊ฑด๋„ ๊ธฐ๊ณ„์ ์œผ๋กœ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ธ€์ด ์ธ์šฉ๋ถ€ํ˜ธ ๋ฐ– ๊ธ€์ž์˜ ๋‹ค์ˆ˜์—ฌ์•ผ ํ•˜๊ณ , ์ธ์šฉ๋ถ€ํ˜ธ ๋ฐ–์— ์ผ๋ณธ์–ด๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉด ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์šฉ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค โ€” ์›๋ฌธ์ด ใ€Œใ•ใ‚ˆใชใ‚‰ใ€๋ฅผ ์ธ์šฉํ•˜๋ฉด ๋ฒˆ์—ญ์ด ๊ทธ๋Œ€๋กœ ์ธ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜ณ๊ณ , ์˜์–ด ํ›„๋ ด์„ ์ธ์šฉํ•˜๋Š” ํ•œ๊ตญ์–ด ๋ฌธ์žฅ๋„ ์˜ณ์Šต๋‹ˆ๋‹ค. ใ€Œํ•œ๊ธ€์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉดใ€์œผ๋กœ ๋‘์—ˆ์„ ๋•Œ ใ€Œ๊ฐ€ fence across from each other.ใ€๊ฐ€ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜จ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ์€ ๋ฌธ๋งฅ์—๋Š” ๊ฐ•ํ•˜๊ณ  ์•”๊ธฐ์—๋Š” ์•ฝํ•ฉ๋‹ˆ๋‹ค. ใ€Œใ€œใฆใ‚‹ใ€๋ฅผ ใ€Œใ€œใฆใ„ใ‚‹ใ€๋กœ ๋˜๋Œ๋ฆฌ๊ฑฐ๋‚˜ ๊ฐ€์‚ฌ๋ฅผ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ•œ๊ตญ์–ด๋กœ ์˜ฎ๊ธฐ๋Š” ์ผ์€ ์ž˜ ํ•˜์ง€๋งŒ, JLPT ๋“ฑ๊ธ‰์„ ์ง€์–ด๋‚ด๊ณ  ํ‘œ์ œ์–ด ์ž๋ฆฌ์— ์ฝ๊ธฐ๋ฅผ ์“ฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒ๋‹จ์€ ๋ชจ๋ธ์—, ์‚ฌ์‹ค์€ ์‚ฌ์ „์— ๋งก๊ธฐ๊ณ , ๊ฐ€์‚ฌ์— ์‹ค์ œ๋กœ ์—†๋Š” ๋‹จ์–ด๋Š” ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค (JustSensei/Sensei.swift์˜ refine).

์ ‘๊ทผ์„ฑ

๋ชจ๋“  ๋ณธ๋ฌธ ํ…์ŠคํŠธ๊ฐ€ Dynamic Type์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Font.system(size:)๋Š” ์‹œ์Šคํ…œ ๊ธ€์ž ํฌ๊ธฐ ์„ค์ •์„ ๋ฌด์‹œํ•˜๊ณ  Font.custom(_:size:relativeTo:)๋Š” ํฐํŠธ ํŒŒ์ผ ์ด๋ฆ„์„ ์š”๊ตฌํ•˜๋ฏ€๋กœ, UIFont๋ฅผ UIFontMetrics๋กœ ํ†ต๊ณผ์‹œํ‚ค๋Š” Font.just(_:weight:relativeTo:)๋ฅผ ์”๋‹ˆ๋‹ค โ€” ๋””์ž์ธ๋œ ํฌ์ธํŠธ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ค์ •์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์ • ํฌ๊ธฐ๋กœ ๋‚จ๊ธด ๊ฒƒ์€ SF Symbol ์•„์ด์ฝ˜๊ณผ ์—ฐ์†์ผ์ˆ˜ ๋ง์˜ ์ˆซ์ž๋ฟ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ธ€์ž์™€ ํ•จ๊ป˜ ์ปค์ง€๋ฉด ์•ˆ ๋˜๋Š” ๊ณ ์ • ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์‚ฌ๋Š” ์—ฌ๊ธฐ์— ์•ฑ ์ž์ฒด์˜ 4๋‹จ๊ณ„ ์กฐ์ ˆ์ด ๊ณฑํ•ด์ง‘๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„ค์ •๊ณผ ์•ฑ ์„ค์ •์ด ๊ฐ™์€ ํ…์ŠคํŠธ์— ํ•จ๊ป˜ ์ž‘์šฉํ•˜๋ฏ€๋กœ, ์ ‘๊ทผ์„ฑ ํฌ๊ธฐ์—์„œ๋Š” ๊ฐ€์‚ฌ ํฌ๊ธฐ๋ฅผ ๋‚ฎ์ถฐ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฅ๋งํฌ

just://review์™€ just://words๋กœ ํ™”๋ฉด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์Šต ์•Œ๋ฆผ๊ณผ ์œ„์ ฏ์ด ์ด ๋งํฌ๋ฅผ ์”๋‹ˆ๋‹ค โ€” ์•Œ๋ฆผ์ด ์•ฑ์„ ์—ด๋˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ง€๋ง‰์— ๋ณด๋˜ ํ™”๋ฉด์œผ๋กœ ๋ฐ๋ ค๊ฐ€๋ฉด ๊ทธ ์•Œ๋ฆผ์€ ์‹คํŒจํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•Œ๋ฆผ์€ onOpenURL๋กœ ์˜ค์ง€ ์•Š์œผ๋ฏ€๋กœ NotificationRouter๊ฐ€ ๋Œ€์‹  ๋ฐ›์Šต๋‹ˆ๋‹ค. ์•ฑ ์‹œ์ž‘ ์‹œ์ ์— ๋“ฑ๋กํ•˜๋Š” ์ด์œ ๋Š”, ์ฝœ๋“œ ์Šคํƒ€ํŠธ์—์„œ ํƒญํ•œ ์•Œ๋ฆผ์ด ๋ทฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์ „์— ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„์ ฏ

ํ™ˆ ํ™”๋ฉด ์œ„์ ฏ์€ ์•ฑ์˜ SwiftData๋ฅผ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ฑ์ด App Group ์ปจํ…Œ์ด๋„ˆ์— ์ž‘์€ ์Šค๋ƒ…์ƒท(JSON)์„ ์“ฐ๊ณ  ์œ„์ ฏ์€ ๊ทธ๊ฑธ ์ฝ์Šต๋‹ˆ๋‹ค โ€” ์œ„์ ฏ์ด ์•ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฌ๋Š” ๊ฒƒ์€ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๋”ฐ๋ผ๋‹ค๋…€์•ผ ํ•˜๊ณ  ์“ฐ๊ธฐ๋„ ๋ชป ํ•˜๋ฉฐ, ์ˆซ์ž ์„ธ ๊ฐœ๋ฅผ ์ฝ์ž๊ณ  ๊ธฐ์กด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ด์œ ๋„ ์—†์Šต๋‹ˆ๋‹ค.

App Group group.com.coby.just๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์„œ๋ช…์ด ๋“ฑ๋กํ•˜์ง€ ๋ชปํ•˜๋ฉด developer.apple.com > Identifiers > App Groups์—์„œ ๋งŒ๋“ค๊ณ , App ID์˜ App Groups ๊ธฐ๋Šฅ์—์„œ ์—ฐ๊ฒฐํ•ด ์ฃผ์„ธ์š”.

MusicKit App ID ์„ค์ • (ํ•„์ˆ˜, 1ํšŒ)

๊ฒ€์ƒ‰์ด "๊ฐœ๋ฐœ์ž ํ† ํฐ ์š”์ฒญ ์‹คํŒจ"๋กœ ์ฃฝ์œผ๋ฉด ์ด๊ฒƒ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

MusicKit์€ ๊ฐœ๋ฐœ์ž ํ† ํฐ์„ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰ํ•˜์ง€๋งŒ, ๋ช…์‹œ์  App ID์— MusicKit ์„œ๋น„์Šค๊ฐ€ ์ผœ์ ธ ์žˆ์„ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ํŒ€ ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํŒŒ์ผ(TEAM.*)๋กœ ์„œ๋ช…ํ•˜๋ฉด ์‹คํŒจํ•˜๊ณ , ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ํ† ํฐ๋งŒ ๋งํ•˜๊ณ  ์ •์ž‘ ์›์ธ์ธ ํฌํ„ธ ์Šค์œ„์น˜๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. developer.apple.com > Certificates, Identifiers & Profiles > Identifiers
  2. + > App IDs > App > Bundle ID๋Š” Explicit๋กœ com.coby.just
  3. ๊ทธ App ID์˜ App Services์—์„œ MusicKit ์ฒดํฌ ํ›„ ์ €์žฅ
  4. ๋‹ค์‹œ ๋นŒ๋“œ (-allowProvisioningUpdates๊ฐ€ ์ƒˆ ํ”„๋กœํŒŒ์ผ์„ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค)

์„ค์ • ํ™”๋ฉด์˜ ์นดํƒˆ๋กœ๊ทธ ์—ฐ๊ฒฐ > ์—ฐ๊ฒฐ ํ™•์ธ์œผ๋กœ ์‹ค์ œ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ์™€ ๋ฐฐํฌ

์˜† ํ”„๋กœ์ ํŠธ mana์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

bash Scripts/setup.sh        # tuist generate
bundle exec fastlane test    # ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํ…Œ์ŠคํŠธ
bundle exec fastlane beta    # TestFlight ์—…๋กœ๋“œ

Tuist ๋ฒ„์ „์€ .mise.toml์— ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์€ ์ž๋™์ด๊ณ  ํŒ€ id๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์žˆ์œผ๋ฏ€๋กœ tuist generate๋งŒ์œผ๋กœ ๊ธฐ๊ธฐ ๋นŒ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

TestFlight๋Š” App Store Connect API ํ‚ค๋กœ ํด๋ผ์šฐ๋“œ ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค โ€” ์ธ์ฆ์„œ๋ฅผ ์†์œผ๋กœ ๊ฐฑ์‹ ํ•  ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ธ์ฆ ํ”Œ๋ž˜๊ทธ๋Š” xcargs ํ•œ ๊ณณ์—๋งŒ ๋‘ก๋‹ˆ๋‹ค(gym์ด archive์™€ export ์–‘์ชฝ์— ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋ฏ€๋กœ export_xcargs๋กœ ์ค‘๋ณตํ•˜๋ฉด xcodebuild๊ฐ€ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค).

v* ํƒœ๊ทธ๋ฅผ ๋ฐ€๋ฉด .github/workflows/deploy.yml์ด ๋Œ๊ณ , ํ•„์š”ํ•œ ์‹œํฌ๋ฆฟ์€ APPSTORE_KEY_ID / APPSTORE_ISSUER_ID / APPSTORE_PRIVATE_KEY์ž…๋‹ˆ๋‹ค.

๋ฒ„์ „์€ MARKETING_VERSION๊ณผ CURRENT_PROJECT_VERSION์ด ์ •ํ•ฉ๋‹ˆ๋‹ค. Info.plist์— ๊ฐ’์„ ๋ฐ•์•„๋‘๋ฉด fastlane์ด ๋„˜๊ธฐ๋Š” ๋นŒ๋“œ ๋ฒˆํ˜ธ๊ฐ€ ๋ฌด์‹œ๋˜์–ด ์—…๋กœ๋“œ๊ฐ€ ๋งค๋ฒˆ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

App/Resources/PrivacyInfo.xcprivacy๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์•ฑ์€ ์ถ”์ ์„ ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ง‘ ํ•ญ๋ชฉ๋„ ์—†์œผ๋ฉฐ, ํ•„์ˆ˜ ์‚ฌ์œ  API๋Š” UserDefaults(CA92.1) ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

xcodebuild -workspace Just.xcworkspace -scheme Just \
  -destination 'platform=iOS Simulator,name=iPhone 17 Pro' test

์ˆœ์ˆ˜ ๋กœ์ง๋งŒ ๋ฎ์Šต๋‹ˆ๋‹ค โ€” ํŒŒ์‹ฑ, ์Šค์ผ€์ค„๋ง, ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ. ์ง€๊ธˆ๊นŒ์ง€ ์‹ค์ œ๋กœ ๋‚˜์˜จ ๋ฒ„๊ทธ๊ฐ€ ์ „๋ถ€ ๊ทธ ์˜์—ญ์ด์—ˆ๊ณ , ๊ธฐ๊ธฐยท๊ณ„์ •ยท๋ชจ๋ธ ์—†์ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„๋„ ๊ฑฐ๊ธฐ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. 62๊ฐœ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๊ณ , ๊ทธ์ค‘ ์—ฌ๋Ÿฌ ๊ฐœ๋Š” ์‹ค์ œ๋กœ ๊ฒช์€ ํšŒ๊ท€๋ฅผ ๊ทธ๋Œ€๋กœ ๊ณ ์ •ํ•ด ๋‘” ๊ฒƒ์ž…๋‹ˆ๋‹ค: CRLF ๊ฐ€์‚ฌ ๋ถ„ํ• , ๋ฒˆ์—ญ๋ณธ ์˜ค์„ ํƒ, ๋™์Œ์ด์˜์–ด ํ‘œ๊ธฐ ๋’ค๋ฐ”๋€œ.

๋‚จ์€ ๊ฒƒ

  • ๋ฒˆ๋“ค ์‚ฌ์ „ 6.9์ฒœ ๋‹จ์–ด ์ค‘ ๋“ฑ๊ธ‰ยทํ’ˆ์‚ฌ๊ฐ€ ๋ถ™์€ ๊ฒƒ์€ ์†์œผ๋กœ ํ™•์ธํ•œ 149๊ฐœ๋ฟ์ž…๋‹ˆ๋‹ค.
  • ๋ฎค์ง๋น„๋””์˜ค๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ API๋กœ๋Š” ์ „์ฒด ์žฌ์ƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณก ๋‚œ์ด๋„๋Š” ๋ถ„์„ํ•œ ์ค„์—์„œ๋งŒ ์ง‘๊ณ„๋˜๋ฏ€๋กœ, ์ผ๋ถ€๋งŒ ๋ถ„์„ํ•œ ๊ณก์€ ํ‘œ๋ณธ์ด ์ž‘์Šต๋‹ˆ๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—๋Š” Apple Music ๊ณ„์ •์ด ์—†์–ด ๊ณก์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ยท์žฌ์ƒยท์ถ”์ฒœยท์•จ๋ฒ”์€ ์‹ค๊ธฐ๊ธฐ์—์„œ๋งŒ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

MIT. ๋‹ค๋งŒ ๋ฒˆ๋“ค ๋ฐ์ดํ„ฐ์˜ ์ถœ์ฒ˜๋Š” ๊ตฌ๋ถ„ํ•ด์„œ ๋ด ์ฃผ์„ธ์š”.

  • Scripts/curated.json (149๋‹จ์–ด), Modules/JustSensei/Resources/kanji-ko.json (ํ•œ์ž 1,591์ž ์Œํ›ˆ), ๊ทธ๋ฆฌ๊ณ  seed-dictionary.json์˜ ๋Œ€๋ถ€๋ถ„์€ ์ด ์ €์žฅ์†Œ ์†Œ์œ ์ž์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์‚ฌ๋Š” ์ €์žฅ์†Œ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์‹œ LRCLIB์—์„œ ๋ฐ›์•„ ๊ธฐ๊ธฐ์—๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณก ์ •๋ณด์™€ ์•„ํŠธ์›Œํฌ๋Š” Apple Music ์นดํƒˆ๋กœ๊ทธ์—์„œ ์˜ต๋‹ˆ๋‹ค. Apple Media Services ์ด์šฉ์•ฝ๊ด€์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages