무쀑단 배포λ₯Ό μœ„ν•œ Mysql Online DDL 기술

2025. 3. 16. 15:10ㆍDatabase

μ„œλΉ„μŠ€κ°€ 컀짐에 따라 λ‹€μ–‘ν•œ κΈ°λŠ₯듀이 μΆ”κ°€λ˜κ³ , 이에 따라 μ„œλΉ„μŠ€ λ’·νŽΈμ—μ„œλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 뿐 μ•„λ‹ˆλΌ DBκΉŒμ§€ μˆ˜λ§Žμ€ 변경점듀이 μƒκ²¨λ‚©λ‹ˆλ‹€.

이 λ•Œλ§ˆλ‹€ μ„œλΉ„μŠ€ 쀑단 곡고λ₯Ό λ‚΄μ„œ μ‚¬μš©μž νŠΈλž˜ν”½μ„ μ›μ²œ μ°¨λ‹¨ν•˜κ³  패치λ₯Ό μ§„ν–‰ν•œλ‹€λ©΄ 개발자 μž…μž₯μ—μ„œλŠ” νŽΈν• μ§€ λͺ°λΌλ„, μ€‘λ‹¨λœ λ§€ μ‹œμ μ΄ μΌμ’…μ˜ μ†μ‹€λ‘œ λ³Ό 수 μžˆμ–΄ μ‰½κ²Œ 생각할 λ¬Έμ œλŠ” μ•„λ‹™λ‹ˆλ‹€.

즉, μ„œλΉ„μŠ€μ˜ κ΄€μ μ—μ„œλŠ” ν”ΌμΉ˜λͺ»ν•  경우λ₯Ό μ œμ™Έν•˜λ©΄ λ¬΄μ€‘λ‹¨μœΌλ‘œ κΈ°λŠ₯이 μΆ”κ°€λ˜λŠ” 편이 더 도움이 λ˜λ¦¬λΌλŠ” 것은 자λͺ…ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 무쀑단 배포λ₯Ό ν•˜κ³  μ‹Άλ‹€κ³  무쑰건 ν•  수 μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. DB λ ˆμ΄μ–΄μ˜ 변경을 μ μš©ν•˜λ‹€λ³΄λ©΄ λ‹Ήμ‹œ μ‹€ν–‰λ˜κ³  있던 νŠΈλžœμž­μ…˜μ€ Blocking이 λ μˆ˜λ„, ν˜Ήμ€ μ•„μ˜ˆ λ¬Έμ œκ°€ λ°œμƒν•΄ μ’…λ£Œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 μœ μ €μ˜ μ„œλΉ„μŠ€ μ΄μš©μ— λ¬Έμ œκ°€ μžˆλŠ” 것이기 λ•Œλ¬Έμ—, 였히렀 μ„œλΉ„μŠ€ 쀑단을 사전에 κ³΅μ§€ν•˜κ³  쀑단 배포λ₯Ό ν•˜λŠ” 것보닀 더 큰 λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ DB 레벨의 변경점듀을 μ‹€μ œ μ μš©ν•  λ•Œμ—λŠ” μ΅œλŒ€ν•œ 라이브 μ„œλΉ„μŠ€μ— 영ν–₯이 κ°€μ§€ μ•ŠλŠ” 방법을 μ•Œμ•„λ‚΄κ³  μ μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

μ €μ˜ κ²½μš°μ—” 졜근 무쀑단 λ°°ν¬μ—μ„œ DDL을 μ‹€ν–‰ν•˜λŠ” 도쀑 λͺ‡λͺ‡μ˜ μœ μ € νŠΈλžœμž­μ…˜μ΄ λ‹€μŒ μ—λŸ¬λ₯Ό λ±‰μœΌλ©° μ‹€νŒ¨ν•˜λŠ” 상황을 κ²ͺμ—ˆμŠ΅λ‹ˆλ‹€.

ERROR 1412 (HY000): Table definition has changed, please retry transaction

