Picasso: 이미지 로딩 및 Android 애플리케이션에서의 작업

저자: IT Sectr 게시일: 2026-05-05 읽는 시간: 8 분

Picasso는 Square사가 개발한 Android 애플리케이션에서 이미지를 로드하기 위한 라이브러리입니다. 이 라이브러리는 네트워크에서 그래픽을 로드, 캐싱 및 표시하기 위한 간단하고 표현력 있는 API를 제공합니다. Picasso의 GitHub 통계에 따르면, 이 라이브러리는 100,000회 이상 다운로드되었습니다. Picasso는 메모리를 자동으로 관리하고 여러 수준에서 이미지를 캐싱합니다.

핵심 사항

  • Picasso — 간단한 API를 갖춘 Square의 Android 이미지 로딩 라이브러리
  • 캐싱 — 디스크 및 메모리 캐싱으로 반복 이미지 로드 시간 단축
  • 변환 — Crop, Resize 및 Rotate를 이미지에 즉시 적용 가능
  • 플레이스홀더 및 오류 이미지 — 로딩 중 및 오류 시 표시
  • 로딩 우선순위 — 이미지 표시 순서 관리 가능

Picasso란 무엇인가?

Picasso는 Square가 만든 Android용 비동기 이미지 로딩 라이브러리입니다. 예술가 파블로 피카소의 이름을 따서 명명되었으며, 복잡한 작업을 간단하고 우아한 API로 변환한다는 라이브러리의 철학을 반영합니다. Android 커뮤니티에서 가장 인기 있는 이미지 로딩 라이브러리입니다.

Picasso의 아키텍처는 미니멀합니다. 라이브러리는 로딩에 스레드 풀, 메모리 캐시에 LruCache, 디스크 캐시에 DiskLruCache를 사용합니다. Glide와 달리 Picasso는 AppGlideModule 설정이 필요 없으며, 의존성을 추가한 즉시 사용할 수 있습니다. 따라서 프로토타입 및 소규모 프로젝트에 이상적인 선택입니다.

Picasso 2.8은 최신 안정 버전으로, Android API 21+ 및 Java 8+와 호환됩니다. 이 라이브러리는 설정에 Gradle 플러그인이나 애너테이션이 필요 없어 버전 간 마이그레이션이 간편하고 업데이트 시 오류 가능성을 줄여줍니다. 오랜 역사에도 불구하고 Picasso는 전 세계 수천 개의 프로젝트에서 계속 사용되고 있습니다.

Picasso의 주요 작업은 URL로 이미지를 로드하고, 디코딩하고, 필요시 크기를 조정하여 ImageView에 표시하는 것입니다. 라이브러리는 백그라운드 스레드, 캐시 및 목록에서 ImageView 재사용을 자동으로 관리합니다.

2013년 출시 이후 Picasso는 Android 커뮤니티에서 이미지 로딩의 표준이 되었습니다. 최소한의 진입 장벽(첫 사용에 코드 한 줄만 필요) 덕분에 수천 개의 애플리케이션에서 사용되고 있습니다.

우선순위 및 요청 취소

Picasso의 우선순위 기능을 통해 이미지 로딩 순서를 관리할 수 있습니다. 기본적으로 모든 요청은 보통 우선순위를 가지지만, 중요한 이미지의 경우 priority 메서드를 통해 높은 우선순위를 설정할 수 있습니다. ImageView가 재사용되는 경우(예: RecyclerView), Picasso는 자동으로 이전 요청을 취소하고 새 요청을 시작하여 스크롤 시 이미지 깜빡임을 방지합니다.

Picasso의 주요 기능

Picasso는 불필요한 복잡성 없이 모바일 애플리케이션에서 이미지 작업의 주요 시나리오를 다루는 기능 세트를 제공합니다.

다중 레벨 캐싱

Picasso의 캐시는 빠른 액세스를 위한 RAM과 영구 저장을 위한 디스크의 두 레벨로 구성됩니다. 이미지 요청 시, 라이브러리는 먼저 메모리 캐시를 확인한 다음 디스크를 확인하고, 그 후에야 네트워크 요청을 수행합니다. 이렇게 하면 반복적으로 로드되는 이미지의 표시 속도가 크게 향상됩니다.

이미지 변환

변환을 통해 매번 원본을 디코딩하지 않고도 이미지 크기 조정, 자르기 또는 회전이 가능합니다. Picasso는 내장 변환 CenterCrop 및 CenterInside를 제공하며, Transformation 인터페이스를 통해 사용자 정의 변환도 만들 수 있습니다. 변환된 이미지는 별도로 캐싱됩니다.

플레이스홀더 및 오류 이미지

