๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

๋ฉ”์ดํŠธ ๋Ÿฌ๋„ˆ ์•ฑ ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๊ณต์œ ํ•˜๋Š” ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค!

 

GitHub - boostcampwm-2021/iOS06-MateRunner: ํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๋Š” ์ฆ๊ฑฐ์›€, Mate Runner ๐Ÿƒ๐Ÿป‍โ™‚๏ธ๐Ÿƒ๐Ÿป‍โ™€๏ธ

ํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๋Š” ์ฆ๊ฑฐ์›€, Mate Runner ๐Ÿƒ๐Ÿป‍โ™‚๏ธ๐Ÿƒ๐Ÿป‍โ™€๏ธ. Contribute to boostcampwm-2021/iOS06-MateRunner development by creating an account on GitHub.

github.com

์—ฌ๊ธฐ์„œ ์ €ํฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋” ์ž์„ธํžˆ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!

 

๊ทธ๋Ÿผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์•ฑ์ด ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์›Œ์š”..

์ €ํฌ ํŒ€์€ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์—†๋‹ค ๋ณด๋‹ˆ ์ตœ๋Œ€ํ•œ API๋งŒ์œผ๋กœ ์„œ๋ฒ„์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ–ˆ๊ณ , ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์„ ์‰ฝ๊ณ , ๊ทธ๋ฆฌ๊ณ  ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ธ Firebase๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Firebase์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ SDK๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ์ด ๋•Œ๋ฌธ์— ๋นŒ๋“œ์— ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ๋นŒ๋“œ์—์„œ๋Š” 1๋ถ„ 30์ดˆ ์ •๋„ ๊ฑธ๋ฆฌ๊ณ , ํ…Œ์ŠคํŠธ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์•„์นด์ด๋น™์„ ์ง„ํ–‰ํ•˜๋ฉด 10๋ถ„ ์ •๋„ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

 

๋˜, SDK์˜ ์šฉ๋Ÿ‰์ด 60MB์ •๋„ ๋˜์–ด์„œ ์•ฑ์˜ ์ด์šฉ๋Ÿ‰์ด 100MB๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

 

REST API ์žˆ๋‹ค๋˜๋ฐ?

SDK ๋•Œ๋ฌธ์— ์•Œ๊ฒŒ๋ชจ๋ฅด๊ฒŒ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋ฐ›๋˜ ์™€์ค‘์— Firestore๋ฅผ REST API๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•œ ์‹ค์‹œ๊ฐ„ ๋‹ฌ๋ฆฌ๊ธฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Firestore ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ REST API๋กœ ๋Œ€์ฒดํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

https://firebase.google.com/docs/firestore/reference/rest?hl=ko 

 

Cloud Firestore API  |  Firebase

Test SDK for Cloud Functions for Firebase

firebase.google.com

์•„์ฃผ ์นœ์ ˆํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ๊ธฐ์— ๋ฌธ์„œ๊ฐ€ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ API๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๊ฑด ํฌ๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

์ถฉ๊ฒฉ๊ณผ ๊ณตํฌ์˜ Firestore JSON

๋‹จ์ˆœํžˆ ์ •ํ•ด์ง„ ์—”๋“œํฌ์ธํŠธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„ ํŒŒ์‹ฑ๋งŒ ํ•˜๋ฉด ๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‹จ์ˆœํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Firestore์— GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ํŠน์ •ํ•œ ๋ฌธ์„œ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ด๋ ‡๊ฒŒ ์ฃผ๋Š”๋ฐ์š”, ๋ญ”๊ฐ€ ์‹ฌ์ƒ์น˜ ์•Š๋‹ค๋Š” ๊ฑธ ๋ˆˆ์น˜์ฑ„์…จ๋‚˜์š”? 

 

