그래서 테슬라가 이렇게 주식 시장에서 잘 나가는 이유를 살펴보기 위해서 테슬라의 주요 실적을 살펴 보았습니다.
Executive Summary
테슬라 연도별 실적을 검초한 결과를 아래와 같이 정리할 수 있었습니다.
테슬라는 2019년 246억 달러 매출을 올려, 전년 비 15% 성장에 그쳤습니다. 예전 7~80% 성장에 비해서는 초라한 수치입니다.
2019년 테슬라는 36.8만대를 판매했고, 이는 전년 비 50% 증가한 것이고 테슬라가 목표로 삼았던 31.5만대보다 훨씬 높은 수치입니다.
그러나 테슬라 매출과 손익을 견인했던 모델 S와 X 판매는 연간 10대 수준에서 6.7만대 수준으로 크게 감소하고 Mass 시장을 겨냥했던 모델 3 판매는 30만대 수준으로 급증했습니다. 결국 평균 판매 단가를 떨어뜨려 판매가 크게 증가했으나 매출은 15% 증가에 그치는 이유가 되었습니다.
테슬라는 여전히 적자에 허덕이고 있습니다. 2019년 8.6억 달러 적자 그러나 2018년과 2019년 일부 분기에서는 오랜 적자를 깨고 흑자를 실현했고, 2019년 처음으로 연간으로 총이익(Gross Profit)은 흑자 전환하는 등 유의미한 결과들이 나오고 있습니다.
테슬라 흑자 전환 가능성은 생산량이 급증하면서 규모의 경제와 생산 능력과 생산 기술이 안정화되면서 생산비가 줄어들고 있기 때문입니다.
주식 시장에서 테슬라 주가가 급증하는 것은 2020년이후 중국 상하이 공장이 안정화되고 독일 베를린 공장과 북미 신공장이 본격 가동되면서 충분한 공급 능력이 확보되고, 기대하던 모델 Y가 본격 생산되는 등 라인업이 강화되어 시장 지배력이 더욱 강화될 것으로 보기 때문으로 추정합니다.
1. 매출 및 매출 성장율 추이
테슬라 매출을 연도별로 살펴보면 흥미로운 현상을 방견할 수 있습니다. 그것은 2019년 매출 성장율이 거의 정체 수준인데요.
이는 테슬라에 대해서 들었던 엄청난 이야기에 비해서 실망스러운 결과라는 것이 처음 받은 느낌 이었습니다.
뭐 곰곰히 생각해보면 다르게 생각할 수 있는 부문도 있겠지만 매출 자체 그리고 성장율만 본다면 고개가 갸우뚱 해집니다.
2019년 테슬라는 246억 달러 매출을 올렸고, 이는 전년 비 15% 성장에 그쳤습니다.
2019년 매출 성장율 15% 성장이 어떻냐고 반론할 수 도 있습니다. 그러나 최근 3년간 7~80%대 성장을 구가해온 테슬라로서는 쉽게 이해가지 않는 것도 사실이죠. 아마도 다른 데이타를 더 살펴바야 할듯 합니다.
테슬라 연도별 매출액 추이( ~ 2021년), Tesla yearly Revenue,, Graph by Happist
2. 테슬라 전기차 판매 추이
그러면 테슬라의 전기차 판매는 어떻까요? 테슬라 전기차 판매야말로 테슬라 비지니스 모델의 전부라고도 할 수 있으니 매우 중요한 지표임에 틀림이 없습니다.
다행이 테슬라 전지차 판매는 시장의 기대를 충족하고 있고, 테슬라가 목표했던 목표를 충분히 달성하고 있습니다.
2019년 테슬라는 36.8만대를 판매(Delivery 기준)했습니다. 이는 전년 비 50% 증가한 것이고 테슬라가 목표로 삼았던 31.5만대보다 훨씬 높은 수치입니다.
테슬라 연도별 전기차 판매( 딜리버리 기준) 추이, Tesla yearly Deliveries, Graph by Happist
비록 증가율 측면에서 모델 3가 본격적으로 생산되기 시작한 2018년의 138% 성장보다는 둔화되었지만 여전히 높은 수준입니다.
더우기 2020년에는 모델 Y가 본격 생산을 시작하고, 상하이 공장과 독일 공장이 본격적으로 가동학 시작하면 테슬라 공급 능력은 시장의 기대를 훨씬 더 뛰어 넘을 것으로 보입니다.
테슬라 생산 공장 및 생산 모델 현황 및 계획, table by Tesla
3. 테슬라 모델별 판매 추이
조금 더 자세하게 살펴보기 위해 테슬라 모델 판매 추이를 살펴보았습니다.
그동안 테슬라 손익을 지탱했고, 테슬라 브랜드를 견인해왔던 모델 S와 X 판매는 연간 10대 수준에서 6.7만대 수준으로 크게 감소하고 Mass 시장을 겨냥했던 모델 3 판매는 30만대 수준으로 급증했습니다.
이는 대당 단가가 크게 떨어지는 역효과를 냈고, 그 덕분에 테슬라 전기차 판매는 50% 증가했지만 매출은 15% 증가 그치는 현상으로 나타났다는 생각입니다.
테슬라 연도별 프리미엄 모델(모델 S+X)과 모델 3와 모델 Y 딜리버리 추이, Tesla yearly Deliveries, Graph by Happist
4.테슬라 손익 추이
테슬라는 회사 설립 후 한번도 이익을 내지 못한 것으로도 유명합니다. 드렇기 때문이 테슬라 주가는 비이성적으로 높다는 비판이 많았죠.
연도별로 테슬라 손익을 살펴보면 이런 지적은 타당합니다. 그러나 2018년과 2019년에 걸쳐 유의미한 결과가 나타나기 시작했다는 점이 흥미롭습니다.
아래는 분기별 순이익 추이를 그려본 것인데요. 2018년과 2019년 일부 분기에서는 오랜 적자를 깨고 흑자를 실현하고 있습니다.
테슬라 연도별 순이익 추이 ~ 2021년), Tesla Yearly Net Income, Grapg by Happist
그런 관점에서 테슬라의 연도별 총이익을 살펴보면 2019년 처음으로 0.65억 달러 흑자를 기록했다는 것을 알 수 있습니다. 크지는 않지만 연간 기준으로 총이익이지만 적자를 면했다는 점은 긍정적으로 볼 수 있죠.
테슬라 연도별 매출총이익 및 매출초이익률 추이( ~ 2021년), Tesla yearly Gross Profit & Gross profit Margin, Grapg by Happist
이에 따라 연간 순이익도 적자가 줄고 순이익율도 -4%로 개선(?)되었습니다.
테슬라 연도별 순이익 및 순이익률 추이( ~ 2021년), Tesla yearly Net Income & Net Margin, Graph by Happist
5. 테슬라 영업이익률 추이
테슬라 연도별 영업이익 및 영업이익률 추이( ~ 2021년), Tesla yearly Operating Income & Operating Margin, Graph by Happist
아마존 전체 매출 성장율이 둔화되었습니다. (4분기 아마존 매출 874억 달러로 전년 비 21% 성장, 33억 달러의 순익을 달성래 순이익율 3.7%로 양호한 손익 추세를 이어 갔음)
아마존이 그동안 심혈을 기울였던 오프라인 공략이 여의치 않습니다. 오프라인 매출은 오히려 감소하고 있습니다. (4분기 매출 43.6억 달러로 전년비 -1% 감소)
반면 온라인 성장세는 여전하고 오히려 성장세가 더 커졌습니다. ( 2019년 4분기 전년 비 14.7% 성장, 전분기 20.6%보다는 다속 하락했지만 아직 상승 추세 유지)
아마존의 차세대 비지니스라고 주목 받고 있는 서브스크립션 서비스 부분은 여전히 성장하나 성장율은 둔화되었습니다. 2019년 4분기 아마존 프라임 회원수가 1.5억명이 넘었습니다. (4분기 매출 52억 달러로 전년 동기 비 32.2% 증가, 예전의 60%대 성장에는 다소 미치지 못하지만 2019년 3~40%대 꾸준히 성장하고 있음)
광고 비지니스 등은 여전히 높은 성장을 유지했지만 성장율은 다소 누그러짐 (광고 부문이 포함된 기타 부문 매출 48억 달러로 전년 비 41% 성장, 이전에 100% 넘던 시기에 비해서 둔화된 것이지만 여전히 40%대 성장율을 유지하면서 고성장 동력을 이어가고 있음)
아마존의 화수분이라 할 수 있는 아마존 웹 서비스 부문도 지속 성장하면서도 높은 영업이익율을 유지하고 있습니다. (4분기 매출 100억 달러로 전년비 34% 성장, 영업이익 26억 달러로 영업이익율 26% 기록)
아마존은 미국 내에서는 엄청난 성과를 내고 있지만, 글로벌 비지니스는 각 지역의 로컬 업체와의 경쟁하면서 좀처럼 튼 성과를 내지 못하고 있습니다. (4분기 매출 238억 달러로 전년 비 14.3% 성장에 그쳤고 여전히 6억 달러의 적자)
아마존의 전반적 트렌드는 2018년 4분기 실적 분석 시 언급했던 내용과 크게 다르지 않습니다. 그래서 이번 2019년 4분기 실적도 비슷한 논조가 유지될 것입니다.
마이크로소프트 애저와 구글의 맹렬한 추격을 받고 있는 클라우드 비지니스를 담당하고 있는 아마존 웹 서비스(AWS)는 여전히 아마존 이익을 만들어 내고 있는 화수분이지만 성장율은 다소 둔화되고 있습니다.
2019년 4분기 AWS는 처음으로 분기 100억 달러를 달성했습니다. 전년비 34% 성장을 이어갔습니다. 이는 엄청난 기록이라 할 수 있죠. 그리고 영업이익도 26억 달러를 기록해 영업이익율 26%로 양호한 기록을 남겼습니다.
다만 전년 비 성장율은 40%대에서 2019년에는 30%대로 하락하면서 경쟁이 치열해짐에 따라 둔화되는 모습을 보였습니다.
아마존 분기별 AWS 부문 매출 및 전년 비 성장율(2014년 1분기 ~ 2019년 4분기) Amazo AWS International revenue & y2y growth rate by quarter, Graph by Happist
6. 아마존 글로벌 비지니스는 여전히 고전중이다.
아마존은 여러 분야에서 좋은 성과를 내고 있지만 몇가지 부문에서는 고전을 면치 못하고 있습니다. 대표적인 것이 글로벌 부문이나 오프라인 부문이죠.
아마존은 미국 내에서는 엄청난 성과를 내고 있지만, 글로벌 비지니스는 각 지역의 로컬 업체와의 경쟁하면서 좀처럼 튼 성과를 내지 못하고 있습니다.
2019년 4분기 글로벌 부문 매출은 238억 달러로 전년 비 14.3% 성장에 그쳤고 여전히 6억 달러의 적자를 냈습니다.
아마존 북미 지역 매출 증가나 아마존 웹서비스와 같은 다른 부문의 매출 성장이 워낙 가파르기 때문에 글로벌 부문의 비중도 한때 40%에 육박했다가 이제는 27% 수중으로 하락했습니다.
아마존 분기별 글로벌 부문 매출 및 전년 비 성장율(2014년 1분기 ~ 2019년 4분기) Amazo International revenue & y2y growth rate by quarter, Graph by Happist
아마존의 북미 지역과 글로벌 비지니스의 성과는 미국에서 고전하고 글로벌에서 날고 있는 넷플릭스와는 완전 반대의 모습을 보여주고 있습니다.
7. 아마존 매출 성장의 둔화
2019년들어 아마존 전체 매출 성장은 확실히 둔화되었습니다.
아마존 매출은 분기당 2~30%대 성장이 기본이었고 특히 2017년하반기 ~ 2018년 상반기엔 3~40%대의 대단히 높은 성장율을 보이면서 애플과 함께 시총 1조달러 클럽 경쟁을 벌이기도 했습니다.
그러나 2019년에는 매출 성장율은 10%로 둔화되면서 실망을 안겨주었죠. 덕분에 아마존 주가도 부진을 면치 못했습니다.
2019년 4분기 아마존은 874억 달러 매출을 올려 전년 동기 비 21% 성장했고(20%대 성장에 따라 월가가 환호 한듯..), 33억 달러의 순익을 달성, 순이익율 3.7%를 기록해 전반적으로 양호한 손익 추세를 이어 갔습니다.
아마존 분기별 매출 및 전년 비 성장율(2014년 1분기 ~ 2019년 4분기) Amazo revenue & y2y growth rate by quarter, Graph by Happist아마존 분기별 순이익 및 순이익율 추이(2014년 1분기 ~ 2019년 4분기) Amazo Net Imcome & Net Income Margin by quarter, Graph by Happist
if [ $operation = "MOVED_FROM" ] || [ $operation = "DELETE" ]; then
# commands to be executed if the file is moved or deleted
elif [ $operation = "CLOSE_WRITE,CLOSE" ] || [ $operation = "MOVED_TO" ]; then
# commands to be executed if a new file is created
fi;Code language:PHP(php)
만약 파일이 다른 곳으로 옴겨졌거나 지워졌으면 WebP 파일을 지웁니다.
if [ -f "$webp_path" ]; then
$(rm -f "$webp_path");
fi;
if [ $(grep -i '\.png$' <<< "$path") ]; then
$(cwebp -quiet -lossless "$path" -o "$webp_path");
else
$(cwebp -quiet -q 90"$path" -o "$webp_path");
fi;Code language:PHP(php)
만약 이미지가 새로 만들어졌다면 아래 조건에 따라 압축이 이루어집니다.
만약 PNG 이미지라면 무손실 압축을 실시
PNG 이미지가 아니라면 손실 압축을 실시
이미지 폴더를 모니터링하고 변화에 따른 후속 조치를 취하는 전체 스크립트는 아래와 같습니다. 이 스크립트를 watchers.sh에서 반영합니다.
nano watchers.shCode language:PHP(php)
아래 스크립트를 watchers.sh에 포합시킵니다.
#!/bin/bashecho"Setting up watches.";
# watch for any created, moved, or deleted image files
inotifywait -q -m -r --format '%e %w%f' -e close_write -e moved_from -e moved_to -e delete $1 \
| grep -i -E '\.(jpe?g|png)$' --line-buffered \
| while read operation path; do
webp_path="$(sed 's/\.[^.]*$/.webp/' <<< "$path")";
if [ $operation = "MOVED_FROM" ] || [ $operation = "DELETE" ]; then # if the file is moved or deletedif [ -f "$webp_path" ]; then
$(rm -f "$webp_path");
fi;
elif [ $operation = "CLOSE_WRITE,CLOSE" ] || [ $operation = "MOVED_TO" ]; then # if new file is createdif [ $(grep -i '\.png$' <<< "$path") ]; then
$(cwebp -quiet -lossless "$path" -o "$webp_path");
else
$(cwebp -quiet -q 90"$path" -o "$webp_path");
fi;
fi;
done;Code language:PHP(php)
일부 CDN을 사용하면 이미지 압축 및 WebP 파일 생성등 로딩 속도를 높이고, 트래픽을 절감해주는 기능을 통해서 최상의 이미지 최적화 효과를 누릴 수 있습니다.
예를들어 Akamai은 이미지 품질을 유지하면서도 이미지 용량을 압축해주며, 모바일 및 데스크 탑 PC 등과 같은 이용자 디바이스별로 최적 크기의 이미지를 보여주어 속도를 개선하며, WebP(크롬, 엣지, 파이어폭스 등 지원)나 JPEG-XR/JPEG 2000과 같이 특정 브라우저에서 최고 효과를 내는 이미지 포맷으로 변환해 보여줍니다.
다만 이런 서비스는 비쌉니다. Akamai은 1TB 트래픽당 350$ 사용료를 받습니다.
무료 플랜이 있는 Cloudflare의 경우에도 자동으로 기기에 맞추어 압축해 주는 서비스는 유료(월 20$)인 프로부터 제공합니다.
당연히 이들은 제한적으로 무료 서비스도 제공하지만 제대로 사용하려면 유료로 서비스를 이용해야 합니다.
위 리스트중에서 맨 처음으로 언급된 Cloudinary는 Free/Plus/Advanced/Custom 서비스가 있는데요.
Free 플랜의 경우 월 트래픽을 25GB를 줍니다.. 저의 경우 최소 300GB가 나오기때문에 Free 플랜은 사용 불가하고 월 99$짜리 Plus 플랜을 사용해야 합니다.
2.4. 서버에서 자체적으로 관리 – 무료
비용 문제나 속도 저하 문제로 플러그인을 사용할 수 없다면 서버에서 자체적으로 이이미지 최적화를 할 수 밖에 없습니다.
다행히 우분투와 같은 서버에서 적용할 수 있는 다양한 이미지 최적화 패키지들이 존재하기 때문에 이를 잘 활용하면 완벽하지는 않지만 해결 가능할 것입니다.
물론 서버에서 작동하도록 만들어야하므로 상당한 서버 운용 능력이 필요하다는 어려움은 있습니다.
구체적인 방법은 다음 장에서 차분히 설명하기로 하죠.
3. 서버에서 이미지 관리 프로세스
그러면 이제부터 서버에서 이미지 관리하는 방안을 살펴보도록 하겠습니다.
참고로 저는 Vultr VPS를 이용하고 있으며, Ubuntu 18.04에 웹서버는 NGINX를 사용하고 있기 때문에 이를 기반으로 설명해 보고자 합니다.
서버 업체 : Vultr(일본 동경)
서버 상품 : High Frequency 4GB RAM, 2 CPU
서버 타입 : Ubuntu 18.04
웹서버 : NGINX
조금 더 구체적으로 어떤 솔류션을 상요해야 할까요? 무슨 작업이 필요할까요?
다양하고 훌륭한 방법이 많이 있겠지만 저는 아래와 같은 프로세스를 사용했습니다.
이미지 최적화를 진행하기 전에 최적화 대상 이미지들을 백업받습니다.
그 다음 업로드된 이미지 리사이즈 여부를 검토, 리사이즈 합니다. 이때 기준은 사이트 도구 – 미디어에서 정의하는 최대 이미지 사이즈에 맞추기로 합니다. 저는 최대 이미지 폭을 1024로 정했기 때문에 폭이 1024를 넘으면 1024로 줄이도록 했고 이미지 높이는 어쩔 수 없이 긴 이미지를 사용하는 경우가 많아서 이는 컨트롤하지 않기로 했습니다. 쇼핑몰의 경우 설명을 이미지로 대체해 아주 긴 이미지를 사용하는 경우가 많죠.
다음으로는 JPEG와 PNG 이미지를 압축합니다.
다음으로는 WebP나 JPEG-XR과 같은 특정 브라우저에서 효율적인 이미지 포맷을 생성합니다.
이미지가 효과적으로 이용자들에게 노출될 수 있도록 Lazy Loading을 적용합니다.
이러한 이미지 최적화 프로세스는 서버에 새로운 이미지가 발생시마다 바로 바로 할 수도 있고 정기적으로 모아 한번에 처리하는 방법이 있습니다.
대부분 서비스는 이미지가 새로 생성되는 순간 관련 작업을 진행해 항상 최적의 상태로 이미지를 최적화합니다.
그러나 이러한 방식은 서버에 무리를 줄 수도 있기 때문에 일정 시간만다 일괄 처리(Batch) 하는 것도 나쁘지는 않을 듯 합니다.
여기에서는 더 적용하기가 쉽기 때문에 크론탭을 사용해 일정 시간마다 일괄 처리하는 방법을 채택해 설명드립니다. 저는 1시간마다 실행토록 만들었습니다.
4. 서버를 이용한 이미지 최적화 시스템
여기서터는 위에서 정의한 프로세스에 따라서 이미지 최적화 시스템(?)을 구축하는 구체적인 방법을 살펴봅니다.
4.1. 이미지 백업
이미지 최적화를 진행 전 백업을 진행합니다.
최적화 시스템 구축 방법에 따라 해당 이미지만을 백업 받을 수도 있고, 폴더를 통채로 백업받을 수도 있습니다.
저는 서버 공간도 남아돌고, CPU도 남아돌고 있기 때문에 폴더채 백업받는 방안을 선택했습니다. 그리고 이는 우선 서버 내에서 백업을 하는 것으로 했습니다.
이어서 백업 스크립트를 만듭니다. 이걸 실핼해도 되고, 뒤에서 설명하는 크론탭에서 자동 실행토록 하면 됩니다.
# 이미지 최적화 진행 전에 백업하기
tar -zcvf /backup/"happistimagebackup$(date +%y%m%d%H%M).tgz" /home/happist/wp-content/uploads/20201>/dev/null2>/dev/nullCode language:PHP(php)
4.1.3. 오래된 백업 파일 삭제
백업을 계속하다보면 엄청난 백업 파일이 쌓이게 됩니다. 그러면 아무리 서버 용량이 많아도 곧 용량 부족 상태에 이르게 되겠죠.
그래서 일정 시간이 경과한 백업 파일은 삭제하도록 합니다. 여기서는 10일 지난 백업 파일은 삭제하도록 했습니다.
이 전 글에서도 언급했지만 사이트에 글을 쓰는 사람이 단 관리자 한명이라면 애정을 가지고 최적화된 이미지를 사용하겠지만 불특정 다수가 글을 쓰는 경우 최적화된 이미지를 사용하는 확율은 그리 크지 않습니다.
더우기 모바일에서 댓글 등의 글을 쓴다면 모바일에서 이미지 편집이 쉽지는 않고 그 귀찮은 일을 할 사람이 거의 없기 때문에 대부분 그냥 활영한 사진을 그대로 올립니다.
스마트폰 카메라 사양이 고급화되면서 이미지 크기도 커졌기때문에 대용량 파일을 그냥 올릴 가능성이 커졌습니다. 물론 댓글이나 상품 리뷰 시 이미지를 사용하지 않토록 만들었다면 별 문제는 없지만 대세는 적극적으로 이미지를 댓글과 상품 리뷰에 적용하고 있는 상황이기도 합니다.
그렇기때문에 정기적으로 이미지 크기와 품질을 최적화해서 적절한 사이즈로 만들어주는 것이 필요합니다.
저는 이러한 이미지 크기를 점검해 지나치게 크다면 사이즈를 줄이는 것을 Imagemagick를 이용해 구현했습니다.
기준으로 폭만 변경하려면 widthxheighr중에서 앞의 width만 적어주고, 높이를 맞추려면 xheight를 사용합니다. 아래 내용을 보시고 제가 사용한 명령어를 그 아래에 소개해 놓았습니다.
적절한 크기의 이미지로 사이즈 조정되었다면 각 이미지를 압축하는 단계로 진입니다. 이미지 압축 대상은 가장 많이 사용하는 JPEG와 PNG 이미지입니다.
JPEG 이미지 압축 방법
JPEG 이미지를 압축하는 방법은 여러가지가 소개되어 있습니다. 각기 자기 방법이 최고라고 주장하고 있죠.
그렇지만 전문가들의 평가를 보면 MozJPEG와 Guetzli를 가장 좋은 JPEG 이미지 압축 방법으로 소개하고 있습니다.
그렇지만 Guetzli는 가장 압축 효과가 뛰어난 대신 인코딩 시간이 많이 걸리고, Progressive를 지원하지 않는등 약점이 있습니다.
그래서 저는 MozJPEG를 사용하는 JPEG-recompress를 사용하기로 했습니다.
JPEG-recompress를 이용해 JPEG와 PNG 이미지를 압축하는 아래와 같은 명령을 사용했습니다.
# jpeg-recompress를 이용 JPEG 이미지 압축
find /home/happist/wp-content/uploads/2020 -type f -iname '*.jpg' -exec jpeg-recompress --quality medium --min 60 --method smallfry \{} \{} \;Code language:PHP(php)
# 이미지가 있는 절대 주소를 입력합니다(absolute path to image folder)
FOLDER="/var/www/happist.com/wp-content/uploads"# 이미지 최대 폭을 설정합니다.max width
WIDTH=1024# 이미지 최대 높이를 설정# 쇼핑몰등은 설명 이미지를 길게 만드는 경우가 많아 높이 조정은 문제가 있어 가능한 큰 값을 지정
HEIGHT=102400# PNG와 JPG의 폭이나 높이가 최대치를 넘어가면 이미지 폭이나 높이를 조정합니다. # 이때 imagemagick은 그 이미지의 폭과 높이 비율을 유지합니다.
find ${FOLDER} -iname '*.jpg' -o -iname '*.png' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
# PNG만 폭이나 높이가 최대치를 넘어가면 이미지 폭이나 높이를 조정합니다. # 이때 imagemagick은 그 이미지의 폭과 높이 비율을 유지합니다.# find ${FOLDER} -iname '*.png' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;# JPG만 폭이나 높이가 최대치를 넘어가면 이미지 폭이나 높이를 조정합니다. # 이때 imagemagick은 그 이미지의 폭과 높이 비율을 유지합니다.# find ${FOLDER} -iname '*.jpg' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;# 다른 대안 소개 폭과 높이를 일정 비율로 축소하는 방법# mogrify -path ${FOLDER} -resize ${WIDTH}x${HEIGHT}% *.png -verboseCode language:PHP(php)
다음으로는 배치 파일 resizeimage.sh 파일이 실행 가능하도록 만듭니다.
chmod a+x resizeimage.shCode language:PHP(php)
배치 파일 실행
이제 준비가 다 끝났습니다. 아래와 같은 방식으로 배치 파일 resizeimage.sh를 실행시켜 이미지 사이즈를 조정하도록 합니다.
다음으로는 MozJPEG 최신 버젼이 무엇인지 확인합니다. MozJPEG 최신 버젼 확인은 여기 링크 주소에서 할 수 있습니다. 제가 확인 시 v3.3.1이 최신 버젼이네요.
MozJPEG 최신 버젼 3.3.1.을 wget을 사용해 다운받습니다.
cd /tmp
wget https://github.com/mozilla/mozjpeg/archive/v3.3.1.tar.gz -O mozjpeg.tar.gz
tar -xf mozjpeg.tar.gz
cd mozjpeg-3.3.1
autoreconf -fiv
./configure --with-jpeg8 --prefix=/usr
make
make installCode language:PHP(php)
3.3. jpeg-recompress 설치하기
아래 명령어를 사용해서 jpeg-recompress를 설치합니다.
다만 jpeg-archive는 2.2.0으로 업데이트되었지만 리눅스용으로 컴파일된 것을 찾지못해 2.1.1 버젼을 그대로 사용했습니다.
apt-get install bzip2
cd /tmp
wget https://github.com/danielgtaylor/jpeg-archive/releases/download/2.1.1/jpeg-archive-2.1.1-linux.tar.bz2 -O jpeg-archive.tar.bz2
tar -xf jpeg-archive.tar.bz2
cp jpeg-recompress /usr/bin/jpeg-recompress
chmod 755 /usr/bin/jpeg-recompressCode language:PHP(php)
여기까지 마쳤다면 필요한 모든 것은 설치된 셈입니다.
3.4. jpeg-recompress에서 사용가능한 이미지 매트릭스
jpeg-recompress에서는 아래 이미지 매트릭스가 사용 가능합니다. 디폴트는 SSIM입니다.
글을 작성 시 jpg 파일과 함께 WebP 이미지 파일을 같이 올렸다면 상관이 없지만 대부분은 그렇지 않기 때문에 서버에 있는 jpg나 png 포맷 이미지에 WebP 포맷 이미지를 추가합니다.
즉 서버의 이미지 저장 폴더에는 확장자가 jpg 또는 png인 이미지 파일 하나와 WebP 확장자를 가진 이미지 파일의 2개의 이미지가 존재하게 됩니다.
웹서버는 WebP 이미지를 지원하는 브라우저에게는 WebP 이미지를 로딩해 주고, 지원하지 않는 브라우저에게는 원래의 jpg 또는 png 파일을 로딩합니다.
그렇기 때문에 WebP 이미지를 이용한다는 것은 기존 jpg 파일에 추가로 WebP 이미지를 추가로 가지고 있기 때문에 서버 용량을 더 많이 차지 합니다.
다만 WebP 이미지를 지원하는 대부분의 브라우져에서는 로딩 속도가 빠르고 트래픽 양이 줄어드는 긍정적인 효과가 있습니다.
아래 코드는 jpg나 png 파일 원본은 그대로 유지하면서 추가로 WebP 파일을 생성해주는 코드입니다.
여기에서는 쉽게 사용하기 위해 sh 파일 스크립트로 사용하도록 만들겠습니다.
먼저 webp.sh 파일을 만듭니다. 만드는 파일 위치는 적절히 관리 가능한 곳에 만듭니다.
여기서는 제가 주로 사용하는 편집기로 가장 쉽다는 nano를 사용했으니 여러분이 사용하는 편집기로 webp.sh 파일을 만들고 코드를 입력하면 됩니다.
nano webp.shCode language:PHP(php)
다음으로는 webp.sh 파일안에 WebP 파일 생성 코드를 추가합니다.
아래 코드 중 echo가 있는 줄은 삭제해도 무방합니다.
이미지 파일이 있는 폴더 위지는 서버의 풀 주소를 사용합니다. 예를 들어 /home/mysite/wp-content/uploads
WebP 파일을 만드는 명령어인 cwebp의 옵션을 정합니다. 옵션은 아래와 같은 것들이 있습니다. -lossless : 무손실 WebP 이미지 파일을 만듭니다. -q : 압축율 지정 예를 들어 -q 80처럼 -quiet : 아무것도 인쇄하지 말라는 옵션 -resize width height : 이미지 크기를 조정, width나 height 중 하나가 0이라면 종횡비를 유지
Webp 적용을 위한 압축율을 조정할 수 있습니다. 아래는 압축 옵션으로 -q 80를 적용하고 있는데요. 이 압축율 대신 다른 원하는 압축율로 변경합니다. 예를 들어 -q 90처럼 말입니다. 중간 품질 -q 75가 WebP에선 기본값이라고 하네요. 80~99는 고품질로 WebP의 잇점은 감소한다고 구글은 이야기합니다. WebP는 품질보다 속도가 중요한 경우 사용하라고 하네요.
echo"===== Converting images into WebP .webp ====="for x in `find 이미지 파일이 있는 폴더 위치(예 /var/www/happist) -type f \( -iname \*.jpeg -o -iname \*.jpg -o -iname \*.JPG -o -iname \*.png \)`
do cwebp -quiet -q 80 ${x} -o ${x}.webp;
echo"Converted $x to ${x}.webp"
doneCode language:PHP(php)
다음으로는 webp.sh 파일을 실행 가능하도록 만들어야 합니다. 이는 chmod 명령어를 사용합니다.
chmod a+x webp.shCode language:PHP(php)
이제 준비가 다 끝났습니다. 아래와 같은 방식으로 webp.sh를 실행시켜 WebP 이미지를 생성하도록 합니다.