[Android] Asset vs Row vs Resource

0
post-thumbnail

Json, Text, mp3,pdf 같은 파일들을 우리는 assets 폴더와 res/raw 폴더에 저장하곤 합니다.

하지만 둘다 파일 접근이 가능하죠.

// From assets
assets.open(assetPathFilename)
// From res/raw
resources.openRawResource(resourceRawFilename)

그렇다면 과연 어디에 저장하는것이 좀더 좋을까요?

1. 유연한 파일명은 어떤 폴더?(Assets 가능)

assets 폴더는 공백과 대문자를 원하는대로 지정할 수 있습니다.

하지만 raw폴더는 소문자, az, 0-9, 밑줄만 포함될 수 있습니다.

assets -> GO NHN FORWARD.pdf

raw -> go_nhn_forward.pdf

2. 하위 폴더 분류가 가능한가? (Assets 가능)

assets 폴더는 하위폴더를 분류하면 확인할 수 있습니다.

반면에 raw 폴더는 root에 존재해야만 합니다.

3. 런타임 때 파일이름 가져오기 (Assets 가능)

assets폴더는 list()를 통해 파일 이름을 가져올수 있습니다.

assets.list(FOLDER_NAME)?.forEach { 
    println(it)
}

하지만 raw폴더는 파일이름을 나열할 수 없습니다.

4. 컴파일 파일 여부 체크 (Raw 가능)

assets은 문자열을 필요로 하기때문에, 없을경우 catch문이 필요합니다.


runcatching{
assets.open("filename")
}

하지만 raw일경우, identifier명을 필요로 하기 때문에 반드시 파일이 있어야 합니다.

resources.openRawResource(R.raw.filename)

5. 대체 리소스 (Raw 가능)

버전별로 파일이 분기처리 될수도 있습니다.
예를들어 API 29인경우, 다른 PDF나 mp3를 사용해야할수도 있습니다.

assets은 수동으로 이것을 해결해야합니다.

반면에 raw일 경우, 폴더를 분리함으로써 기종별 리소스를 변경할 수 있습니다.

6. XML에서 액세스 가능 (Raw 가능)

XML에서 assets에 있는 파일을 접근하기가 쉽지 않습니다.

반면에 raw@raw/filename을 통해 쉽게 접근이 가능합니다.


서로 장단점이 있으니 아래의 표를 보고 상황에 맞춰 선택하면 될것 같습니다.

번외) res vs resource

localTest를 할때, 우리는 local json 파일를 이용해, 파싱 테스트를 진행하곤 합니다.
근데 json 파일을 어디에 두어야 하는걸까요?

일단 Context 접근이 불가능하기에, res폴더에 두는것은 불가능합니다.

안드로이드는 이럴때를 대비해 resource 폴더를 제공하고 있습니다.

resource 폴더는 컴파일될때 java 클래스 경로의 루트에 배치되게 됩니다.

그렇다고 main에서 resource 폴더를 사용할 경우, 헷갈리기 때문에
test 폴더에서만 resource를 사용하도록 합시다.

<3


참고

Assets or Resource Raw folder of Android?

difference-between-res-and-resources

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글