๋ชจ๋“  ๊ฐ’๋“ค์ด ์–ด๋–ค ํƒ€์ž…์ธ์ง€๋ฅผ ํฌํ•จํ•˜๋Š” JSON ํ˜•ํƒœ๋กœ ํ•œ๋ฒˆ ๋” ๋ž˜ํ•‘๋˜์–ด์„œ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. mate ๊ฐ™์€ ๊ฒฝ์šฐ๋„ ์ €ํฌ๊ฐ€ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๊ฑด 

"mate": ["a", "b", "c"]

์ด๊ฑฐ์˜€๋Š”๋ฐ ๋ง์ด์ฃ ...

 

์‚ฌ์‹ค ์‘๋‹ต์„ ๋ฐ›์•„์„œ ๋””์ฝ”๋”ฉ ํ•˜๋Š”๊ฑด ๊ดœ์ฐฎ์ง€๋งŒ, POST๋‚˜ PATCH ์š”์ฒญ์„ ์œ„ํ•ด ๋ฐ”๋””์— ๋‹ด์•„์•ผ ํ•˜๋Š” JSON ์—ญ์‹œ๋„ ๋™์ผํ•œ ํฌ๋งท์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•˜๋‹ค ๋ณด๋‹ˆ ์œ„ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋””์ฝ”๋”ฉ๊ณผ ์ธ์ฝ”๋”ฉ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ฐ ํƒ€์ž…์„ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ•˜๊ธฐ

์ด์ œ ๊ทธ๋ƒฅ ๋”•์…”๋„ˆ๋ฆฌ๋กœ JSON์„ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์—†๊ณ  ํŠน์ˆ˜ํ•œ ํƒ€์ž…์„ ํ•„๋“œ๋กœ ๊ฐ€์ง„ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ธฐ๋ณธ ํƒ€์ž…๋“ค์„ Firestore์—์„œ ์ฃผ๋Š” ํ˜•ํƒœ์— ๋Œ€์‘๋˜์–ด ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ํƒ€์ž…๋“ค์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— IntegerValue์˜ value ๊ฐ€ String์ธ ๊ฑฐ ๋ณด์ด์‹œ๋‚˜์š”? ์ง„์งœ ๋ฏธ์ณ๋ฒ„๋ฆฌ๋Š” ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹คใ…‹ใ…‹ใ…‹ใ…‹ ๊ทผ๋ฐ ์ง„์งœ๋กœ ๋ฌธ์ž์—ด๋กœ ์ค๋‹ˆ๋‹ค..

๋„๋Œ€์ฒด ์™œ...

์ด์ œ ์ € ํƒ€์ž…๋“ค์„ ์ด์šฉํ•˜๋ฉด ํŒŒ์ด์–ด๋ฒ ์ด์Šค๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋””์ฝ”๋”ฉ๊ณผ ์ธ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ์š”, CodingKey์— ํ•„๋“œ์— ๋Œ€ํ•œ ํ‚ค๋ฅผ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

{
	"stringValue" : value
}

 

๊ทผ๋ฐ ์—ฌ๊ธฐ์— ์‹ค์ œ๋กœ ์ด ๊ฐ’์ด ์–ด๋–ค ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์ธ์ง€ ๊ทธ ํ‚ค๊ฐ’์ด ๋˜ ํ•„์š”ํ•˜๊ฒ ์ฃ .. 

{
	"name" : {
		"stringValue" : value
	}
}

์ด๋Ÿฐ์‹์œผ๋กœ์š”.

 

๊ทธ๋ž˜์„œ ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์˜ฌ๋ฆฌ๊ณ  ๋ฐ›๋Š” ํŠน์ˆ˜ํ•œ ํƒ€์ž…๋“ค, ๋‹ฌ๋ฆฌ๊ธฐ ๊ฒฐ๊ณผ, ํ”„๋กœํ•„ ์ •๋ณด ๋“ฑ์„ DTO๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

DTO ์„ค๊ณ„

