본문 바로가기

TIL

[TIL 2024. 04. 19] 개인과제 오류 수정 (3)

django 기초 주차의 개인과제로 Sparta Market을 만들어보는 과정에서 발생했던 오류를 정리한 마지막 글이다.

 

메인 페이지인 물품 목록 리스트 페이지에 현재 로그인한 사용자의 프로필 페이지로 갈 수 있는 a태그(GET요청)를 만들어 주었는데, 어떤 때는 잘 기능했다가 어떤 때는 오류가 발생했다.

 

처음에는 오류가 나는 원인이 뭔지, 왜 처음에는 잘 되다가 어떤 때에는 오류가 나는지를 알지 못해서 당황스럽기도 했다.

 

그런데 오류가 나는 상황을 보니, 서버를 켜고 로그인된 상태에서는 애초에 오류화면이 뜨지도 않고 ,내 프로필로 이동하는 하이퍼링크가 잘 기능했다. 하지만 그렇게 이동한 프로필 페이지에서 "로그아웃" 버튼을 누르면 바로 에러화면이 떴고, 이럴 떄는 서버를 껐다가 켜도 오류가 계속됐다.

 

즉, 로그인된 상태에서는 메인 페이지도 오류 없이 잘 출력되고, 내 프로필 가기 버튼도 정상적으로 작동된다. 하지만 로그아웃 상태면 일단 메인 페이지 로드 자체가 실패하는 오류가 발생하고 있는 것이었다.

 

이렇게 정리하고 보니, 오류의 원인도 짚이는 것이 있었다.


 

오류가 난 처음의 코드 작성의 배경(상황, 흐름)은 다음과 같았다.

 

당시 난 products:products_list와 users:profile 뷰를 다음과 같이 작성한 상태였다.

 

products:products_list (products/views.py)
users:profile (users/views.py)

 

그리고 profile페이지(profile.html)과는 별도로 사용자의 편이성을 위해 products_list.html에 현재 로그인된 사용자의 프로필 페이지로 바로 이동할 수 있는 버튼을 만들고자 한 것이다.

 

애초에 내가 메인페이지에 지금 로그인된 사용자의 프로필로 가기만 넣기로 한 것도 products_list 뷰와 관련이 있다.

즉, products_list.html에 뿌려줄 수 있는 데이터를 넘겨주는 products_list 뷰의 context에 사용자에 대한 정보가 전혀 없었다. 사실 member의 변수를 새로 만들고, 조회한 값을 함께 넘겨줄 수도 있었지만 메인 페이지에서는 현재 로그인한 사용자의 프로필 페이지에만 접근 가능하도록 하는 것이 간결할 것 같아 그렇게 계획했었다.

(타 사용자의 프로필 페이지에 대한 접근은 게시물 상세 페이지의 작성자를 클릭하면 가능하도록 했다)

 

메인 페이지가 번잡하면 안될 것 같다는 생각과 함께 메인 페이지(products_list.html)에 사용자에 대한 정보가 넘어오는게 없더라도 "request.user"을 사용하면 어떤 템플릿에서도 현재 로그인된 유저 정보에 대한 접근이 가능하다는 점이 특히 메인페이지를 이렇게 구성하기로 한 것의 주요한 이유였다.

 

그래서 작성한 처음이자 오류가 나기도 한 문제의 코드가 바로 아래의 코드이다.

오류가 난 코드 (변수도 잘 넘겨줬다..)


오류 메시지

 

 

아무리 봐도 변수(parameter)까지 request.user.username으로 잘 넘겨줬는데, 오류 메시지에는 "username"이 없다고 떠서 의아했다..

 

근데 앞에서 언급했듯 "로그인"과 "로그아웃"을 연관시켜서 생각하니 오류의 원인을 알 수 있었다.

 

request.user이라는 접근 자체가 '현재 로그인된 사용자'에 대한 정보를 말하는 것인데, "로그아웃"경우에 대한 분기처리가 없으니 당연히 로그아웃 상태에서는 메인 페이지 템플릿을 불러오는 것부터 오류가 발생할 수밖에 없는 것이다.

 

(와이어 프레임을 활용하든..로그인 화면과 로그아웃 화면에 대한 구체적인 구상이 있었다면 헤매지 않을 수 있는 문제였다.. -> 로그아웃 화면에서는 당연히 "내 프로필 페이지" 링크도 사용자에게 노출되지 않을 것이므로!)

 

이렇게 문제점을 인지한 후에 수정해서 작성한 코드가 아래의 코드이다.

오류를 수정한 코드

 

즉, 로그인한 경우는 기존에 작성한 코드에서와 마찬가지로 "request.user.username"을 변수로 활용했고(products_list view에는 별도의 수정 안했음), 로그아웃의 경우는 else를 통해 분기를 나누어 login view를 통해 login.html을 렌더링하도록 처리해줬다.

 

그 결과, 로그인 상태에서는 내 프로필 페이지 링크(버튼)이 활성화 되고, 로그아웃 상태에서는 아예 노출되지 않는다.

 

로그인한 경우 (링크 버튼 노출됨)


로그아웃한 경우 (링크 버튼 노출 안됨)