# 상황
회사에서 진행하게되는 프로젝트에서 안드로이드 App을 개발해야하는 업무를 마주하게 되었다.
고객사의 업무시스템을 웹으로 개발 진행중인게 있는데, 웹과 동일한 화면을 앱에서도 지원하면되기 때문에
웹뷰앱을 만들면되는 간단한 프로젝트라고 볼 수 있었으나, 회의에 회의가 진행된 결과
특정 업무기능들이 오프라인에서도 지원되어야한다는 것이다.
(앱을 사용하는 실사용자들이 음영지역에 있을 경우가 많다고 한다.)
결국 첫 로그인시 당일에 해당 사용자가 업무를 진행하면서 조회하는 페이지들의 데이터를
미리 받아놓고 sqlite3와 같은 로컬 DB에 저장했다가
그런데 그 업무기능들을 사용해야하는 페이지들이 상당히 많고, 복잡한 구조로 되어있었다.
결국 필요한 것은 Spring boot + vue 조합으로 개발된 웹프로젝트의 코드를 80% 이상 그대로 사용할 수 있는
개발환경을 세팅하는 것이 주된 목표였다.
# 핵심 목표
- Controller, Service 로직을 최대한 그대로 안드로이드 앱으로 가져온다.
- REST API 방식을 유지하여 Vue 프론트엔드 코드의 변경을 최소화한다.
#Trial 1 : Spring Boot + Jetty 임베딩 실패
가장 먼저 시도한 것은 웹 프로젝트 환경과 똑같은 Spring Framework와 Jetty Embedded Server를 안드로이드 앱에 띄워보는 것이었다.
| 시도 방식 | Gradle 설정 (실패) |
| Spring + Jetty | org.springframework:spring-core, org.springframework:spring-webmvc, org.eclipse.jetty:jetty-server 등 추가 |
💥 CRITICAL ERROR: java.beans 패키지 부재
실행 직후, 앱은 java.beans 패키지를 찾을 수 없다는 치명적인 오류를 만났다.
"이건 단순 필요한 jar등을 이식해줘서 해결할 수 있는 문제가 아니였다. 안드로이드 **ART(Runtime)**에서 의도적으로 제거한 JDK 코어 라이브러리에 Spring이 의존하고 있는 문제였으며. 외부 JAR을 강제로 넣어도 해결 불가능한 플랫폼 제약이었다."
Spring의 DI 컨테이너는 Bean 분석 시 java.beans.Introspector를 필수적으로 사용하며, 모바일 환경 최적화를 위해 이 패키지를 제거한 Android 개발환경에서는 해결이 어려워보였고 만약 가능하다고 해도 시간이 너무나 많이 소요될 것으로 보였다.
#Trial 2: NanoHTTPD와 '로직'만의 재활용 전략
Spring을 포기하고, 순수한 Java 기반의 경량 서버인 NanoHTTPD를 대안으로 선택하였다.
Spring에서 지원하는 몇몇 Annotation들을 제거하면 코드를 거의 그대로 사용할 수 있고, Android와 호환성도 좋으면서
Jetty보다 훨씬 더 경량화된 http 서버를 앱 내부에서 띄울 수 있게되어 성능상의 문제도 줄일 수 있을 것이라는 결론이었다.
# 남아있는 숙제 : DB 및 Mapper
웹프로젝트에서는 약 4개의 DB가 연결되어있고 대충 400개정도의 테이블을 사용하는 방대한 프로젝트이다.
물론 오프라인에서 지원해야하는 페이지에서 사용되는 테이블을 50개정도만 사용한다지만
Mapper에 작성된 쿼리라던지 프로시저 등이 많고, 게다가 연결된 DB가 Oracle 3개, MariaDB 1개 이며
표준 SQL 형태로 작성되어있는 것도 아니라서, Sqlite3를 사용하는 로컬 DB에서는 결국 이러한 쿼리들을 마이그레이션하는 작업이 가장 고된 작업이 될 것으로 보인다.
'Android' 카테고리의 다른 글
| AGP(Android Gradle Plugin)이란? (0) | 2025.11.11 |
|---|---|
| [Android] - @JavascriptInterface에 대해서 (0) | 2025.11.04 |
| Android.Manifest 클래스에 대해서 (0) | 2025.10.23 |
| [Android] - AppCoimpatActivity 클래스에 대해 (0) | 2025.10.21 |
| [Kotlin] - companion object (0) | 2025.10.21 |