본문으로 건너뛰기
이미지 & 미디어

WordPress -scaled 이미지 비활성화하는 방법 (big_image_size_threshold)

big_image_size_threshold 필터로 2560px 제한을 올리거나 없애서 흐릿한 WordPress 이미지를 해결하고, 다들 건너뛰는 재업로드 단계까지 짚어봅니다.

게시됨

big_image_size_thresholdfalse를 반환하는 필터를 걸면 WordPress는 업로드 시 -scaled 사본을 더 이상 만들지 않습니다. 대신 숫자를 반환하면 제한을 없애는 게 아니라 기준을 올리는 것입니다. 둘 다 functions.php나 작은 mu-plugin에 넣으면 되고, 둘 다 필터가 적용된 이후에 올린 파일에만 영향을 줍니다.

// Disable the cap entirely — no -scaled copies at all.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise it. Longest edge, in pixels.
add_filter( 'big_image_size_threshold', function () {
    return 3840;
} );

WordPress가 실제로 하는 일

WordPress 5.3부터는 업로드한 모든 이미지의 긴 변을 측정합니다. 그 변이 big_image_size_threshold, 기본값 2560px보다 크면 WordPress는 이미지를 그 한계까지 줄여 다시 인코딩하고 your-photo-scaled.jpg로 저장한 다음, 첨부 파일 메타데이터를 고쳐서 full 크기가 그 scaled 사본을 가리키게 만듭니다.

원본이 삭제되는 것은 아닙니다. 원래 파일명 그대로 디스크에 남고, 첨부 파일 메타데이터에도 기록되며, PHP에서는 wp_get_original_image_path()로 접근할 수 있습니다. 하지만 프런트엔드에서는 아무것도 원본을 내보내지 않습니다. 블록 편집기도, srcset도, 미디어 라이브러리 미리보기도 아닙니다. 그저 보관용 사본으로 남아 있을 뿐입니다.

그 아래로 만들어지는 모든 것은 업로드한 파일이 아니라 scaled 파일에서 생성됩니다.

크기생성 원본
full-scaled 사본
large, medium_large, medium, thumbnail-scaled 사본
add_image_size로 등록한 사용자 정의 크기-scaled 사본
테마와 플러그인 크기, 예를 들어 woocommerce_thumbnail-scaled 사본
srcset 후보-scaled 사본

이 한 가지 사실 때문에 정말 많은 사람이 당황합니다.

”선명한 사진이 흐리게 나온다”의 가장 흔한 원인

두 가지가 동시에 일어나는데, 그중 하나만 눈에 띕니다.

눈에 띄는 쪽은 해상도입니다. 전체 폭 히어로용으로 4000px 사진을 올렸는데 WordPress는 브라우저에 2560px를 건넵니다. 1600px 컨테이너를 채우는 일반 화면에서는 아무도 눈치채지 못합니다. 하지만 2배 레티나 화면에서 그 컨테이너는 실제 픽셀 3200개쯤을 원하는데 2560개만 받고, 브라우저가 그 차이를 확대해서 메웁니다. 가장자리가 뭉개지고, 디테일이 뭉그러지고, 이미지 안의 글자가 흐려집니다.

덜 눈에 띄는 쪽은 재인코딩입니다. -scaled 사본은 원본을 무손실로 잘라낸 것이 아닙니다. WordPress가 업로드한 파일을 디코딩하고, 크기를 줄이고, 자체 JPEG 품질 설정으로 다시 압축합니다. 원본이 이미 Lightroom이나 휴대폰에서 나온 압축 JPEG였다면 이건 2세대 인코딩입니다. 압축 아티팩트 위에 압축 아티팩트가 얹히는 셈이죠. 미세한 디테일, 필름 그레인, 완만한 그라데이션이 가장 크게 손해를 봅니다. 픽셀 크기가 충분해 보일 때도 이 현상은 눈에 보입니다.