플레이스홀더는 네트워크에서 이미지를 로드하는 동안 표시되어 사용자에게 시각적 피드백을 제공합니다. 로드 실패 시 오류 이미지가 표시됩니다. Picasso는 새 버전이 로드될 때까지 표시되는 이미지도 지원하며, 업데이트 가능한 아바타에 유용합니다.

다양한 소스에서 로딩

Picasso는 URL, 리소스, 파일, 콘텐츠 제공자 및 URI에서 이미지 로딩을 지원합니다. load() 메서드는 이러한 모든 유형에 대해 오버로드되어 있으며, 라이브러리가 자동으로 소스를 판별합니다. 리소스 및 파일의 경우 Picasso는 네트워크 요청을 수행하지 않고 직접 데이터를 로드하여 내장 그래픽 표시를 가속화합니다.

Picasso는 어떻게 작동하는가?

Picasso는 RequestCreator와 Dispatcher를 기반으로 하는 아키텍처를 사용합니다. 각 요청은 Picasso.get().load()를 통해 생성되고 스레드 풀에서 실행됩니다. Dispatcher는 요청 큐, 우선순위 및 ImageView 재사용 시 취소를 관리합니다.

요청 아키텍처

into(view)를 호출하면 Picasso는 URL, 변환, 대상 및 콜백을 포함하는 Action 객체를 생성합니다. Action은 Dispatcher 큐에 배치됩니다. 엔진은 Downloader(기본적으로 OkHttp)를 통해 이미지를 로드하고, Bitmap을 디코딩하며, 변환을 적용하고, 결과를 UI 스레드에 전달합니다. 모든 이미지는 자동으로 ImageView 크기에 맞춰집니다.

java
Picasso.get()
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .resize(400, 300)
    .centerCrop()
    .into(imageView)

Picasso 설치 및 설정

Picasso 설치는 Gradle을 통해 이루어집니다. 라이브러리는 Maven Central을 통해 배포되며 복잡한 설정이 필요하지 않습니다. 최소 Android API 버전은 21입니다.

의존성 추가

모듈 수준의 build.gradle 파일에 implementation ‘com.squareup.picasso:picasso:2.8’을 추가합니다. Gradle 동기화 후 Picasso를 사용할 수 있습니다. 네트워크 작업의 경우 Picasso는 프로젝트에 OkHttp가 있으면 자동으로 사용하고, 없으면 내장 HttpURLConnection을 사용합니다.

groovy
dependencies {
    implementation "com.squareup.picasso:picasso:2.8"
}

// OkHttp에서 로드하기 위한 Kafka (선택사항)
implementation "com.squareup.okhttp3:okhttp:4.12.0"

디버그 표시기 및 캐시

Picasso의 디버그 표시기는 각 이미지 모서리에 색상 삼각형을 표시합니다. 빨간색은 네트워크 로딩, 파란색은 디스크 캐시, 녹색은 메모리 캐시를 나타냅니다. Picasso 인스턴스에서 setIndicatorsEnabled(true)를 호출하여 활성화합니다. 기본 캐시 크기는 기기 사용 가능 메모리의 15%입니다.

사용자 정의 Picasso 인스턴스를 구성하려면 Picasso.Builder를 사용하세요. 백그라운드 스레드용 Executor, 네트워크 요청용 Downloader, MemoryCache 및 DiskCache를 설정할 수 있습니다. 사용자 정의 인스턴스는 특히 테스트에서 유용하며, Downloader를 네트워크 요청 없이 이미지를 반환하는 스텁으로 대체할 수 있습니다.

Picasso 사용 예제

아래 예제는 Picasso 작업의 일반적인 시나리오(간단한 이미지 로딩, 변환 사용, RecyclerView에서 로딩)를 보여줍니다.

ImageView에 이미지 로딩

ImageView에 기본 로딩은 한 번의 호출로 이루어집니다. Picasso는 scaleType을 고려하여 자동으로 이미지를 뷰의 크기에 맞춥니다. 로딩이 완료될 때까지 플레이스홀더가 표시되고, 연결 오류 시 오류 이미지가 표시됩니다.

java
Picasso.get()
    .load("https://example.com/photo.jpg")
    .placeholder(R.drawable.loading)
    .error(R.drawable.broken_image)
    .fit()
    .centerCrop()
    .into(imageView)

사용자 정의 변환 적용

BlurTransformation은 지정된 반경으로 이미지를 흐리게 합니다. 사용자 정의 변환은 transform 메서드로 Transformation 인터페이스를 구현합니다. 캐시는 변환 결과를 고유 키로 저장하여 재적용을 방지합니다.

java
public class BlurTransformation implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap blurred = Bitmap.createBitmap(source);
        RenderScript rs = RenderScript.create(context);
        // 블러 적용
        source.recycle();
        return blurred;
    }

    @Override
    public String key() {
        return "blur";
    }
}

RecyclerView에서 이미지 로딩

