Project 12

[Backend] 정리 - 1

□ Model 필드 부분 update 포스트 방문 수 측정을 위해 Post 모델의 hits라는 필드를 가지고 있다. class Post(models.Model): ... hits = models.BigIntegerField(default=0) updated_at = models.DateTimeField(auto_now=True) ... 정말 많은 사람들이 방문하고 그랬다면 Redis 서버를 별도로 두어서 카운팅을 하고 스케줄러를 통해 주기적으로 DB에 업데이트해줬을 것이지만 여기서는 그런 주제의 글이 아니기에 패쓰 단순하게 사람들이 방문하면 +1씩 값을 증가시켜주는데 아래와 같이 그냥 save를 호출할 경우, DB에 전체 필드를 그대로 업데이트하게 된다. def retrieve(self, request,..

[Frontend] 정리 - 1

□ 댓글 Utterances Github 저장소를 이용하여 댓글 기능을 구현할 수 있는 앱인데 IT 개발 관련 블로그를 만든다면 큰 도움이 될 것 같다. (개발자라면 Github 계정 하나쯤은 있을 것이기에.. ) Utterances에서는 아래와 같이 각 포스트와 댓글(Issue) 맵핑 방식을 정할 수 있다. 보통 맵핑이기에 유일키로 할 수 있는 것으로 정하는데 여기서는 첫 번째 pathname으로 하였다. 문제는 pathname으로 하면 URL에 사용하는 Slug를 조심히 쓰거나 쓰지말아야할 것 같다. Slug 특성 상, 보통 글 제목을 가지고 Slug를 만드는데 백엔드에서 글 제목을 수정할 경우, Slug도 같이 그에 맞춰서 변경하도록 되어있다. 그에 따라서 댓글이 있는 상태에서 글 제목을 수정할 경..

Intro.

전에 회사다닐 때, 도메인까지 구입하여 블로그를 만든 적이 있었다. (지금은 정말 다양하고 편리한 기능을 제공하는 블로그 사이트들에 반해 진작 접었지만..) 처음 만들었을 당시에는 그래도 내가 직접 만든 사이트에 장기간 좋은 글을 계속 쓴다면 나름 나만의 브랜드 사이트를 만들 수 있다는 상상을 했었던 것 같다. (꿈만 컸네.. 쩝.) 지금은 티스토리에 이렇게 글을 쓰지만 아... 너무 좋은 것 같다. Django Admin에 Ckeditor 붙여서 사용할 때는 뭐 나름 나쁘지는 않았지만 별도 추가 개발을 안하고 너무 기본 기능만 쓰다보니 비교가 되는 건 어쩔 수 없나보다. 이젠 사용하지 않으니 소스코드를 공개로 전환하는 과정에서 조금 고치고 싶은 욕구가 샘솟아 몇 가지를 고치고 전환하였다. 참고로 처음 ..

[Backend] 정리 - 3

□ JSONField Test Case 이전 포스트에서 JSONField를 이용하여 2가지 형태를 이용했었습니다. Case 1 : { "data" : [ "취미 1", "취미 2", "취미 3"] } Case 2 : [ "취미 1", "취미 2", "취미 3"] 각각 테스트 케이스를 작성하여 발생했던 문제점을 보겠습니다. 테스트 케이스는 아래와 같이 작성되었습니다. (핵심 코드만 보기 위해 로그인이나 이런 부차적인 것들은 제외시켰습니다.) class UpdateProfileTestCase(APITestCase): def setUp(self): … def test_can_update_profile(self): data = { … "passions": {"data": ["축구", "야구"]}, } respo..

[Backend] 정리 - 2

□ Django User Model 이 부분은 사람마다 의견이 다를 것 같네요. 보통 장고에서 User Model 계획할 때, 3가지 방법을 사용합니다. 기존 User를 Foreign Key로 연결 (OneToOneField 이용) User 모델을 완전 새로 정의 (AbstractBaseUser 상속) User 모델에 필드 추가 (AbstractUser 상속) 제가 일하면서 들었던 조언 중 하나는 장고 프레임워크를 너무 변형시킬 경우, 다른 패키지(3rd party)를 이용할 때 문제 발생할 가능성이 높아진다. 최대한 프레임워크 기초를 건들지말고 있는 그대로 사용하는 것이 좋다. 라는 것이었습니다. 그래서 이 프로젝트도 OneToOneField를 이용하여 Profile 테이블을 만들었습니다. 이 부분에 ..

[Backend] 정리 - 1

앱별로 상세 설명을 진행하려고 하다가 큰 의미가 없는 것 같아서 프로젝트 진행하면서 기록하고 싶은 점이나 특징점을 쓰기로 하였습니다. □ TimeStampedModel class TimeStampedModel(models.Model): updated_datetime = models.DateTimeField(auto_now=True) created_datetime = models.DateTimeField(auto_now_add=True) class Meta: abstract = True 대부분의 모델에서 생성일과 수정일 필드는 존재하기 때문에 추상클래스 TimeStampedModel을 상속받아 모델들을 생성하였습니다. 추상클래스 TimeStampedModel을 상속받은 휴대폰인증 이력 모델 class Ph..

[Backend] env 환경변수

설명이 필요한 환경변수만을 나열하였습니다. □ ENV_MODE 셋팅 파일 이름 (ex: 'local', 'dev', 'prod') 이전 설명에서 배포환경에 따라 셋팅 파일들을 분리하였기 때문에 호출할 때도 동일하게 환경에 따라 다른 셋팅 파일을 호출해야합니다. manage.py, wsgi.py, asgi.py에 환경변수 셋팅하는 코드가 있으므로 매번 3개의 파일을 변경시켜주면 불편하니 'ENV_MODE'라는 환경변수를 만들어 3개 파일에 자동으로 적용시켜주는 방향으로 잡았습니다. □ ADMIN_URL 관리자 접속 URL은 누구나 접근할 수 없어야하므로 기본 /admin/ 주소 말고 별도의 다른 값(uuid와 같은)으로 지정해줍니다. □ BACKEND_DOMAIN ALLOWED_HOSTS에 등록할 백엔드 ..

[Backend] 프로젝트 환경셋팅

프로젝트 폴더 생성 $ mkdir redhorse $ cd redhorse 가상환경 생성 및 활성화 $ virtualenv venv $ . venv/bin/activate 이 프로젝트에서는 가상환경을 virtualenv로 사용하였습니다. 패키지 의존성 + 가상환경까지 관리 및 셋팅할 수 있는 pipenv 또는 poetry 사용을 고민했으나 virtualenv만 익숙하신 분들도 있기 때문에 virtualenv만을 사용하였습니다. Django 설치 및 프로젝트 생성 $ pip install django $ django-admin startproject redhorse . django-extensions 설치 $ pip install django-extensions 저는 두 가지를 목적으로 사용하였습니다. 1..

[Backend] DB 설계

뭔가 FM 방식으로 한다면 기능명세를 보고 분석하여 DB 모델링을 하겠지만 지금은 제가 기획자이자 설계자이니(^_^) 화면 설계 기준으로 보면 필요한 것을 대략적으로 알 수 있으므로 최종 필요한 테이블은 아래와 같이 되겠네요. 회원 계정 관련 테이블 - 회원 / User - 회원 휴대폰번호 / UserPhone - 프로필 / Profile - 프로필 사진 / ProfilePicture 채팅방 및 채팅메시지 테이블 - 채팅방 / ChatRoom - 채팅방 멤버 / ChatRoomMember - 채팅 메시지 / ChatMessage 기타 - (초기 회원가입 시) 휴대폰 인증 이력 / PhoneVerificationHistory - 매칭 / Match - (비밀번호 찾기를 위한) 임시 비밀번호 발급 이력 / ..