Python - Django를 이용한 인스타그램 클론 - 1(시작)

2022. 9. 15. 00:36How to become a real programmer/Back-End

파이썬은 어쩌면 현재 많은 사람들이 쓰는 개발언어 중 가장 진입장벽이 낮은 언어일 것이다. 그래서 많은 비전공자분들이 파이썬으로 코딩에 입문하는 것을 볼 수 있다. 

파이썬은 웹 프레임워크로 Flask와 Django 두 가지를 지원하는데, 이번에는 Django를 사용하여 인스타그램을 클론해보도록 하겠다. 필자도 현재 Flask는 대학 수업 중 프로젝트로 잠깐 다뤄본적이 있지만 Django는 써보지 않아 여러 강의를 참고하였다.

그 중에서도 현직 개발자이시며 개발 유튜브를 하고 계시는 mychew_ 님의 제로부터 시작하는 인스타그램 만들기를 보면서 장고를 익혔으니 자세한 내용은 해당 영상을 보며 따라해도 될 것 같다.

https://www.youtube.com/watch?v=M8UPyeF5DfM

11시간 30분 정도 되는 큰 영상인데, 그런만큼 다른 클론영상에서는 대충 넘어가는 부분까지도 자세히 설명해주시니 많은 것을 알 수 있을 것이다. 위 영상을 다 보고 난 후, Django를 활용한 다른 프로젝트까지 만들어 본다면 공부에 도움이 될 것이다.

 

우선 개발 환경으로 vscode를 사용할 수 있지만 파이썬에 특화된 IDE인 Pycharm을 다운로드 받아 사용하였다. 필자의 경우 현재 대학재학중이라 Pycharm의 프로페셔널 버전을 무료로 지원해주는 대상이었기에 프로페셔널 버전을 다운받아 사용하였고 해당 영상에서도 프로페셔널 버전을 대상으로 하는 것이기에 한달 무료버전을 사용하거나 대학생인 경우 프로모션을 받아 무료로 사용하면 될 것 같다.

그리고 python 3.7.9 버전을 다운로드 받았고, 아래와 같이 프로젝트를 생성했다.

프로젝트 생성 시 보이는 화면

Minstagram 프로젝트를 생성했고 그 안에 Minstagram이라는 폴더가 있다. 해당 폴더에는 settings.py라는 파일이 있는데 프로젝트 세팅에 대한 파일이고 많이 고치게 될 예정이다.

그리고 template 폴더가 있는데, 장고는 MTV모델로서, Model-Template-View 모델로 되어있다. 기존에 플라스크나 스프링부트에서는 MVC(Model(데이터)-View(사용자 인터페이스)-Controller(데이터 처리 로직)) 모델이었고, 각 요소가 서로 방해되지 않도록 설계하는 방식이었다. 장고도 이와 유사하지만 View가 Controller 역할을 한다. MTV에서는 Model이 데이터 형태를 설정, Template이 화면을 구성, View가 데이터를 처리, 가공하는 역할을 한다고 생각하면 될 것 같다. View가 중앙에서 Template에서 일어난 이벤트를 인식, Model에 인식한 행동을 처리와 같이 여기저기를 오가면서 행동한다.

 

venv는 파이썬 가상환경 폴더이고, manage.py 파일은 장고를 관리하는 여러 명령어를 통해 장고를 띄우거나, 장고 DB를 만들거나, 모델 객체를 만들거나, DB와 마이그레션을 할때 사용한다.

 

한번 아무것도 만지지 않은 순수한 프로젝트를 실행해볼까. 실행하게 되면 http://127.0.0.1:8000/ 주소로 열리게 된다. 

아무것도 건드리지 않고 실행하면 위와 같이 떠야한다

자 로컬호스트의 8000번 포트로 열린 페이지를 열어보니 위와같이 뭐 잘 열렸다는 것 처럼 나온다. 이러면 정상적으로 잘 설치된 것이다.