무엇을 바꾸기 전에 먼저 확인하세요. 이미지를 새 탭에서 열고 URL의 파일명을 읽습니다. -scaled.jpg면 제한이 작동한 것입니다. -1536x1024.jpg처럼 크기 접미사가 붙어 있다면 이야기가 다릅니다. srcset이 너무 작은 중간 크기를 고른 경우라서, 이 임계값 필터로는 해결되지 않습니다.

서버에서는 이렇게 확인합니다.

find wp-content/uploads -name '*-scaled.*' | wc -l

이 숫자가 크다면 제한이 라이브러리 전체를 좌우해 왔다는 뜻입니다.

scaled 이미지 비활성화 도구에 파일을 넣어보면, 설정을 확정하기 전에 해당 원본이 임계값에 걸리는지, 걸린다면 scaled 사본이 어떤 크기로 만들어지는지 미리 확인할 수 있습니다.

솔직한 득실

대부분의 글은 제한을 끄면 디스크 용량이 더 든다고 말합니다. 그건 거꾸로이고, 정확히 짚고 넘어갈 만합니다.

이미지당 디스크 사용량은 오히려 조금 줄어듭니다. 임계값이 켜져 있으면 WordPress는 원본 큰 scaled 사본을 함께 저장합니다. 끄면 원본만 남습니다. 파일 두 개가 하나가 되는 겁니다.

대역폭과 페이지 무게는 늘어납니다, 때로는 크게. 제한을 끄면 full이 손대지 않은 원본입니다. full 크기를 참조하거나 렌더링하는 모든 것, 즉 라이트박스, 갤러리 플러그인, “원본 보기” 링크, 히어로 이미지에 full을 요청하는 테마가 이제 900KB 대신 6MB짜리 파일을 내보낼 수 있습니다. 모바일에서는 이게 실제 Largest Contentful Paint 문제가 되고, 이미지 CDN이 항상 구해주지도 않습니다. 일부는 특정 용량을 넘으면 그냥 통과시키기 때문입니다.

업로드 중 메모리 사용량이 늘어납니다. PHP에서 6000px 이미지를 리사이즈하는 데는 2560px보다 훨씬 많은 메모리가 듭니다. PHP 메모리 한도가 낮은 저렴한 공유 호스팅에서는 제한을 끄는 것만으로 업로드 실패나 썸네일 일부 누락이 생길 수 있습니다. 아예 없애는 대신 임계값을 3840으로 올리는 것이 같은 변경의 더 안전한 버전입니다.

그래서 대부분의 사이트에서 합리적인 기본 선택은 숫자를 올리는 것이지 없애는 것이 아닙니다. 없애는 것이 옳은 경우는 정말로 원본 해상도가 필요한 이미지를 내보낼 때입니다. 인쇄 품질 갤러리, 상품 확대, 건축 사진처럼 사용자가 원본을 들여다볼 것으로 기대되는 경우죠.

제대로 적용하기

1. 살아남을 자리에 필터를 두세요. 자식 테마의 functions.php도 됩니다. 한 파일짜리 mu-plugin이 더 낫습니다. 테마를 바꿔도 조용히 무효화되지 않기 때문입니다.

<?php
/**
 * Plugin Name: Raise big image threshold
 */
add_filter( 'big_image_size_threshold', function () {
    return 3840;
} );

2. 해당 이미지를 다시 업로드하세요. 다들 이 단계를 건너뛰고 필터가 안 먹는다고 결론 냅니다. 임계값은 업로드 시점에 한 번만 평가됩니다. 기존 첨부 파일은 옛 메타데이터를 계속 유지합니다. 첨부 파일을 삭제하고 다시 올린 뒤, 글에 걸린 참조를 고치세요.

3. 썸네일 재생성이 뭔가를 구해줄 거라고 기대하지 마세요. WP-CLI의 wp media regenerate는 메타데이터가 full 파일이라고 부르는 것을 기준으로 중간 크기를 다시 만듭니다. 이미 잘린 이미지라면 그게 곧 -scaled 사본입니다. 버려진 디테일을 되살릴 수는 없습니다. 재업로드 후 정리 작업으로는 쓸모 있지만, 그 자체로는 해결책이 아닙니다.

