django media_root와 media_url을 알아봅시다.

웹/장고 2023. 1. 3. 01:00

 안녕하세요. 이번 시간에는 settings.py에 작성하는 MEDIA_ROOT와 MEDIA_URL을 어디에 쓰는지 알아보겠습니다.

 


 

 먼저, Post에 ImageField를 추가했어요. ImageField를 사용하기 위해서는 Piliow를 설치해야 합니다. 이는 장고가 이미지 field를 validation 할 때 piliow를 쓰기 때문입니다.

 

 

 이제 post 테이블을 보면 image가 VARCHAR로 있음을 알 수 있는데요. 직감하셨겠지만, 이 필드는 경로를 저장합니다. 실제 파일은 이 경로값을 읽어온 다음에 파일로 접근하게 됩니다.

 

 

 이제, 새로운 포스트 하나 만들고 1.jpg를 이미지로 해 보겠습니다.

 

 그러면, 제 프로젝트 root 폴더에 1.jpg가 올라가 있음을 볼 수 있는데요. 사실 이는 원하는 방향이 아닙니다. media, static 파일 등은 분리되어야 하기 때문입니다. 저 경우에는 requirements.txt라던지 .env와 같이 설정 & 셋팅 파일과 같이 있습니다. 깔끔하지 않습니다.

 

 게다가, 1.jpg에 들어가려고 하면 안 되는데요. 이는 제가 실제 media 파일에 접근할 수 있는 url을 설정하지 않았기 때문입니다.

 


 어떻게 해야 할까요? 먼저 MEDIA_URL과 MEDIA_ROOT를 설정합니다. 둘 다 media/로 들어가는데요. MEDIA_ROOT는 실제로 유저가 올리는 이미지 등의 파일이 올라가는 루트 위치를 의미합니다. 다음에, MEDIA_URL은 이 루트 폴더를 어느 url과 맵핑시킬지를 나타냅니다.

 

 

 urls.py에 이 정보들을 반영시켜 주면 됩니다. document_root는 실제 미디어 파일들이 저장된 루트 위치를 나타냅니다. 앞에 있는 settings.MEDIA_URL은 미디어 파일들이 저장된 루트 위치를 어느 url로 mapping 할 건지를 나타내요. 위 예제에서는 MEDIA_URL과 MEDIA_ROOT를 각각 'media/'로 설정하였는데요. 이 경우, 프로젝트 루트 디렉토리의 'media/1.jpeg'가 url 'media/1.jpeg'로 맵핑이 되게 됩니다. 다시, 제일 최신 글의 image를 1.png로 업로드 해 보겠습니다.

 

 

 url을 주목해 봅시다. media/1.png로 접근했어요.

 

 

 그랬더니, 이미지 파일을 잘 얻어오는 것을 볼 수 있어요. 만약에 MEDIA_URL을 'media/'가 아닌 '/'로 설정하면 어떻게 될까요?

 

 요래 설정해 보겠습니다.

 

 그리고 다시 가장 최신 글에 있는 이미지에 접근하는 요청을 날려 봅시다. url이 media/1.png가 아니라, 1.png로 접근하고 있어요.

 

 

 이미지도 잘 얻어옴을 알 수 있습니다. 이제 db와 실제 local file system에는 어떻게 저장되어 있나 보겠습니다.

 

 post에는 미디어 루트로부터 파일 경로가 저장되게 됩니다. 3968번 포스트의 image가 1.png로 적혀있는 것을 보면 알 수 있어요.

 

 실제 파일은 media 밑에 저장되게 됩니다.

 


 그러면 django에서 MEDIA_ROOT와 MEDIA_URL은 어디에서 쓰일까요?

 

 MEDIA_ROOT라는 키워드를 django가 설치된 가상 환경에서 찾아봅시다. 그러면, files/storage.py에서 쓰는 것을 볼 수 있어요.

 

 236, 251번째 줄은 FileSystemStorage 클래스 안에 있습니다. 공식 문서의 설명을 보면 local file system의 파일 저장소를 구현하고 있다고 되어 있어요. 즉, 로컬에서 FIlefield 관련해서 테스트 할 때 유용하게 쓰일 수 있는 것임을 알 수 있습니다.