본문 바로가기
프로젝트/Django - How Dimt?

Django poj.c B17) 이미지 파일 압축/삭제 - 29일차

by Fola 2022. 5. 17.

Code B Django 17번 글, 프로젝트 29일차 (월)

 

2022.05.14 - [프로젝트/Django - How Dimt?] - Django poj.c A3) 타겟 유저와 유저 유인 요소, 실 서비스를 위해 필요한 숙제들 - 27일차

 

 

 

 

1. 

실 서비스를 위해 필요한 숙제 2번 - 이미지 압축/삭제를 해결

 

 

 

 

2. 이미지 삭제

객체를 'UPDATE' 할 때 이미지 필드가 교체되면 기존의 파일을 삭제한다.

 

아주 간단하게 해결되었다.

django-cleanup라는 pip 패키지가 있다.

이 패키지는 FileField와 ImageField의 값이 변한 뒤 모델이 저장되면 기존의 파일을 자동으로 지워준다.

 

패키지를 설치하고 setting.py에 INSTALLED_APPS에 등록하면 설정 끝.

 

PyPI의 패키지 문서 링크를 첨부

https://pypi.org/project/django-cleanup/

 

 

 

 

 

3. 이미지 압축

 

1)

이미지를 압축하는 스니펫 코드를 작성하였다.

스니펫 코드는 프로젝트 루트 아래 snippets라는 이름의 디렉터리 한 곳에 모아 관리하기로 했다.

 

 

가로/세로 중 더 큰 쪽의 길이가 1000px 가 넘어갈 시 ratio를 유지하며 1000px로 resize 한다

이미지는 80% 퀄리티로 저장.

기존 이미지를 파라미터로 받아 압축된 새 이미지를 반환한다.

 

함수를 호출할 시 size= 값을 파라미터로 넘기면 최대 픽셀을 수정할 수 있으며

값을 따로 넘기지 않을 경우 기본값 1000px, 1000px로 설정.

 

 

(의문)

 

Pillow 패키지로 Image.open() 할 때 뒤에 .convert('RGB') 메서드를 붙이지 않으면

JPEG 이외의 파일을 읽지 못한다.

 

Image.save() 시 이미지 포맷을 'jpeg'로 설정했음에도 불구하고

png 형식의 파일을 읽고 설정된 값으로 resize 및 압축되며 jpeg가 아닌 png 파일로 저장이 된다.

 

함수 내부와 공식 문서를 열심히 읽어 봤으나 원인 혹은 원리 이해는 실패.

 

 

 

2)

ImageField 가 있는 모델에서 .save() 함수를 오버라이드 하여

업로드된 이미지가 이미지 압축 스니펫 코드를 거쳐 서버에 저장하는 코드를 작성하였다.

 

Django에서 제공하는 클래스 내부의 함수를 오버라이드 하는 방법을 익힌 이후로

많은 로직에서 보다 쉽게 내가 원하는 결과물을 얻고 있다.

기쁘다.

 

 

3) 

결과 - 이미지 파일 1개당 400kb을 넘지 않는 크기로 서버에 저장된다.

 

 

 

 

3.

더 이상 사용하지 않는 이미지 파일을 삭제하고, 고해상도 고용량 이미지를 적절한 수준으로 압축하는 코드를 완성하였다.

 

원한다면 이미지 압축률과 resize 최댓값을 쉽게 변경할 수 있다.

유지보수가 쉬운 좋은 코드가 나와 만족스럽다.

 

이미지 삭제/압축 로직은

프로젝트를 실제로 서비스한다고 가정했을 때

서버에 저장되는 데이터가 급격하게 늘어나지 않도록 만들어 주는 안전장치가 될 것이다.

댓글