๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ‘ฉ‍๐Ÿ’ป TECH

[TECH] Retrofit2 Multipart์‚ฌ์šฉํ•˜๊ธฐ

by yuujoeng 2023. 8. 23.

[ํ‹ฐ๋Œ] ํ‹ฐ๋Œ Retrofit2 Multipart๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์™€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ  ๋ฐ›๊ธฐ
 
์•ˆ๋…•ํ•˜์„ธ์š” ๋Œ์•„์˜จ ํ‹ฐํ”Œ์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ๊น€์œ ์ •์ž…๋‹ˆ๋‹ค :D

 

ํ‹ฐ๋Œ์˜ 3์ฐจ ์—…๋ฐ์ดํŠธ์—๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”๋ฐ์š”.
์˜ค๋Š˜์€์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ Retrofit2์˜ Multipart์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ‘ฉ‍๐Ÿ’ปRetrofit2๋ž€?

Retrofit์€ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ์„œ๋ฒ„๊ฐ„์˜ REST API ํ†ต์‹ ์„ ๋„์™€์ฃผ๋Š” OkHTTP ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ‹ฐ๋Œ ์—ญ์‹œ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ์„œ๋ฒ„ ํ†ต์‹ ์— Retrofit์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Retrofit์˜ ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Volley, AsyncTack)์— ๋น„ํ•ด ๋†’์€ ์„ฑ๋Šฅ
  • Annotaion์œผ๋กœ HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ๋†’์Œ
  • JSON, XML์„ ์ž๋™์œผ๋กœ ํŒŒ์‹ฑํ•ด์ฃผ๋Š” Converter ์—ฐ๋™์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›€

 

Reotrofit

 


๐Ÿ‘ฉ‍๐Ÿ’ปMultipart๋ž€?

Retrofit์„ ์‚ฌ์šฉํ•ด Multipart ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ๋กœ ํ–ˆ์œผ๋‹ˆ Multipart์— ๋Œ€ํ•ด ์•Œ์•„๋ด์•ผ๊ฒ ์ฃ ?

Multipart๋ž€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ HTTP ์š”์ฒญ์„ ๋ฐ”๋””์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ „์†ก ์‹œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ๋•Œ HTTP ๋ฐ”๋”” ๋ถ€๋ถ„์— ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ์ „์†กํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, Multipart ํ˜•์‹์œผ๋กœ ์ „์†กํ•  ์‹œ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ !

 


๐Ÿ‘ฉ‍๐Ÿ’ปRetrofit2 Multipart ์‹ค์Šต

 

๋ณธ๊ฒฉ์ ์œผ๋กœ Retrofit2 Multipart ์‚ฌ์šฉ ๊ณผ์ •์„ ์„ค๋ช…ํ•ด๋ณผํ…๋ฐ์š”,

์•„๋ž˜์˜ ๊ณผ์ •์€ Retrofit2์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์„ธํŒ…์ด ๋งˆ์นœ ์ƒํƒœ์—์„œ ์ด๋ฃจ์–ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์—ผ๋‘ํ•ด์ฃผ์„ธ์š” :)

 

1. ์„œ๋ฒ„ ์š”์ฒญ ํ™•์ธ

๊ฐœ๋ฐœ ์ „ ๋จผ์ € ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •๋ฆฌํ•ด๋‘” API ๋ช…์„ธ์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

id์™€ Content๋Š” ๊ฐ๊ฐ int์™€ Stringํ˜•์œผ๋กœ memoDto์— ๋‹ด๊ธฐ๊ณ , json type์œผ๋กœ ์ง€์ •๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

image๋Š” Mulipartfile ํ˜•์‹์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API ํ†ต์‹  Input

 

2. API Interface ์„ค์ •

