๊ฐœ๋ฐœ ์‹œํ–‰์ฐฉ์˜ค

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] URLSession์œผ๋กœ multipart/form-data ์š”์ฒญ

Forest Yun 2023. 8. 22. 20:51
728x90

 

๐Ÿ‘ฉโ€๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉโ€๐Ÿ’ป

์•จ๋ฒ”์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ด ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ์ž‘์—…์ด ์ฃผ์–ด์กŒ๋‹ค. ์ด์ „์— ๋ช‡ ๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„๋ณธ ๊ฒฝํ—˜์ด ์žˆ์–ด ๋ฌด๋ฆฌ๊ฐ€ ์—†์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ทธ๋•Œ๋Š” 3rd party์ธ Alamofire๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์„œ ๊ฐ„๋‹จํ–ˆ์—ˆ๊ณ  ์ง€๊ธˆ์€ Apple์˜ built-in์ธ URLSession์„ ์‚ฌ์šฉํ•ด์•ผํ•ด์„œ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋‹ค.
'์‹œํ–‰์ฐฉ์˜ค' ๊ธ€์—์„œ๋Š” ๋‚ด๊ฐ€ ๊ฒช์—ˆ๋˜ ์–ด๋ ค์›€๋งŒ ์ •๋ฆฌํ•˜๊ณ  ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋”ฐ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•  ์˜ˆ์ •์ด๋‹ค.
 
 
 

๐Ÿ˜ฎ cURL Vs HTTP

API๋ฌธ์„œ๋Š” ํ‘œํ˜„์˜ ์ฐจ์ด ๋“ฑ์œผ๋กœ iOS๋งŒ ์•Œ๊ณ  ์žˆ์–ด์„œ๋Š” ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋™์•ˆ ํ•ด์™”๋˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๊ฒฝํ—˜๊ณผ ๊ตฌ๊ธ€๋ง์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์ž˜ ์ดํ•ดํ•˜๋ฉฐ ์—ฐ๊ฒฐํ•ด์™”๋‹ค. ์˜ค๋žœ๋งŒ์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ API๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ๋‚ด๊ฐ€ ๋”ฐ๋กœ ์ฐพ์•„ ๊ณต๋ถ€ํ–ˆ๋˜ mutipart/form-data ์—ฐ๊ฒฐ ๊ตฌ์กฐ์™€๋Š” ๋งŽ์ด ๋‹ฌ๋ผ ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•œ๊ฑด๊ฐ€ ์‹ถ์–ด ๊ตฌ๊ธ€๋ง์„ ์ •๋ง ๋งŽ์ด ํ•ด๋ดค์ง€๋งŒ ๋˜‘๊ฐ™์€ ๊ตฌ์กฐ๋งŒ ์žˆ์—ˆ๋‹ค.

--Boundary- (์ฝ”๋“œ)
Content-Dispotion: form-data; name="name"

Forest
--Boundary- (์ฝ”๋“œ)
Content-Dispotion: form-data; name="name"

Tree
--Boundary- (์ฝ”๋“œ)
Content-Dispotion: form-data; name="name"; filename="filename.jpg"

(Data ๊ฐ’)
--Boundary-(์ฝ”๋“œ)โ€”

 
 
์ฃผ์–ด์ง„ API๋กœ๋Š” cURL์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์—๋Š” ๋‹ค๋ฅธ API์—๋Š” ์—†๋˜ ์˜ต์…˜(-f)์ด ์žˆ์–ด ํ•ด๋‹น ์˜ต์…˜์ด ํ•ด๊ฒฐ์˜ ์—ด์‡ ๊ฐ€ ๋˜์–ด ์ฃผ์ง€ ์•Š์„๊นŒ ์‹ถ์–ด ๋˜ ์—ด์‹ฌํžˆ ๊ตฌ๊ธ€๋งํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์•Œ๊ฒŒ ๋œ ๊ฑด ๋ฐ”๋กœ Postman์„ ํ†ตํ•ด Code snippet, ์ฆ‰ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. ๊ทธ๋ž˜์„œ Postman์„ ์‚ฌ์šฉํ•ด ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ํ•ด๋ณด์•˜๋”๋‹ˆ ๋‚ด๊ฐ€ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋ณด์•„์˜จ ์–‘์‹์ด ๋ฐ”๋กœ HTTP ์–‘์‹์ด์—ˆ๋‹ค.

 
 

 

๐Ÿค™๐Ÿป HTTP๋Š” ํ†ต์‹ ๊ทœ์•ฝ

HTTP๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์ž์›์„ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ†ต์‹  ๊ทœ์•ฝ์ด๋‹ค. HTTP๋Š” IT ์ง€์‹์˜ ๊ธฐ๋ณธ์ด๋ผ ์ •๋ง ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹์„ ์žŠ๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์–ด์จŒ๋“  HTTP๋Š” ํ†ต์‹  '๊ทœ์•ฝ'์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ•ด์ง„ ์–‘์‹์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๋‚ด๊ฐ€ ๊ตฌ๊ธ€๋งํ•˜๋ฉด์„œ ๊ณ„์† ๋ด์™”๋˜ ๊ตฌ์กฐ์˜€๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ทœ์•ฝ์„ ์ง€์ผœ์„œ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. mutipart/form-data๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” HTTP Header์— multipart/form-data๋ผ๋Š” ํƒ€์ž…๊ณผ ๊ณ ์œ ํ•œ ๊ฐ’์ธ Boundary๋ฅผ ํ• ๋‹นํ•ด Body์—์„œ ์‚ฌ์šฉํ•  ๊ฐ’์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ๊ณ , ์ดํ›„ ์•„๋ž˜ HTTP body ๊ตฌ์กฐ๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ๋‚˜ํƒ€๋‚˜๋ฉฐ ์ด๋ฅผ ๋ชจ๋‘ ๋ชจ์•„ ํ•œ ๋ฒˆ์— HTTP body์— ํ• ๋‹นํ•œ๋‹ค.

 
 
 

๐Ÿค” ๊ทธ๋Ÿผ cURL์€ ๋ญ˜๊นŒ?

cURL์ด๋ž€, ๋‹ค์–‘ํ•œ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค. HTTP, HTTPS๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊น HTTP๋ฅผ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๋งŒ๋“  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ HTTP ์–‘์‹๊ณผ ๋‚ด์šฉ์ด ๋น„์Šทํ•˜๋ฉด์„œ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ๋œ ๊ฒƒ์ด๋‹ค.
 
 
 

๐Ÿงš๐Ÿปโ€โ™€๏ธ ๋งˆ๋ฌด๋ฆฌ

์š”์ฆ˜ ์ž์ฃผ ๋Š๋ผ๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ด ๋˜์–ด์•ผ ์‘์šฉ์ด ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. 3rth party๋“  ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋“  ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์—์„œ ์‹œ์ž‘๋˜์–ด ๋งŒ๋“ค์–ด์กŒ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์‘์šฉ๋œ ๊ฒƒ์„ ๋งŒ๋“œ๋Š”๋ฐ ์ง‘์ค‘ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. URLSession๊ฐ™์ด built-in๋œ ๋„๊ตฌ๋“ค์„ ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์ž์ฃผ ์‚ฌ์šฉํ•ด๋ณด๋ฉฐ ๋‚ด๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ๊ฒƒ๋“ค์ด ์™œ ๋ถˆํŽธํ•ด์„œ 3rth party๊ฐ€ ๋‚˜์˜จ๊ฑด์ง€ ์ง์ ‘ ๋Š๊ปด๋ด์•ผ๊ฒ ๋‹ค.
 
 
 

728x90