안드로이드 namespace tools:context란 무엇인가

프로그래밍/Android 관련2018. 2. 24. 17:16

안녕하세요. 개발자 드리머즈입니다.


이번 포스팅에서는 안드로이드 xml에서 namespace가 무엇인지 tool:context가 무엇인지 살펴보겠습니다.


1.namespace(xmlns)란 무엇인가?

안드로이드에서 xml을 통해 레이아웃을 설정하다보면 아래 코드와 같이 tool:context라는 attribute를 볼 수 있습니다.


1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tool="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tool:context=".TestActivity"
    >
cs


먼저 지금까지 궁금했지만 그냥 지나쳤었던 xmlns가 무엇인지 알아보겠습니다. xmlns는 XML name space의 약자입니다.

namespace가 왜 필요한지 비유를 들어보겠습니다. 



컴퓨터에 동일한 이름 food.jpg이지만 서로 다른 내용의 그림 파일2개가 있다고 가정을 하겠습니다. 이 경우 두 그림 파일을 하나의 폴더에 넣으면 동일한 이름 때문에 충돌이 발생합니다. 그래서 파일 이름을 바꾸거나 서로 다른 폴더에 넣어야합니다. namespace를 사용하는 것은 이 두 파일을 서로 다른 폴더에 넣어 충돌을 방지하는 것과 비슷합니다.



안드로이드 레이아웃 xml에서 attribute의 충돌 방지할 목적으로 namespace를 사용합니다. android namespace와 tools namespace 모두 text라는 attribute가 있습니다. 하지만 android:text와 tool:text는 하는 일이 서로 다릅니다. 다들 알다시피 <TextView>에서 android:text는 <TextView>에 나타낼 텍스트를 설정합니다. 그러나 경우에 따라 xml 레이아웃 파일에서 android:text를 설정하지 않는 경우도 많이 있습니다. apk가 실행되면서 동적으로 값이 결정되는 경우가 대표적입니다. 예를 들어 보여주는 데이터가 어느 년/월의 데이터인 지를 의미할 때 <TextView>의 내용은 "2018-02", "2018-01"과 같이 바뀔 것입니다. 이처럼 실제로 apk가 동작될 때 <TextView>가 결정되어 레이아웃 xml에 android:text를 설정하지 않으면 아래 사진처럼 Design 탭에서 레이아웃 미리보기?가 제대로 되지 않습니다.


(물론 어차피 apk가 실행될 때 <TextView>의 text가 설정될 것이기에 android:text 속성을 사용하여 임의로 텍스트를 설정할 수 있습니다. 하지만 이렇게 할 경우 서버로부터 값을 전달받아 <TextView>에 표시해야하는 경우를 생각해보면 서버로부터 값을 전달받기 전까지 임의로 android:text로 설정했던 텍스트가 보여질 것이기에 문제가 될 수 있습니다)


그래서 이 때 사용할 수 있는 tools namespace의 tools:text가 쓰입니다. <TextView>에 tools:text로 텍스트를 설정하게 되면 apk를 실행할 때가 아닌 xml Design 탭에서 레이아웃을 미리보기할 때만 텍스트가 보입니다. 


설명이 길어졌는데 namespace는 이름 충돌을 피하기 위해 사용하는 컴퓨터 파일로 보면 폴더와 같은 개념입니다.


2. xmlns:android="http://schemas.android.com/apk/res/android"

저는 xmlns:android:"http://schemas.android.com/apk/res/android"에서 value에 해당하는 주소값이 왜 필요한지 늘 궁금했었습니다. 몇 가지 간단한 테스트를 해보니 값에 해당하는 주소가 namespace를 구별하는 진짜 이름인 것 같습니다. 따라서 


xmlns:aaa:"http://schemas.android.com/apk/res/android"


위와 같이 namespace를 정의할 수 있습니다. 이렇게 정의하면 aaa:layout_width, aaa:layout_height 등과 같이 prefix로 aaa를 사용해야 합니다.

하지만 아래와 같이 value를 변경할 수는 없습니다.


xmlns:android:"http://schemas.android.com/apk/res/android1232"


value에 해당하는 주소가 실제로 namespace를 구별하는 이름이기 때문입니다. "http://schemas.android.com/apk/res/android1232"라는 namesapce는 존재하지 않습니다.

3.tools:context란 무엇인가?

이제 tool:context가 정확히 어떤 역할을 하는지 찾아봤습니다.


https://developer.android.com/studio/write/tool-attributes.html


위의 구글 안드로이드 디벨로퍼 사이트에 tools:context를 포함한 tool 관련 attribute에 대한 자세한 설명이 있습니다.

tools:context의 값으로 설정가능한 것들은 액티비티들입니다. 현재 작성하고 있는 레이아웃 xml과 관련되어있는 액티비티를 설정하면 됩니다. 이렇게 레이아웃과 관련된 액티비티를 설정하면 이 레이아웃이 어느 액티비티와 관련있는지 알게되어 Design 탭에 미리보기로 그 레이아웃에 적용되어야 하는 theme이 나타나게 됩니다. 또한 만약 andriod:onClick 속성을 사용하는 경우 관련된 액티비티를 알게되어 quickfix를 사용할 수 있습니다. quickfix란 간단하게 xml파일에서 android:onClick의 값으로 사용가능한 함수를 선택할 수 있다는 것입니다. 그리고 만약 설정한 값(함수)가 그 액티비티에 없다면 에러를 발생시켜 미리 알 수 있게 합니다.




4.반드시 사용해야 하는가?

tools namespace에 있는 속성들을 살펴보니 실제 apk가 실행될 때가 아닌 안드로이드 스튜디오의 레이아웃 Design 탭에 보여주는 UI적인 부분과 관련된 것이 많았습니다. apk가 실제 실행될 때 영향을 미치지 않기에 반드시 사용해야하는 것들은 아니지만 이 속성들을 잘 사용하게 되면 개발자가 개발할 때 느끼는 답답함을 줄여줄 것 같습니다. 저도 조금씩 배워서 사용하는 습관을 들여야겠습니다.


작성자

Posted by 드리머즈

관련 글

댓글 영역