개발 디렉터리와 파일 구조

SO__OK·2022년 11월 13일
0
post-thumbnail

2. 앱의 디렉터리와 파일

안드로이드 스튜디오에서 앱을 개발하면 실제 많은 디렉터리와 파일이 만들어 진다. 하지만 대부분 개발자와 관련이 없으며, 안드로이드 스튜디오 내부에서 빌드 작업 등을 목적으로 사용된다. 이곳에서는 개발자가 알아야 하는 디렉터리와 파일을 소개하려 한다.

위 그림은 안드로이드 스튜디오의 탐색 창이다. 내가 했었던 프로젝트 파일을 가져 온 것이며 파일명을 Mission1으로 지정하였다. 안드로이드 앱을 개발하려면 이 디렉터리와 파일이 각각 어떤 역할을 하는지 이해해야한다.

AndroidManifest.xml : 앱의 메인 환경 파일
java/Mission1.java : 화면 구성을 위한 액티비티 컴포넌트로 실제 이 파일이 수행되어 화면에 UI가 출력된다.
res : 앱의 모든 리소스 파일은 res 폴더 하위에 위치한다.
res/drawable : 리소스 중 이미지 파일을 저장하기 위한 폴더이다.
res/layout : 리소스 중 UI 구성을 위한 레이아웃 XML 파일을 위한 폴더이다.
res/mipmap : 리소스 중 앱의 아이콘 이미지를 위한 폴더이다.
res/valuse : 리소스 중 문자열 값 등을 위한 폴더이다.

앱의 메인 환경 파일은 AndroidManfest.xml 이며, 이곳에 정의된 대로 앱이 실행된다. 개발자는 AndroidManfest.xml 파일을 열어 분석하거나 수정하면서 앱을 개발한다. 또한, 개발자가 작성하는 모든 자바 파일(컴포넌트 자바 파일 포함)은 java 폴더에 위치하며, 모든 리소스 파일은 res 하위 폴더에 위치한다.

R.java의 이해

안드로이드 앱을 작성할 때 많은 리소스 파일을 이용한다. 모든 리소스 파일은 res 폴더 하위에 있어야 하며, 이름이 지정되어 있어 개발자 임의로 이름을 추가할 수 없다. 또한, 각 폴더의 서브 폴더를 만들 수 없다.
하지만 개발을 하다보면 수백 개의 리소스가 만들어지는데, 코드 영역에서 이를 식별할 방법이 필요하다.
이를 도와주기 위한 파일이 R.java 이다. R.java 파일은 툴이 자동으로 만들어주며, 이 파일을 열어보면 단순하게 int형 변수만 선언되어 있다.
개발자가 만들지도 않은 파일을 열어서 수정하는 것도 아니라서 개발시 R.java 파일을 분석하지도 않는다. 그러나 R.java 파일을 중심으로 리소스가 어떻게 관리되는지, 어떠한 역할을 하는지는 안드로이드 학습 초반에 정리해 두면 좋다.

3. 그레이들(gradle) 파일

앱을 개발할 때 테스트를 진행하거나 개발이 완료된 후 사용자에게 배포하려면 빌드 작업이 필요하다. 앱에 포함된 리소스와 자바 코드를 컴파일하고 준비된 키로 서명해서 배포용 파일인 APK 파일을 추출해야 한다.
안드로이드 스튜디오에서는 이 모든 작업을 그레이들(gradle) 이라는 도구를 이용한다.

개발자는 build.gradle 파일에서 그레이들 관련 설정을 할 수 있는데, 그레이들 파일은 위 그림 처럼 'Gradle Scripts' 영역에 있다.
그레이들 파일은 크게 프로젝트 수준과 모듈 수준으로 구분된다.
안드로이드 스튜디오에서는 앱이 모듈 단위이며, 여러 모듈을 묶어서 관리하기 위한 개념이 프로젝트 개념이다. 프로젝트 수준의 그레이들 파일은 전체 프로젝트를 위한 설정이며, 모듈 수준의 그레이들 파일은 각 모듈을 위한 설정 파일이다. 모듈 하나당 하나의 그레이들 파일이 만들어 진다.

settings.gradle

위 그림의 settings.gradle 파일은 그레이들에 모듈을 포함하여 스레이들이 모듈을 관리하고 빌드하게 설정하는 파일이다.

include ':app'

settings.gradle 파일을 열어보면 위의 코드처럼 그레이들이 관리하고 빌드해야 하는 모듈이 등록되어 있다.
프로젝트에 여러 모듈을 만들어 개발하면 모듈을 만들 때마다 모듈명이 자동으로 settings.gradle에 포함되므로 개발자가 직접 조정하는 일은 많지 않다.

프로젝트 수준의 그레이들

프로젝트 수준의 그레이들 파일은 안드로이드 참색 창에서 'Gradle Scripts' 영역의 최상위에 있는 build.gradle로, 옆에 프로젝트명이 표시된 파일이다.
이 파일은 모든 모듈을 위한 최상위 설정을 목적으로 한다.

build.gradle은 위처럼 작성된 파일인데, 대부분 모듈 수준의 그레이들 파일 설정이 자주 이루어지며, 프로젝트 수준의 그레이들 파일 설정은 비번하지 않다.

모듈 수준의 그레이들

개발자가 스레이들을 설정한다면 대부분은 모듈 수준의 그레이들 파일이다.

위의 파일은 모듈 수준의 그레이들 파일이며, 이곳의 설정은 모듈을 개발하고 빌드할 때 아주 중요한 역할을 한다.

