Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

potato's iOS Story/๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์นœ๊ตฌ๋“ค

[UIKit] ๋ฒ„ํŠผ์ด ํˆฌ๋ช…์ƒ‰์ด๋ผ์„œ ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š” ๋ฌธ์ œ!

๊ฐ์ž ๐Ÿฅ” 2022. 11. 16. 20:01
๋ฐ˜์‘ํ˜•

ํ•ด๋‹น ๊ธ€๊ณผ ๊ด€๋ จ๋œ Pull Request๋ฅผ ์˜ฌ๋ ค๋‘ก๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด!! ๊ต‰์žฅํžˆ ์ž์„ธํ•˜๊ฒŒ ๋ฆฌ๋ทฐํ•ด๋†ง๊ธฐ ๋•Œ๋ฌธ~~ ๊ฐ€์„œ ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœํ–ˆ๋Š”์ง€, ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํ›„ ๐Ÿ˜‡

https://github.com/DeveloperAcademy-POSTECH/MacC-Team-EarthValley80/pull/117

 

[FEAT] ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” GotoSomewhereButton์˜ UI๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. by deslog · Pull Request #117 · DeveloperAca

์—„์ฒญ TMI PR์ด ๋˜์—ˆ๋Š”๋ฐ์š”,, ๋ฒ„ํŠผํ•˜๋‚˜๊ณ ์น˜๊ฒ ๋‹ค๊ณ  ํ•˜๋ฃจ๋ฅผ ๋ชฝ๋•… ์จ๋จน์–ด์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค,, ๊ทธ๋ฆฌ๊ณ  ์งˆ๋ฌธ์ด,, ์žˆ์–ด์š”.. ์ข€๋งŒ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค ํ˜ธํ˜ธํ˜ธ,,, โค๏ธ โšซ๏ธ Issue Number close #115 โšซ๏ธ

github.com

 

๐ŸŸฃ ๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋ฒ„ํŠผ

๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด์•ผํ•  ๋ฒ„ํŠผ์€, ์•„๋ž˜์ฒ˜๋Ÿผ ๋‘ฅ๊ธ€๊ณ  ์ด์˜๊ณ  ๊ทธ๋ฆผ์ž์ง„ ๋ฒ„ํŠผ์ด๋‹ค.

Design by. ์•ˆ์€์ง€

ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ, ๊ธฐ์กด์— ๋งŒ๋“ค์–ด๋‘” ๋ฒ„ํŠผ์„ ์ˆ˜์ •ํ•ด์•ผํ–ˆ๋‹ค. ๊ธฐ์กด๋ฒ„ํŠผ์€ ๊ทธ๋ƒฅ ๊ฒ€์ •์ƒ‰์ด์—ˆ๊ณ , ๋‚ด๊ฐ€ ์ถ”๊ฐ€๋กœ ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€, '๊ธฐ์‚ฌ ๊ณต์œ ํ•˜๊ธฐ'๋ฒ„ํŠผ์€ ์•ฝ๊ฐ„ ํˆฌ๋ช…์ƒ‰์„ ๋ˆ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๊ฐ–๋Š”๊ฒƒ์ด๋ž‘, ๋ฒ„ํŠผ๋“ค์˜ shadow๋ฅผ ์„ค์ •ํ•˜๋Š”๊ฒƒ!

๋„น,, ๋ฒ„ํŠผ์— shadow๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์— shadow๋ฅผ ๋„ฃ์œผ๋ฉด์„œ ๋งŒ๋‚œ ๋ฌธ์ œ๋Š”, ๋ฐ”๋กœ '๊ธฐ์‚ฌ ๊ณต์œ ํ•˜๊ธฐ'๋ฒ„ํŠผ์ด ํˆฌ๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. (์ƒ๋‹นํžˆ ๋ฌผ๋ฆฌ๊ฐ™๋”๋ผ๊ณ ์š”... ๋ฒ„ํŠผ์ด ํˆฌ๋ช…ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋‹ค๊ณ ๋ผ๊ณ ๋ผ๊ณ ๋ผ,,,)
์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ,,, ์ˆ˜๋‹จ๊ณผ ๋ฐฉ๋ฒ•์„ ๊ฐ€๋ฆฌ์ง€์•Š๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ ๋„์ „ํ•ด๋ดค๋Š”๋ฐ,, ๊ทธ ๊ณผ์ •์„ ์—ฌ๊ธฐ๋‹ค๊ฐ€ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฃ ๋ฒ„ํŠผ์„ ํˆฌ๋ช…์ƒ‰์œผ๋กœ ๋งŒ๋“ค๋ฉด, ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ™Œ๐Ÿป ๊ทธ๋ฆผ์ž๋ฅผ ์ค€ ๋ฐฉ๋ฒ•