DTO๋Š” ๊ธฐ์กด ๋ชจ๋ธ์—์„œ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋กœ ์˜ฌ๋ฆด ๋•Œ๋Š” ์œ„์˜ ๋”์ฐํ•œ JSON์˜ ํ˜•ํƒœ๋กœ, ๋ฐ›์•˜์„ ๋•Œ๋Š” ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฐ์ฒด์˜ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

์œ„ ์˜ˆ์‹œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋Œ€ํ•œ DTO์ธ๋ฐ์š”,

ํŒŒ์ด์–ด๋ฒ ์ด์Šค์˜ ์ตœ์ƒ์œ„ ํ‚ค๊ฐ’์€ ํ•ญ์ƒ "fields"๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋”ฉ ํ‚ค์— fields๋ฅผ ์ฃผ๊ณ , ๊ทธ ํ•˜์œ„ ํ•„๋“œ์— ๋Œ€ํ•œ ํ‚ค์™€ ๊ทธ ๊ฐ’์„ ๊ธฐ๋ณธ ๊ฐ’์— ๋Œ€ํ•ด ์ •์˜ํ•œ StringValue, IntegerValue ๋“ฑ์œผ๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ์„œ JSON๊ณผ ๊ฐ™์€ ํฌ๋งท์ด ๋งŒ๋“ค์–ด์ง€๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋””์ฝ”๋”ฉ์„ ํ•  ๋•Œ๋Š” fields๋กœ ํ•œ๋ฒˆ ์ค‘์ฒฉ๋œ JSON ๊ตฌ์กฐ๋ฅผ ํ’€์–ด์ฃผ๊ณ , ๊ทธ ๋‚ด๋ถ€์— ์žˆ๋Š” ํ•„๋“œ๋“ค์„ nestedContainer๋กœ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ ์ธ์ฝ”๋”ฉํ•  ๋•Œ๋Š” String, Double๋กœ ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ StringValue, DoubleValue๋กœ ํ•œ๋ฒˆ ๋ฐ”๊พผ ๋’ค์— DTO์˜ ํ”„๋กœํผํ‹ฐ์— ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DTO๋ฅผ JSON์œผ๋กœ ์ธ์ฝ”๋”ฉํ–ˆ์„ ๋•Œ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ›์•˜๋˜ JSON๊ณผ ๋™์ผํ•œ ํ˜•ํƒœ๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ API ๋งŒ๋“ค๊ธฐ

์ €ํฌ ํŒ€์€ ๊ฝค๋‚˜ ๋งŽ์€ ๋ถ€๋ถ„์ด SDK๋กœ ์ด๋ฏธ ๊ตฌํ˜„๋œ ์ƒํƒœ์—์„œ REST API๋กœ ์ „ํ™˜ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๊ธฐ๋Šฅ๋“ค์— ๋Œ€์‘๋˜๋Š” REST API๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” Firestore REST API ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ํ”„๋กœํ† ์ฝœ์— ์ฃผ์„์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•œ์ง€, ๋ฐ˜ํ™˜ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…์‹œํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ „์ฒด API ๋ชฉ๋ก์— ๋Œ€ํ•ด MARK๋ฅผ ๋ช…์‹œํ•ด์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋ ˆํŒŒ์ง€ํ† ๋ฆฌ API์— ๋Œ€ํ•ด์„œ๋Š” ์ด PR์— ๋” ์ž์„ธํžˆ ์ •๋ฆฌํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค!

https://github.com/boostcampwm-2021/iOS06-MateRunner/pull/217

 

RestAPI ์š”์ฒญ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ๊ตฌํ˜„ by jeonyeohun · Pull Request #217 · boostcampwm-2021/iOS06-MateRunner

๐Ÿ“• Issue Number Close #212 Close #215 Close #208 Close #214 Close #202 Close #211 ๐Ÿ“™ ์ž‘์—… ๋‚ด์—ญ ๊ตฌํ˜„ ๋‚ด์šฉ ๋ฐ ์ž‘์—… ํ–ˆ๋˜ ๋‚ด์—ญ protocol FirestoreRepository { // MARK: - Running Result Update/Read func save( ...

