OpenApi Generator in Android

Kim, Sujin·2023년 10월 10일
1

OpenApi Generator

목록 보기
1/2
post-thumbnail

OpenApi Generator in Android

우테코 내의 플랫폼 근로 활동을 하며, code generator을 활용하자는 의견이 나왔습니다.
그에 따라, Android에서 어떻게 시작하고 활용할 수 있을지, 사용하기에 적절한지를 알아보기 위해 다음과 같은 실습을 진행했어요!

연습한 코드 저장소: 링크

OpenApi Generator 공식문서에서 제공하는 실습용 petstore.yaml을 이용하였으며,

Android Studio Giraffe | 2022.3.1 에서 진행하였습니다.

안드로이드에서 OpenApi Generator 시작하기

1. openapi-generator-cli 설치하기

  • (맥 기준) 터미널에서 brew install openapi-generator 을 실행해줍니다.

2. 안드로이드 프로젝트 및 gradle 설정하기

서버 개발자로부터 받은 api .yaml 파일을 프로젝트 내의 경로에 넣어줍니다.

이후, gradle을 다음과 같이 설정해주세요.

// build.gradle.kts (project 모듈)
plugins {
    ...
    id("org.openapi.generator") version "7.0.1" apply true
}

buildscript {
    repositories {
        maven(url = "https://repo1.maven.org/maven2")
    }
}

tasks.register(
    "generateClient",
    org.openapitools.generator.gradle.plugin.tasks.GenerateTask::class,
) {
    generatorName.set("kotlin")
	// .yaml 파일이 위치하는 경로
    inputSpec.set("$rootDir/specs/petstore-v3.0.yaml")
    // generate된 코드가 위치할 경로 
    outputDir.set("$rootDir/network")
	// genertate된 코드가 가질 상위 경로
    packageName.set("com.example.network")
    apiPackage.set("com.example.network.api")
    modelPackage.set("com.example.network.model")
    invokerPackage.set("com.example.network.invoker")
    // 설정하기
    // 프로젝트 설정에 맞는 library 선택 (하단 링크>공식문서 참고)
    configOptions.set(
        mapOf(
            "library" to "jvm-retrofit2",
            "dateLibrary" to "java8",
            "omitGradleWrapper" to "true",
            "sourceFolder" to "src/main/java",
            "useCoroutines" to "true",
        ),
    )
}

(이 링크에서 library를 참고하세요!)

4. run generateClient

gradle>Tasks>other>generateClient 를 실행해주세요.

4. 생성된 코드 모듈 분리하기

다음과 같이, 지정해준 경로 (rootDir/network)에 코드가 생성됨을 알 수 있습니다.

다만, 아직 모듈화가 되지 않은 상태로 존재하는데요.
방법은 간단합니다!
settings.gradle.ktsinclude(":network") 를 추가해주세요.

5. build 오류 해결

위의 과정을 거친 후 build를 하면, network 모듈의 gradle에서 오류가 발생하는데요.

사실 위의 코드를 지워주는 것으로 해결이 됩..니다.
(이유를 찾아봐도 모르겠네요 ㅠㅠ 아시는 분 계시다면 공유 부탁드려요..!)
(2023/10/24 update)

// setting.gradle.kts
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

repositoriesMode는 다음과 같이 세 종류가 있는데요,
FAIL_ON_PROJECT_REPOS (default)
PREFER_PROJECT
PREFER_SETTINGS
이 중에서 PREFER_SETTINGS로 설정해주면 오류가 발생하지 않습니다.


위의 5단계를 거치면, 아주 간단하게 api 명세에 맞추어 코드들이 생성되고
app에서 바로 그 코드를 사용할 수 있습니다 :) (짝짝)

// 요로코롬 말이죠 !
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val pet = Pet(
            "jiny",
            listOf("https://get.pxhere.com/photo/nature-grass-flower-wildlife-kitten-cat-mammal-fauna-close-up-whiskers-vertebrate-domestic-cat-macro-photography-young-cat-red-mackerel-tabby-red-cat-cat-baby-wild-cat-small-to-medium-sized-cats-cat-like-mammal-634099.jpg"),
        )
        ApiClient().createService(PetApi::class.java).addPet(pet).enqueue(object : Callback<Pet> {
            override fun onResponse(call: Call<Pet>, response: Response<Pet>) {
                Log.d("ssuu", "onResponse: ${response.body()}")
            }

            override fun onFailure(call: Call<Pet>, t: Throwable) {
                Log.d("ssuu", "onFailure: ${t.message}")
            }
        })
    }
}

고려할 점 & 아쉬운 점

자동으로 생성된 코드들은 정말 편리하게 느껴지고 참으로 신기하죠!
다만, 바로 사용하기엔 아쉬운 점들이 보이고 많은 비용이 들 것으로 예상되는데요. (공부가 더 필요하다는 얘기,,,)

코드를 처음 생성하고 빌드를 하면, 다음과 같은 오류가 발생했어요.

org.apache.oltu.oauth2.common.Xxxx
org.apache.oltu.oauth2.client.Xxxx
위의 두 패키지로부터의 클래스가 중복된다는 오류가 발생합니다.

network gradle에서 implementation "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.2" 를 주석처리해주면, 위의 문제는 해결할 수 있습니다.
다만, 위의 라이브러리를 사용하는 부분에서는 당연히 오류가 발생하겠죠 :)


이번 실습을 진행할 때는, 위의 오류와 관련된 코드들을 주석처리하고 진행하고,
기본적인 기능들이 수행되는지만 볼 수 있도록 테스트를 했어요.
하지만 이러한 오류들을 모두 해결하고 코드를 수정하기에는 많은 비용이 들 것 같아요.

💡 또는 gradle에서 task를 이용하여 필요없는 파일들은 생성되지 않도록 하는 방법도 추가적으로 찾아봐야겠어요!
(api, model 파일만 생성할 수 있어도...!?)


또한, 코드들에 수많은 주석이 있고 깔끔하지 못한 모습이에요.
코드 제너레이터 기능을 통하여 api service, model (data class)도 만들어지고,
위에서 언급한 oauth 관련 코드들과
수많은 Adapter를 포함한 infrastructure 코드도 함께 만들어집니다.

다만, 코드 내에 많은 주석들이 포함되어 있고, 가독성이 좋지 못해요.
api 명세가 수정되는 경우, 다시 generate하는 것도, 파일을 직접 수정하는 것도 번거로울 것으로 보여요.

결론

허둥지둥 결론을 내려보자면,
code generator는 굉장히 편리하게 느껴지는 기능입니다.
다만, 아직 실제로 사용하기에는 오류 사항들도 있고 안정적이지 못한 것 같아요.
기능들이 많이 보완되고, 추가적인 학습을 통해 편리한 사용법을 찾게 된다면
더없이 편리한 기능이 될 것 같네요 ! :)

이번 근로 활동에서는, RDD (낭만 주도 설계) 를 할 예정이므로 (^^)
code generator + ktor를 사용해볼 계획입니다.
그럼,, 다음 시리즈를 기대해주세요. 뿅,,

참고 자료

https://docs.gradle.org/current/javadoc/org/gradle/api/initialization/resolve/RepositoriesMode.html
https://jaeryo2357.tistory.com/110

0개의 댓글