self.layer.shadowOpacity = 0.4
self.layer.shadowRadius = 20
self.layer.shadowOffset = CGSize(width: 4, height: 10)
self.layer.shadowColor = UIColor.evyBlack1.cgColor

 

1๏ธโƒฃ ๋ฒ„ํŠผ์˜ ์ƒ‰์ƒ์— alpha๊ฐ’์„ ๋„ฃ์–ด์„œ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ž.

  • ๋ฒ„ํŠผ์ด ํฐ์ƒ‰์ด๋ผ ์ž˜๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋นจ๊ฐ„๋ฐฐ๊ฒฝ์„ ๋„ฃ์—ˆ๋‹ค.
  • ๋‹ค์ฝ์—ˆ์–ด์š” / ๊ธฐ์‚ฌ ๊ณต์œ ํ•˜๊ธฐ ๊ธ€์ž ๋ง๊ณ  ๋ฐฐ๊ฒฝ์ƒ‰์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.
// hex๋ฅผ ๋„ฃ์–ด์„œ UIColor๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” extension์„ ๋งŒ๋“ค์–ด๋‘์–ด์„œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•จ.

UIColor(hex: "#FFFFFF", alpha: 0.14)

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ, ๋ฐฐ๊ฒฝ์€ ํˆฌ๋ช…์ƒ‰์ด ๋˜์—ˆ๋Š”๋ฐ ์ •์ž‘ ์œ„์—์„œ ์ž‘์„ฑํ•ด์ค€ ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. (๋น„๊ต๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ๋‘๊ฐ€์ง€์˜ ์‚ฌ์ง„์„ ๋„ฃ์–ด๋ณธ๋‹ค.)

 

2๏ธโƒฃ ๋ฒ„ํŠผ์˜ ์ž์ฒด์˜ layer opacity๋ฅผ ์กฐ์ ˆํ•ด๋ณด์ž.

๊ทธ๋ฆผ์ž๋Š” ๋ฌด์กฐ๊ฑด ์ƒ๊ฒจ์•ผํ•˜๋‹ˆ๊นŒ, ๋ฒ„ํŠผ์˜ ์ƒ‰์ƒ์€ white๋กœ ํ•ด์ฃผ๊ณ , button์ž์ฒด์˜ opacity๋ฅผ ์กฐ์ ˆํ•ด๋ณด์ž.

self.backgroundColor = .evyWhite
self.layer.opacity = 0.14

์ด๋Ÿด์ˆ˜๊ฐ€…. ๋ฒ„ํŠผ์— stroke ์ถ”๊ฐ€ํ•ด์ค€๊ฒƒ๋„ ์ „๋ถ€๋‹ค ์—ฐํ•ด์กŒ๊ณ , ๊ธ€์”จ๋„,, ,์ด๋ฏธ์ง€๋„,, ์ „๋ถ€ ์—ฐํ•ด์กŒ๋‹ค. ๊ทธ๋‹ˆ๊นŒ ํ•ด๋‹น ์ฝ”๋“œ๋Š” button์„ ์ด๋ฃจ๋Š” layer ์ „๋ถ€์— opacity๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ ‡๊ฒŒ ๋  ์ˆ˜๋ฐ–์— ์—†๋‹ค. …

๊ทธ๋ž˜์„œ ๋‚˜๋Š”, ๋ฒ„ํŠผ์€ white๋กœ ๊ทธ๋Œ€๋กœ ์ฃผ๋˜, ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

3๏ธโƒฃ copy(alpha: )๋ฅผ ์ด์šฉํ•ด๋ณด์ž

  • ๋ฒ„ํŠผ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— alpha๊ฐ’์„ ์ฃผ๋Š”๋ฐ, copy ์•ˆ์—๋‹ค๊ฐ€ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
button.layer.backgroundColor = (UIColor.white.cgColor).copy(alpha: 0.14)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, opacity๋ฅผ ์คฌ์„๋•Œ์ฒ˜๋Ÿผ ๊ธ€์ž์™€ stroke๊นŒ์ง€ ๋ชจ๋‘ ํˆฌ๋ช…ํ•ด์ง€์ง€ ์•Š๊ณ  ๋”ฑ ๋ฐฐ๊ฒฝ์ƒ‰์—๋งŒ alpha๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๊ทผ๋ฐ,, ์•„์ง ๊ทธ๋ฆผ์ž๋Š” ์•ˆ๋“ค์–ด๊ฐ„๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐฐ๊ฒฝ์ƒ‰์€ ์ฃผ๋ฉด ๋ ๊ฑฐ ๊ฐ™๋‹ค.


 

