Uing? Uing!!

[안드로이드 팁] public.xml: 라이브러리 리소스 숨기기 본문

Android

[안드로이드 팁] public.xml: 라이브러리 리소스 숨기기

Uing!! 2021. 10. 20. 02:53
반응형

라이브러리와 리소스

안드로이드 라이브러리를 개발할 때에는 리소스와 관련해서 신중하게 접근할 필요가 있다.

앱에서 라이브러리를 implementation했을 때, 라이브러리에서 정의한 리소스명들이 그대로 노출 및 사용되기 때문이다.

이때 라이브러리 내부의 리소스와 실제 앱 개발 작업이 직접적으로 엮이는 부분은 두 가지가 있다.

 

1) 앱과 라이브러리에 동일한 이름을 갖는 리소스가 있다면, 라이브러리의 리소스는 무시된다.

2) 앱 개발 중 라이브러리의 color, string 등 리소스가 자동완성 등에 직접 노출되고, 실제로 사용할 수도 있다.

 

1번의 경우 간단한 이야기이지만 이 포스팅의 논점은 아니니 다른 포스팅에서 다루는 것으로 하고,

2번이 일어나는 이유는 라이브러리 내부의 모든 리소스는 기본적으로 공개되기 때문이다.

아래는 라이브러리의 리소스가 공개되어 있어서 혼동이 생기는 대표적인 경우이다.

자동완성에 라이브러리의 리소스가 잡히는 경우, 실제로 라이브러리 리소스가 앱에서 활용된 경우.

이 예시에서는 라이브러리의 cancel에 library_라는 prefix가 있기 때문에 그나마 큰 혼동 없이 적용할 수 있겠지만,

만일 라이브러리의 리소스 이름이 alert_cancel 이었다면 어떨까? 

앱과 라이브러리의 리소스 이름이 헷갈리는 경우, 헷갈리는 리소스 이름 중 라이브러리의 것이 활용된 경우.

cance까지 쳤을 때 cancel과 alert_cancel이 동시에 나오니, 어떤 것이 실제 의도와 맞는지 혼란스럽다.

오른쪽 이미지처럼 실제로 라이브러리의 리소스가 적용된 경우에는 더 난감한 것이, 나중에 다른 사람이 이 코드를 보았을 때에도 앱에서 의도한 cancel 문구가 사용되지 않았다는 것을 알아차리기 어렵다.

 

이 상황에서 alert_cancel이라는 스트링을 가진 라이브러리가 버전을 업데이트하며 alert_cancel의 문구를 '취소'에서 '종료'로 바꿨다고 하자.

같은 리소스를 사용하는 이 앱이 라이브러리 버전을 업데이트하게 되면, 갑자기 취소 버튼이 '종료'라는 문구로 바뀔 것이다.

그리고 개발자는 왜 갑자기 버튼의 텍스트가 바뀌었는지를 이해하기 위해 레이아웃 파일을 들여다 보면서 '아..! 라이브러리의 것을 가져다 썼구나'하고, 그제서야 상황을 이해하게 될 것이다.

 

이런 상황을 방지하기 위해서, 라이브러리에서는 꼭 공개해야 하는 리소스를 제외하고는 숨기는 것이 좋다.

public.xml

'꼭 공개해야 하는 리소스를 제외하고는 숨기는 것이 좋다'라고는 했지만, 

실제로 이를 적용하는 방식은 '모든 리소스를 숨기되 꼭 공개해야 하는 리소스만 공개한다'에 가깝다.

 

라이브러리 리소스를 숨기기 위해서는 public.xml이라는 파일을 사용한다.

이 xml 파일 내부에 공개할 리소스를 지정하면, 지정되지 않은 리소스들은 자동완성에서 제외된다.

public.xml의 작성 방식은 간단하다.

 

1) res/values 폴더 안에 public.xml 파일을 생성한다.

 

2) public.xml에서 공개할 리소스를 지정한다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public name="library_cancel" type="string"/>
</resources>

 

이렇게 public.xml을 작성한 버전을 배포하면, 라이브러리를 사용하는 앱에서도 버전을 업데이트해야 리소스 숨기기가 적용된다. 

라이브러리 버전을 업그레이드했다면, 이전의 캐시가 남아 있을 수 있으므로 invalidate caches & restart 하는 것이 좋다. (라이브러리를 최초로 implementation하는 상황이라면 이 과정은 필요 없다.) 

 

 

이렇게 설정하고 나면, public으로 설정한 libary_ok 외에는 더이상 레이아웃의 자동완성에 표시되지 않는다.

더 이상 libary_cancel이 표시되지 않음

 

주의사항

public.xml을 통해 리소스를 숨기는 방식에는 두 가지 허점이 있다.

 

1) 앱 내 레이아웃 상에서의 자동 완성은 막아주지만, 코드 상에서 (패키지명).R.(리소스타입).(리소스명) 의 방식으로 작성하는 경우에는 자동완성을 막아주지 않는다.

코드에서 작성할 경우에는 자동완성이 숨겨지지 않음

2) 자동완성에서 보이지 않을 뿐, 전체 리소스명을 자동완성 없이 직접 타이핑하면 레이아웃에서 활용할 수 있다.

library_cancel은 숨겨져 있지만, 전체 타이핑하면 사용 가능함

 

결국 public.xml의 역할은 '라이브러리를 참조한 앱 내 레이아웃에서 라이브러리 리소스가 자동완성되는 것을 방지하는 용도'라고 볼 수 있겠다.

이렇듯 모든 것을 막아주지는 못하지만, 최소한 public.xml으로 레이아웃 자동완성이라도 막아 주면 라이브러리를 활용하는 개발자 입장에서는 훨씬 편리해진다.

 

* 혹시 위 두 가지 한계를 극복하는 방법을 알고 계시는 분은 댓글로 남겨주시면 감사하겠습니다. ㅠ.ㅠ

 

반응형
Comments