๐ŸŒ™

[iOS] WKWebView์—์„œ์˜ ์Šคํฌ๋กคโˆ™Bounceโˆ™SafeArea ๋™์ž‘

yeggrrr๐Ÿผ 2025. 11. 17. 22:32
728x90

 

 

 

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์›น๋ทฐ์—์„œ ์Šคํฌ๋กค์ด ํŠ€๊ฑฐ๋‚˜,
ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ฌ ๋•Œ ๋ ˆ์ด์•„์›ƒ์ด ๊นจ์ง€๊ฑฐ๋‚˜,
iOS Safari์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ž์ฃผ ๋งž๋‹ฅ๋œจ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

ํŠนํžˆ iOS์˜ WKWebView๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ WebView, ๋ธŒ๋ผ์šฐ์ € Safari์™€ ๋™์ž‘ ๋ฐฉ์‹์ด ๋ชจ๋‘ ๋‹ฌ๋ผ์„œ
๊ธฐ๋Šฅ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ๋„ ๋งŽ์€ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” WKWebView์˜ ์Šคํฌ๋กค ๋™์ž‘๊ณผ ๊ด€๋ จํ•ด ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

 

 

WKWebView ์Šคํฌ๋กค์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

 

webView.scrollView

- WKWebView ์ž์ฒด๋Š” ์Šคํฌ๋กค์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
- ๋‚ด๋ถ€์˜ UIScrollView๊ฐ€ ๋ชจ๋“  ์Šคํฌ๋กคโˆ™๋ฐ”์šด์Šคโˆ™์ปจํ…์ธ  inset ์กฐ์ •์„ ๋‹ด๋‹นํ•œ๋‹ค.
- ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ ์Šคํฌ๋กค ์กฐ์ž‘โˆ™์„ค์ •์€ ์ด ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

webView.scrollView.bounces = false
webView.scrollView.showsVerticalScrollIndicator = false

 

 

Safe Area์™€ ์Šคํฌ๋กค ๊ด€๊ณ„: iOS๋งŒ์˜ ํŠน์ˆ˜ ์ฒ˜๋ฆฌ

iOS๋Š” ๋…ธ์น˜/ํ™ˆ ์ธ๋””์ผ€์ดํ„ฐ ๋•Œ๋ฌธ์— Safe Area๊ฐ€ ์กด์žฌํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, WKWebView๊ฐ€ ์ด Safe Area์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉด์„œ ์˜๋„์น˜ ์•Š์€ ์—ฌ๋ฐฑ์ด๋‚˜ ํА ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ์•„๋ž˜ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผํ•œ๋‹ค.

webView.scrollView.contentInsetAdjustmentBehavior = .never

- .automatic: iOS๊ฐ€ Safe Area๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ž๋™ ์กฐ์ ˆ. ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—ฌ๋ฐฑ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
- .scollableAxes: ์Šคํฌ๋กค๋˜๋Š” ๋ฐฉํ–ฅ๋งŒ ์ž๋™ ์กฐ์ ˆ
- .never: Safe Area๋ฅผ ์ „ํ˜€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ
- .always: ๋ฌด์กฐ๊ฑด Safe Area ๋ฐ˜์˜

์‹ค๋ฌด์ ์œผ๋กœ WKWebView์—์„œ๋Š” ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ .never์ด ์ •๋‹ต์ด๋‹ค.
์™œ๋ƒ!
SPA ์›น์•ฑ์ด ์ž์ฒด์ ์œผ๋กœ padding-top / padding-bottom์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—
์ค‘๋ณต inset์ด ์ƒ๊ฒจ ์ƒ๋‹จ/ํ•˜๋‹จ์ด ๋ฐ€๋ฆฐ ๋ ˆ์ด์•„์›ƒ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ž˜์„œ WKWebView์—์„œ๋Š” .never๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žก๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

 

 

Overscroll Bounce ๋น„ํ™œ์„ฑํ™”

iOS ์›น๋ทฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ
- ์Šคํฌ๋กค ์ƒ๋‹จ์„ ๋‹น๊ธฐ๋ฉด ์•„๋ž˜๋กœ ๋Š˜์–ด๋‚œ๋‹ค.
- ์Šคํฌ๋กœ ํ•˜๋‹จ์„ ๋‹น๊ธฐ๋ฉด ์œ„๋กœ ๋Š˜์–ด๋‚˜๋Š” bounce ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ์˜๋„์น˜ ์•Š์€ ํ™”๋ฉด ํ”๋“ค๋ฆผ์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

webView.scrollView.bounces = false
webView.scrollView.alwaysBounceVertical = false

๊ทผ๋ฐ ๋‚œ ๊ฐœ์ธ์ ์œผ๋กœ 'bounces = true' ๋™์ž‘์ด ์ต์ˆ™ํ•œ ๋А๋‚Œ.. ๋งŽ์€ iOS ์•ฑ๋“ค์ด ํ—ˆ์šฉํ•ด๋†“์„ ๊ฒƒ ๊ฐ™๋‹ค.

