์ „์ฒด ๊ธ€

๐ŸŒฑiOS ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ•™์ƒ์ด ๋งŒ๋“œ๋Š” ๋ธ”๋กœ๊ทธ
ยท๐ŸŽ iOS & Swift
๊น€์„ฑ์ผ๋‹˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€? ๊ธ€์„ ๋ฉ”์ธ์œผ๋กœ ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. - ์ด ๊ธ€์€ ๊ฐœ์ธ์ ์ธ ํ•™์Šต๊ณผ ๊ณต์œ ๋ฅผ ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๊ธ€์˜ ํ•˜๋‹จ์— ๊ธฐ์žฌํ•ด๋†“์•˜์œผ๋ฉฐ ์›๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ด ๋‚ด์šฉ๋„ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋“ค์–ด๊ฐ€๊ธฐ์ „์— RxSwift๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ•˜์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ฌด์—‡์ธ์ง€, Rx๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ  ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜์ฃ . ๊ธ€์„ ์ฝ๊ณ ๋‚˜๋ฉด ์™œ RxSwift๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ API์ธ์ง€ ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ์€ ๊ฐ€์‹ค๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Rx, Reactive Programming ๋‹ค์Œ ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋งŒ ์•Œ๊ฒŒ ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๊ฐ€๋ณด๋„๋ก ํ•˜์ฃ . Reactive Programming(๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์œผ๋กœ์˜ ์—ฌํ–‰ Reactive programmin..
ยท๐ŸŒฑ SeSAC
FrameBaseLayout FrameBaseLayout + AutoResizing ์š”์ฆ˜์—๋Š” ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ๋Š” ๊ธฐ๊ธฐ๋ฅผ ์ „๋ถ€ ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง view.addSubview(emailTextField) // ํฌ๊ธฐ์™€ ์œ„์น˜ ๋ฐ ์†์„ฑ ์ •์˜ emailTextField.frame = CGRect(x: 50, y: 50, width: UIScreen.main.bounds.width - 100, height: 50) emailTextField.borderStyle = .line emailTextField.backgroundColor = .lightGray AutoLayout AutoLayout (๊ธฐ๊ธฐ๋ณ„ ๋Œ€์‘ ํ•„์š”) + NSLayoutConstraints Class(- base) AutoLayout ์ž‘์—… ์‹œ AutoResi..
ยท๐Ÿง OOP
ํ•ด๋‹น ์ฑ…์„ ๊ฐ€๋ณ๊ฒŒ ์ฝ์œผ๋ฉด์„œ ์ƒ๊ฐํ•ด ๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ–๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. 1, 2์žฅ์„ ์ฝ์œผ๋ฉด์„œ ์†”์งํžˆ ๋“ค์—ˆ๋˜ ์ƒ๊ฐ์€ ์žฌ๋ฏธ์žˆ๋Š”๋ฐ ์•„์ง์€ ์™„์ „ํžˆ ์™€ ๋‹ฟ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ƒ๊ฐ์ด์—ˆ๋‹ค. ์ฑ…์„ ์ฝ์œผ๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ๋“œ๋Š” ์ƒ๊ฐ์€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ์— ์ž˜ ๋…น์—ฌ๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ๋ผ๋Š” ์ƒ๊ฐ์ด์—ˆ๋Š”๋ฐ ์‚ฌ์‹ค ๋„ˆ๋ฌด ์š•์‹ฌ์ธ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค. ์ฑ… ํ•œ ๋ฒˆ ์ฝ๋Š”๋‹ค๊ณ  ์ ์šฉ์ด ์‰ฝ๊ฒŒ ๋œ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋„ˆ๋ฌด ์‰ฌ์šธํ…Œ๋‹ˆ๊นŒ ๋ง์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ๊ต์–‘ ์ฑ… ํ•œ ๊ถŒ ์ฝ๋Š”๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ๊ฐ€๋ณ๊ฒŒ ์ ‘๊ทผํ–ˆ๋‹ค. 1, 2์žฅ์—์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋Š๊ผˆ๋˜ ์ ์€ ์šฉ์–ด์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์–ด๋Š ์ •๋„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ, ๋ฉ”์‹œ์ง€, ์ƒํƒœ, ํ–‰๋™ ๋“ฑ ์ •๋ง ๋‹ค์–‘ํ•œ ์šฉ์–ด๊ฐ€ ๋“ฑ์žฅํ•˜๋Š”๋ฐ ์ด๊ฒƒ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ์ƒํ™ฉ์— ์ž˜ ๋น—๋Œ€์–ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด๋ณด์˜€๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์€ ํด๋ž˜์Šค..
ยท๐ŸŒฑ SeSAC
๊ธฐ์ˆ  ์ปจํผ๋Ÿฐ์Šค ๊ธฐ์ˆ  ์ปจํผ๋Ÿฐ์Šค, ๋ธ”๋กœ๊ทธ ์ž์ฃผ ๋ณด๊ธฐ! wwdc if kakao slash tech blog ๋ชจ๋“ˆํ™”์™€ ์ ‘๊ทผ ์ œ์–ด ๋ชจ๋“ˆํ™” ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. UI ์ปดํฌ๋„ŒํŠธ, ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ๋“ฑ๋“ฑ์ด ์žˆ์„ํ…๋ฐ ์ด๋ฅผ ๋งค ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ง์ ‘ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„์Šทํ•œ ์„ฑ๊ฒฉ์˜ ์ฝ”๋“œ๋ผ๋ฆฌ ๋ชจ์•„์„œ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ ๋„ ์ดํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ ๋ชจ๋“ˆํ™”๋ฅผ ํ•ด๋ณด๋ฉด ์ ‘๊ทผ ์ œ์–ด์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์กฐ๊ธˆ ๋ช…ํ™•ํ•ด์ง (- ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ EasyKit์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ๋Š๊ผˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค.) ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋Š” ์กฐ๊ธˆ ๊ฐ€๋ฒผ์›Œ์ง ๊ฐ๊ฐ ์—ญํ• ์— ๋Œ€ํ•œ ๋ถ„๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์ง ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ, UI ๋ชจ์•„๋†“๊ธฐ ์ ‘๊ทผ ์ œ์–ด ์ด๋ก ์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ..
ยท๐ŸŽ iOS & Swift
UIButton.Configuration iOS 15.0๋ถ€ํ„ฐ ์ด์šฉ ๊ฐ€๋Šฅ Struct ํƒ€์ž… ๊ธฐ๋ณธ ์ œ๊ณต Configuration ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฒ„ํŠผ ์Šคํƒ€์ผ์ด ํƒ€์ž… ๋ฉ”์„œ๋“œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค. Configuration ํ™•์žฅ ๋งค๋ฒˆ configuration์„ ๋ฒ„ํŠผ๋งˆ๋‹ค ๋งŒ๋“ค์–ด ์ฃผ๋Š”๊ฒŒ ์ฝ”๋“œ ๋ผ์ธ๋„ ๊ธธ์–ด์ง€๊ณ  ๊ท€์ฐฎ์•˜๋Š”๋ฐ ๋ฉ˜ํ† ๋‹˜๊ป˜์„œ ๋ง์”€ํ•ด์ฃผ์‹  extension์œผ๋กœ ํ™•์žฅํ•œ๋‹ค๋Š” ๊ด€์ ์ด ์ข‹์•˜๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด์— ๋ฒ„ํŠผ ์Šคํƒ€์ผ์ด ๋ช‡ ๊ฐ€์ง€ ์—†๊ฑฐ๋‚˜ ์ผ์ •ํ•˜๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์–ด์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์•„๋ณด์ธ๋‹ค. (๊ธฐ๋ณธ ์ œ๊ณต ์Šคํƒ€์ผ๊ณผ ๋™์ผํ•œ ์•„์ด๋””์–ด ์ธ ๊ฒƒ ๊ฐ™๋‹ค.) ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ ์˜ˆ์‹œ ์•„์ง ์‹ค์ œ๋กœ ์ ์šฉํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๋‚ด์— 3๊ฐ€์ง€ ์Šคํƒ€์ผ์˜ ๋ฒ„ํŠผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ์—ด๊ฑฐํ˜•(Enum)๊ณผ Configuration ํ™•์žฅ์„ ..
ยท๐ŸŒฑ SeSAC
๋Œ์•„๋ณด๋ฉฐ ์ƒˆ์‹น ๊ณผ์ •์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฒŒ์จ 30๋ฒˆ์งธ TIL์ด๋‹ค. (1, 2์ผ์ฐจ TIL์€ ์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ ๋นผ๋จน๊ฒŒ ๋˜์—ˆ์ง€๋งŒ) ์ฐธ ์‹œ๊ฐ„ ๋น ๋ฅด๋‹ค... ์ฒ˜์Œ์—๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์“ฐ๊ณ  ์‹ถ์–ด์„œ ๋ฏธ๋ฃจ๋‹ค๊ฐ€ ์ •๋ง ๋งŽ์ด ๋ฐ€๋ ธ์—ˆ๋Š”๋ฐ ์ด๋Ÿฌ๋‹ค๊ฐ€ ํ•˜๋‚˜๋„ ๋ชป ์“ธ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•„๊ธฐํ•ด ๋’€๋˜ ๊ฑฐ ์งค๋ง‰ํ•˜๊ฒŒ ์˜ฌ๋ฆฌ๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ชจ์•„๋†“์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ์ข‹์€ ์ž์‚ฐ์ด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. (30์ผ์ฐจ๊นŒ์ง€ ๊ทธ๋ž˜๋„ ๋ช‡ ์ž ์ ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ ๊ฒƒ์€ ์นญ์ฐฌํ•œ๋‹ค.) ์—ฌ๊ธฐ์„œ ์ž์ฒด ํ”ผ๋“œ๋ฐฑ์„ ํ•˜์ž๋ฉด, TIL์€ ๊ทธ๋‚  ๊ทธ๋‚  ์“ฐ๋Š”๊ฒŒ ๋ฒ ์ŠคํŠธ์ธ ๊ฒƒ ๊ฐ™๊ณ  ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ๋˜ ๋‚˜์˜ ์ƒ๊ฐ์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณด์™„ํ•ด๋‚˜๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์กฐ๊ฐ๋„ ๋งŽ์ด ๋ชจ์•„๋†“์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์‚ฌ์‹ค 30์ผ์ฐจ๊นŒ์ง€์˜ TIL์€ ๋‚ด์šฉ์„..
ยท๐ŸŒฑ SeSAC
MapView ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ๋ฒ•์„ ์ฒดํฌํ•ด๋ณด์ž import MapKit // ํ™”๋ฉด์— MKMapView ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์•„์›ƒ๋ ›์„ ์—ฐ๊ฒฐํ•˜์ž @IBOutlet weak var mapView: MKMapView! let center = CLLocationCoordinate2D(latitude: 37.000000, longitude: 126.000000) // Region ์„ค์ • // ์ง€๋„ ์ค‘์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณด์—ฌ์งˆ ๋ฒ”์œ„ ์„ค์ • let region = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000) mapView.setRegion(region, animated: true) // Annotation ์„ค์ • (..
ยท๐ŸŒฑ SeSAC
ReusableView Protocol ๊ธฐ์กด์— cell ๋งˆ๋‹ค id๋ฅผ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋˜ ๋ฐฉ์‹์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœํ† ์ฝœ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ protocol ReusableViewProtocol { static var reuseIdentifier: String { get } } extension UICollectionViewCell: ReusableViewProtocol { static var reuseIdentifier: String { return String(describing: self) } } extension UITableViewCell: ReusableViewProtocol { static var reuseIdentifier: String { return String(describing: ..