๊ทธ๋Ÿผ ๊ทธ๋ฆผ์ž๋Š” ๋„๋Œ€์ฒด ์™œ ์•ˆ์ƒ๊ธธ๊นŒ? ์ด๋ ‡๊ฒŒ ์ƒ๊ฐ์„ ํ•˜๋˜ ์™€์ค‘, ๋ณด๋ผ์ƒ‰ ์„ธ๋ชจ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์•„๋‹ˆ ๋ณด๋ผ์ƒ‰ ์ „๊ตฌ์ž–์•„!?

๋‘๊ฐœ์˜ ๋ฒ„ํŠผ์—์„œ ๋ชจ๋‘ ๋ฐœ์ƒํ–ˆ๊ณ , ์—๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค

โš ๏ธ The layer is using dynamic shadows which are expensive to render.

๊ทธ๋ฆผ์ž๋Š” ์ฃผ๋ณ€์˜ ์œ„์น˜?๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๋‚ด๋ณด๋‚ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งŽ์ด๋“ ๋‹ค๊ณ  ํ•œ๋‹ค. shadowPath๋กœ ๋ฐ”๊ฟ”๋ณด๋Š”๊ฒŒ ์–ด๋–ป๋ƒ? ๋ผ๊ณ  ๊ฒฝ๊ณ ๋ฅผ ์ค€ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ™Œ๐Ÿป shadowPath๊ฐ€ ๋ญ์ง€?

๋ณดํ†ต ๊ทธ๋ฆผ์ž๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ๋Š” CALayer์— ์žˆ๋Š” 5๊ฐ€์ง€ ์†์„ฑ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  • shadowColor: ๊ทธ๋ฆผ์ž์ƒ‰ ์ง€์ • (๋””ํดํŠธ ๊ฒ€์ •์ƒ‰)
  • shadowOpacity: ๊ทธ๋ฆผ์ž ํˆฌ๋ช…๋„ ์ง€์ •(0 ~ 1)
  • shadowRadius: ๊ทธ๋ฆผ์ž์˜ ๋ธ”๋Ÿฌ ์ •๋„ ์ง€์ • (0์ผ๋•Œ ์„ ๊ฐ™์ด ์ง„ํ•œ ๊ทธ๋ฆผ์ž ๋†’์„ ์ˆ˜๋ก ํผ์ง€๋Š” ํšจ๊ณผ)
  • shadowOffset: ๊ทธ๋ฆผ์ž์˜ ์œ„์น˜(๊ธฐ๋ณธ 0,0 -> ๋ถ€๋ชจ์˜ ์œ„์น˜๋ฅผ ๋”ฐ๋ผ๊ฐ)
  • shadowPath: ๊ทธ๋ฆผ์ž์˜ ๋ชจ์–‘์„ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ (๋””ํดํŠธ nil)

๋‚˜๋„ ํ˜„์žฌ, ์œ„์— ๋„ค๊ฐ€์ง€ ์†์„ฑ์„ ํ™œ์šฉํ•ด์„œ ๊ทธ๋ฆผ์ž๋ฅผ ๋„ฃ์–ด๋‘์—ˆ์ง€๋งŒ, ๋ณด๋ผ์ƒ‰ ์—๋Ÿฌ๊ฐ€ ๋œฌ๊ฒƒ! shadowPath๋Š” ๊ทธ๋ฆผ์ž์˜ ์ปค์Šคํ…€์ด ๊ฐ€๋Šฅํ•ด์„œ, ๊ธฐ๋ณธ์ ์œผ๋กœ shawdow๋ฅผ ๋„ฃ์œผ๋ฉด

๊ทธ๋ฆผ ์ถœ์ฒ˜; https://nsios.tistory.com/157

์ด๋ ‡๊ฒŒ ๋ทฐ ์•„๋ž˜์— ๊ฐˆ๋ฆฌ๋Š” ๊ทธ๋ฆผ์ž๊ฐ€ ๋˜๋Š”๋ฐ, ์ด๊ฒƒ๋ง๊ณ  ์ž…์ฒด์ ์ธ ๊ทธ๋ฆผ์ž, ๋ฐ‘๊ณผ ์œ„์— ์ƒ๊ธฐ๋Š” ๊ทธ๋ฆผ์ž ๋“ฑ ๋‹ค์–‘ํ•œ ๊ทธ๋ฆผ์ž์˜ ํ˜•ํƒœ๋ฅผ shadowPath๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž. ๊ต‰์žฅํžˆ!!! ์ž˜ ์„ค๋ช…๋˜์–ด์žˆ๋‹ค. ๊ตฟ๊ตฟ

 

