728x90
๋ฐ˜์‘ํ˜•

 

์ด์ „์— ๋™์•„๋ฆฌ์—์„œ ์ง„ํ–‰ํ•˜๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๋ฆฌํŽ™ํ† ๋งํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ–๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ „์—๋Š” 3์ฃผ๋ผ๋Š” ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ๋ชจ๋‘ ๊ตฌํ˜„์„ ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ํƒ„ํƒ„ํ•˜์ง€ ์•Š์•˜๊ณ , ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‚œ์ƒ ์ฒ˜์Œ ์จ๋ณด๋Š” SwiftUi์™€ ํ˜ผ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋œฏ์–ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

SwiftUI๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋˜ ์ด์œ ๋Š”, screenTime API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹น์‹œ์—๋Š” Github์—์„œ ๋ˆ„๊ตฐ๊ฐ€ ์‚ฌ์šฉํ•ด๋‘” screenTime API๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ณต๋ถ€ํ•  ์‹œ๊ฐ„์กฐ์ฐจ ์—†๋‹ค๊ณ  ๋Š๊ปด์กŒ๊ธฐ์— ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ์ฑ„ ํ”„๋กœ์ ํŠธ์— ๋ฐ˜์˜ํ•ด๋ฒ„๋ ธ๋‹ค.

 

์ด๋ฒˆ์—๋Š” ๋‹ค์‹œ ๋” ํƒ„ํƒ„ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋งŒํผ, ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜๊ณ , screenTime API ๋งˆ์Šคํ„ฐ๊ฐ€ ๋ผ์•ผ ๊ฒ ๋‹ค.

 

์˜ค๋Š˜์€ screenTime API๋ฅผ ํ”„๋กœ์ ํŠธ์— ๋ฐ˜์˜ํ•˜๊ธฐ์— ์•ž์„œ, ํ•ด๋‹น API์—๋Š” ๋ฌด์—‡์ด ์žˆ๋Š”์ง€, ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋“ฑ์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

https://developer.apple.com/videos/play/wwdc2021/10123/

 

Meet the Screen Time API - WWDC21 - Videos - Apple Developer

Explore the Screen Time API and learn how you can build apps that support customized parental controls — all while putting privacy first...

developer.apple.com

 

์œ„ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

 


 

ScreenTime API๋ž€?

์ž๊พธ ๊ณต์‹๋ฌธ์„œ์—์„œ ๊ฐ•์กฐํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค. 

๋ฐ”๋กœ ๋งž์ถคํ˜• ๋ถ€๋ชจ ํ†ต์ œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ, ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ๋‹ค.

์ด API๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

 

1. DeviceActivity

2. FamilyControls

3. ManagedSettings

 

์ฐจ๊ทผ์ฐจ๊ทผ ํ•˜๋‚˜์”ฉ ๊ณต๋ถ€ํ•ด๋ณด์ž !

 

 

1. DeviceActivity๋ž€?

https://developer.apple.com/documentation/DeviceActivity

 

DeviceActivity | Apple Developer Documentation

Monitor device activity with your app extension while maintaining user privacy.

developer.apple.com

 

์ด Framework๋Š” ๋ง ๊ทธ๋Œ€๋กœ, ๊ธฐ๊ธฐ ํ™œ๋™์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

1. ์‚ฌ์šฉ์ž์˜ ์•ฑ ๋ฐ ์›น์‚ฌ์ดํŠธ ํ™œ๋™์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ ,

2. ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๋ฉด,

์‚ฌ์šฉ์ž๊ฐ€ ์ž ์ž๋ฆฌ์— ๋“ค์–ด์•ผํ•˜๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๊ธฐ ํ™œ๋™์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋„๋ก ์ทจ์นจ ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋” ํ™•์žฅํ•ด๋ณด๋ฉด, ํ™œ๋™ ์ผ์ •์ด ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ๋๋‚˜๊ธฐ ์ „์—, ํ˜น์€ ํ™œ๋™์ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ํ•œ๊ณ„์— ๋„๋‹ฌํ•  ๋•Œ ๊ฒฝ๊ณ  ํ˜น์€ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ๊ณ„์† ์‚ฌ์šฉ ์‹œ๊ฐ„๊ณผ ํ™œ๋™์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํ•œ๊ณ„์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ, ํŠน์ • ์•ฑ์„ ํŠน์ • ์‹œ๊ฐ„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น framework์˜ ๊ธฐ๋Šฅ์ด ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค !

 

 

2. FamilyControls๋ž€?

์ด framework๋Š” ๋ง ๊ทธ๋Œ€๋กœ, ์ฒ˜์Œ์— ๊ณ„์† ๊ฐ•์กฐํ–ˆ๋˜ ๋ถ€๋ชจ์˜ ํ†ต์ œ ๊ถŒํ•œ์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

์ด ๋ถ€๋ถ„์€ ๋‚ด๊ฐ€ ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์ž๊พธ ๊ฐ•์กฐํ•˜๋‹ˆ ์งง๊ฒŒ๋‚˜๋งˆ ์ •๋ฆฌ๋ฅผ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๊ทผ๋ฐ ์ง€๋‚œ ๊ฐœ๋ฐœ์—์„œ๋Š” ์ด framework๋„ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, screenTime์„ ์„ค์ •ํ•˜๋ ค๋ฉด 1์ฐจ์ ์œผ๋กœ ํ•„์š”ํ•œ framework์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

์ถ”ํ›„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด ์•Œ๊ฒŒ ๋˜๊ฒ ์ง€?

 

Family Sharing group

์ด framework๋Š” ๋ถ€๋ชจ๊ฐ€ ์ž๋…€์˜ ์•ฑ ์‚ฌ์šฉ์„ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•จ์ด ๋ชฉ์ ์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š”, ๋ถ€๋ชจ์˜ ํ†ต์ œ ๊ถŒํ•œ ํ•  ์ˆ˜ ์žˆ๋Š” ์Šน์ธ์ด ํ•„์š”ํ•œ๋ฐ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ž๋…€๊ณผ ๊ฐ™์€ ๊ฐ€์กฑ ๊ณต์œ  ๊ทธ๋ฃน์— ์†ํ•ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ์ž๋…€์™€ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ๊ฐ€์กฑ ๊ณต์œ  ๊ทธ๋ฃน(Family Sharing group)์— ์†ํ•ด ์žˆ์–ด์•ผ ๋ถ€๋ชจ๊ฐ€ ์ž๋…€์˜ ์•ฑ ์‚ฌ์šฉ์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์Šน์ธ ๊ณผ์ •์€, ์‹œ์Šคํ…œ์—์„œ ์ž๋…€์˜ ๊ธฐ๊ธฐ์— ์ธ์ฆ sheet๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ๋ถ€๋ชจ๋‚˜ ๋ณดํ˜ธ์ž๊ฐ€ ์ด์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์Šน์ธ ๋˜๋Š” ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์•ฑ์˜ AuthorizationCenter๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

AuthorizationCenter

