본문 바로가기

Django

백엔드 서버 되어보기

Django로 프로젝트를 생성, app을 만들고 models.py, views.py, urls.py를 작성하여 엔드포인트를 생성했다.

이제 프론트엔드가 클라이언트가 되어 여기로 요청을 보내고 응답을 받아갈 수 있다. 터미널에서 혼자 서버 켜고 다른 터미널에서 httpie를 사용하여 테스트하던 것과 다른, 진짜 누군가와 주고 받는 통신이다.

 

views.py에있는 클래스 안에 POST, GET method가 있고 이 method가 갖는 argument로 request가 있다. 프론트가 요청을 보내면 이 request로써 들어오고, 필요한 정보를 추출해 DB에 반영하는 등의 로직을 거친다. 응답을 보낼 땐 method와 설정해둔 응답의 유형에 따라 status code만 보내기도 하고 header나 payload에 정보를 담기도 한다.

 

한 컴퓨터 내에서 지지고 볶는 게 아니라 외부에서 요청을 받고자 하기 때문에 준비해야 되는 게 있다.

1. 같은 와이파이를 쓰고 있어야 된다.

프론트는 서버의 IP주소를 통해 요청을 보낸다. 백엔드에서 서버를 켜두고 와이파이를 사용하고 있으면 이 기기는 공유기가 할당해준 private IP주소를 사용하고 있기 때문에 만일 같은 와이파이를 사용하는 게 아니라면 공유기 바깥에서는 서버를 제대로 찾아올 수 없다. 회사 내에서 각자 자리를 1번, 2번으로 부르기로 합의하고선 외부인인 퀵에게 ㅁㅁ회사 2번 자리로 배달해주세요 하면 2번 자리가 어딘데요?가 되는 느낌으로 이해했다.

참고 링크

kimsgomul.tistory.com/287

www.clien.net/service/board/kin/12058183

2. settings.py의 allowed_host 확인

빈 배열이면 장고가 설정해준 대로 localhost만 접근이 가능하다.

['*']이면 모든 요청을 허용한다는 뜻이다.

3. 서버 실행시 코드

$ python manage.py 0.0.0.0:8000

$ python manage.py 0:8000

둘 중 하나를 써서 서버를 돌리면 8000 포트를 통한 모든 요청을 허용한다. 0.0.0.0은 모든 IP를 의미한다.

 

준비를 다 하고 나서 프론트엔드에게 요청시 필요한 내용을 공유해야 된다.

4. 내 IP 공유

우분투에서

$ hostname -I

를 치면 IP 주소를 얻을 수 있다. 엔드포인트 url에 이걸 넣어야 된다.

5. 엔드포인트 url과 요청시 조건 공유

프론트에서 백엔드 서버로 요청을 보낼 땐 이 백엔드에서 이미 만들어둔 것만 사용할 수 있다. 어느 url을 쓰고 여기서 method를 사용할 수 있는지 그리고 반드시 써야되는 key와 해당 key에 줘야 되는 데이터의 type등 조건은 무엇인지를 알고 이 형식에 맞게 보내야만 된다. access token을 어떤 key로 지정하는지도 통일해야 된다.

총 세번의 요청을 받은 서버단의 터미널 캡쳐이다.

첫번째는 해당 엔드포인트에 없는 method를 사용했을 때 - 여긴 POST만 만들어져 있었다.

두번째는 성공

세번째는 조건에 부합하지 않는 정보를 담아 요청했을 때 - 틀린 아이디/비밀번호로 로그인

에러

로컬에서 서버를 테스트할 땐 httpie를 사용해서 요청을 보냈다. access token 관련을 구현한 뒤 httpie를 사용해 테스트할 때 headers에 데이터를 넣는 방식은 이 링크를 참고했다.

온갖 틀린 케이스를 넣어 에러를 발생시키고 처리했는데 내가 프론트에 대해 잘 몰라서 과하게 잡은 것도 있었다.

- 요청의 body가 없는 상태에서 보냈을 때 발생하는 에러를 처리했는데, 지금처럼 폐쇄적인 프-백 통신에서는 프론트의 코드에서 body 부분이 빠질 일은 거의 없다고 보면 된다. 불특정 다수가 접근할 수 있는 오픈 API에서는 핸들링해야되는 문제다.

- 요청시 보내는 정보인 email에 '@'와 '.'이 반드시 포함되어 있어야 하기 때문에 일부러 email='@.'을 요청에 담아 보냈다. 그랬을 때 요청 자체가 가지 않고 http error [Errorno 21]이 떴다. 에러 메세지를 긁어서 구글링을 해봐도 같은 메세지를 가진 IsADirectoryError에 대한 내용만 나왔다.

나중에 알게 되었지만 이건 httpie 내의 규칙으로 인한 문제였다. httpie에선 '@'가 파일에 관련된 문자였기 때문. 수아님이 주신 참고 링크

미해결 에러

중복 검사 로직이 있는데도 불구하고 중복 데이터가 DB에 저장된 오류. 민지님은 중복 검사 로직도 있고 models.py에 unique도 주었는데 동일한 오류를 겪었다.

회원가입 엔드포인트로 요청을 보낼 때 같은 정보를 입력하고 빠르게 여러번 연달아 보냈을 때 원래는 DB에 처음 한 개만 저장이 되야 한다. 그런데 요청 전부가 다 저장되어 있었다.