일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- retrofit
- CoroutineScope
- statusbar
- MVI
- 안드로이드
- repositories
- ViewPager2
- mvvm
- Emulator fails to Launch
- Coroutine
- constraintlayout
- LinearLayout
- systembar
- 피그마
- Swiftshader
- Android
- Mocky
- figma
- Rotate
- github
- GPT
- ToyProject
- Kotlin
- php
- compose
- SharedPreference
- AndroidStudio
- TabLayout
- ViewModel
- Backup Manager
- Today
- Total
Kwaang Tech
[API]Mocky 로 가상 API 만들기 본문
Mocky
개발자들이 HTTP 응답을 커스텀할 수 있게 해주는 온라인 서비스입니다. API나 웹 서비스를 개발할 때, 실제 서버의 응답을 모방(mock)하여 테스트할 필요가 있을 때 유용하다.
Mocky 바로가기
1.내가 필요한 Json형식의 코드를 미리 작성한다.
{
"music": [
{
"track": "Oh My Gawd",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/626/oh-my-gawd-1707181251-EF5wcXQo8R.mp3",
"singer": "Crushed Candy",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/626/325x325/oh-my-gawd-1707181249-Jl1tI0gMkM.jpg"
},
{
"track": "SUN",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/618/sun-1706058053-p5vxL6BDnj.mp3",
"singer": "KEELA",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/618/325x325/sun-1706058050-qj9RNmhe7k.jpg"
},
{
"track": "i will be ok",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/613/i-will-be-ok-1705539678-nEoVrMZqCc.mp3",
"singer": "yanvince",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/613/325x325/i-will-be-ok-1705539676-06bP22B49Y.jpg"
},
{
"track": "i Like It With You",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/602/i-like-it-with-you-1705021253-5v1bZv6VfF.mp3",
"singer": "Daniel Levi",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/602/325x325/i-like-it-with-you-1705021252-rYThEJ9s7A.jpg"
},
{
"track": "Vienna (feat. PhiloSofie)",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/595/1703857333_NOc8qBIT2u_01-James-Mercy---Vienna-feat.-PhiloSofie-NCS-Release.mp3",
"singer": "James Mercy, PhiloSofie",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/595/325x325/vienna-feat-philosofie-1703811650-qWKxIlZaMp.jpg"
},
{
"track": "Morning Drift",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/593/morning-drift-1703552453-gnAI12OX2N.mp3",
"singer": "Rameses B",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/593/325x325/morning-drift-1703552451-gbzd0KHYjj.jpg"
},
{
"track": "Heart My Heart",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/581/heart-my-heart-1702342852-bgXrAUrUMT.mp3",
"singer": "intouch",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/581/325x325/heart-my-heart-1702342850-8xXwkVZbO4.jpg"
},
{
"track": "triple no",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/582/triple-no-1702551651-1S59sasB7E.mp3",
"singer": "yanvince",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/582/325x325/triple-no-1702551649-Itmcwr9bkd.jpg"
},
{
"track": "What's The Problem?",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/583/whats-the-problem-1702551656-evxTC7URyG.mp3",
"singer": "OSKI",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/583/325x325/whats-the-problem-1702551653-S6dwHsSBAg.jpg"
},
{
"track": "Talk",
"streamUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/548/talk-1697155275-0hDQxRNuG5.mp3",
"singer": "Daniel Levi",
"coverUrl": "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/548/325x325/talk-1697155272-R5JHzKezL7.jpg"
}
]
}
2. Mocky 사이트로 go
NEW MOCK
을 클릭한다.
- HTTP Response Body 영역에 준비한 Json 내용을 작성 한 후,
GENERATE MY HTTP RESPONSE
를 클릭한다. Mock URL
을 잘 복사 해 둔다.
3. 의존성 추가
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.github.bumptech.glide:glide:4.12.0")
glide
를 사용하여, 이미지도 같이 불러 오기 때문에,glide
도 같이 추가
4. data claas
json 코드에 music 라는 이름으로 리스트 안에 재생목록 정보를 저장했기 때문에 DTO(Data Transfer Object)가 필요하다.
data class MusicDto (
val music: List<MusicEntity>
)
음원 정보를 저장할 MusicModel
data class MusicModel(
val id: Long,
val track: String,
val streamUrl: String,
val singer: String,
val coverUrl: String,
val isPlaying: Boolean = false
)
5. Retrofit 인터페이스
서버로부터 데이터를 가져오는 요청을 하기 위해서 @GET Request 메소드를 작성했다.
GET의 url 로는 위에서 생성한 가상 API url에서 복사 해 둔 https://run.mocky.io의 뒷 부분을 넣어주면 된다.
import retrofit2.Call
import retrofit2.http.GET
interface MusicService {
@GET("/v3/뒷부분")
fun listMusic() : Call<MusicDto>
}
6. 서버에서 가져오기
private fun getVideoListFromServer() {
val retrofit = Retrofit.Builder()
.baseUrl("https://run.mocky.io")
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit.create(MusicService::class.java)
.also {
it.listMusic()
.enqueue(object : Callback<MusicDto> {
override fun onResponse(call: Call<MusicDto>, response: Response<MusicDto>) {
Log.d("PlayerFragment", "${response.body()}")
response.body()?.let { musicDto ->
controller = musicDto.mapper()
setMusicList(controller.getAdapterModels())
playListAdapter.submitList(controller.getAdapterModels())
}
}
override fun onFailure(call: Call<MusicDto>, t: Throwable) {
}
})
}
}
private fun setMusicList(modelList: List<MusicModel>) {
context?.let {
player?.addMediaItems(modelList.map { musicModel ->
MediaItem.Builder()
.setMediaId(musicModel.id.toString())
.setUri(musicModel.streamUrl)
.build()
})
player?.prepare()
}
}
여기서 MusicEntity.mapper는 MusicEntity
객체를 MusicModel
객체로 변환하는 역할
fun MusicEntity.mapper(id: Long): MusicModel =
MusicModel(
id = id,
streamUrl = streamUrl,
coverUrl = coverUrl,
track = track,
singer = singer
)
MusicDto.mapper는 MusicDto
객체를 받아서 PlayerController
객체로 변환하는 역할로, MusicDto
내의 music 리스트를 순회하면서 각 MusicEntity
객체를 MusicModel
객체로 변환한 후, 이를 PlayerController
의 playMusicList
에 할당한다.
즉, MusicDto.mapper()
함수는 MusicDto
객체를 인자로 받아, 그 안에 있는 MusicEntity
객체들의 리스트를 MusicModel
객체의 리스트로 변환한다. 이 변환된 리스트는 PlayerController
객체 내의 playMusicList
로 설정되고, 이 함수는 네트워크로부터 받은 데이터 구조를 애플리케이션에서 사용하기 위한 컨트롤러 구조로 매핑한다.
fun MusicDto.mapper(): PlayerController =
PlayerController(
playMusicList = music.mapIndexed { index, musicEntity ->
musicEntity.mapper(index.toLong())
}
)
인터넷 권한 추가
<uses-permission android:name="android.permission.INTERNET"/>
결과 화면
음원 참고한 사이트
에서 크롤링 하여 만들었습니다.
'Dev > Study' 카테고리의 다른 글
[Android] CoroutineScope와 launch 함수 (1) | 2023.11.23 |
---|---|
[Android] Kotlin으로 안드로이드 스레드(Thread)사용하기 (0) | 2023.10.30 |
ViewModel에서 View의 특정타입(Button,ListView 등)을 직접적으로 참조를 하지 않는 이유 (0) | 2023.09.19 |
MVC, MVP, MVVM, MVI (7) | 2023.09.14 |
[Android] ViewPager2 사용법과 TabLayout 적용해보기 (3) | 2023.09.04 |