์ด framework์—์„œ AuthorizationCenter๋Š” ๊ฝค๋‚˜ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

๋ถ€๋ชจ๊ฐ€ ๊ถŒํ•œ์„ ์Šน์ธ ๋˜๋Š” ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉ์ž(์ฆ‰, ์ž๋…€)์˜ ์Šน์ธ ๋˜ํ•œ ํ•„์š”ํ•œ๋ฐ ์ด ๊ถŒํ•œ ๊ฒฐ๊ณผ ๋˜ํ•œ AuthorizationCenter๋กœ ์ „์†กํ•œ๋‹ค.

 

์ฆ‰, ์ •๋ฆฌํ•˜๋ฉด ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ž๋ฅผ ๋ถ€๋ชจ์™€ ์ž๋…€๋กœ ๋‚˜๋ˆ ๋ณด์ž.

์ด ๋•Œ, ๊ฐ™์€ ๊ฐ€์กฑ ๊ณต์œ  ๊ทธ๋ฃน์— ์†ํ•œ ๋ถ€๋ชจ์™€ ์ž๋…€๋Š” ๊ฐ๊ฐ ๊ถŒํ•œ์— ๋Œ€ํ•œ ์Šน์ธ์ด ํ•„์š”ํ•˜๋‹ค.

๋ถ€๋ชจ๊ณผ ์ž๋…€๊ฐ€ ๊ถŒํ•œ์„ ์Šน์ธ ๋˜๋Š” ๊ฑฐ๋ถ€ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์‘๋‹ต ๊ฒฐ๊ณผ๊ฐ€ AuthorizationCenter๋กœ ๋ชจ๋‘ ์ „์†ก๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์ฃผ์š” ๊ธฐ๋Šฅ

์ด framework์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋ถ€๋ชจ๋‚˜ ๋ณดํ˜ธ์ž๋กœ๋ถ€ํ„ฐ ์ธ์ฆ๋œ ์ž๋…€(์‚ฌ์šฉ์ž)๊ฐ€ ๋ถ€๋ชจ ํ†ต์ œ ์„ค์ •์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•œ๋‹ค.

2. ๊ธฐ๊ธฐ์— ๋ถ€๋ชจ๋‚˜ ๋ณดํ˜ธ์ž๊ฐ€ ์ธ์ฆํ•œ ํ†ต์ œ ์•ฑ์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์„ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๋Š” iCloud์—์„œ ๋กœ๊ทธ์•„์›ƒ ํ•  ์ˆ˜ ์—†๋‹ค.

 

์ฆ‰, ์ž๋…€๋Š” ๋ถ€๋ชจ ํ†ต์ œ ์•„๋ž˜ ์žˆ๋Š” ์•ฑ์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํ†ต์ œ๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋…€๋“ค์€ ์ •๋ง ์‹ซ์–ดํ• ๋งŒํ•œ framework์ด์ง€๋งŒ, ๋ถ€๋ชจ๋‹˜๋“ค์€ ์ƒ๋‹นํžˆ ์ข‹์•„ํ•˜์‹ค.. ๊ทธ๋Ÿฐ framework์ด๋‹ค.

 

 

3. Manage Settings

Managed Settings๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ธฐ๊ธฐ์—์„œ ํŠน์ • ์„ค์ • ๋ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ผ์ด๋ฒ„์‹œ ๋ณดํ˜ธ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.

์‚ฌ์šฉ์ž์˜ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์œผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋ฏธ๋””์–ด ์ฝ˜ํ…์ธ  ํ‘œ์‹œ ์ œํ•œ

2. ์•ฑ ๊ตฌ๋งค ์ œํ•œ

3. ์•”ํ˜ธ ์„ค์ •์„ ์ž ๊ทธ๊ณ , ๋‹ค๋ฅธ ๊ธฐ๊ธฐ ๋™์ž‘์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ, ManagedSettingsUI, DeviceActivity, ๊ทธ๋ฆฌ๊ณ  FamilyControls ์ด ์„ธ ๊ฐœ์™€ ํ•จ๊ป˜ ์ž‘๋™๋˜์–ด ๊ธฐ๊ธฐ ์‚ฌ์šฉ์„ ์ œํ•œ, ์Šน์ธ, ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
 
์ด ๊ถŒํ•œ ์Šน์ธ ๋ฐฉ๋ฒ•์€ FamilyControls,
๊ธฐ๊ธฐ ์‚ฌ์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ผ์ • ๊ด€๋ฆฌ๋Š”DeviceActivity๋ฅผ ์ž์„ธํžˆ ๋ด์•ผํ•œ๋‹ค !

 


 

์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ฐ˜ ์—†์ด ๋Œ€์ถฉ ๋ณด๊ณ  ๊ฐœ๋ฐœํ•ด์„œ ์ด๋ฆ„๋„ ํ—ท๊ฐˆ๋ฆฌ๊ณ , ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๊ด€ ๊ด€๊ณ„๋„ ๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๋‹ˆ ์กฐ๊ธˆ์€ ์ดํ•ด๊ฐ€ ๋๋‹ค.

 

์ด์ œ ์ง์ ‘ framework๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค !!

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

 

 

์ฒ˜์Œ ๋ฐฐํฌ๋ฅผ ์ค€๋น„ํ•ด๋ณด๋Š” ๋‚˜๋Š”,,,

๋””๋ฒ„๊น… ๋ชจ๋“œ์™€ ๋ฆด๋ฆฌ์ฆˆ ๋ชจ๋“œ๊ฐ€ ๋”ฐ๋กœ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ž๋‹ค.

 

์ˆœํƒ„ํ•˜๊ฒŒ test flight๊นŒ์ง€ ๋“ฑ๋กํ•˜๊ณ , ์„ค๋ ˆ๋Š” ๋งˆ์Œ์œผ๋กœ ์•ฑ์„ ์„ค์น˜ํ•ด ์‹คํ–‰ํ•ด๋ดค๋Š”๋ฐ

์›ฌ๊ฑธ,,,

 

๊ฐ€์žฅ ์ค‘์š”ํ•œ ํƒญ๋ฐ”๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

 

์•„ใ…... ์–ด์ฉŒ์ง€..

 

๋ฐฐํฌ ๊ฒฝํ—˜์ด ์žˆ๋Š” ์นœ๊ตฌ์—๊ฒŒ ๋ฌผ์–ด๋ดค๋‹ค.

๐Ÿคฏ : ํ…Œํ”Œ์— ๋“ฑ๋กํ–ˆ๋Š”๋ฐ ๊ฐœ๋ฐœํ• ๋•Œ๋ž‘ ๋‹ค๋ฅด๋ฉด ์–ด๋–กํ•ด?

๐Ÿ˜ : ๋ญ˜ ์–ด๋–กํ•ด ๋‹ค์‹œ ์ˆ˜์ •ํ•ด์•ผ์ง€

๐Ÿ™ : (์•„์˜ค) ์–ด๋–ป๊ฒŒ ๊ทธ๊ฑธ ์žฌํ˜„ํ•˜๋Š”๋ฐ,,

