안녕하세요. 장고의 resolve 함수는 URL에 매핑되는 view에 대한 정보를 얻어올 때 쓰일법 해요. 예를 들어, url name은 무엇이고, view name이 무엇인지 등등입니다. ResolverMatch object를 리턴하는데요. 이것이 무엇인지도 간단하게 디버그 모드를 통해서 보겠습니다.

 


 먼저, 대략적인 프로젝트 구조에요. djangoex 패키지에는 urls.py가 있어요. 그리고, app 패키지에는 views.py가 있어요. 이 두 개의 파일만 건드릴 거에요.

 

 먼저, urls.py를 볼게요. path들이 있는데요. "/"에 대한 view 함수는 views.index로 잡혀있고, name은 "index"인 것을 알 수 있어요. 이 상황을 그림으로 그려 봅시다.

 

 

 즉, path가 "/"인 경우, app에 있는 views의 index를 타게 되는데요.

 

 

 index를 보면 그냥 단순히 "ok"만 응답함을 알 수 있어요. localhost:8000이 base 주소이니, localhost:8000 으로 요청을 날리겠습니다.

 

 

 request를 보겠습니다. 뭔가 여러 가지 메타 정보들이 걸려있는데요. path가 "/"로 잡혀있는 것을 볼 수 있어요. "/"일 때 views.py에 있는 index 함수에 있는 것들을 수행함을 알 수 있어요. 이제, resolve 함수가 리턴하는 ResolverMatch를 보겠습니다.

 

 그러면, 이런 메타 정보들이 나오게 되는데요. url_name이 "index"이고, view_name이 "index"라는 정보가 나옴을 볼 수 있어요. resolve는 문서에 따르면 path를 받아서, ResolverMatch 객체를 리턴하니 path를 잘 넘겨주면 되겠군요.

 


 이제, request로부터 path를 받아 봅시다. request는 path와 가 있는데요. 문서를 보면 후자는 항상 경로 정보를 포함한다고 되어 있어요. 그래서 요청의 path 정보를 볼 때, path_info를 쓰면 됩니다.

 

 6번째 줄을 보시면, resolve(request.path_info).url_name이라고 되어 있습니다. 일단, localhost:8000/으로 요청을 보냈고, base가 localhost:8000이기 때문에, request.path_info에는 "/"이 있을 겁니다.

 

 

 이 ResolverMatch에는 url name이 "index"라는 정보가 들어있기 때문에, url_name을 얻어오면 됩니다.

 

 

 index라고 잘 나오네요.

 


 이제 조금 재밌는 일을 해 보겠습니다.

 

 path "in3/"에 대응되는 view는 views.index3이고, name은 "index3" 입니다.

 

 이제 localhost:8000/을 입력해 보겠습니다. 그러면, index 함수에 들어올 겁니다. 6번째 줄에서 resolve 함수가 튜플 형태로 무언가를 리턴하는데요. 이 중 1번째가 view입니다. 이 view는 path "/in3"에 대응되는 뷰를 리턴하는데요. views.index3이였습니다. 어라? 잠깐만. 그러면 index를 타고 들어오면, 1을 출력할까요?

 

 

 네. 그렇네요. 즉 "/in3/"에 대응되는 view 함수를 얻어온 셈이 되겠습니다.