RecyclerView에서 Picasso는 화면 밖으로 스크롤된 ImageView의 요청을 자동으로 취소하고 이미 로드된 이미지를 재사용합니다. 이렇게 하면 메모리 누수를 방지하고 부드러운 스크롤을 보장합니다.

java
public void onBindViewHolder(ViewHolder holder, int position) {
    String url = items.get(position).getImageUrl();
    Picasso.get()
        .load(url)
        .fit()
        .centerCrop()
        .into(holder.imageView);
}

Picasso vs Glide: 라이브러리 비교

Android용 이미지 로딩 라이브러리를 선택할 때 Picasso와 Glide 비교는 자주 묻는 질문입니다. 두 라이브러리 모두 동일한 작업을 해결하지만 우선순위와 사용 특성이 다릅니다.

Picasso는 단순함과 최소 APK 크기가 중요한 프로젝트에 더 적합합니다. Glide는 GIF 지원, 비디오 프레임 및 최대 메모리 최적화가 필요할 때 선택됩니다. Glide는 이미지를 정확한 ImageView 크기로 자동 조정하여 일부 시나리오에서 Picasso보다 메모리 소비를 최대 50%까지 줄입니다.

성능 테스트에서 Glide는 사전 로딩 메커니즘과 빠른 스크롤 시 자동 요청 취소 덕분에 RecyclerView 작업 시 더 나은 결과를 보여줍니다. Picasso는 더 간단한 전략을 사용하여 예측 가능하지만 대규모 데이터에서는 효율성이 떨어집니다.

Picasso는 API 단순함과 최소 크기에 중점을 둡니다. Glide는 더 광범위한 기능(GIF, 애니메이션 이미지, 비디오 프레임, 라이프사이클 통합 지원)을 제공합니다. Glide는 ImageView 크기로의 자동 조정 덕분에 메모리를 더 효율적으로 관리합니다.

기준PicassoGlide
라이브러리 크기~120 KB~500 KB
GIF 지원아니요
비디오 프레임아니요
개발자SquareGoogle (Bumptech)
APIFluent 체인RequestBuilder

Android Developer Relations에 따르면, Google은 새 프로젝트에서 이미지 로딩을 위해 Glide를 선호 라이브러리로 권장합니다. Picasso는 GIF 및 비디오 프레임이 필요하지 않은 간단한 프로젝트에 여전히 탁월한 선택입니다.

자주 묻는 질문

Picasso와 Glide의 차이점은 무엇인가요?

Picasso는 크기가 작고 사용하기 쉽습니다. Glide는 GIF 및 비디오 프레임을 지원하고 메모리를 더 효율적으로 관리하며 Google에서 권장합니다. 선택은 추가 형식에 대한 프로젝트의 필요에 따라 달라집니다.

Picasso 캐시를 지우는 방법은?

Picasso 캐시를 지우려면 단일 이미지의 경우 Picasso.get().invalidate(url) 메서드를, 전체 삭제의 경우 shutdown()을 사용하세요. 디스크 캐시는 앱 재설치 시 또는 시스템 설정을 통해 삭제됩니다.

Picasso는 화면 회전을 어떻게 처리하나요?

Picasso는 화면 회전에 의존하지 않습니다. 로드된 이미지는 캐시에 저장되며 Activity 재생성 시 캐시에서 표시됩니다. 속도를 높이려면 Picasso와 함께 ViewModel을 사용하여 로드된 데이터를 보존하세요.

Kotlin에서 Picasso를 사용할 수 있나요?

, Picasso는 Kotlin과 완전히 호환됩니다. Kotlin 개발자는 확장 함수를 사용하여 더 간결한 구문을 사용하거나 이미지 로딩 시 null 값 처리를 위해 koptional 라이브러리를 적용할 수 있습니다.

Picasso는 메모리를 어떻게 관리하나요?

Picasso는 메모리 캐시에 LruCache를 사용하여 사용되지 않는 이미지를 자동으로 정리합니다. 기본 캐시 크기는 앱 사용 가능 메모리의 15%입니다. 메모리가 부족하면 Picasso는 onTrimMemory를 통해 리소스를 해제합니다.

요약

  • Picasso — 최소 API를 갖춘 Square의 경량 이미지 로딩 라이브러리
  • 캐싱 — 자동 크기 관리가 포함된 디스크 및 메모리 캐싱
  • 변환 — CenterCrop, CenterInside 및 Transformation 인터페이스를 통한 사용자 정의 변환
  • 플레이스홀더 및 오류 이미지 — 원활한 사용자 경험 제공
  • 자동 요청 취소 — RecyclerView에서 불필요한 로딩 방지
  • 디버그 표시기 — 이미지 소스를 시각적으로 식별
  • 라이브러리 크기 — 120KB에 불과, APK 크기에 미치는 영향 최소

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기