๐Ÿค” : release ๋ชจ๋“œ๋กœ ๋นŒ๋“œํ•˜๋Š”๊ฑฐ ์žˆ์„๊ฑธ? flutter์—์„œ๋Š” flutter run —releaseํ•˜๋ฉด ๋˜๋˜๋ฐ ๋„ˆ๋„ค๋„ ์žˆ์„๊ฑธ?

 

์ด๋ ‡๊ฒŒ ํ• ๊ฒŒ ๋œ release ๋ชจ๋“œ ๋นŒ๋“œ..

 

์–ด๋–ป๊ฒŒ ํ•˜๋ƒ๋ฉด, xcode์˜ ์ƒ๋‹จ์— ์žˆ๋Š” Product ์—์„œ Scheme > Edit Scheme์„ ํ•˜๊ณ , 

 

 

 

Build Configuration์„ Debug -> Release๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค !

 

๋‚ด ๊ฒฝ์šฐ, ์ด๋ ‡๊ฒŒ ํ•ด๋„ ์—ฌ์ „ํžˆ ํƒญ๋ฐ”๊ฐ€ ์•ˆ๋ณด์˜€์ง€๋งŒ,,

์ด๊ฑด ๋ฌด์Šจ ๋ฌธ์ œ์ธ์ง€ ๋” ์ฐพ์•„๋ด์•ผ ํ•  ๋“ฏ ํ•˜๋‹ค.

 

์–ด์จŒ๋“  ๋ฐฐํฌ๋œ ๋ฒ„์ „์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ Build Configuration์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค !

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ์— ์ž‘์—… ํ•  ๋•Œ, ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•ด git branch ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ์ €์žฅ์†Œ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ workflow ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ”๋กœ git branch ์ „๋žต์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ฐœ๋ฐœ์„ ํ•  ๋•Œ, ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ์ˆ˜์ •์‚ฌํ•ญ์ด ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ๋™์‹œ์— ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋˜ํ•œ, ๊ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ํŠน์ • ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ž‘์—… ๋‹จ์œ„์˜ Rollback์ด ๊ฐ€๋Šฅํ•˜๊ธฐ์— ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์˜ ์œ ์—ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ „๋žต์€ ์›ํ•˜๋Š” ๋ฒ„์ „ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ์™€ ๋ฐฐํฌ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
Branch ์ „๋žต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
1๏ธโƒฃ Git flow
2๏ธโƒฃ Github Flow
3๏ธโƒฃ Gitlab flow

 

 

1๏ธโƒฃ Git flow

๋ธŒ๋žœ์น˜ ์ข…๋ฅ˜

  1. master: ์ œํ’ˆ ์ถœ์‹œ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜
  2. develop: ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ์œ„ํ•ด ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
  3. feature: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
  4. release: ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ์ค€๋น„ํ•˜๋Š” ๋ธŒ๋žœ์น˜
  5. hotfix: ์ถœ์‹œ๋œ ์ œํ’ˆ์˜ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์น˜๊ธฐ ์œ„ํ•œ ๋ธŒ๋žœ์น˜

 

Git Flow๋ฅผ ํ™œ์šฉํ•œ ๊ฐœ๋ฐœ ์ง„ํ–‰ ํ๋ฆ„

  1. ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์€ develop ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ feature ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ์ž‘์—…
  2. ์ž‘์—…์ด ์™„๋ฃŒ๋œ feature ๋ธŒ๋žœ์น˜๋Š” develop ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ.
    • PR์„ ํ†ตํ•ด ๋ฆฌ๋ทฐ ํ›„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹
  3. ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ค€๋น„๋Š” ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ์œ„ํ•ด ๊ฐœ๋ฐœ์ค‘์ธ develop ๋ธŒ๋žœ์น˜์—์„œ release ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ํ•œ๋‹ค.
    • ๋งŒ์•ฝ, ํ•ด๋‹น ๊ณผ์ •์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ๋‹ค๋ฉด, release ๋ธŒ๋žœ์น˜์—์„œ ๋ฐ”๋กœ ๋ฐ˜์˜
  4. ํ…Œ์ŠคํŠธ ํ›„, ์ผ์ • ์ฃผ๊ธฐ๋กœ master ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ œํ’ˆ ์ถœ์‹œ
  5. ๋ฐฐํฌ ์ดํ›„, release ๋ธŒ๋žœ์น˜์—์„œ ๋ฐœ๊ฒฌ๋˜์ง€ ๋ชปํ•œ ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๋Š” main ๋ธŒ๋žœ์น˜์—์„œ hotfix ๋ธŒ๋žœ์น˜๋ฅผ ํŒ ํ›„, hotfix ๋ธŒ๋žœ์น˜์—์„œ ๋ฐ”๋กœ ๊ณ ์นœ ํ›„ main์œผ๋กœ ๋ณ‘ํ•ฉ
  6. hotfix ๋ธŒ๋žœ์น˜์—์„œ ๊ณ ์น˜๊ณ , main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ ๋˜์—ˆ๋‹ค๋ฉด, ์ด๋ฅผ develop ๋ธŒ๋žœ์น˜์—๋„ ๋ณ‘ํ•ฉ

 

ํŠน์ง•

  • release์™€ hotfix ๋ธŒ๋žœ์น˜๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํ•œ ๋ฐฐํฌ ์ ˆ์ฐจ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ๋‚˜ ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉํ•˜๋‹ค.
  • ๋ณต์žก์„ฑ๊ณผ Control์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํŠน์ • ๊ธฐ๋Šฅ์ด๋‚˜ ์ˆ˜์ •์„ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋“ฑ์—์„œ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง.

 

 

 

2๏ธโƒฃ Github Flow

 

๋ธŒ๋žœ์น˜ ์ข…๋ฅ˜

  • master : base๊ฐ€ ๋˜๋Š” ๋ธŒ๋žœ์น˜
  • feature : master์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜

 

Github Flow๋ฅผ ํ™œ์šฉํ•œ ๊ฐœ๋ฐœ ์ง„ํ–‰ ํ๋ฆ„

  1. master ๋ธŒ๋žœ์น˜๋Š” ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ธŒ๋žœ์น˜.
  2. ๋งŒ์•ฝ, ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, master ๋ธŒ๋žœ์น˜๋กœ๋ถ€ํ„ฐ feature ๋ธŒ๋žœ์น˜๋กœ ์ƒˆ๋กœ ๋”ฐ์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.
  3. Task๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, Pull Request๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Review๋ฅผ ์š”์ฒญํ•˜๊ณ , PR์€ feature → master ๋ธŒ๋žœ์น˜์ด๋‹ค.
  4. ๋ฆฌ๋ทฐ ์™„๋ฃŒ ํ›„, ํ”ผ๋“œ๋ฐฑ์ด ๋ชจ๋‘ ๋ฐ˜์˜๋˜์—ˆ๋‹ค๋ฉด, ํ•ด๋‹น feature ๋ธŒ๋žœ์น˜๋ฅผ master ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•œ๋‹ค.

 