๋ช…์„ธ์— ๋งž์ถ”์–ด API ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ค๋‹ˆ๋‹ค.

  • @Multipart ์–ด๋…ธํ…Œ์ด์…˜ : Multipart ์š”์ฒญ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์ •์˜
  • @POST ์–ด๋…ธํ…Œ์ด์…˜ : POST HTTP ์š”์ฒญ์„ "/memo" ์—”๋“œํฌ์ธํŠธ์— ๋ณด๋‚ผ ๊ฒƒ์ž„์„ ์ •์˜
  • fun memo : memo ๋ฉ”์„œ๋“œ๋Š” ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ๋ฐ›์•„์˜ค๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰
  • @Part("memoDto") : ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋กœ, memoDto๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก
  • @Part image : MultipartBody.Part ํ˜•ํƒœ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ „์†ก, ์ด๋•Œ ?๋Š” ์ด๋ฏธ์ง€๊ฐ€ null ๊ฐ’์ผ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ
  • memo ๋ฉ”์„œ๋“œ๋Š” ํ†ต์‹ ์˜ ๊ฒฐ๊ณผ๋กœ ResponseChallengeJoin ํ˜•ํƒœ์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

Android Retrofit Multipart

 

๋”๋ถˆ์–ด memoDto๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ data class๋กœ ์ •์˜ํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

Android data class

 

3. API ์‚ฌ์šฉ

Interface๊ฐ€ ์ •์˜๋˜์—ˆ๋‹ค๋ฉด ์‹ค์ œ API๊ฐ€ ์‚ฌ์šฉ๋  ํŽ˜์ด์ง€์—์„œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

๋จผ์ € ์ „์ฒ˜๋ฆฌ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

  • memoDto์— ๊ฐ๊ฐ string๊ณผ intํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์ฃผ์–ด์•ผํ•˜๋ฏ€๋กœ ํ˜•๋ณ€ํ™˜ ํ›„ JSON ํ˜•์‹์˜ memoDto๋ฅผ ์ƒ์„ฑ
  • Gson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด memoDto ๊ฐ์ฒด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , memoDtoRequestBody ๋ณ€์ˆ˜์— ์ €์žฅ
  • uri ๋ณ€์ˆ˜์— ์ด๋ฏธ์ง€ uri๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น uri์—์„œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  MultipartBody.Part ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
  • ์ด๋•Œ uri ๋ณ€์ˆ˜๊ฐ€ null๊ฐ’์ผ ๊ฒฝ์šฐ null ๊ฐ’์„ ์œ ์ง€

 

์‚ฌ์ „์— ์ •์˜ํ•œ API ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

  • memo ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ „์†ก
  • ์ด๋•Œ, input์€ ์•ก์„ธ์Šค ํ† ํฐ, JSON ํ˜•์‹์˜ memoDto, MultipartBody.Part  ํ˜•์‹์˜ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ
  • ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด enqueue ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฝœ๋ฐฑ ๋“ฑ๋ก
  • onFailure๋ฅผ ์‚ฌ์šฉํ•ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

 

Retrofit API ํ˜ธ์ถœ

 


๐Ÿ‘ฉ‍๐Ÿ’ป ๋งˆ์น˜๋ฉฐ

String์ด๋‚˜ Intํ˜•์„ ์ฃผ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ์ผ๋ฐ˜์ ์ธ Retrofit์˜ ์‚ฌ์šฉ๊ณผ ๋‹ฌ๋ฆฌ Multipart๋Š” ์„œ๋ฒ„์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ํ˜• ๋ณ€ํ™˜์„ ๊ฑฐ์ณ์•ผํ•ด ๊นŒ๋‹ค๋กญ๊ณ , ์ƒ์†Œํ•˜๊ฒŒ ๋А๊ปด์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์˜ ๋ช…์„ธ์„œ๋ฅผ ๊ผผ๊ผผํžˆ ํ™•์ธํ•˜๊ณ  API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ์— ์„ฑ๊ณตํ•˜๋Š” ์งœ๋ฆฟํ•จ์„ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค :D !

 


โฌ‡๏ธ ์ง€๊ธˆ ๊ตฌ๊ธ€ ํ”Œ๋ ˆ์ด ์Šคํ† ์–ด์—์„œ ํ‹ฐ๋Œ ๋‹ค์šด ๋ฐ›๊ธฐ
https://play.google.com/store/apps/details?id=com.team7.tikkle&hl=ko-KR


๐Ÿ“ฉ Contact : yuu-jeong@naver.com
๐Ÿ“ฒ SNS : https://instagram.com/yu.eek