참고로, 127.0.0.1 은 해당 컴퓨터의 로컬호스트를 말한다. 그리고 포트번호는 서버역할을 하는 내 컴퓨터에 여러 서비스가 열려있는 경우, 포트로 나누어 관리하기 위해서 설정해놓는 것이다.

 

이제 해당 주소에 우리가 만든 html파일을 펼쳐주기 위해서 아래와 같이 template 안에 Minstagram 폴더를 만들고, main.html파일을 만들어 주었다. 

main.html에 대충 내용을 넣고, 해당 파일을 띄우기 위해서는 View가 controller 역할을 한다고 했으니 View 부분을 만져서 이어야한다.

이를 위해선 url.py라는 파일을 통해서 사용자가 어떤 url로 입장했을 때 어떤 views.py 내 함수를 실행시킬지, html파일을 열어줄 지를 설정할 수 있다.

url.py는 Minstagram 폴더 내에 있는데, urlpatterns = [] 부분에 우리가 어떤 경로로 접근하면 어떠한 것을 열어줄지를 하나하나 매칭시켜주는 것이다. 

기본적으로 위와같이 되어있는데,

즉  path('경로', 열어줄 파일) 처럼 되어있는 것 처럼 127.0.0.1:8000/admin으로 접속하게 되면 아래와 같이 admin.site.urls 파일이 뜨는 것이다.

요렇게

일단 Django-rest-framework를 설치해주어야 하는데, rest-framework란 무엇일까.

REST는 공동표준으로, Representational State Transfer의 약자인데 그냥 우리가 url로 어디 접근을 하고, 하는데 사용하는 표준이라 생각하면 되겠다. 장고에서 REST를 쓰기위해선 Django rest framework가 필요하다.

이를 설치하기 위해 터미널을 열고 설치해주도록 하겠다. pip install djangorestframework 명령어를 실행하면 된다.

요렇게

CLI가 싫다면 설정창에서 설치도 가능하다

위와 같이 현재 설치된 패키지를 확인할 수 있고 + 버튼을 누르면 검색 후 설치가능하다.

 

이제 어떠한 경로로 가면 뭔가를 실행시키게 해야하는데 실행시키기 위한 파일로 views.py 파일을 Minstagram 폴더 내에 만들어주었다.

그리고 위와 같은 코드를 쳐준다. 아까 설치한 Djangorestframework 패키지가 여기서 사용되는 것을 알 수 있는데, APIView가 rest_framework.views에서 import 되는 것이기 때문이다. APIView 함수는 Rest를 호출할 수 있게 만들어주는 것이다. get으로 호출하면 Minstagram/main.html 파일이 설정되게 해주는 것이다. 거기에 post로 호출할 때도 똑같이 적어주면 post로 가도 동일하게 열릴 것이다. 

 

자 클래스 까지 만들었으니, url에서 ""으로 접속 시 sub 클래스를 실행시키면 창이 표시 될 것이다. 즉 url에서 views.py로 가서, templates/main.html을 실행시키는 것이다. 이를 위해서 urls.py로 이동한다.

urls.py에서 위 처럼 views파일에서 Sub 클래스를 임포트 해주고, 경로 설정에서 디폴트 경로로 Sub 클래스를 실행해 보여주겠다는 함수를 넣어주면 창이 뜨는데 필요한 건 모두 완료이다. 실행해주고 들어가보게 되면!

아까 내가 만든 main.html 파일이 잘 나타난다.

만약 경로설정이 안된 hey라는 경로로 그냥 접근해보면.

위와 같이 디버그 모드에서 현재 들어갈 수 있는 경로인 "admin/" 과 ""가 있다는 것을 알려준다. 이러한 디버그 모드는 settings.py에서 DEBUG = True로 되어있는 부분에서 제어할 수 있다. False로 해놓으면 그냥 page not found가 뜬다. 쾌활하고 화나지않는 개발환경을 위해 켜놓는게 좋을 듯 하다.

여기까지 MTV에서 Template과 View를 만져본 것이다.