ํŠน์ง•

  • ๋‹จ์ˆœํ•˜๋ฉฐ ์ง€์†์ ์ธ ๋ฐฐํฌ๋ฅผ ๊ฐ•์กฐํ•˜๋ฉฐ, master ๋ธŒ๋žœ์น˜์—์„œ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋‹จ์ˆœํ•˜๋ฉฐ ๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ…Œ์ŠคํŠธ์™€ ๊ฒ€์ฆ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ master ๋ธŒ๋žœ์น˜๋กœ Merge ๋˜๋ฏ€๋กœ ์œ„ํ—˜์„ฑ์ด ์žˆ๋‹ค.

 

 

 

3๏ธโƒฃ Gitlab flow

๋ณต์žกํ•œ Git Flow์™€ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•œ Github Flow์˜ ์ ˆ์ถฉ์•ˆ

 

 

๋ธŒ๋žœ์น˜ ์ข…๋ฅ˜

  • master : ์•ˆ์ •์ ์ธ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ธŒ๋žœ์น˜๋กœ base๊ฐ€ ๋˜๋Š” ๋ธŒ๋žœ์น˜.
    • ์ „์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ์ง„ํ–‰์ด ์™„๋ฃŒ๋˜์–ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ์žˆ๋‹ค๋ฉด, production ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€.
    • ๋งŒ์•ฝ staging ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, pre-production ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€.
  • feature : ๊ฐ ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ๋˜๋Š” ๋ธŒ๋žœ์น˜.
    • master ๋ธŒ๋žœ์น˜์—์„œ ํŒŒ์ƒ๋˜๊ณ  PR์„ ํ†ตํ•ด ๋‹ค์‹œ ๋ณ‘ํ•ฉ๋œ๋‹ค.
  • Production : ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ๊ธฐ๋Šฅ์˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋ธŒ๋žœ์น˜
  • Pre-Production : ๋ฐฐํฌ ์ „์— ์ œํ’ˆ์„ ํ…Œ์ŠคํŠธ (QA, ํ’ˆ์งˆ๊ฒ€์‚ฌ) ํ•˜๋Š” ๋ธŒ๋žœ์น˜
    • ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด, production ๊ณผ master ์— ๊ฐ๊ฐ PR(Pull Request)์„ ๋ณด๋‚ธ๋‹ค.

 

Gitlab Flow๋ฅผ ํ™œ์šฉํ•œ ๊ฐœ๋ฐœ ์ง„ํ–‰ ํ๋ฆ„

  • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, master ๋ธŒ๋žœ์น˜์—์„œ feature ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • feature ๋ธŒ๋žœ์น˜์—์„œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ›„, PR์„ ํ†ตํ•ด
    • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ฐ ๋ณด์žฅ์ด ์žˆ๋‹ค๋ฉด production ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€ํ•œ๋‹ค.
    • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ฐ ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, pre-production ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€ํ•œ๋‹ค.
  • pre-production ๋ธŒ๋žœ์น˜์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋ฉด, production๊ณผ master์— PR์„ ํ†ตํ•ด ๋ณ‘ํ•ฉํ•œ๋‹ค.

 

ํŠน์ง•

  • ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ํ”Œ๋กœ์šฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • GitLab์€ ๋‚ด์žฅ๋œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋“ฑ์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ธ ๋ฐฐํฌ์™€ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ˜‘์—…๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
  • ํŠนํžˆ ์ง€์†์ ์ธ ๋ฐฐํฌ๊ฐ€ ๊ฐ•์กฐ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ํšจ๊ณผ์ ์ด๋‹ค.
728x90
๋ฐ˜์‘ํ˜•

'๐Ÿˆโ€โฌ› git' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

git history ์‚ญ์ œํ•˜๊ธฐ  (0) 2022.10.04
git merge ์—๋Ÿฌ  (0) 2022.07.06
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ  CPU Scheduling

์‹œ์Šคํ…œ์˜ CPU ์‚ฌ์šฉ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

Resources (CPUํฌํ•จ)๋Š” process๋“ค ์‚ฌ์ด์—์„œ ๊ณต์œ ๋œ๋‹ค.

 

๐Ÿ–ฅ๏ธ CPU-IO Burst Cycle

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ CPU ์‚ฌ์šฉ(bursts)๊ณผ ์ž…์ถœ๋ ฅ(I/O) ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์‚ฌ์ด๋ฅผ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ๋ฐ˜๋ณตํ•˜๋Š” ํ˜„์ƒ

 

Types of processes

  • I/O bound process
    • ์ž…๋ ฅ(input)๊ณผ ์ถœ๋ ฅ(output) ์ž‘์—…์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค
  • CPU-bound process
    • ๊ณ„์‚ฐ์ด๋‚˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค

 

๐Ÿ–ฅ๏ธ CPU Scheduler

CPU Scheduler๋Š” ready queue์—์„œ process๋ฅผ ์„ ํƒํ•˜๊ณ , CPU core๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

 

When Scheduling Occurs?

  1. running์—์„œ waiting state์œผ๋กœ switch ๋  ๋•Œ (Nonpreemtive)
  2. running์—์„œ ready state์œผ๋กœ switch ๋  ๋•Œ (Preemtive)
  3. wating์—์„œ ready๋กœ switch ๋  ๋•Œ (Preemtive)
  4. ์ข…๋ฃŒ๋  ๋•Œ (Nonpreemtive)

 

Non-preemptive vs Preemptive

- Non-preemptive scheduling

  • ์•„๋ฌด๋„ interruptํ•  ์ˆ˜ ์—†๋‹ค.
  • running → waiting / terminate ๋  ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•œ๋‹ค.
  • Running process๋Š” interrupted ๊ฐ€ ์•„๋‹ˆ๋‹ค.

- Preemptive scheduling

  • 1,2,3,4์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • processing์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ scheduling์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • interrupt, process with higher priority
  • HW์˜ ์ง€์›๊ณผ shared data handling์ด ํ•„์š”ํ•˜๋‹ค.
  • ์„ ์ ํ˜• ์Šค์ผ€์ค„๋ง์ด ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ ๊ฒฝ์Ÿ ์ƒํƒœ(๋ ˆ์ด์Šค ์ปจ๋””์…˜)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ–ฅ๏ธ Dispatcher

CPU๋ฅผ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค์Œ์— ์‹คํ–‰ํ•  ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์šด์˜ ์ฒด์ œ์˜ ๋ชจ๋“ˆ์ด๋‹ค.
  • Switching Context
    • CPU๊ฐ€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค(P0)์˜ ์ƒํƒœ(์˜ˆ: ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’, ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ ๋“ฑ)๋ฅผ ์ €์žฅํ•˜๊ณ , ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค(P1)์˜ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์ € ๋ชจ๋“œ๋กœ ์ „ํ™˜(Switching to User Mode)
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก CPU์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์ ˆํ•œ ์œ„์น˜๋กœ ์ ํ”„(Jumping to the Proper Location)
    • ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋œ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ๋ฅผ ํ•ด๋‹น ์œ„์น˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Dispatch Latency (์ง€์—ฐ)