true, false๋“  ์•„๋ž˜ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•ญ์ƒ ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
์ฆ‰, ์ด ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ bounce ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜์˜๋œ๋‹ค.

webView.scrollView.isScrollEnabled = true

 

 

 

ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ฌ ๋•Œ ์Šคํฌ๋กค ๊นจ์ง ํ˜„์ƒ

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด,
- ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ค๋ฉด ์›น์ด ๊ฐ‘์ž๊ธฐ ์œ„๋กœ ํŠ€์–ด ์˜ค๋ฅธ๋‹ค.
- input ํด๋ฆญ ์‹œ content inset์ด ๊ฐ‘์ž‘์Šค๋Ÿฝ๊ฒŒ ๋ฐ”๋€๋‹ค.
- ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ์ด๋™ํ•œ๋‹ค.

์œ„ ํ˜„์ƒ๋“ค์˜ ์›์ธ์€ ๋ฐ”๋กœ iOS ํ‚ค๋ณด๋“œ๊ฐ€ ๋“ฑ์žฅํ•  ๋•Œ ScrollView์˜ SafeAreaInsets / contentInset์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•œ๋‹ค.
๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ WKWebView์—์„œ๋Š” ์ด ์ž๋™์กฐ์ • ๋•Œ๋ฌธ์— ์›น ๋‚ด๋ถ€ ๋ ˆ์ด์•„์›ƒ๊ณผ ์ถฉ๋Œํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€
์ฒซ ๋ฒˆ์งธ๋กœ๋Š” ์•ž์„œ ์ด์•ผ๊ธฐ ํ•œ '์ž๋™ inset ์กฐ์ •์„ ๋น„ํ™œ์„ฑํ™”'ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

webView.scrollView.contentInsetAdjustmentBehavior = .never

 

๋‘ ๋ฒˆ์งธ๋กœ๋Š” ํ‚ค๋ณด๋“œ ์•Œ๋ฆผ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ๋•Œ ํ•˜๋‹จ inset์„ ์ง์ ‘ ๋งž์ถฐ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

NotificationCenter.default.addObserver(
    forName: UIResponder.keyboardWillChangeFrameNotification,
    object: nil,
    queue: .main
) { [weak self] notification in
    guard
        let info = notification.userInfo,
        let frame = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect
    else { return }

    let height = UIScreen.main.bounds.height - frame.origin.y
    self?.webView.scrollView.contentInset.bottom = max(height, 0)
    self?.webView.scrollView.verticalScrollIndicatorInsets.bottom = max(height, 0)
}

์ด๊ฑด ์‹ค๋ฌด์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋„ฃ์–ด์•ผํ•˜๋Š” ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

์›น์—์„œ ์Šคํฌ๋กค์ด ์•ˆ ๋จนํžˆ๋Š” ๋ฌธ์ œ(ํŠนํžˆ ํŠน์ • ๋„๋ฉ”์ธ)

iOS WKWebView๋Š” ๋ถ€๋ชจ UIScrollView์™€ ์›น ๋‚ด๋ถ€ ์Šคํฌ๋กค์ด ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜„์ƒ๋“ค์ด๋‹ค.
- ํŠน์ • ์˜์—ญ์ด ์Šคํฌ๋กค ๋˜์ง€ ์•Š๋Š”๋‹ค.
- ์Šคํฌ๋กค์ด '๋”ฑ๋”ฑํ•จ'์ด ๋А๊ปด์ง„๋‹ค.
- ์กฐ๊ธˆ ์›€์ง์ด๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋ฉˆ์ถ˜๋‹ค.
- position: fixed ์š”์†Œ๊ฐ€ ๋–จ๋ฆฐ๋‹ค.


์ด๋Ÿฌํ•œ ํ˜„์ƒ๋“ค์˜ ์›์ธ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- CSS์—์„œ touch-action ๋ฏธ์ง€์›
iOS Safari/WebKit์€ ์—ฌ์ „ํžˆ touch-acion: pan-y ๋“ฑ์„ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋”ฐ๋ผ์„œ CSS ์Šคํฌ๋กค์ด ๋ถ€๋“œ๋Ÿฝ์ง€ ์•Š์„์ˆ˜๋„ ์žˆ๋‹ค.

๋˜ ์•„๋ž˜์™€ ๊ฐ™์€ ์›์ธ๋„ ์žˆ๋‹ค.

- overflow: scroll ์˜์—ญ ์ด์Šˆ
overflow: scroll ๋˜๋Š” overflow: auto๋ฅผ ๊ฐ€์ง„ div ๋‚ด๋ถ€๋Š” ๋ถ€๋ชจ UIScrollView์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค.

iOS์—์„œ momentum scrolling ํ™œ์„ฑํ™”๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

.scroll-area {
  -webkit-overflow-scrolling: touch;
}

์ด ์†์„ฑ์ด ์—†์œผ๋ฉด ๋ชจ๋ฐ”์ผ Safari/WKWebView ๋ชจ๋‘ ์ •์ƒ์ ์ธ ์Šคํฌ๋กค ๋ชจ๋ฉ˜ํ…€์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

