해결된 질문
작성
·
66
·
수정됨
0
질문을 온전히 이해할 수 있도록, 모든 맥락을 전달해주세요.
질문은 질문자가 번거로워야 보다 좋은 답변을 얻으실 수 있습니다.
시행착오를 알려주시면 곧바로 원하는 문제에 집중할 수 있습니다.
오류 메시지는 일부만 알려주시기보다 전체 오류 메시지를 캡처해서 주시면, 오류 파악에 도움이 됩니다.
당신의 파이썬/장고 페이스메이커가 되겠습니다. ;-)
인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
7-01 02 강의에서 ipv4address custom field를 생성하셨는데요
8-20 강의 같이 이후에는 그냥 Django GenericIPAddressField를 사용셨습니다.
7-01 02강의는 그냥 custom 필드를 보여주기 위한 예시이고 그냥 장고에서 제공해주는 IP 필드를 사용하면 되는건가요? 아니면 차이점이 존재하는 건가요?
제가 제작한 사이트의 사용량 집계를 위해 로그를 얻으려고 합니다.
class AccessLog(models.Model):
request = models.URLField()
time = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
ip = models.GenericIPAddressField()
상기와 같은 모델을 작성하여 request가 client로 날라올 때마다 db에 쌓아나가는게 맞을까요? 아니라면 logger를 이용하는게 맞을까요?
답변 1
1
안녕하세요.
A1. 그렇습니다. 장고에서 일반적으로 아이피를 저장하실 때에는 GenericIPAddressField를 사용하시면 되구요. 해당 강의에서는 말씀하신 대로 Custom 필드를 만드는 방법을 보여드리기 위함이었습니다.
그런데, MySQL의 경우 GenericIPAddressField를 사용하면, 데이터베이스에 아이피가 문자열로 저장되는데요. 아이피가 문자열로 저장되었을 때에는, 본 강의에서 언급드렸다시피 아이피 정렬 부분에서 문자열 특성으로 정렬이 됩니다. 아이피를 정렬하실 경우 주의가 필요하시구요. // 만약 아이피를 정말 수백만 이상 정말 많이 저장하셔야할 경우, 문자열보다 숫자로 저장하시는 것이 데이터베이스 디스크 공간을 조금 더 줄이실 수 있습니다. 이럴때 custom 필드를 고려해보실 수 있으시겠습니다.
A2. 말씀하신 대로 데이터베이스에 저장을 하실 수 있겠구요. 그런데 사용자가 아주 많은 경우 AccessLog INSERT 자체가 데이터베이스에 부하가 많이 걸릴 수도 있습니다.
부하가 많이 걸리는 지 여부는 데이터베이스 모니터링이 필요하겠구요. AccessLog를 저장하는 데이터베이스를 분리해서 부하를 분산시키실 수도 있겠구요.
웹서비스에서 AccessLog를 조회해서 즉시 보여주는 경우가 아니라면, 데이터베이스에 저장하기보다 웹서버의 access log 기능을 활용해서 text 파일 로그로 저장하실 수도 있습니다. access log 기능은 nginx나 apache 웹서버에서 기본 제공하는 기능이며, 아이피, user agent, 시각 등의 다양한 정보를 저장하실 수 있습니다. 이는 웹 일반적인 포맷이거든요. 그러니 https://goaccess.io 와 같은 유틸리티로 실시간으로 웹로그를 분석할 수도 있습니다.
살펴보시고, 댓글 남겨주세요.
화이팅입니다. :-)