ํ•œ ํ”„๋กœ์„ธ์Šค(P0)๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค(P1)๊ฐ€ ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

 

๐Ÿ–ฅ๏ธ Scheduling Criteria

  • CPU Utilization(CPU ์ด์šฉ๋ฅ ) : CPU๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ถ€์ง€๋Ÿฐํžˆ ์ผํ•˜๋Š”๊ฐ€. / ๋†’์„์ˆ˜๋ก ์ข‹์€๊ฑฐ์ž„ (๋‹จ์œ„ : %)
  • Throughput(์ฒ˜๋ฆฌ์œจ) : ์‹œ๊ฐ„๋‹น ๋ช‡๊ฐœ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€. / ๋†’์„์ˆ˜๋ก ์ข‹์€๊ฑฐ์ž„ (๋‹จ์œ„ : job/sec)
  • Turnaround time(๋ฐ˜ํ™˜์‹œ๊ฐ„) : ์ž‘์—…์ด ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋๋‚ด๊ณ  ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„. / ์งง์„์ˆ˜๋ก ์ข‹์€๊ฑฐ์ž„ (๋‹จ์œ„ : sec)
  • Waiting time(๋Œ€๊ธฐ์‹œ๊ฐ„) : CPU์—์„œ ์„œ๋น„์Šค๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ReadyQueue์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„. / ์งง์„์ˆ˜๋ก ์ข‹์ง€ (๋‹จ์œ„ : sec)
  • Response time(์‘๋‹ต์‹œ๊ฐ„) : ์ปดํ“จํ„ฐ์™€ ๋Œ€ํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ค‘์š”ํ•จ. (์š”์ƒˆ๋Š” ๋‹ค ๋งž๊ธดํ•จ) / ์งง์„์ˆ˜๋ก ์ข‹์Œ (๋‹จ์œ„ : sec)
728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
728x90

์ด์ œ ๊ณง ํŒŒ๋“œ์˜ 3๊ธฐ iOSํŒŒํŠธ๊ฐ€ ์‹œ์‹œ์‹œ์‹œ์ž‘์ด๋‹ค.

์„ธ๋ฏธ๋‚˜๋ฅผ ์œ„ํ•ด OT ์ž๋ฃŒ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋˜ ์ค‘, ๋ฌธ๋“ ๋ˆ„๊ตฐ๊ฐ€ ์ด๋Ÿฐ ์งˆ๋ฌธ์„ ํ•˜๋ฉด ์–ด์ฉŒ์ง€ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 

Main์ด๋ž‘ Lauch ์ค‘ ์–ด๋””์—์„œ ํ•ด์•ผ๋ผ์š”?

๋‘˜์˜ ์ฐจ์ด๋Š” ๋ญ์ฃ ?

 

.

.

 

์ •ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•˜๊ธฐ์— ์ฐพ์•„๋ณด์•˜๋‹ค.

 

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด LauchStoryboard๋Š” Android์˜ splashํ™”๋ฉด ๊ฐ™์€ ํ™”๋ฉด์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, LauchStoryboard์— ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ !

 

.

.

Launch storyboard

 

 

Main storyboard

 

์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ์„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ๋ฅผ ํ•˜๋ฉด, ์•„๋งˆ Launch storyboard๋งŒ ๋ณด์—ฌ์งˆ ๊ฒƒ์ด๋‹ค.

 

์ด๊ฑด AppDelegate์—์„œ Launch storyboard๊ฐ€ ๋ณด์—ฌ์งˆ ์‹œ๊ฐ„์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    sleep(1)
    return true
}

 

์ด๋Ÿฐ์‹์œผ๋กœ sleep(1)์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด, 1์ดˆ ๋’ค Main ํ™”๋ฉด์ด ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ํŒŒํŠธ์žฅ์„ ํ•˜๋‹ค ๋ณด๋‹ˆ, ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋˜ ๊ฒƒ๋“ค์ด ํ•˜๋‚˜์”ฉ ๋ณด์—ฌ์ง€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

 

.

.

 

์•„์ง ๋ถ€์กฑํ•จ์ด ๋งŽ์€ ๋‚ด๊ฐ€ ํŒŒํŠธ์žฅ์ด๋ผ๋‹ˆ,,

๋” ์—ด์‹ฌํžˆ ํ• ๊ฒŒ์š” ์—ฌ๋Ÿฌ๋ถ„..

 

.

.

 

๋

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
728x90

์กธ์—…์ƒ ์„ ๋ฐฐ๋‹˜๊ณผ ์ง„ํ–‰ํ•˜๋Š” ์Šคํ„ฐ๋”” ์ค‘, ์ด์ œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ ์šฉํ•  ์‹œ์ ์ด ๋˜์—ˆ๋‹ค.

๋ˆ„๊ฐ€ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ ์šฉํ•  ๊ฒƒ์ธ์ง€ ์—ญํ•  ๋ถ„๋ฐฐ๋ฅผ ํ•˜๋Š”๋ฐ, ์•„๋ฌด๋„ ๋‚˜์„œ์ง€ ์•Š์•˜๊ณ ,

๋‚˜๋Š” ์ด์ œ ๋™์•„๋ฆฌ ์ผ์ •๋„ ์–ด๋Š์ •๋„ ๋๋‚˜์„œ ์‹œ๊ฐ„์  ์—ฌ์œ ๊ฐ€ ๋น„๊ต์  ์žˆ์—ˆ๊ธฐ์— ๋‚ด๊ฐ€ ํ•˜๊ฒ ๋‹ค๊ณ  ํ–ˆ๋‹ค.

 

๋””์ž์ธ ์‹œ์Šคํ…œ. ๋‚ด๊ฐ€ ํ•ด์™”๋˜ ๋ฐฉ์‹๋Œ€๋กœ๋ผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ, ์Šคํ„ฐ๋”” ์žฅ ์„ ๋ฐฐ๋‹˜์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ถ”์ฒœํ•ด์ฃผ์…จ๋‹ค.

swift gem? ๋ญ๋ผ๊ณ  ํ•˜์…จ๋Š”๋ฐ, ์ž˜ ๊ธฐ์–ต์ด ์•ˆ๋‚œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์˜ค๋Š˜, ์Šฌ๋ž™ DM์œผ๋กœ ๊นƒํ—ˆ๋ธŒ ๋งํฌ๋ฅผ ํ•˜๋‚˜ ๋ณด๋‚ด์ฃผ์…จ๋‹ค.

ํ•œ์‹œ๊ฐ„ ๋ฐ˜์ •๋„ ์†Œ์š”ํ•˜์—ฌ ํ•œ๋ฒˆ ํ•ด๋ณด๋ผ๊ณ  ํ•˜์…จ๋‹ค.

