λ λμ€ μ₯μ νκ³
2022λ 11μ 30μΌ λ¨ νμ€μ μ½λλ‘ μΈνμ¬ μμ€ν μ μ μμ μΌλ‘ μ΄μ©ν μ μλ μνλ‘ λ§λ€μ΄λ²λ¦¬λ μ¬κ°ν κ²°ν¨μ λ§λ€μλ€. κ³Όμ° μ΄λ€ λ¬Έμ κ° λ°μνκ³ κ·Έ μμΈμ 무μμ΄μλμ§ λλμ보며 μ¬λ¬λΆμκ² κ³΅μ νκ³ μ νλ€.
μΌλ°μ μΈ μΉ μλΉμ€μ²λΌ μ€μκ°μΌλ‘ λ§μ μ¬μ©μμ κ·Έλ¦¬κ³ κ° μ¬μ©μμ μν΄ λλμ νΈλν½μ΄ λ°μνλ μμ€ν νκ²½μ μλλλ€λ§ μ ν리μΌμ΄μ μ΄ μ€μΌμΌ μμλμ΄ λΆμ°νλλ κ²μ κ³ λ €νμ¬ μΈμ ν΄λ¬μ€ν°λ§μ μνμ¬ μ€νλ§ μΈμ κ³Ό ν¨κ» μΈμ μ 보λ₯Ό λ λμ€λΌλ μΈλ©λͺ¨λ¦¬ μ μ₯μμ μ°κ³νλλ‘ μ€νλ§ μΈμ λ λμ€λ₯Ό μ¬μ©νκ³ μμλ€. μμ€ν νκ²½ κ·λͺ¨ μ λ§μ μ¬μ©μμ μΈμ λ°μ΄ν°κ° μ μ₯λλ κ²μ μλλ―λ‘ 1GB μ λμ λ©λͺ¨λ¦¬ μ¬μμ κ°μ§λ μμ λ¨μΌ μΈμ€ν΄μ€μ λ λμ€λ₯Ό μ€μΉνμ¬ μ€ν λ€λ-μΌλ‘ λͺ¨λλ‘μ¨ μ¬μ©νλλΌλ ν° λ¬Έμ κ° μμλ€. μΈμ μ μ₯μλ‘μ¨ λ λμ€λ₯Ό λμ νμμΌλ μ€μ λ‘ μ¬μ©μμ μν΄ λ°μνλ μΈμ λ°μ΄ν°κ° λ§μ΄ μ μ₯λμ§ μμ κ²μ΄λ―λ‘ μΌλΆ λ°μ΄ν°λ² μ΄μ€ μ‘°νμ λν΄μ λΆνλ₯Ό μ€μΌ μ μλλ‘ μμ£Ό λ³κ²½λ κ°λ₯μ±μ΄ μλ μΌλΆ λ°μ΄ν°λ₯Ό μ‘°ννλ νλ‘μμ νΈμΆμ λν΄μ μ€νλ§ μΊμλ₯Ό μ μ©νμλ€. κ·Έλ¬λ, μΈμ κ³Ό μΊμ λ°μ΄ν°λ₯Ό ν¬ν¨νμ¬ μκ°λ³΄λ€ μ¬μ©λλ λ©λͺ¨λ¦¬λ λ―ΈλΉνμκΈ°μ μΈμ μ΄λ μΊμμ λν΄ κ·Έλ€μ§ κ³ λ―Όν νμμ±μ μμλ€κ³ μκ°λλ€.
κ·Έλ¬λ, μ΄λ μμ λΆν° νΉμ νκ²½μμ λ λμ€κ° μ€μΉλ μλ²μ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ‘°κΈμ© μ€λ₯Έλ€λ λͺ¨λν°λ§ μ§νλ₯Ό μ λ¬λ°μμΌλ©° λͺ¨λν°λ§ μ§νκ° μ λ¬λλ κ³Όμ μμ μκ°μ΄ λ§μ΄ νλ κΈ°μ κΈ΄κΈνκ² λ λμ€κ° μ€μΉλ μλ²μ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμΌλ©° μ ν리μΌμ΄μ μλ²μ CPU λΆνκ° λκ³ μμ€ν μ μ μμ μΌλ‘ μ΄μ©ν μ μλ μνκ° λμλ€κ³ λ³΄κ³ λ°κ² λμλ€.
λ λμ€μ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμμ§ μμΈ
μ²μμλ λ λμ€κ° μ€μΉλ μλ²μ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμμ§λ€λ μ΄μΌκΈ°λ§ μ λ¬λ°μκΈ°μ (μ΄μ μ λ°μν μ΄λ ₯μ ν λλ‘) 보μ λ° λͺ¨λν°λ§ λͺ©μ μΌλ‘ κ° μλ²μ μ€μΉλ λ°±μ νλ‘κ·Έλ¨μ΄λ λͺ¨λν°λ§ μμ΄μ νΈλ‘ μΈν΄ λ©λͺ¨λ¦¬ λμκ° λ°μνμ κ²μ΄λΌκ³ μμ¬νμΌλ λ λμ€ μλ²μ μ μ ν λͺ λ Ήμ΄λ₯Ό μννλλ° λ²λ² 거릴 μ λλ‘ μλ²μ μ¬μ λ©λͺ¨λ¦¬κ° λ¨μμμ§ μμ μνκ° λμ΄μμμΌλ©° λ λμ€κ° μ€μκ°μΌλ‘ μ¬μ©νλ λ©λͺ¨λ¦¬μ μ¬μ©λμ΄ μλ² λ©λͺ¨λ¦¬λ₯Ό κ±°μ μ μ νκ³ μμμμ νμΈνμλ€.
λ λμ€κ° μλ² λ©λͺ¨λ¦¬λ₯Ό κ±°μ μ¬μ©ν μ΄μ
μλ²μ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μμ²λκ² λμλ μ΄μ λ λ λμ€κ° κ±°μ λλΆλΆμ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νκ³ μμκΈ° λλ¬Έμ΄λ©° μ΄λ κ²κΉμ§ λμ΄λ²λ¦° μ¬μ μ λν΄μλ μ΄μμ μΈ μΈ‘λ©΄μ κ³ λ €νμ§ μκ³ μΈνλΌ λ° μλ² νκ²½ κ΅¬μΆ μ λ λμ€λ₯Ό μ€μΉνκ³ λμ λΉλ°λ²νΈλ₯Ό μ μΈν λλ¨Έμ§ μ΅μ μ λν΄μλ κΈ°λ³Έκ°μΌλ‘ ꡬλνμκΈ° λλ¬Έμ΄λ€. μ¬μ€ μ λ λμ€λΌλ κΈ°μ μ λν΄μ λΌμΈμ΄λ μΉ΄μΉ΄μ€μ κ°μ κ·λͺ¨μ μ‘°μ§μ΄ μλλΌλ©΄ κΈ°μ μ μΈ κ²½νμ΄ λΆμ‘±ν΄μ λ λμ€μμ μ 곡νλ κΈ°λ³Έκ°μ μ¬μ©νλ κ³³μ΄ λ§μμ§λ λͺ¨λ₯΄κ² λ€.
μλ¬΄νΌ λ λμ€λ₯Ό μ€μΉνμμλ κΈ°λ³Έμ μΌλ‘ μ 곡νλ μ€μ νμΌμμ λ λμ€κ° μ¬μ©νλ μ΅λ 맀λͺ¨λ¦¬μ λν μ νμ μλλ‘ λμ΄μμΌλ©° κ²½κ³ λ¬Έκ΅¬λ₯Ό ν΅ν΄ μΈμ μ΄λ μΊμλ₯Ό μν΄μ λ λμ€λ₯Ό μ¬μ©νλ κ²½μ° μ΅λ λ©λͺ¨λ¦¬ μ€μ μ νλ κ²μ΄ μ’μ μ μλ€κ³ μλ΄νκ³ μλ€. λ λμ€κ° μλ² λ©λͺ¨λ¦¬λ₯Ό μ νμμ΄ μ¬μ©νκ² λλ©΄μ μλ² μνκ° μ΄μν΄μ§ κ²μ κ²½ννκ³ λμμΌ ν΄λΉ μ΅μ μ΄ μ μ©λμ΄ μμ§ μμμ νμΈνμκ³ μ΄μ λν΄ κΈ΄κΈ μ μ μ‘°μΉκ° νμν¨μ μ°μ μ λ¬νμλ€.
μ΅λ λ©λͺ¨λ¦¬ μ€μ μ μλ² λ©λͺ¨λ¦¬λ₯Ό λ무 λ§μ΄ μ¬μ©νκ² λμ΄ κ°μ λ©λͺ¨λ¦¬κΉμ§ μ€μνμ¬ μ¬μ©νμ§ μλλ‘ νκΈ° μν μλ°©μ± μΌ λΏ κ·Όλ³Έμ μΈ μμΈμ λν΄ κ²ν λμ§ μμκ³ ν΄κ²° λ°©λ²μ μλλ€. μ°μ λ λμ€ μλ²μ μνλ₯Ό μμ μ μΌλ‘ μ μ§ν μ μλλ‘ μ΅λ λ©λͺ¨λ¦¬λ₯Ό μ€μ λ° μ€λ μ·λ νμΌμ μμ νκ³ λ λμ€λ₯Ό μ¬μμνμλ€.
λ λμ€ μ€λ μ·μ ν΅ν΄ λ°μ΄ν° λΆμ
λ λμ€μ μ΅λ λ©λͺ¨λ¦¬ μ€μ μ‘°μΉλ₯Ό μννκΈ° μ μ λ λμ€μμ κΈ°λ³Έκ°μ μν΄ μ체μ μΌλ‘ μ μ₯ν΄λμλ μ€λ μ·(dump.rdb) νμΌμ λ°±μ ν ν λ‘컬 νκ²½μμ λ컀 컨ν μ΄λλ₯Ό ν΅ν΄ λ λμ€λ₯Ό μ€λ μ· κΈ°μ€μΌλ‘ ꡬλν ν λ λμ€κ° μ μ νκ³ μλ λ©λͺ¨λ¦¬κ° μ΄λ€ λ°μ΄ν°λ‘ μΈν κ²μΈμ§ κ²ν νμλ€. λ λμ€ ν΄λΌμ΄μΈνΈ(redis-cli)λ₯Ό ν΅ν΄ μ μ₯λ λ°μ΄ν°λ€μ ν€λ₯Ό μ‘°ννμμΌλ©° μ΄μμ€μΈ νκ²½μ΄ μλλ―λ‘ KEYS λͺ λ Ήμ΄λ₯Ό μννμ¬ λλ΅μ μΈ ν€λ€μ νμΈνκ³ λ무 λ§μ ν€λ€λ‘ μΈνμ¬ μ λλ‘ νμΈμ ν μ μλ€κ³ νλ¨λμ΄ μ€νλ§ μΈμ κ΄λ ¨ ν€μ μΊμλ‘ μ μ₯νλ ν€λ€μ μ 리νκ³ μ€νμ€λ²νλ‘μ°μ 곡μ λ λκΈ μ€ eval λͺ λ Ήμ΄λ₯Ό νμ©ν μμλ₯Ό μ°Έκ³ νμ¬ μλμ κ°μ΄ μννμλ€.
eval "return #redis.call('keys', 'spring:session:*')" 0
eval "return #redis.call('keys', 'spring:session:sessions:*')" 0
eval "return #redis.call('keys', 'spring:session:sessions:expires*')" 0
eval "return #redis.call('keys', 'spring:session:expirations*')" 0
μΈμ κ΄λ ¨ ν€λ€μ μ½ 60λ§ κ°κ° λ±λ‘λμ΄μμμΌλ©° μΈμ κ΄λ ¨ ν€λ€μ μμ νλ λ¨μμλ μΊμ λ°μ΄ν°λ‘ μΈν΄ μ μ μ€μΈ λ©λͺ¨λ¦¬μ μ¬μ©λμ μ½ 200MBκ° λμλ€. μΌλΆ ν μ€νΈλ₯Ό μν μ¬μ©μμ μΆκ°λ‘ μΈνμ¬ μΊμλλ λ°μ΄ν°μ μμ΄ μ‘°κΈμ λ§μμ‘μΌλ μμ€ν μ μ€μκ°μΌλ‘ μ μνλ μ¬μ©μμ λν μΈμ μ λ§μ§ μκΈ°μ 무λΆλ³νκ² λΆνμν μΈμ ν€λ€μ΄ λ±λ‘λμμμ μΈμ§νκ² λμλ€. λ¨μνκ² λ°λΌλ³΄λ©΄ μΌλ°μ μΌλ‘ μΈμ μ λ§λ£ μκ°μ μ§§κ² νλλ° μμ€ν μꡬμ¬ν νΉμ± μ μΈμ νμμμμ΄ 7μΌλ‘ μ§μ λμ΄ μμκΈ°μ λ±λ‘λ μΈμ κ΄λ ¨ ν€λ€μ μ€λλμ λ λμ€λ₯Ό μ μ νκ² λλ μν©μ΄ λμ΄λ²λ Έλ€.
μ€νλ§ νλ μμν¬μ ꡬνμ μ΄ν΄νμ§ λͺ»ν μ΄μ λ‘ λΆνμν μΈμ μ 보λ₯Ό μ μ₯
보μ μꡬμ¬νμ μν΄ μ¬μ©μμ μμ²μ΄λ λ΄λΆμ μΈ μ€μΌμ€ μμ μ μν΄ νΈμΆλλ λ°μ΄ν°λ² μ΄μ€ μμ²μ λν΄μ μΌλ ¨μ κ³Όμ μ κ°μν μ μλλ‘ API μμ²μ λν λ‘κ·Έλ μ΄λ€ νλ‘μμ λ₯Ό νΈμΆνλμ§ λ‘κ·Έλ‘μ¨ κΈ°λ‘ν΄μΌνκ³ μ΄ κ³Όμ μμ λ°μ΄ν°λ² μ΄μ€μ λν μμ²μ μννλ μΈμ μ μμ΄λκ° μ μ₯λμ΄μΌν νλͺ©μ ν¬ν¨λμ΄μμλ€. μ΄ μꡬμ¬νμ λν μμ μ κ³΅ν΅ λͺ¨λλ‘μ¨ μ½λλ₯Ό μμ±νλλ° λ°μ΄ν°λ² μ΄μ€λ₯Ό νΈμΆνλ ν΄λμ€κ° κ³΅ν΅ λͺ¨λμ μμμΌλ©° ν΄λΉ ν΄λμ€κ° μ€νλ§ μ»¨ν μ΄λλ₯Ό ν΅ν΄ λΉμΌλ‘ κ΄λ¦¬λλ κ²μ΄ μλλΌ λ§€λ² μμ±λμ΄μΌνλ κ΅¬μ‘°λ‘ λμ΄μλ€λ³΄λ μ€νλ§μμ μ§μνλ AOPλ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€ μμ²μ λν΄μ κ°λ‘μ±μ΄ κΈ°λ‘ν μ μμλ€.
μλ¬΄νΌ λ°μ΄ν°λ² μ΄μ€μ λν νλ‘μμ λ₯Ό νΈμΆνλ κ³Όμ μμ μ λΉν μμΉλ₯Ό κ³ λ €νμ¬ μ μ νκ³ νλ‘μμ λͺ κ³Ό μ¬λ¬κ°μ§ μ 보μ ν¨κ» μΈμ μμ΄λλ₯Ό κΈ°λ‘νκΈ° μν΄μ μ€νλ§ νλ μμν¬μμ μ 곡νλ RequestContextHolderλ₯Ό ν΅ν΄ RequestAttributesλ₯Ό κ°μ Έμ¨ ν μΈμ μμ΄λλ₯Ό λ°ννλ ν¨μλ₯Ό νΈμΆνλλ‘ μμ±νμλ€.
μ΄ λ°©μμ΄ μ΄λ€ λ¬Έμ κ° μλμ§ λ°λ‘ μμμ± λΆλ€μ΄λΌλ©΄ μ€νλ§ νλ μμν¬ κ΅¬νμ μ λλ‘ μκ±°λ λ§μ κ²½νμ΄ μλ€κ³ 보μ¬μ§λ€. μλ§ λλΆλΆμ μ ν¨μλ₯Ό νΈμΆνλκ² μ λ λμ€μ μ°κ΄μ΄ μλμ§ μμνκΈ° νλ€κ²μ΄λ€.
μ¬μ€ λ¨μν μ ν¨μλͺ μ λ°λΌλ³Έλ€λ©΄ 보μ μꡬμ¬νμ λν μ²λ¦¬ λ‘μ§ κ³Όμ μμ 무λΆλ³νκ² μΈμ μ λ³΄κ° μ μ₯λ μ μλμ§ κ²ν νλ 건 μ½λ 리뷰λ₯Ό νλλΌλ μ΄λ €μ μ κ²μ΄λΌλ μκ°μ΄ λ λ€. μ€νλ§ νλ μμν¬μμ μ 곡νλ μΈν°νμ΄μ€μ μ νμλ μμΈν λ΄μ©μ νμΈνλ©΄ μλμ κ°μ΄ NULL κ°μ΄ λ μ μλ λ¬Έμμ΄μ΄ λ°νλμ΄μΌνλ€κ³ λμ΄μκΈ° λλ¬Έμ΄λ€.
/**
* Return an id for the current underlying session.
* @return the session id as String (never {@code null})
*/
String getSessionId();
μ΄μ λ°λΌ μ€νλ§ νλ μμν¬μμλ ServletRequestAttributes ꡬν체μμ μΈμ μμ΄λκ° λ°λμ λ°νλμ΄μΌνλ―λ‘ μμ² μ 보μμ μΈμ μ κ°μ Έμ¬ λ μμΌλ©΄ μμ±λλλ‘ μΈμκ° λ°λμ trueμΈ μνλ‘ λμνκ² κ΅¬νν΄λμλ€. μΌλ°μ μΌλ‘ μΈμ λ°©μκ³Ό ν ν° κΈ°λ°μ μΈμ¦μ΄λ API μμ²μΌλ‘ ꡬλΆλλλ° μ€νλ§ μΉ MVC μμλ λκ° λͺ¨λ μλΈλ¦Ώ μμ²μΌ λΏμ΄λ―λ‘ μ€λ λ λ‘컬μ μμ² μ€λ λκ° μ μ₯λμ΄ μΈμ λ κ°μ Έμ¬ μ μλ μνκ° λλ€.
κ·Έλ°λ°, μΈμ μμ΄λλΌ ν¨μ μΈμ λ°©μμ μμ²μ λν΄μλ§ μλ―Έκ° μμΌλ―λ‘ μΈμ μ΄ νμ©λμ§ μλ ν ν° κΈ°λ° μμ²μ λν΄μλ λ΄λΆμ μΌλ‘ μΈμ μ μ μ₯νλ μ½λκ° νΈμΆλμ§ μλλ€. λ°λΌμ, ν ν° κΈ°λ° μμ² μ μΈμ μ΄ μμ±λμ§ μμμΌ ν¨μ λΆκ΅¬νκ³ μΈμ μμ΄λλ₯Ό κ°μ Έμ¬ μ μλ μ ν¨μλ₯Ό νΈμΆνκ² λλ©΄ μλ‘μ΄ μΈμ μ΄ μμ±λκ³ μ€νλ§ μΈμ μ λν νν°κ° κ°μ₯ λ¨Όμ μ²λ¦¬λλ―λ‘ μμ²μ μ²λ¦¬νκ³ μλ΅νλ κ³Όμ μμ μμ±λ μΈμ μ΄λ λ³κ²½λ μΈμ μ 보λ₯Ό κ°±μ νκΈ° μν΄ μ€νλ§ μΈμ λ λμ€ κ΅¬ν λμμ΄ νΈμΆλμ΄ λ λμ€μ λΆνμν μΈμ ν€λ€μ μμ±νκ² λ κ²μ΄λ€.
μΈμ μμ΄λλ₯Ό μ‘°ννλ μ½λ λ‘μ§μ λ³κ²½
μ€νλ§ νλ μμν¬μμ μ 곡νλ ν¨μμ ꡬνμ μ λλ‘ νμΈνμ§ λͺ»ν μνμμ μꡬμ¬νμ μ²λ¦¬ν λμ μ€μ μΈ κ²μ λͺ ννλ€. ServletRequestAttributesλ₯Ό ν΅ν΄ μΈμ μμ΄λλ₯Ό μ½κ² κ°μ Έμ¬ μ μμμΌλ μν©μ λ°λΌ μμνμ§ λͺ»νλ κ²°κ³Όλ₯Ό κ°μ Έμ€κ² λμμΌλ―λ‘ μΈμ μμ΄λλ₯Ό μ‘°ννλ μ½λλ₯Ό HttpServletRequestλ‘λΆν° νμ¬ μ€λ λ λ‘컬 λ΄μ μΈμ μ΄ μλ€λ©΄ κ°μ Έμ€λλ‘ λ³κ²½νλ€. μ΄μ λ μλ‘μ΄ μΈμ μ λ§λλ κ³Όμ μ΄ μμΌλ―λ‘ ν ν° κΈ°λ° APIκ° μμ²λ λ λ λμ€μ 무μν λ§μ μΈμ ν€κ° λ±λ‘λμ§ μλλ€.
μ΄μμ μΈ μΈ‘λ©΄μ λ λμ€ μ΅μ κΆκ³
tcp-backlog 1024
maxmemory 400mb
maxmemory-policy allkeys-lfu
ulimit -n 65535
echo 'net.ipv4.tcp_max_syn_backlog=1024' >> /etc/sysctl.conf
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo never > /sys/kernel/mm/transparent_hugepage/enabled
λ λμ€ κ²°ν¨μΌλ‘ μΈν΄ νμΈλ λ λμ€ μ΅μ μ λν λ¬Έμ λ κ²ν νμ¬ μμ κ°μ΄ μ΄μμ μΈ μΈ‘λ©΄μμμ μ΅μ μ μ 리ν ν λ λμ€ μλ² νκ²½μ μ μ©ν μ€λΉλ₯Ό νκ³ μλ€. νκ°μ§ λͺ ννμ§ μμ λΆλΆμ μ΅λ λ©λͺ¨λ¦¬ μ΅μ μ μ μ©λμ΄μΌν μ λΉν μμΉκ° 무μμ΄λμΈλ° BGSAVEλ₯Ό ν΅ν΄ RDB μ€λ μ·μ μννλ κ²½μ° Fork λ°©μμΌλ‘ νλ‘μΈμ€λ₯Ό 볡μ νμ¬ λ€ν νμΌμ μμ±νκΈ° λλ¬Έμ μ€μ λ‘ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λλ°° μ΄μμ΄ λ μ μλ€λ μ μ κ°μνλ€λ©΄ μ λ° μ΄νμ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν μ μλλ‘ ν΄μΌν κ² κ°λ€. λꡬλ λ λμ€ λΏλ§ μλλΌ CPUλ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν μ μλ λ°±μ νλ‘κ·Έλ¨μ΄ ꡬλμ€μ΄λ―λ‘ μΈν°λ·μ μ 리λ 60% μ λμ λ©λͺ¨λ¦¬ μ€μ μ μ ν©νμ§ μλ€κ³ μκ°λλ€.
νΈλ¬λΈμν νκ³
κ°λ°μλ‘μ¨λ μκ°μ§λ λͺ»νκ² λ¨ νμ€μ μ½λλ‘ μΈνμ¬ μμ€ν μ λ§λΉμν€λ κ²½νμ ν ν° μ΄μμμΌλ©° κ³ κ°μ μ μ₯μμλ μ¬μ©μ€μΈ μμ€ν μ λν μμ μ±κ³Ό μ λ’°μ±μ λ¬Έμ μΌμ μ μλ 건μ΄μλ€. μλ¬΄νΌ μ‘°μ§μμλ μ΄μ λν μ₯μ λ³΄κ³ λ₯Ό κ³ κ° μΈ‘μκ² μ λ¬νκΈ° μνμ¬ κ΄λ ¨ μ 보λ₯Ό μ 리νκ³ μμΌλ©° κ΄λ ¨ μ΄μκ° λ°μνμ§ μλλ‘ μ΄λ€ μ‘°μΉλ₯Ό ν κ²μΈμ§λ₯Ό κ³ λ―Όνκ³ μλ€. μ΄ λ¬Έμ μ λν΄μ λμ보면μ νμΈνκ² λ μλμ κΈλ€μ 곡μ νλ©° λ§μΉκ³ μ νλ€.