이 문제λ₯Ό κ²ͺκ³  λ‚œ λ’€, ν•΄λ‹Ή μ£Όμ œμ— λŒ€ν•΄ 경각심을 κ°–κ²Œ λ˜μ—ˆκ³  이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν•™μŠ΅ν•œ λ‚΄μš©λ“€μ„ 닀뀄보렀고 ν•©λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” MySQL Online DDL의 κ°œλ…, μ•Œκ³ λ¦¬μ¦˜ μœ ν˜•κ³Ό 잠금 방식, 무쀑단 배포λ₯Ό μœ„ν•œ μ „λž΅, 그리고 μ™Έλž˜ ν‚€ μ œμ•½ 쑰건 μΆ”κ°€ μ‹œ λ°œμƒν•  수 μžˆλŠ” λ¬Έμ œμ™€ ꡬ체적인 ν•΄κ²°μ±…κΉŒμ§€ ν¬κ΄„μ μœΌλ‘œ λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.

DDL Algorithm, Lock

Mysql 8λ²„μ „λΆ€ν„°λŠ” DDL μ‹€ν–‰ 도쀑에도 μ„œλΉ„μŠ€μ˜ 쀑단점이 μ΅œμ†Œν™”λ  수 μžˆλ„λ‘ Online DDL이 λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ΄μ „κΉŒμ§€λŠ” 이 μƒν™©μ—μ„œ ptosc와 같은 κΈ°μˆ μ„ μ΄μš©ν•˜μ—¬ 이 λ¬Έμ œλ“€μ„ ν’€μ—ˆμœΌλ‚˜, μ΄μ œλŠ” λŒ€λΆ€λΆ„μ˜ μΌ€μ΄μŠ€μ—μ„œ Mysql이 직접 이 문제λ₯Ό ν•΄κ²°ν•  수 있게 된 κ²ƒμž…λ‹ˆλ‹€. (Mysql Online DDL이 문제λ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν•˜λŠ” μΌ€μ΄μŠ€: https://medium.com/daangn/mysql-online-ddl-faf47439084c)

Mysql Online DDLμ—μ„œλŠ” ALTER TABLE 문이 λ°œμƒν•˜λ©΄, μ΅œμ†Œν•œμ˜ μ„œλΉ„μŠ€ 영ν–₯도λ₯Ό κ°–λŠ” DDL μ•Œκ³ λ¦¬μ¦˜, 락을 μ„ νƒν•˜λŠ” 과정을 κ±°μΉ©λ‹ˆλ‹€.

이 λ•Œ 적용될 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜κ³Ό 락의 μ’…λ₯˜λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • Algorithm
    • INSTANT
      • Mysql 8λ²„μ „μ—μ„œ μ‹ κ·œ λ„μž…λ˜μ—ˆμœΌλ©° λͺ©ν‘œ ν…Œμ΄λΈ” λ‚΄ λ°μ΄ν„°μ—λŠ” μ „ν˜€ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³ , ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ λ©”νƒ€λ°μ΄ν„°λ§Œμ„ λ³€κ²½ν•œ λ’€ μ’…λ£Œλ˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘
      • μ‹€ν–‰ 속도가 맀우 λΉ λ₯΄λ©° μ„œλΉ„μŠ€μ— 거의 영ν–₯을 μ£Όμ§€ μ•ŠμŒ
      • λ‹€λ§Œ 맀우 μ œν•œμ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ (ex. ν…Œμ΄λΈ”μ˜ 끝뢀뢄에 칼럼 μΆ”κ°€, 칼럼 κΈ°λ³Έκ°’ μˆ˜μ •, ν…Œμ΄λΈ” 이름 λ³€κ²½)
    • INPLACE
      • λͺ©ν‘œ ν…Œμ΄λΈ”μ— λŒ€ν•΄, DDL μ‹œμž‘ νŽ˜μ΄μ¦ˆμ™€ μ’…λ£Œ νŽ˜μ΄μ¦ˆμ— 짧게 락이 κ±Έλ¦¬μ§€λ§Œ κ·Έ μ™Έ μ‹€ν–‰ λ„μ€‘μ—λŠ” 읽기 μž‘μ—…κ³Ό μ“°κΈ° μž‘μ—…μ΄ λͺ¨λ‘ κ°€λŠ₯ν•œ 방식
      • 원본 ν…Œμ΄λΈ”μ„ λ³΅μ œν•˜κ³  λ³΅μ œλ³Έμ— μˆ˜μ •μ„ κ°€ν•˜λŠ” COPY λ°©μ‹κ³ΌλŠ” 달리, INPLACE 방식은 원본 ν…Œμ΄λΈ” μžμ²΄μ— Mysql νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ μ ‘κ·Όν•˜μ—¬ μŠ€ν‚€λ§ˆ μˆ˜μ •μ„ 가함
      • DDL λ™μž‘ 쀑 λ°œμƒν•˜λŠ” DML은 μš°μ„  online_alter_log에 μ €μž₯되고, μŠ€ν‚€λ§ˆ μˆ˜μ •μ΄ μ™„λ£Œλœ 직후에 μ‹€μ œ ν…Œμ΄λΈ”μ— 반영
      • 이 λ•Œ online_alter_log μ €μž₯μ†Œκ°€ 가득찰 경우, DDL이 μ‹€νŒ¨ν•˜κΈ° λ•Œλ¬Έμ— 이 κ²½μš°μ—” 128MB둜 κΈ°λ³Έ μ„€μ •λœ innodb_online_alter_log_max_size 값을 ν‚€μ›Œμ•Ό 함. (μ„Έμ…˜ 별 μˆ˜μ • κ°€λŠ₯)
    • COPY
      • μŠ€ν‚€λ§ˆ 변경점이 적용된 ν…Œμ΄λΈ”μ„ μƒˆλ‘œ μƒμ„±ν•˜κ³  κΈ°μ‘΄ 데이터λ₯Ό 일괄 볡제 ν›„ μ΅œμ’…μ μœΌλ‘œ RENAMEν•˜μ—¬ μƒˆλ‘œμš΄ 원본 ν…Œμ΄λΈ”μ΄ λ˜λ„λ‘ ν•˜λŠ” 방식
      • 이 경우 DDL μ‹€ν–‰ 쀑 읽기 μž‘μ—…λ§Œ ν—ˆμš©λ¨
  • Lock
    • NONE
      • μ•„λ¬΄λŸ° 잠금이 λ°œμƒν•˜μ§€ μ•ŠμŒ
    • SHARED
      • 읽기 μž‘μ—…λ§Œ ν—ˆμš©ν•˜λŠ” 잠금 λ°œμƒ
    • EXCLUSIVE
      • 읽기, μ“°κΈ° λͺ¨λ‘ λΆˆκ°€λŠ₯ν•œ 잠금 λ°œμƒ

무쀑단 배포λ₯Ό μœ„ν•΄μ„œλΌλ©΄?

무쀑단 배포λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” SELECT, INSERT, UPDATE 문을 λͺ¨λ‘ 보μž₯ν•˜λŠ” Algorithm = INPLACE, Lock = NONE μ‘°ν•©μœΌλ‘œ DDL을 μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν˜„μž¬ μ μš©ν•΄μ•Όν•˜λŠ” DDL이 μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜κ³Ό 락을 ν•„μš”λ‘œ ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² λ‹€λ©΄ μš°μ„  ALTER TABLE ~ , Algorithm = INSTANT 둜 ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ 싀행해보고, ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ DDL을 μˆ˜ν–‰ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€κ³  μ—λŸ¬κ°€ λ‚œλ‹€λ©΄ κ·Έ ν›„ ALTER TABLE ~ , Algorithm = INPLACE, Lock = NONE 으둜 싀행해보면 λ©λ‹ˆλ‹€. λ§Œμ•½ 이쑰차도 λΆˆκ°€λŠ₯ν•˜λ‹€λ©΄ 쀑단 배포λ₯Ό 고렀해봐야 ν•©λ‹ˆλ‹€.

λ¬Όλ‘  Mysql κ³΅μ‹λ¬Έμ„œμ—μ„œλ„ 각 DDL이 μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€μ™€ Online DDL을 μœ„ν•΄ κ³ λ €ν•΄μ•Όν•  뢀뢄듀을 μ •λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. (https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-operations.html μ°Έμ‘°)

λ¬΄μ€‘λ‹¨μœΌλ‘œ FK μΆ”κ°€ν•˜κΈ° (Feat. ERROR 1412 (HY000): Table definition has changed, please retry transaction)

λ‹€μ‹œ μ„œλ‘ μ—μ„œ μ–ΈκΈ‰ν•œ μ—λŸ¬λ‘œ λŒμ•„μ™€, 이 문제λ₯Ό ν˜„μž¬λŠ” μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€ μ„€λͺ…ν•˜λ©° ν•΄λ‹Ή 글을 λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€.

μ—λŸ¬κ°€ λ°œμƒν•œ λ‹Ήμ‹œμ˜ 상황을 쑰금 더 μ„€λͺ…ν•˜μžλ©΄, 라이브 Mysql DB에 μ‹ κ·œ κΈ°λŠ₯을 μœ„ν•œ 일련의 DDL듀을 μ‹€ν–‰ν•΄μ•Όν•˜λŠ” μƒν™©μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” μ‹ κ·œ ν…Œμ΄λΈ”μ˜ μΆ”κ°€ 및 κΈ°μ‘΄ ν…Œμ΄λΈ”λ‘œμ˜ FK μ°Έμ‘° μΆ”κ°€κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” DDL을 μ‹€ν–‰ν–ˆκ³  μ΄λŠ” μ–Όλ§ˆ μ•ˆκ°€ μ„±κ³΅ν–ˆμ§€λ§Œ, 막상 저희 μ„œλ²„ λ‘œκ·Έμ—λŠ” λͺ‡λͺ‡μ˜ μš”μ²­μ΄ ν•΄λ‹Ή μ—λŸ¬λ₯Ό λ±‰μœΌλ©° μ‹€νŒ¨ν•œ 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

이전에도 ν•΄λ‹Ή μ—λŸ¬λ₯Ό λ³Έ 적이 이미 μžˆμ—ˆμ–΄μ„œ, μ €λŠ” λ‹Ήμ‹œμ—λ„ μ–΄λ–€ DDL이 μ‹€ν–‰λ˜μ—ˆλŠ”μ§€ ν™•μΈν•΄λ³΄μ•˜κ³  κ·Έ λ•Œμ—λ„ 'μ‹ κ·œ ν…Œμ΄λΈ” μΆ”κ°€ > κΈ°μ‘΄ ν…Œμ΄λΈ”μ— λŒ€ν•œ FK μ°Έμ‘° μ œμ•½ 생성'의 νŒ¨ν„΄μ΄ μ‘΄μž¬ν–ˆμ—ˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

FKλ₯Ό μΆ”κ°€ν•˜λŠ” μž‘μ—…μ€ 기본적으둜 Algorithm = COPY, LOCK = SHARED둜 λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— ν•„μ—°μ μœΌλ‘œ λ³„λ„μ˜ ν…Œμ΄λΈ”μ΄ μƒˆλ‘œ μƒκ²¨λ‚˜κ³ , 이둜 인해 νŠΈλžœμž­μ…˜μ—μ„œ 졜초 μ°Έμ‘°ν•˜λ˜ ν…Œμ΄λΈ”μ˜ κ΅¬μ‘°μ™€λŠ” 달라져버리기 λ•Œλ¬Έμ— λ°œμƒν•©λ‹ˆλ‹€.

μ—¬κΈ°κΉŒμ§€ νŒŒμ•…ν•œ λ’€ '그럼 FKκ°€ μΆ”κ°€λ˜λŠ” μƒν™©μ—λŠ” 맀번 쀑단 배포λ₯Ό ν•΄μ•Όν•˜λŠ”κ±΄κ°€'λΌλŠ” 생각을 잠깐 ν–ˆμ§€λ§Œ, μ œκ°€ ν˜„μž¬ κ°œλ°œν•˜κ³  μžˆλŠ” μ„œλΉ„μŠ€μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό μƒκ°ν–ˆμ„ λ•Œ κ·ΈλŸ¬κΈ°μ—” 쉽지 μ•Šλ‹€κ³  νŒλ‹¨ν–ˆκ³  λ‹€λ₯Έ 방법을 κ°•κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ λ°œκ²¬ν•œ 해결책은 DDL μ„Έμ…˜μ— ν•œμ •ν•΄μ„œ foreign_key_checks μ˜΅μ…˜μ„ κΊΌλ²„λ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€. Mysql κ³΅μ‹λ¬Έμ„œμ—λŠ” μ•„λž˜μ²˜λŸΌ μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. (κ²°κ΅­ κ³΅μ‹λ¬Έμ„œμ— 닡이 μžˆλ‹€λ‹ˆ...)

The INPLACE algorithm is supported when foreign_key_checks is disabled. Otherwise, only the COPY algorithm is supported.

λ¬Όλ‘  ν˜ΉμžλŠ” FK 체크 μ œμ•½μ„ 꺼버리면 무슨 μ˜λ―Έκ°€ μžˆλŠλƒκ³  ν•  수 μžˆμ§€λ§Œ foreign_key_checks μ˜΅μ…˜μ€ μ„Έμ…˜ λ ˆλ²¨μ—μ„œ μ œμ–΄κ°€ κ°€λŠ₯ν•΄μ„œ 라이브 μ„œλΉ„μŠ€μ—μ„œλŠ” μ—¬μ „νžˆ FK μ œμ•½μ΄ 잘 λ™μž‘ν•  것이며 'μ‹ κ·œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜κ³  이λ₯Ό κΈ°μ‘΄ ν…Œμ΄λΈ”κ³Ό μ—°κ²°ν•˜λŠ” 상황'μ—μ„œλŠ” μ• μ΄ˆμ— μ„œλ²„ 둜직이 배포되기 μ „κΉŒμ§€λŠ” μ‹ κ·œ ν…Œμ΄λΈ”μ— 데이터가 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 것이기 λ•Œλ¬Έμ— λ¬Έμ œκ°€ μ—†λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. (λ‹€λ§Œ 기쑴에 μ‘΄μž¬ν•˜λ˜ ν…Œμ΄λΈ”λ“€ κ°„μ˜ FK μ œμ•½ μΆ”κ°€ μΌ€μ΄μŠ€μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λŠ”λ°, 이 κ²½μš°λŠ” μ• μ΄ˆμ— ν…Œμ΄λΈ” 섀계 λ ˆλ²¨μ—μ„œ 잘λͺ»λœ μΌ€μ΄μŠ€μ΄κΈ°λ„ ν•˜κ³  거의 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μΌ€μ΄μŠ€μ΄κΈ° λ•Œλ¬Έμ— μ–΄λŠμ •λ„ λ°°μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 땐 μ–΄μ©” 수 없이 쀑단 배포λ₯Ό ν•΄μ•Όλ˜μ§€ μ•Šμ„μ§€...)

μ‹€μ œ μ‹€ν–‰λ˜λŠ” μΏΌλ¦¬λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

SET SESSION foreign_key_checks = 0;
ALTER TABLE ... ADD FOREIGN KEY ..., Algorithm = INPLACE, LOCK = NONE;
SET SESSION foreign_key_checks = 1;

Mysql Online DDL Checker (250324 μΆ”κ°€)

ν•΄λ‹Ή 글을 μž‘μ„±ν•œ λ’€, Mysql Online DDL의 μ•Œκ³ λ¦¬μ¦˜κ³Ό 락을 ν™•μΈν•˜λŠ” 방법이 λ„ˆλ¬΄ λ²ˆκ±°λ‘­λ‹€λŠ” 생각을 λ–¨μΉ  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ κ·Έλƒ₯ 직접 κ°œλ°œν•˜μ—¬ μ˜€ν”ˆμ†ŒμŠ€λ‘œ 배포해보면 μ–΄λ–¨κΉŒ μƒκ°ν•˜κ³  μ•„λž˜ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

https://github.com/One-armed-boy/mysql-ddl-checker

ν•΄λ‹Ή νŒ¨ν‚€μ§€λ₯Ό npm을 톡해 λ‚΄λ €λ°›μ•˜λ‹€λ©΄, 루트 κ²½λ‘œμ— μ„€μ • νŒŒμΌμ„ μ„ΈνŒ…ν•˜κ³  μ•„λž˜μ²˜λŸΌ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. (파일 μ„ΈνŒ…λ²•μ€ λ¦¬λ“œλ―Έλ₯Ό μ°Έμ‘°ν•΄μ£Όμ„Έμš”.)

npx mysql-ddl-checker "ALTER TABLE users ADD COLUMN email VARCHAR(255)"

(κΈ‰ν•˜κ²Œ μž‘μ„±ν•΄λ³Έ ν”„λ‘œμ νŠΈλΌ λΆ€μ‘±ν•œ 뢀뢄도 많고 아직 λͺ¨λ“  DDL을 μ»€λ²„ν•˜μ§€ λͺ»ν•  수 μžˆμ–΄μ„œ νŽΈν•˜κ²Œ 이슈 μ œλ³΄λ‚˜ 기여해주셔도 λ©λ‹ˆλ‹€.)