๐Ÿ™Œ๐Ÿป  shadowPath๋กœ custom ๊ทธ๋ฆผ์ž๋ฅผ ๋งŒ๋“ค์ž.

๊ทธ๋ƒฅ ๋ฒ„ํŠผ ์ž์ฒด์˜ ๊ทธ๋ฆผ์ž๋ฅผ custom ํ•ด์„œ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋‚˜๋Š” ๋ฒ„ํŠผ ์ „์ฒด์˜ ํฌ๊ธฐ๋งŒํผ ๊ทธ๋ฆผ์ž๋ฅผ ์ƒ์„ฑํ–ˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ฒ„ํŠผ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๊ทธ๋ฆผ์ž๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

let buttonWidth = self.calculateButtonWidth(with: buttonTitle) + 10
let renderRect = CGRect(origin: .zero, size: CGSize(width: buttonWidth, height: Size.buttonHeigth))
self.layer.shadowPath = UIBezierPath(ovalIn: renderRect).cgPath

// width ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ , height๋Š” ๊ณ ์ •๊ฐ’์ด ์žˆ์Œ! -> Size.buttonHeigth
private func calculateButtonWidth(with buttonTitle: String) -> CGFloat {
    let label = UILabel()
    label.text = buttonTitle
    label.font = .font(.bold, ofSize: 16)
    label.sizeToFit()
    return label.frame.width + 28 + 44
}

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค. ๋ฒ„ํŠผ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ธฐ๋“ , shadowPath๋Š” ๊ทธ๋ƒฅ ๊ทธ๋ฆผ์ž๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ฝ”๋“œ์˜€๋‹ค.

 

์ด๋ ‡๊ฒŒ , ๋ฒ„ํŠผ ์•„๋ž˜์— ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ๊ฒผ๋‹ค!!

โœ… ์ž ๊น, ๋ฐฐ๊ฒฝ์ด ํˆฌ๋ช…์ด๋“  ์•„๋‹ˆ๋“  ๊ทธ๋ƒฅ ๊ทธ๋ฆผ์ž๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š”๊ฑฐ๋ฉด, ์œ„์—์„œ copy(alpha: ) ๋ฅผ ์ ์šฉํ•ด์ฃผ์ง€ ์•Š๊ณ , ๊ทธ๋ƒฅ ๋ฒ„ํŠผ ๋ฐฐ๊ฒฝ์ž์ฒด๋ฅผ UIColor(hex: “#FFFFF”, alpha: 0.14)๋กœ ์ ์šฉํ•ด๋„ ๋˜์ง€ ์•Š์„๊นŒ? ํ•˜๋Š” ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค. ๋ฐ”๋กœ ์ ์šฉํ•ด๋ณด์ž…

 

์—ญ์‹œ!!!

copy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, CGColor๋ฅผ UIColor๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ณ , ๊ทธ ๊ณผ์ •์—์„œ optional unwrapping์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐ์ฐํ–ˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ UIColor์— alpha๊ฐ’์„ ์กฐ์ ˆํ•ด์ค€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๋ฌด์—‡๋ณด๋‹ค ๋ณด๋ผ์ƒ‰ ์ „๊ตฌ๋ฅผ ์—†์• ์ฃผ๋Š” shadowPath๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‹ˆ, renderํ•˜๋Š”๋ฐ๋„ ๋ถ€๋‹ด์ด ์•ˆ๋˜๊ณ !!

 

์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ ์งœ์ž” ๐ŸŽ‰

 

 

์•„,, ๋ฒ„ํŠผ์ด ์ •๋ง,, ๋‚˜๋ฅผ ์• ๋จน์ธ๋‹ค. ์ง€๋‚œ๋ฒˆ์—๋„ ๋ฒ„ํŠผ์ด๋ž‘ ์ „์Ÿ์น˜๋ฃจ๋Š๋ผ ํž˜๋“ค์—ˆ๋Š”๋ฐ ใ…‹ใ…‹ใ…‹ใ…‹
์˜ค๋Š˜์€ shadow๋ž‘ ์—ด์‹ฌํžˆ ๋†€์•„๋ณธ ํ•˜๋ฃจ์˜€๋‹ค. ,,, ์—ฌ๊ธฐ ๋‚ด๋ถ€์—์„œ๋„ ์•Œ์•„๋ณผ ๊ฐœ๋…์ด ๋ฌด์ˆ˜ํžˆ ๋งŽ์ง€๋งŒ,,, ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํˆฌ๋ช…๋„๋ฅผ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ผ๋Š” ์ ์„ ๋ฐฐ์›Œ๊ฐ„๋‹ค. ํ™”์ดํŒ…!! ๐Ÿป

๋ฐ˜์‘ํ˜•