∙ compileSdkVersion : 사용하는 컴파일러 버전
위의 설정은 빌드 시 이용되는 툴 버전 정보이다. 모듈 생성 시 기본으로 설정된 값을 사용하지만, 때에 따라 외부에서 작성된 코드를 안드로이드 스튜디오에 불러와서(import) 사용하는 경우, 위의 정보가 맞지 않아 빌드가 안 될 때가 있다. 이럴 때는 그레이들 파일을 수정하여 설치된 툴 버전을 명시하거나 SDK 매니저를 이용하여 맞는 버전의 툴을 추가 설치해야 한다.

∙ application "com.example.myapplication"
∙ minSdk
∙ targetSdk
∙ versionCode

위의 4가지 설정도 중요하다.

applicationId는 앱의 식별자 정보를 설정하는 곳이다. 안드로이드 앱은 특정 키로 식별되지 않고, 개발자가 그레이들 파일에 applicationId 속성으로 지정한 문자열로 식별한다. 개발의 임의의 문자열이지만, 앱의 식별자이기 때문에 유일무이해야 한다.

minSdk는 개발자가 이 앱을 몇 버전의 스마트폰까지 지원할 것인지에 대한 설정이다. 위의 그림에서 API Level이 25인데 이는 Android 7.0을 지칭하며, 앱이 이 버전까지 지원한다는 의미이다.

targetSdk은 개발 시 이용하고 있는 라이브러리 버전이다. 위에는 31로 지정되어 있으며 31버전의 라이브러리로 개발하겠다는 의미이다.

versionCode는 앱의 버전 정보이다. 스마트 폰 앱들은 수시로 버전이 업데이트되므로 앱을 사용자에게 서비스하는 도중 앱이 업데이트되면, 이 정보를 변경하여 다시 구글 play 스토어에 등록하면 된다.

그레이들 파일에서 개발자가 가장 많이 변경하는 부분이 dependencies이다.
앱을 개발하면서 표준 라이브러리와 다양한 외부 라이브러리를 사용하게 되는데 이를 앱에서 이용하기 위해서는 꼭 그레이들 파일의 dependencies에 등록해 주어야 한다.

4. Hello World 앱 코드 분석

AndroidManifest.xml
AndroidManifest.xml은 앱의 메인 환경 파일이다.
개발자가 AndroidManifest.xml 파일을 열어 분석하고 수정하는 작업은 빈번하게 이뤄지며, 앱이 스마트폰에서 동작할 때도 이 파일에 정의된 대로 동작한다.

AndroidManifest.xml 파일에서 각 구성요소의 의미를 살펴보자.

package="com.example.helloworld"
앱의 식별자 정보이다. 이 정보로 앱을 식별한다. 그레이들 파일에 설정된 applicationId의 값과 같으며 값은 유일무이해야 한다.

application
앱의 구성요소를 등록하기 위한 태그이다.
안드로이드 앱은 컴포넌트 기반의 개발이다. 안드로이드 컴포넌트 클래스는 개발자 클래스이지만, 생명주기를 안드로이드 시스템이 관리한다. 따라서 컴포넌트 클래스들은 AndroidManifest.xml에 등록해야 하며, application 태그의 하위 태그로 등록한다.

android:icon="@mipmap/ic_launcher", android:label="@string/app_name"
application 태그에 등록된 속성으로, 사용자 스마트폰에 앱이 설치되었을 때 앱의 아이콘 이미지와 앱의 이름을 명시하기 위한 속성이다.
XML 속성값이 @로 지정되었다는 건 res 하위 폴더의 리소스들을 지칭한다.

activity android:name="MainActivity"
앱의 액티비티 컴포넌트를 등록하기 위한 태그이다. 위의 AndroidManifefst.xml 파일에는 activity 태그가 하나만 등록되어 있으므로 이 앱은 하나의 액티비티로 구성된 앱이다. 또한 서비스, 프로바이더, 리시버 컴포넌트가 있다면 service, provider, receiver 태그로 등록해 주어야 한다.
activity 태그에 액티비티를 등록할 때 name 속성은 생략할 수 없으며, name 속성은 등록하고자하는 클래스명을 명시하기 위한 속성으로 위의 코드는 MainActivity라는 클래스를 액티비티로 등록하는 구문이다.

intent-filter
intent-filter을 자세히 이해하기 위해서 다음 포스터에 상세하게 기재하려 한다. 이 곳은 간단하게 사용자가 앱의 아이콘을 클릭했을 때 실행되는 액티비티를 설정하는 용도로 이해하고 넘어가면 된다.

MainActivity.java

사용자가 앱을 클릭했을 때 실행되는 액티비티 클래스이다. 즉, 화면을 구성을 주목적으로 하는 클래스이다.

액티비티 클래스들은 Activity를 상속받아 작성하는데, 위의 코드는 AppCompatActivity를 상속받아 작성하였다. 액티비티가 실행되면 자동으로 onCreat() 함수가 호출되는데, 이 함수의 setContentView() 함수가 화면 출력 함수이다. R.layout.activity_main을 매개변수로 지정하였으므로 res/layout.activity_main.xml의 구성대로 액티비티 화면이 출력된다.

✏️ 오늘 2개의 포스터를 올렸는데 이제 이론을 막 벗어나서 너무 후련하다.. 이렇게 작성한게 누군가한테 꼭 도움이되었으면 좋겠다. 앞에 내용은 공부한지 오래되서 표면적인 의미만 기억하고 있었는데 다시 한번 정리하며 읽어보니 꽤 유익한 정보를 얻을 수 있었다. 내일은 전에 만들었던 기본적인 앱에 대해 다뤄 볼 생각이다. 일이 끝나고 작성해야 해서 새벽 쯤에야 올릴 수 있을 듯 하다.

profile
찌끄레기 코딩

0개의 댓글