์›น๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํฌ๋กค์ด ๋™์‹œ์— ์žˆ๋Š” ๊ฒฝ์šฐ(์ด์ค‘์Šคํฌ๋กค)

๋ชจ๋ฐ”์ผ ์›น ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜„์ƒ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค.
- ์›น ๋‚ด๋ถ€ ์Šคํฌ๋กค์ด ์›€์ง์ด๋Š”๋ฐ ๋„ค์ดํ‹ฐ๋ธŒ WKWebView๊นŒ์ง€ ๊ฐ™์ด ์›€์ง์ธ๋‹ค.
- ์Šคํฌ๋กค์ด ๋๋‚ฌ๋Š”๋ฐ bounce๊ฐ€ ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•œ๋‹ค.
- ์ƒ๋‹จ ๊ณ ์ • ํ—ค๋”๊ฐ€ ๋–จ๋ฆฐ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
- WKWebView์˜ bounce ์ œ๊ฑฐ
- ์›น ๋‚ด๋ถ€ ์Šคํฌ๋กค ์˜์—ญ์— -webkit-overflow-scrolling: touch
- ๊ฐ€๋Šฅํ•˜๋ฉด ์•ฑ์—์„œ๋Š” overscroll-behavior ์ปจ๋“œ๋กค์„ ์›น์—์„œ ๊ฐ™์ด ์ ์šฉ

html, body {
  overscroll-behavior: none;
}

 

 

 

Safe Area์™€ ์Šคํฌ๋กค์˜ ๊ฒฐํ•ฉ ๋ฌธ์ œ

์ด๊ฒƒ ๋ฌด์Šจ ๋ฌธ์ œ๋ƒ.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์›น์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด Safe Area padding์„ ์ ์šฉํ–ˆ๋‹ค๋ฉด,

padding-top: env(safe-area-inset-top);

๊ทธ๋ฆฌ๊ณ  WKWebView๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด SafeAreaLayoutGuide์— ๋งž์ถฐ์ ธ์žˆ๋‹ค๋ฉด,

webView.snp.makeConstraints {
    $0.top.equalTo(view.safeAreaLayoutGuide)
}

(์Šค๋ƒ…ํ‚ท ์‚ฌ์šฉ ์ฝ”๋“œ์ž„)

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด, ์ƒ๋‹จ padding์ด 2๋ฒˆ ์ ์šฉ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ—ค๋”๊ฐ€ ๋‚ด๋ ค์•‰์•„ ์ด์ƒํ•œ ์—ฌ๋ฐฑ์ด ์ƒ๊ธด๋‹ค.


์ฆ‰, ์ •๋ฆฌํ•˜์ž๋ฉด ์›น์ด SafeArea๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด? ๋„ค์ดํ‹ฐ๋ธŒ๋Š” SafeAreaLayoutGuide๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
๋งŒ์•ฝ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ Safe Area๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด? ์›น์—์„œ env()๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

 

 


 


WKWebView๋Š” ๋‹จ์ˆœํ•œ ์›น ์ปจํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ iOS ๊ณ ์œ  ๋™์ž‘๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฎ์—ฌ ์žˆ๋‹ค.
ํŠนํžˆ ์Šคํฌ๋กค๊ณผ Safe Area, ํ‚ค๋ณด๋“œ, ๋ฐ”์šฐ์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ง์ ‘์ ์œผ๋กœ ์˜ํ–ฅ์„ ์ฃผ๋Š” ์š”์†Œ๋“ค์€
๋„ค์ดํ‹ฐ๋ธŒ์™€ ์›น ๋ ˆ์ด์–ด๊ฐ€ ์–ด๋ฏ๊ฒŒ ๊ฐœ์ž…ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

๊ฒฐ๊ตญ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์–ด๋–ค ๊ณ„์ธต์ด ๋ฌด์—‡์„ ์ฑ…์ž„์งˆ์ง€ ๋ช…ํ™•ํžˆ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์›น ๊ฐœ๋ฐœ์ž์™€ ์•ฑ ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์— ์ด ์›์น™์ด ํ™•์‹คํžˆ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด

๋Œ€๋ถ€๋ถ„์˜ ์Šคํฌ๋กคโˆ™๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ๋Š” ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ ,
ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์—์„œ๋„ iOS ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ฐ€๊น๊ณ  ์•ˆ์ •์ ์ธ UX๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ธฐ์กด์—๋Š” ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์›น์•ฑ์„ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ๋‹ค๋ฉด,
์ด๋ฒˆ์—๋Š” ์›น์•ฑ ๊ธฐ๋ฐ˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง์ ‘ ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜๋ฉด์„œ
iOS์˜ ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ํ›จ์”ฌ ์›น๊ณผ ๊นŠ๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์„ ์ƒˆ๋กญ๊ฒŒ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค.

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


 

728x90