๋ญ”๊ฐ€ ๋„์ „ ๊ณผ์ œ๋ฅผ ๋ฐ›์€ ๊ฒƒ ๊ฐ™์•„์„œ ์‚ด์ง ์„ค๋ œ๋‹ค.

 

์ง€๊ธˆ๋ถ€ํ„ฐ ๊ณต๋ถ€ ์‹œ-์ž‘ !!

 

https://github.com/mac-cain13/R.swift

 

GitHub - mac-cain13/R.swift: Strong typed, autocompleted resources like images, fonts and segues in Swift projects

Strong typed, autocompleted resources like images, fonts and segues in Swift projects - mac-cain13/R.swift

github.com

 

 

์ด ํŒจํ‚ค์ง€๋Š” ์ž๋™ ์™„์„ฑ์œผ๋กœ ์ด๋ฏธ์ง€, ํฐํŠธ, ์ƒ‰์ƒ ๋“ฑ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๊ณต์‹ ๋ฌธ์„œ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด,

์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด,

let icon = UIImage(named: "settings-icon")
let font = UIFont(name: "San Francisco", size: 42)
let color = UIColor(named: "indicator highlight")
let viewController = CustomViewController(nibName: "CustomView", bundle: nil)
let string = String(format: NSLocalizedString("welcome.withName", comment: ""), locale: NSLocale.current, "Arthur Dent")

 

ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

let icon = R.image.settingsIcon()
let font = R.font.sanFrancisco(size: 42)
let color = R.color.indicatorHighlight()
let viewController = CustomViewController(nib: R.nib.customView)
let string = R.string.localizable.welcomeWithName("Arthur Dent")

 

์ด ํŒจํ‚ค์ง€๋Š” Mathijs Kadijk๋ผ๋Š” ๋ถ„์ด 2016๋…„์— ๋ฐœํ‘œํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ํƒ€์ž…๋“ค์„ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์ž ๊ทธ๋Ÿผ ์ด์ œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด์ž!

 

์„ค์น˜ํ•˜๊ธฐ

