728x90
블로그에 지난 졸업프로젝트에서 했던 주요 기능부분을 기록으로 남기려고한다.
조금? 오랜 시간이 지났지만 기억을 되살려서 기록을 해보자.
졸업 작품에서 이미지와 관련된 기능을 구현하다보니 이미지들을 가져오거나 서버측으로 이미지를 보내줘야하는 상황이 발생하였고, 이를 해결하기 위해서 MultiPart란 것을 사용하게 되었다.
MultiPart란 무엇인가?
- 멀티파트는 클라이언트와 서버 간에 전송되는 HTTP 요청 또는 응답에서 여러 종류의 데이터를 동시에 전송하기 위해 사용되는 방식이다.
- 일반적으로 파일 업로드와 관련된 데이터를 전송하는데 주로 사용된다.
- HTTP 프로토콜은 기본적으로 텍스트 기반의 요청과 응답을 처리한다. 하지만 파일과 같은 이진 데이터를 전송해야할 때는 이진 데이터를 텍스트 형식으로 인코딩하는 것이 비효율적이고 제한이 있다. 멀티파트는 이러한 이진 데이터를 인코딩하지 않고 원본 형식으로 전송할 수 있도록 해준다.
- 멀티파트 요청은 'Content-Type' 헤더에 'multipart/form-data'값을 가지며 여러개의 파트(part)로 구성된다. 각 파트는 개별적인 데이터 조각으로 파일이나 텍스트 데이터 등을 포함할 수 있다. 각 파트는 헤더와 본문(body)으로 구성되어 있으며 헤더에는 파트의 메타 데이터가 포함되어 있고 본문에는 실제 데이터가 포함된다.
- 멀티파트 요청을 처리하기 위해서는 서버 측에서 멀티파트 데이터를 파싱하고 해석하는 로직이 필요하다. 일반적으로 멀티파트 요청을 처리하는 라이브러리나 프레임워크를 사용하여 멀티파트 데이터를 추출하고 처리한다.
MultiPart를 통해서 Android로 받거나 보내기
우선적으로 Android Studio에서 인터넷 권한을 설정하자.
Menifest 파일에 권한을 추가하고
<uses-permission android:name="android.permission.INTERNET" />
Gradle에서 Retrofit의존성을 주입한다.
// Retrofit2
// retrofit_version = "2.9.0"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.2'
implementation 'com.google.code.gson:gson:2.9.0'
실제 프로젝트에서는 아래와 같이 작성을 하였다.
@Multipart
@POST("/exchange/post")
suspend fun createExchangePost(
@Part("exchangePostDTO") requestBody: RequestBody,
@Part images: List<MultipartBody.Part?>
): Response<ResponseBody>
위 코드는 Kotlin에서 Retrofit을 기반으로 MultiPart를 사용한 것이다.
@POST("/exchange/post")는 서버의 엔드포인트를 나타낸다. 이 경우 "/exchange/post" 경로로 재능교환 포스팅을 POST 요청을 통해서 서버로 저장하기위해서 요청하고 있다.
suspend fun createExchangePost(...)은 코루틴을 지원하는 함수로, 비동기적인 작업을 수행할 때 사용된다. Retrofit에서는 코루틴을 통해 네트워크 요청을 처리할 수 있다.
이 함수는 두 개의 매개변수를 가지고 있다.
- @Part("exchangePostDTO") requestBody: RequestBody: 이는 텍스트 기반의 데이터를 나타내며, "exchangePostDTO"는 해당 파라미터의 이름이다. 일반적으로는 서버에서 요구하는 데이터를 담는 역할을 한다.
- @Part images: List<MultipartBody.Part?>: 이는 이미지 파일을 나타내며, MultipartBody.Part 형식의 리스트로 전달된다. 이 리스트는 여러 개의 이미지를 동시에 전송할 수 있도록 해준다.
마지막으로, 함수는 Response<ResponseBody>를 반환한다.
728x90
'Android > Study' 카테고리의 다른 글
[Android] 로그인 기능 구현 (3) - ViewModel (0) | 2024.01.21 |
---|---|
[Android] ktlint, detekt를 적용해보기 (0) | 2024.01.20 |
[Android] 로그인 기능 구현 (2) - UiState (0) | 2024.01.14 |
[Android] View가 그려지는 순서 (0) | 2024.01.13 |
[Android] Activity 생명 주기(Life Cycle) (0) | 2024.01.13 |