4. 결과를 확인하세요, 짐작하지 말고. 다시 업로드한 뒤 프런트엔드에서 이미지를 열고 파일명을 다시 읽어보세요. -scaled가 없으면 필터가 살아 있는 것입니다.

끄는 것이 답이 아닌 경우

원본 이미지가 이미 2560px 미만인데도 흐릿하다면, 임계값은 애초에 관련이 없습니다. 표시 영역이 사용할 수 있는 픽셀보다 크다는 것이 문제이고, 답은 더 큰 원본 파일이거나 더 작은 컨테이너이지 이 필터가 아닙니다.

내보내지는 파일명에 -scaled가 아니라 크기 접미사가 붙어 있다면 srcset이 작은 후보를 고른 것입니다. 보통은 테마가 선언한 콘텐츠 폭과 이미지가 실제로 렌더링되는 영역이 어긋나서 생깁니다. 제한을 꺼도 이 문제는 전혀 달라지지 않습니다.

그리고 플러그인이 src를 최적화 도구나 CDN 프록시로 다시 쓰고 있다면, 그 프록시가 무엇을 내보내는지 확인하기 전까지는 여기 적힌 내용이 하나도 적용되지 않습니다. WordPress가 생성해야 할 것과 브라우저가 실제로 불러오는 것을 비교하세요. 둘이 다르다면 그 사이에 무엇이 끼어 있는지 보면 됩니다.

FAQ

질문

WordPress에서 scaled 이미지를 어떻게 끄나요?

big_image_size_threshold에 false를 반환하는 필터를 겁니다. functions.php나 작은 mu-plugin에 넣으면 됩니다. false를 반환하면 제한이 완전히 꺼져서 업로드한 파일이 원본 크기를 그대로 유지하고 -scaled 사본도 만들어지지 않습니다. 대신 3840 같은 숫자를 반환하면 제한을 없애는 게 아니라 기준을 올리는 것입니다.

WordPress 파일명에 붙는 -scaled는 무슨 뜻인가요?

업로드한 이미지의 긴 변이 2560px를 넘어서 WordPress가 다시 인코딩해 만든 사본이라는 표시입니다. 그 사본이 사이트 전체에서 full 크기 역할을 합니다. 원본 파일은 원래 이름으로 디스크에 남아 있지만 프런트엔드에서는 아무것도 원본을 참조하지 않고, 모든 썸네일과 srcset 후보가 scaled 사본에서 만들어집니다.

scaled 이미지를 끄면 디스크 용량을 더 쓰나요?

이미지당으로 보면 대개 조금 덜 씁니다. WordPress가 원본 옆에 큰 파일을 하나 더 쓰지 않게 되기 때문입니다. 진짜 비용은 저장 공간이 아니라 대역폭입니다. 제한을 끄면 full 크기를 참조하는 모든 곳이 손대지 않은 원본을 내보내는데, 모바일 회선에서는 그게 몇 메가바이트짜리일 수 있습니다.

임계값을 끄면 이미 흐릿해진 이미지가 복구되나요?

아닙니다. 필터는 새로 올리는 파일에만 적용됩니다. 이미 미디어 라이브러리에 있는 이미지는 여전히 scaled 사본을 가리키는 메타데이터를 유지하고, 썸네일을 재생성해도 결국 그 잘린 파일에서 다시 만듭니다. 해상도를 되찾으려면 필터를 적용한 뒤 첨부 파일을 삭제하고 다시 업로드해야 합니다.

2560px를 그대로 두는 게 맞나요?

대부분의 콘텐츠 사이트에서는 그렇습니다. 2560px 원본이면 픽셀 밀도 2배 화면에서 1280px 표시 영역을 채울 수 있고, 그게 가장 흔한 경우입니다. 화면을 꽉 채우는 히어로 이미지, 상품 확대, 사진 갤러리를 운영한다면 3840으로 올리세요. 손대지 않은 원본을 꼭 내보내야 할 때만 완전히 끄면 됩니다.