1. ๋จผ์ € xcode์—์„œ Package Dependencies ํƒญ์— ๋“ค์–ด๊ฐ€ +๋ฅผ ํด๋ฆญํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , github.com/mac-cain13/R.swift (์ด ๋งํฌ ์•„๋‹˜!! https://github.com/mac-cain13/R.swift.git <- ์ด๊ฒŒ ๋งž์•„์š” !!)

๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

https://github.com/mac-cain13/R.swift.git

์˜ค์ž‰ ๊ทผ๋ฐ ์•ˆ๋ณด์ธ๋‹ค. ํ ..

๋ฐ”๋กœ ์Šคํ„ฐ๋””์žฅ๋‹˜ํ•œํ…Œ ๋ฌผ์–ด๋ดค๋‹ค.

์ด๋Ÿฐ ์ฃผ์†Œ๊ฐ€ ์ž˜๋ชป ๋œ ๊ฒƒ์ด์—ˆ๋”ฐ..... ์ด๋Ÿฐ ๋ฐ”๋ณด.............

https://github.com/mac-cain13/R.swift.git ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์ž !!

 

add packages๋ฅผ ๋ˆŒ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

2. ๋‹ค์Œ์œผ๋กœ ํƒ€๊นƒ-> general์„ ์„ ํƒํ•œ ๋’ค, Frameworks, Libraries, and Embeded Content ์„น์…˜์—์„œ + ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ RswiftLibrary๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ผ๊ณ  ํ•œ๋‹ค.

๊ทผ๋ฐ package๋ฅผ ์ถ”๊ฐ€ํ•˜๋‹ˆ ์ด๋ฏธ ์žˆ์—ˆ๋‹ค !

 

3. ํƒ€๊นƒ์„ ์„ ํƒํ•˜๊ณ , "Build Phases" ํƒญ์—์„œ "Run Build Tool Plug-ins"๋ฅผ ์„ ํƒํ•œ ๋’ค + ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

RswiftGenerateInternalResources ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

 

์„ค์น˜ ๋!

์ด์ œ build๋ฅผ ํ•˜๋ฉด, trust ํ•  ๊ฒƒ์ธ์ง€ ์ฐฝ์ด ๋œจ๋Š”๋ฐ, trust ํ•˜๊ฒ ๋‹ค๊ณ  ํ•˜๋ฉด ๋œ๋‹ค !!

import ํ•ด๋ณด๋ฉด ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค !

build๋„ ์ž˜ ๋œ๋‹ค ~!!!

 

 

R.swift ์‚ฌ์šฉํ•˜๊ธฐ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ชจ๋“  Resource๋“ค์€ R.~~~๋กœ ํ˜ธ์ถœํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ด์œ ๋Š”, R.generated.swift๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ Resources๋ฅผ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
728x90

react๋กœ ๋งŒ๋“  ํ”„๋ก ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด netlify๋ฅผ ๊ฐ€์ž…ํ•˜๊ณ , ๊นƒํ—ˆ๋ธŒ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฐ๋™ํ•˜์˜€๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ž๊พธ ์•Œ ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๋“ค์ด ๋œจ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

๋‚˜๋Š” react๋ฅผ ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ญ˜ ํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๊ฒช์—ˆ๋˜ ์‹œํ–‰์ฐฉ์˜ค๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

 

 

๐Ÿป  build ํด๋” ์ƒ์„ฑํ•˜๊ธฐ

npm run build

 

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ build ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

 

๐Ÿป  Failed during stage "Reading and parsing configuration files": When resolving config: Base directory does not exist: /opt/build/repo/velog_front ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ

 

ํ•ด๋‹น ์—๋Ÿฌ๋Š” ๋‚˜์˜ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜€๋‹ค.

๊นƒํ—ˆ๋ธŒ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ์—ฐ๋™ํ•ด์„œ ๋ฐฐํฌํ•˜์˜€๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊นƒํ—ˆ๋ธŒ์— ์žˆ๋Š” ํด๋”๋ช…์„ ์ ์–ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ๋‚˜๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ด๋ฆ„์„ ์ ๊ณ ์•ผ ๋ง์•˜๋‹ค....

์ด๋ ‡๊ฒŒ ๋‚ด ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—๋Š” client์™€ server๊ฐ€ ์žˆ๋Š”๋ฐ, ๋‚˜๋Š” Client๋งŒ ๋ฐฐํฌํ•˜๊ณ  ์‹ถ์œผ๋ฏ€๋กœ ์„ค์ •ํ•  ๋•Œ ํ•ด๋‹น ์ด๋ฆ„์„ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ Base directory์— ๊นƒ์— ์žˆ๋Š” ํด๋”๋ช…์„ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ !!

 

 

 

๐Ÿป  Manifest: Line: 1, column: 1, Syntax error. ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ

netlify๋กœ deploy๋ฅผ ๊ณ„์† ์‹œ๋„ํ–ˆ์œผ๋‚˜, deploy๋Š” ์„ฑ๊ณตํ•ด๋„ ๋นˆ ํ™”๋ฉด์ด ์ž๊พธ ๋–ด๋‹ค.

fn + F12๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์ฝ˜์†”์ฐฝ์„ ํ™•์ธํ•˜๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค.

Manifest: Line: 1, column: 1, Syntax error.

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, build ํด๋”์˜ index.html ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

# ๊ธฐ์กด ์ฝ”๋“œ
<link rel="manifest" href="/velog/manifest.json" />

# ์ˆ˜์ • ์ฝ”๋“œ
<link rel="/manifest" href="/velog/manifest.json" /> #manifest ์•ž์— / ๋ถ™์ด๊ธฐ
# ๊ธฐ์กด ์ฝ”๋“œ
<link rel="icon" href="/velog/favicon.ico" />

# ์ˆ˜์ • ์ฝ”๋“œ
<link rel="icon" href="./velog/favicon.ico" /> # ์•ž์— . ๋ถ™์ด๊ธฐ
# ์ˆ˜์ • ์ „
<link href="/velog/static/css/main.cfa5924d.css" rel="stylesheet" />

# ์ˆ˜์ • ํ›„
<link href="./velog/static/css/main.cfa5924d.css" rel="stylesheet" /> # ์•ž์— . ๋ถ™์ด๊ธฐ

 

 

 

 

๐Ÿป  Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ

/%PUBLIC URL%/favicon.ico:1

์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” app.js์—์„œ router์— basename์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

function App() {
  return (
    <ThemeProvider theme={theme}>
      <GlobalStyle />
      <Router basename={process.env.PUBLIC_URL}/> // basename ์ถ”๊ฐ€
    </ThemeProvider>
  );
}

์ด๋ ‡๊ฒŒ basename์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ ๋œ๋‹ค !

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ  ThemeProvider ?

์ง€์ •๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ !?

๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ThemeProvider์ด๋‹ค.

React ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ๋งˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณตํ†ต theme์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ‰์ƒ๊ฐ’์€ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค.

 

 

๐Ÿ–ฅ๏ธ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?

1. theme ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ํŒŒ์ผ์— ์ƒ‰์ƒ์„ ์ง€์ •ํ•œ๋‹ค.

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ theme ์ƒ‰์ƒ์ด๋‹ค. 

// styles/theme.js

const theme = {
  colors: {
    background: "#121212",
    text: "#ececec",
    primary: "#63e6be",
    primary2: "#62E6BE",
    white1: "#F1F3F5",
    white: "#FFFFFF",
    unSelected: "#ACACAC",
    secondBlack: "#1E1E1E",
    divider: "#2A2A2A"
  },
};

export default theme;

 

 

2. import ํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ๋‹จ์— import ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

import { ThemeProvider } from "styled-components";
import theme from "../../styles/theme";

 

 

3. App.js์— ์‚ฌ์šฉํ•˜๊ธฐ

import theme from "./styles/theme";
import Router from "./router/Router";

function App() {
  return (
    <ThemeProvider theme={theme}>
      <GlobalStyle />
      <Router />
    </ThemeProvider>
  );
}

export default App;

์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ThemeProvider์˜ props๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค !!

 

 

4. ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

background-color: ${theme.colors.background};

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, theme ํŒŒ์ผ์— ์žˆ๋Š” ์ƒ‰์ƒ๋“ค์„ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค !!

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

 

didSet์„ ์–ด์ฉŒ๋‹ค ๋งŒ๋‚˜๊ฒŒ ๋๋ƒ๋ฉด,

๋‚ด๊ฐ€ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋Š” iOS ์Šคํ„ฐ๋””์—์„œ ๋งก์€ ํŒŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๋งŒ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ํ™”์‚ดํ‘œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋‚ ์งœ๋ฅผ ๋ฐ”๊พผ๋‹ค.
2. ๋‚ ์งœ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค data filter์˜ ๊ธฐ์ค€ ๋‚ ์งœ๋ฅผ ์„ ํƒ๋œ ๋‚ ์งœ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
3. ๋ฐ”๋€ filter์˜ ๋‚ ์งœ์— ๋”ฐ๋ผ ์ด์— ๋งž๊ฒŒ filtering ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.

 

์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ณ , ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์—์„œ ์ƒ๊ฐ๋‚œ ๊ฒƒ์€ delegate ๋ฐ–์— ์—†์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ๋„, ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ง€์ง€๋Š” ์•Š์•˜๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ค ์•Œ๊ฒŒ ๋œ ๊ฒƒ์ด didSet์ด๋‹ค.

 

 

 

 

 

 

didSet์ด๋ž€

๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด, ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ์ƒˆ๋กœ ์„ค์ •๋œ ํ›„ ํ˜ธ์ถœ๋˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

์ฆ‰, ๊ฐ’์ด ๋ฐ”๋€Œ๊ณ  ์ด์— ๋Œ€ํ•ด ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์ค˜์•ผ ํ•˜๋Š” ๋‚˜์—๊ฒŒ๋Š” ๊ผญ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด์—ˆ๋‹ค.

didSet์„ ์„ค์ •ํ•˜๋ฉด, ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ด ๋ถ€๋ถ„์ด ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

 

 

 

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ƒ๋ฉด

var dateSend: Date = Date() {
    didSet {
        updateUI(for: dateSend)
    }
}

 

์ด๋ ‡๊ฒŒ, ํ”„๋กœํ† ์ฝœ๋กœ ๋ฐ›์€ dateSend์˜ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋ผ์•ผ ํ•˜๋Š” ํ™”๋ฉด์ด ๋ฐ”๋€Œ๋Š” updateUI ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค.

 

์‚ฌ์‹ค ๋‚˜์ค‘์—๋Š” reloadํ•จ์ˆ˜๋ฅผ ์จ์„œ ๊ทธ๋ƒฅ collectionView์˜ cell์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ•˜๊ฒŒ ๋ผ์„œ ์ด didSet์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ด๋Ÿฐ ์นœ๊ตฌ๋„ ์žˆ๊ตฌ๋‚˜ ~~ ํ•˜๋Š” ์ค‘์š”ํ•œ ์‚ฌ์‹ค์„ ๋ฐฐ์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

์ด์ „์— react์—์„œ ์ œ๊ณตํ•˜๋Š” dropdown ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ํ•œ ์ ์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ด๋ฒˆ์— ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋“œ๋กญ๋‹ค์šด์€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปค์Šคํ…€ํ•ด์„œ๋Š” ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์•ฝ 20๋ถ„์ •๋„ ํ•ด๋ณด๊ณ  ์•ˆ๋˜๋‹ˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฑด, ์•„์ด์ฝ˜์„ ๋ˆŒ๋ €์„ ๋•Œ ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋ดค์œผ๋‚˜, ๊ตฌ๋…์„ ํ•˜๊ฑฐ๋‚˜ ๋ˆ์„ ๋‚ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค.

 

๊ณ ๋ฏผ ๋์— ๊ทธ๋ƒฅ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

๋Œ€๋žต์ ์ธ ์ƒ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ์•„์ด์ฝ˜ ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•œ๋‹ค.
2. ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ dropdown์„ ๋ณด์—ฌ์ค€๋‹ค.
3. dropdown ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๊ฐ list์— ๋ผ์šฐํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 

1. ์•„์ด์ฝ˜ ๋ฒ„ํŠผ ์ƒ์„ฑํ•˜๊ธฐ

์ด๋ถ€๋ถ„์€ ์™„์ „ํ•œ ui ์˜์—ญ์ด๊ธฐ์— ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ์•„์ด์ฝ˜ ๋ฒ„ํŠผ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด๋‘๊ฒ ๋‹ค.

<ProfileButton
          onClick={toggleDropdown}
          style={{ backgroundColor: "transparent" }}
        >
         {/*  */}
          <AccountCircleIcon
            sx={{
              fontSize: "30px",
              color: "white",
              paddingTop: "5px",
              paddingLeft: "20px",
              paddingRight: "80px",
            }}
          />
</ProfileButton>
const ProfileButton = styled.button`
  text-align: center;
  background-color: ${theme.colors.background};
  color: ${theme.colors.white1};
  border-color: transparent;
  width: 35px;
  height: 35px;
  margin-right: 130px;
`;

 

2. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ dropdown ๋ณด์—ฌ์ฃผ๊ธฐ

2-1. ์ƒํƒœ ๊ด€๋ฆฌ

์ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” useEffect๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ๋Š”์ง€, ์•ˆ๋ˆŒ๋ ธ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

const [isDropdownOpen, setIsDropdownOpen] = useState(false);

 

์ด๋ฅผ ์œ„ํ•ด ๋จผ์ € false๋กœ ์ดˆ๊ธฐํ™” ๋œ isDropdownOpen ์ด๋ผ๋Š” ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

์ด ๋ณ€์ˆ˜๋Š” dropdown์ด ์—ด๋ ค ์žˆ๋Š”์ง€, ๋‹ซํ˜€ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ์ƒํ–ˆ๋“ฏ, false๋Š” ๋‹ซํžŒ ์ƒํƒœ์ด๊ณ , true๋Š” ์—ด๋ฆฐ ์ƒํƒœ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ setIsDropdownOpen์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ–ˆ๋Š”๋ฐ, ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด isDropdownOpen์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

const ref = useRef(null);

 

useRef๋Š” ๋‚˜๋„ ์•„์ง ๊ณต๋ถ€๋ฅผ ๋” ํ•ด๋ด์•ผ ํ•˜๊ฒ ์ง€๋งŒ, DOM์— ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค. DOM์— ์ ‘๊ทผํ•ด์„œ ๋ฌด์—‡์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ, ์–ด๋–ค ์ž…๋ ฅ ํ•„๋“œ์— ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๋ฅผ ๋งž์ถ”๊ฑฐ๋‚˜, ์–ด๋–ค ์š”์†Œ์˜ ํฌ๊ธฐ ํ˜น์€ ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€ ๋ฐ”ํƒ•์„ ํด๋ฆญํ•˜๋ฉด ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ๋‹ซํžˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. 

์ด ref๋ฅผ ์‚ฌ์šฉํ•œ ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” 2-2๊ฐ€ ๋  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ถ€๋ถ„์—์„œ ๋” ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

 

 

const toggleDropdown = () => {
  setIsDropdownOpen(!isDropdownOpen);
};

 

์ด ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜์˜ dropDown์ด ์—ด๋ ค ์žˆ์œผ๋ฉด ๋‹ซ๊ณ , ๋‹ซํ˜€์žˆ์œผ๋ฉด ์—ด๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ์•„์ด์ฝ˜์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

 

2-2. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ

๋‹ค์Œ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

์•ž์„œ ์‚ด์ง ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๋“œ๋กญ๋ฐ•์Šค ์™ธ๋ถ€์˜ ์˜์—ญ์„ ํด๋ฆญํ•˜๋ฉด ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ๋‹ซํžˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

useEffect(() => {
    const handleClickOutside = (event) => {
      if (ref.current && !ref.current.contains(event.target)) {
        setIsDropdownOpen(false);
      }
    };

    document.addEventListener("mousedown", handleClickOutside);
    return () => {
      document.removeEventListener("mousedown", handleClickOutside);
    };
  }, [ref]);

 

์ •๋ฆฌํ•˜๋ฉด, ๋ฌด์–ธ๊ฐ€๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ dropDown ์™ธ๋ถ€์˜ ๊ฒƒ์ธ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์™ธ๋ถ€์˜ ๊ฒƒ์ด๋ผ๋ฉด 

ref.current.contains(event.target) ๋Š” false๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์™ธ๋ถ€๋ผ๋ฉด, dropDown์„ ๋‹ซ๊ฒŒ ๋œ๋‹ค.

 

3. ๋“œ๋กญ๋‹ค์šด ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ

<DropdownContainer ref={ref}>
	{/* ์•„์ด์ฝ˜ ๋ฒ„ํŠผ */}
        <ProfileButton
          onClick={toggleDropdown}
          style={{ backgroundColor: "transparent" }}
        >
        {/* ์—ฌ๊ธฐ์— ์‚ฌ์šฉํ•  ์•„์ด์ฝ˜์„ ๋„ฃ์–ด์ค€๋‹ค. */}
          <AccountCircleIcon
            sx={{
              fontSize: "30px",
              color: "white",
              paddingTop: "5px",
              paddingLeft: "20px",
              paddingRight: "80px",
            }}
          />
        </ProfileButton>
        
        {/* ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ StyledDropdown ๋ณด์—ฌ์ฃผ๊ธฐ */}
        {isDropdownOpen && (
          <StyledDropdown>
            <ul style={{display: "flex", flexDirection: "column"}}>
              <DropdownTextStyle href="/myPage">๋‚ด ๋ฒจ๋กœ๊ทธ</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">์ž„์‹œ ๊ธ€</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">์ฝ๊ธฐ ๋ชฉ๋ก</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">์„ค์ •</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">๋กœ๊ทธ์•„์›ƒ</DropdownTextStyle>
            </ul>
          </StyledDropdown>
        )}
</DropdownContainer>

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋“œ๋กญ๋‹ค์šด ๋ฐ•์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค !!

 

๊ฒฐ๊ณผ

-> ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ์„ ํƒํ–ˆ์„ ๋•Œ

 

-> ๋“œ๋กญ๋‹ค์šด์— ์žˆ๋Š” ๋ฉ”๋‰ด ํ˜ธ๋ฒ„ ์‹œ

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•

'๐Ÿ–ฅ๏ธ react' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[react] ThemeProvider ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2024.01.20
[react] react-dropdown ์ปค์Šคํ…€ ํ•˜๊ธฐ  (0) 2024.01.15
[react] markdown editor, viewer ๊ตฌํ˜„ํ•˜๊ธฐ  (2) 2023.01.29
[react] useEffect()  (0) 2022.12.27
styled components  (0) 2022.12.27

+ Recent posts