전체 글(30)
-
[MySQL] Soft delete와 unique constraint
Soft delete인데 unique가 걸려있다... 제목을 어떻게 지어야할지 몰라서 저렇게 지었지만 회사 API 작성 중 회원가입 파트에서 막힌 부분이 있었다. 바로 탈퇴한 아이디인데 그 아이디로 다시 회원가입을 할 경우, 로직상 DB에서 레코드(row)를 삭제하는 것이 아닌, soft delete(논리 삭제)를 할 경우 unique해야 할 아이디가 이미 테이블에 존재한다며 에러를 내뿜었다. 이 부분에 대해 고민을 한 것이 2가지였다. unique constraint를 없애고 비지니스 로직으로 논리 삭제된 아이디를 제외하고 중복된 아이디인지 검사 nickname과 deleted_at 컬럼 두개를 다중 컬럼 unique를 건다. unique 삭제? unique 조건을 삭제한다면 문제가 분명히 생길 것이다..
2023.01.12 -
[Django] Channels 사용하기 - 4
이 글은 [Django] Channels 사용하기 - 3에서 이어집니다. views 테스트하기 Selenium을 사용하여 end-to-end 테스트를 할 것이다. 메시지를 보낼 때, 같은 방에 있는 모두가 그 메시지를 보는가 메시지를 보낼 떄, 다른 방에 있는 누군가는 메시지를 볼 수 없는가 Selenium을 설치하자 $ python3 -m pip install selenium chat/tests.py 파일을 만들고 코드를 작성하자. # chat/tests.py from channels.testing import ChannelsLiveServerTestCase from selenium import webdriver from selenium.webdriver.common.action_chains impor..
2022.10.24 -
[Django] Channels 사용하기 - 3
이 글은 [Django] Channels 사용하기 - 2에서 이어집니다. 비동기 consumer 작성하기 기존에는 동기적인 consumer를 만들었다. 동기 consumer는 특별한 코드없이 Django 모델에 동기적으로 접근할 수 있어서 편리하지만, 비동기 consumer는 추가 스레드를 생성할 필요가 없다는 점에서 높은 성능을 자아낸다. 기존에 사용하던 sync_to_async를 사용해도 되지만 async-native 라이브러리를 사용하는 것이 더 성능이 좋다. 이제 ChatConsumer를 비동기 형태로 바꿔보자. chat/consumers.py를 다음과 같이 바꾸자. # chat/consumers.py import json from channels.generic.websocket import As..
2022.10.24 -
[Django] Channels 사용하기 - 2
이 글은 [Django] Channels 사용하기 - 1에서 이어집니다. room view 추가 특정 채팅방에서 게시된 메세지를 볼 수 있는 room view를 추가하도록 하자. chat/templates/chat/room.html파일을 추가하자. chat/ __init__.py templates/ chat/ index.html room.html urls.py views.py 그리고 해당 파일에 다음과 같이 작성하자. {{ room_name|json_script:"room-name" }} 이제 view에서 room.html 파일을 찾아갈 수 있게 작성해 주자. # chat/views.py from django.shortcuts import render def index(request): return re..
2022.10.18 -
[Django] Channels 사용하기 - 1
Django의 Chaanels는 Django에서 웹 소켓을 사용할 수 있게 해주는 라이브러리이다. Channels는 django에서 HTTP이외의 웹 소켓이나, IoT 프로토콜과 같은 다양한 프로토콜을 지원하기 위해 만들어졌다. Channels는 비동기 형식으로 django를 래핑하여 작동한다. ASGI 기반으로 개발 되었다. 하기 내용은 Channels 공식 문서를 참조하여 작성하는 글이다. 설치 $ python3 -m pip install -U channels 참고로 필자는 위의 방법으로 설치 시 에러가 나서 아래와 같이 설치했다. $ pip install channels 설치가 완료되면 다음과 같이 확인해 보자. $ python3 -c 'import channels; print(channels.__..
2022.10.17 -
[Django] connection.queries always empty
django에서 작성한 orm이 어떤 식으로 쿼리가 날아가는 지 확인하기 위해 raw 쿼리를 찍어보려고 했는데 connection.queries를 해도 계속 [] 라는 빈 값이 나왔다. 어떠한 짓을 해도 쿼리의 개수가 0이었기 때문에 무엇이 문제인지 구글링을 하던 도중 여기서 해답을 찾을 수 있었다. 나는 django-extention을 사용하여 shell-plus를 쓰고 있는데, 쉘 플러스는 쿼리가 평가될 때 raw쿼리를 찍어서 보여주기 때문에 이 친구가 connection을 잡고 있는 것 같았다. 즉, 이미 shell-plus가 쿼리를 다 확인했기 때문에 내가 찍었을 때는 없는 것이었다...라고 생각이 든다.
2022.10.13