[iOS] ๋ฉ์ดํธ๋ฌ๋: Firestore SDK ์์ REST API๋ก
๋ฉ์ดํธ ๋ฌ๋ ์ฑ ๊ฐ๋ฐ ๊ณผ์ ์ ๊ณต์ ํ๋ ํฌ์คํธ์ ๋๋ค!
์ฌ๊ธฐ์ ์ ํฌ ํ๋ก์ ํธ๋ฅผ ๋ ์์ธํ ๋ณผ ์ ์์ด์!
๊ทธ๋ผ ์์ํ๊ฒ ์ต๋๋ค!
์ฑ์ด ๋๋ฌด ๋ฌด๊ฑฐ์์..
์ ํฌ ํ์ ์๋ฒ ๊ฐ๋ฐ์๊ฐ ์๋ค ๋ณด๋ ์ต๋ํ 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
์์ฃผ ์น์ ํ์ง๋ ์์ง๋ง ์ฌ๊ธฐ์ ๋ฌธ์๊ฐ ์ ์ ๋ฆฌ๋์ด ์์ด์ 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
์ ํฌ ํ์ด ์ด๊ธฐ ์ค๊ณ๋ฅผ ์ํด๋ ๋๋ถ์ SDK์์ REST API๋ก ์ค๊ฐ์ ๋ณ๊ฒฝ์ด ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๊ธฐ์กด ์ฝ๋๋ ํฌ๊ฒ ์๋ ํ์ ์์ด, ์ ์ฆ ์ผ์ด์ค์ ์๋ ๋ ํ์งํ ๋ฆฌ๋ง ์๋ก์ด ๋ ํ์งํ ๋ฆฌ๋ก ๋ณ๊ฒฝํ๊ณ ๋ฐํ ํ์ ์ ๊ธฐ์กด ๋ก์ง์ ์ ์ฉํ ์ ์๋ ์ฝ๋๋ง ์กฐ๊ธ ์์ ํ๋ฉด ๋์์ต๋๋ค.
REST๋ก ๋ฐ๊ฟ์ ์ป์ ๊ฒ
์กฐ๊ธ ์๊ฐ์ ๊ฑธ๋ ธ์ง๋ง ๊ฒฐ๊ตญ Firestore์ ๋ํ ๋ชจ๋ SDK๋ REST API๋ก ๋์ฒดํ ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น๋ ์๊ฐ์ 28์ด ์ ๋๋ก ํฌ๊ฒ ์ค์๊ณ , ์์นด์ด๋น๋ 2-3๋ถ ๋ด์ธ๋ก ์์ฒญ๋๊ฒ ๊ฐ๋ฒผ์์ก์ต๋๋ค!
์ฑ์ ์ฉ๋๋ 40MB ์ ๋๋ก ๋ ๊ฐ๋ฒผ์์ก์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
SDK๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ง ํธํ๊ธด ํ์ง๋ง, URLSession์ ํตํ ๋คํธ์ํน๋ ์ง์ ๊ฒฝํํด ๋ณผ ์ ์๊ณ , ์ฑ์ด ๋ฌด๊ฑฐ์์ง๋ค๋ ๋จ์ ์ด ์์์ต๋๋ค. REST API๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด ์ฝ์ง๋ ์์์ง๋ง(์ค์ ๋ก ์ดํ ์ ๋๋ ์๋ฎฌ๋ ์ดํฐ๋ ์ผ๋ณด์ง๋ ๋ชปํ๊ณ Postman๊ณผ ํจ๊ป ํ์ต๋๋ค..) ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ์ ์งํ๊ฒ ๊ฒฝํํ๊ณ ์ฃผ์ด์ง๋ ์น API์ ์๋ต์ ์ฑ์ ์ํฉ์ ๋ง๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊น๊ฒ ๊ณ ๋ฏผ๋ ํด๋ณผ ์ ์๋ ์ข์ ๊ธฐํ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ ํฌ ์ฑ์ด ๋ ๊ถ๊ธํ์๋ค๋ฉด ๊นํ๋ธ์ ๋ฐฉ๋ฌธํด์ฃผ์ธ์!