github.com

 

์ €ํฌ ํŒ€์ด ์ดˆ๊ธฐ ์„ค๊ณ„๋ฅผ ์ž˜ํ•ด๋‘” ๋•๋ถ„์— SDK์—์„œ REST API๋กœ ์ค‘๊ฐ„์— ๋ณ€๊ฒฝ์ด ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ธฐ์กด ์ฝ”๋“œ๋Š” ํฌ๊ฒŒ ์†๋Œˆ ํ•„์š” ์—†์ด, ์œ ์ฆˆ ์ผ€์ด์Šค์— ์žˆ๋˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋งŒ ์ƒˆ๋กœ์šด ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ธฐ์กด ๋กœ์ง์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋งŒ ์กฐ๊ธˆ ์ˆ˜์ •ํ•˜๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

REST๋กœ ๋ฐ”๊ฟ”์„œ ์–ป์€ ๊ฒƒ

์กฐ๊ธˆ ์‹œ๊ฐ„์€ ๊ฑธ๋ ธ์ง€๋งŒ ๊ฒฐ๊ตญ Firestore์— ๋Œ€ํ•œ ๋ชจ๋“  SDK๋Š” REST API๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ์‹œ๊ฐ„์€ 28์ดˆ ์ •๋„๋กœ ํฌ๊ฒŒ ์ค„์—ˆ๊ณ , ์•„์นด์ด๋น™๋„ 2-3๋ถ„ ๋‚ด์™ธ๋กœ ์—„์ฒญ๋‚˜๊ฒŒ ๊ฐ€๋ฒผ์›Œ์กŒ์Šต๋‹ˆ๋‹ค!

์•ฑ์˜ ์šฉ๋Ÿ‰๋„ 40MB ์ •๋„๋กœ ๋” ๊ฐ€๋ฒผ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

SDK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ํŽธํ•˜๊ธด ํ•˜์ง€๋งŒ, URLSession์„ ํ†ตํ•œ ๋„คํŠธ์›Œํ‚น๋„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด ๋ณผ ์ˆ˜ ์—†๊ณ , ์•ฑ์ด ๋ฌด๊ฑฐ์›Œ์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. REST API๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์ด ์‰ฝ์ง€๋Š” ์•Š์•˜์ง€๋งŒ(์‹ค์ œ๋กœ ์ดํ‹€ ์ •๋„๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ผœ๋ณด์ง€๋„ ๋ชปํ•˜๊ณ  Postman๊ณผ ํ•จ๊ป˜ ํ–ˆ์Šต๋‹ˆ๋‹ค..) ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ์„ ์ง„ํ•˜๊ฒŒ ๊ฒฝํ—˜ํ•˜๊ณ  ์ฃผ์–ด์ง€๋Š” ์›น API์˜ ์‘๋‹ต์„ ์•ฑ์˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊นŠ๊ฒŒ ๊ณ ๋ฏผ๋„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 

 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ €ํฌ ์•ฑ์ด ๋” ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ๊นƒํ—ˆ๋ธŒ์— ๋ฐฉ๋ฌธํ•ด์ฃผ์„ธ์š”!

 

GitHub - boostcampwm-2021/iOS06-MateRunner: ํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๋Š” ์ฆ๊ฑฐ์›€, Mate Runner ๐Ÿƒ๐Ÿป‍โ™‚๏ธ๐Ÿƒ๐Ÿป‍โ™€๏ธ

ํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๋Š” ์ฆ๊ฑฐ์›€, Mate Runner ๐Ÿƒ๐Ÿป‍โ™‚๏ธ๐Ÿƒ๐Ÿป‍โ™€๏ธ. Contribute to boostcampwm-2021/iOS06-MateRunner development by creating an account on GitHub.

github.com