Kwaang Tech

[API]Mocky 로 가상 API 만들기 본문

Dev/Study

[API]Mocky 로 가상 API 만들기

콰앙 2024. 2. 7. 21:07

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 객체로 변환한 후, 이를 PlayerControllerplayMusicList에 할당한다.
즉, 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"/>

결과 화면

 

음원 참고한 사이트

https://ncs.io/

 

NCS (NoCopyrightSounds) - Free Music for Creators

NCS is a copyright-free record label and music platform dedicated to connecting creators and artists through music to build careers.

ncs.io

에서 크롤링 하여 만들었습니다.

반응형