ISSUE
-
[22.11.27] 🍃 구현하고자 하는 화면 1. 이전 개발 단계에서 사이트를 등록하여 해당 사이트에 Tag를 Many-to-Many관계로 등록하는 진행 2. 이제 태그가 등록된 사이트를 최신순으로 4~6개 조회 후 등록된 모든 태그를 조회하여 하단에 Tag button형태로 동적으로 뿌려주는 작업을 진행할 것이다. 3. 위와 같이 진행하기 위해서 Site항목을 조회할 뿐 아니라 Many-to-Many관계로 등록된 태그도 조회를 해야하기 때문에 Serializer 작업을 진행하게 되었다. 물론 api 2개를 요청하여 각각 사이트 데이터, 태그 데이터 조회할 수도 있지만 2번을 요청한다는 것 자체가 비효율적이며 drf에 존재하는 serialize를 활용하지 못한다고 판단 1. views.py > TagsA..
[ISSUE] Tag 포함된 Site 모델의 serialize 처리[22.11.27] 🍃 구현하고자 하는 화면 1. 이전 개발 단계에서 사이트를 등록하여 해당 사이트에 Tag를 Many-to-Many관계로 등록하는 진행 2. 이제 태그가 등록된 사이트를 최신순으로 4~6개 조회 후 등록된 모든 태그를 조회하여 하단에 Tag button형태로 동적으로 뿌려주는 작업을 진행할 것이다. 3. 위와 같이 진행하기 위해서 Site항목을 조회할 뿐 아니라 Many-to-Many관계로 등록된 태그도 조회를 해야하기 때문에 Serializer 작업을 진행하게 되었다. 물론 api 2개를 요청하여 각각 사이트 데이터, 태그 데이터 조회할 수도 있지만 2번을 요청한다는 것 자체가 비효율적이며 drf에 존재하는 serialize를 활용하지 못한다고 판단 1. views.py > TagsA..
2023.05.06 -
[22.11.26] 🍃 ManytoMany 관계를 가진 두 모델 Bulk Create 작업 ✔️ 현재 위와 같이 등록된 항목에 대해 태그를 추가하는 기능을 개발 구현 중이다. 등록된 항목은 Scrap Parsing을 통해 특정 사이트에 관련한 url, 썸네일, 제목 등을 저장하여 접근할 수 있게 구현한 현황 화면이다. 특정 사이트를 선택하여 bulk(다중)로 태그를 등록할 수 있게 스크립트 구현 선택한 각 Site와 Tag Model이 ManytoMany 관계로 데이터 모델링 1. 모델 코드 📌 Tag Model class Site(models.Model): """ 항목에 관한 데이터 모델 """ title = models.CharField(verbose_name='타이틀', max_length=100)..
[ISSUE] ManytoMany 관계를 가진 두 모델 Bulk Create 작업[22.11.26] 🍃 ManytoMany 관계를 가진 두 모델 Bulk Create 작업 ✔️ 현재 위와 같이 등록된 항목에 대해 태그를 추가하는 기능을 개발 구현 중이다. 등록된 항목은 Scrap Parsing을 통해 특정 사이트에 관련한 url, 썸네일, 제목 등을 저장하여 접근할 수 있게 구현한 현황 화면이다. 특정 사이트를 선택하여 bulk(다중)로 태그를 등록할 수 있게 스크립트 구현 선택한 각 Site와 Tag Model이 ManytoMany 관계로 데이터 모델링 1. 모델 코드 📌 Tag Model class Site(models.Model): """ 항목에 관한 데이터 모델 """ title = models.CharField(verbose_name='타이틀', max_length=100)..
2023.05.06 -
[22.11.26] 🍃 중복되며 각 함수의 사전에 처리되는 작업 decorator 📌 SiteBulkAPIView - 벌크 즐겨찾기, 삭제 class SiteBulkAPIView(APIView): """ 벌크 항목 즐겨찾기, 삭제 api """ def get_list(self): pk_ids: list = self.request.data.get('pk_ids') return get_list_or_404(Site, id__in=pk_ids) def validate_ids(self): pk_ids: list = self.request.data.get('pk_ids') for id in pk_ids: get_object_or_404(Site,id=id) return self.get_list() def put(..
[ISSUE]decorator를 이용한 중복작업 전처리[22.11.26] 🍃 중복되며 각 함수의 사전에 처리되는 작업 decorator 📌 SiteBulkAPIView - 벌크 즐겨찾기, 삭제 class SiteBulkAPIView(APIView): """ 벌크 항목 즐겨찾기, 삭제 api """ def get_list(self): pk_ids: list = self.request.data.get('pk_ids') return get_list_or_404(Site, id__in=pk_ids) def validate_ids(self): pk_ids: list = self.request.data.get('pk_ids') for id in pk_ids: get_object_or_404(Site,id=id) return self.get_list() def put(..
2023.05.05 -
[22.11.29] 2종류 데이터를 받아오는 api, restful하게 변경 작업 🍃 many-to-many serialize ✔️ many-to-many 관계가 존재하는 Model Site, Tag의 데이터를 하나의 api를 요청해서 동시에 받아오도록 serialize와 models, view쪽 작업을 진행했었다. serializers.py **class TagSerializer(ModelSerializer): name = serializers.CharField(max_length=20, allow_blank=False, trim_whitespace=True) class Meta: model = Tag fields = ['id', 'name']** class SiteSerializer(ModelSeri..
[ISSUE] 2종 데이터 받아오는 api를 restful하게 변경 작업[22.11.29] 2종류 데이터를 받아오는 api, restful하게 변경 작업 🍃 many-to-many serialize ✔️ many-to-many 관계가 존재하는 Model Site, Tag의 데이터를 하나의 api를 요청해서 동시에 받아오도록 serialize와 models, view쪽 작업을 진행했었다. serializers.py **class TagSerializer(ModelSerializer): name = serializers.CharField(max_length=20, allow_blank=False, trim_whitespace=True) class Meta: model = Tag fields = ['id', 'name']** class SiteSerializer(ModelSeri..
2023.05.05 -
[22.11.24] Signup-AbstractBaseUser ✔️ Django에서 제공하고 있는 제공하는 auth-user를 사용하면 회원가입 시 기본적으로 secret key를 이용하여 password를 암호화, 로그인 시 session을 이용한 인증 인가를 손쉽게 이용할 수 있다. ✔️ 하지만 현재 진행하고 있는 프로젝트는 auth-user를 사용하지 않고 다른 user모델을 생성하여 사용자의 정보를 관리할 수 있게 따로 분리하였다. ✔️ Simple-JWT를 이용할 예정이라 session을 이용한 대한 인증 인가를 사용하지 않고, User에 필요한 사용자 정보를 custom 할 필요가 있기 때문에 제공해 주는 auth-user를 사용하지 않았다. 🍃 User 📌 User Model class Us..
[ISSUE] signup AbstractBaseUser class[22.11.24] Signup-AbstractBaseUser ✔️ Django에서 제공하고 있는 제공하는 auth-user를 사용하면 회원가입 시 기본적으로 secret key를 이용하여 password를 암호화, 로그인 시 session을 이용한 인증 인가를 손쉽게 이용할 수 있다. ✔️ 하지만 현재 진행하고 있는 프로젝트는 auth-user를 사용하지 않고 다른 user모델을 생성하여 사용자의 정보를 관리할 수 있게 따로 분리하였다. ✔️ Simple-JWT를 이용할 예정이라 session을 이용한 대한 인증 인가를 사용하지 않고, User에 필요한 사용자 정보를 custom 할 필요가 있기 때문에 제공해 주는 auth-user를 사용하지 않았다. 🍃 User 📌 User Model class Us..
2023.05.05 -
[22.11.23] APIView bulk update 구현 ✔️ 사용자가 빈번하게 찾아가는 사이트를 북마크처럼 저장하여 저장한 항목들에 대해 즐겨찾기로 등록하여 분류하는 기능을 구현하고 있다. 🍃 구현 화면 ✔️ 위의 이미지와 같이 사용자가 등록한 항목을 선택할 수 있고, 선택한 항목들을 bulk(다중)처리가 가능한 기능이다. 상단 Toolbar에서 "벌크"버튼 선택으로 등록된 사이트를 선택이 가능하게 javascript로 동적 구현 항목을 선택할 때마다 코드에 선언되어 있는 전역변수 selected_articles에 해당 항목에 대한 식별자(id)값을 쌓아주며 벌크 이벤트를 작동하기 위한 선작업을 진행한다. 🍃 클라이언트 javascript function favoriteBulkSelectedSite..
[ISSUE] APIView로 bulk update 구현[22.11.23] APIView bulk update 구현 ✔️ 사용자가 빈번하게 찾아가는 사이트를 북마크처럼 저장하여 저장한 항목들에 대해 즐겨찾기로 등록하여 분류하는 기능을 구현하고 있다. 🍃 구현 화면 ✔️ 위의 이미지와 같이 사용자가 등록한 항목을 선택할 수 있고, 선택한 항목들을 bulk(다중)처리가 가능한 기능이다. 상단 Toolbar에서 "벌크"버튼 선택으로 등록된 사이트를 선택이 가능하게 javascript로 동적 구현 항목을 선택할 때마다 코드에 선언되어 있는 전역변수 selected_articles에 해당 항목에 대한 식별자(id)값을 쌓아주며 벌크 이벤트를 작동하기 위한 선작업을 진행한다. 🍃 클라이언트 javascript function favoriteBulkSelectedSite..
2023.05.05 -
✔️ 자바스크립트에서 fetch 함수를 이용해서 서버와 통신을 하게 클라이언트단을 개발하고 있다. 🍃 fetch() 함수 비동기처리로 인한 문제 발생 📌 문제의 코드 function deleteBulkSelectedSite(){ /* bulk 삭제 이벤트 */ if (selected_articles.length > 0){ if(confirm('선택한 항목을 삭제하시겠습니까?')){ let data = setFechData("DELETE", {pk_ids: selected_articles, user: 'User Id'}) fetch(`/api/sites/bulk`, data) .then(response => { let status = response.status if (status == 200) alert..
[ISSUE] Asynchronous processing 비동기 처리 방식✔️ 자바스크립트에서 fetch 함수를 이용해서 서버와 통신을 하게 클라이언트단을 개발하고 있다. 🍃 fetch() 함수 비동기처리로 인한 문제 발생 📌 문제의 코드 function deleteBulkSelectedSite(){ /* bulk 삭제 이벤트 */ if (selected_articles.length > 0){ if(confirm('선택한 항목을 삭제하시겠습니까?')){ let data = setFechData("DELETE", {pk_ids: selected_articles, user: 'User Id'}) fetch(`/api/sites/bulk`, data) .then(response => { let status = response.status if (status == 200) alert..
2023.05.05 -
[22.11.20] Try to apply generics DestroyAPIView Generics View를 사용하지 않는 이유 ✔️ DRF로 서버단을 rest_framework가 지원해주는 generics View를 사용하지 않고 APIView만을 이용하여 프로젝트를 진행하기로 결정하였다. ✔️ 그렇게 결정한 이유는 generics 한 View를 사용하면 코드가 간결해지고 개발하기 편리해지긴 하지만 팀 프로젝트를 진행하며 그렇게 간결해지고 작동되는 로직을 파악하지 않고 무분별하게 사용하는 것을 우려하여 처음에는 자유롭게 customizing이 가능한 APIView를 사용하기로 했다. APIView로 작성된 Bulk Delete ✔️ 항목을 다중으로 삭제하기 위한 기능 개발을 위해 클라이언트 단에서 ..
[ISSUE] gernerics view, DestroyAPIView 적용[22.11.20] Try to apply generics DestroyAPIView Generics View를 사용하지 않는 이유 ✔️ DRF로 서버단을 rest_framework가 지원해주는 generics View를 사용하지 않고 APIView만을 이용하여 프로젝트를 진행하기로 결정하였다. ✔️ 그렇게 결정한 이유는 generics 한 View를 사용하면 코드가 간결해지고 개발하기 편리해지긴 하지만 팀 프로젝트를 진행하며 그렇게 간결해지고 작동되는 로직을 파악하지 않고 무분별하게 사용하는 것을 우려하여 처음에는 자유롭게 customizing이 가능한 APIView를 사용하기로 했다. APIView로 작성된 Bulk Delete ✔️ 항목을 다중으로 삭제하기 위한 기능 개발을 위해 클라이언트 단에서 ..
2023.05.05 -
[22.11.17] Change method of REST API (GET -> POST) Python 부트캠프 교육 과정을 수료하며 배운 퓨어 Django로 프로젝트를 진행하지 않고 백엔드와 프런트가 분리된 REST API 방식의 DRF(Django Rest Framework) 프레임워크를 사용하여 프로젝트를 진행하기로 하였다. 📌 DRF(Django Rest Framework)를 사용하고자 하는 이유 상세한 DRF를 사용해야 하는 이유는 다른 게시 글로 작성하겠지만 프로젝트를 진행하며 나온 첫 번째 이슈사항이기 때문에 사용하고자 하는 이유를 짚고 넘어가려고 한다. ➤ 이유 일반적으로 Django만 사용하는 경우에는 DB에서 데이터를 꺼내오면 Queryset의 형태로 데이터가 주어진다. 이 경우 프런..
[ISSUE] REST API GET방식에서 POST로의 변경[22.11.17] Change method of REST API (GET -> POST) Python 부트캠프 교육 과정을 수료하며 배운 퓨어 Django로 프로젝트를 진행하지 않고 백엔드와 프런트가 분리된 REST API 방식의 DRF(Django Rest Framework) 프레임워크를 사용하여 프로젝트를 진행하기로 하였다. 📌 DRF(Django Rest Framework)를 사용하고자 하는 이유 상세한 DRF를 사용해야 하는 이유는 다른 게시 글로 작성하겠지만 프로젝트를 진행하며 나온 첫 번째 이슈사항이기 때문에 사용하고자 하는 이유를 짚고 넘어가려고 한다. ➤ 이유 일반적으로 Django만 사용하는 경우에는 DB에서 데이터를 꺼내오면 Queryset의 형태로 데이터가 주어진다. 이 경우 프런..
2023.04.19 -
프로젝트 시작단계, 서로 맡은 업무를 진행하며 프로젝트 초기 세팅을 하는 기간이다. 우리는 프로젝트를 시작하며 처음으로 github의 oranization을 통해 repository를 공유받아 해당 repository에서 협업을 진행하게 되었다. 협업의 꽃은 바로 git과 github이지만 한 명의 구성원이라도 숙지를 제대로 하고 있지 않으면 문제에 맞닥드리기 아주 쉽다. 우리는 브랜치 전략으로 main브랜치에서 develop와 feature, bugfix, docs, conf 등의 브랜치를 가지는 전략을 취하기로 하였다. ➤ Issue1-올리지 말아야할 파일 처음 main브랜치에 프로젝트 초기 셋팅을 잡아 main브랜치에 push를 하게 되었는데, github에 초기 프로젝트를 처음 올리기 때문에 .g..
[ISSUE] commit 시점이 뒤에 위치한 Branch프로젝트 시작단계, 서로 맡은 업무를 진행하며 프로젝트 초기 세팅을 하는 기간이다. 우리는 프로젝트를 시작하며 처음으로 github의 oranization을 통해 repository를 공유받아 해당 repository에서 협업을 진행하게 되었다. 협업의 꽃은 바로 git과 github이지만 한 명의 구성원이라도 숙지를 제대로 하고 있지 않으면 문제에 맞닥드리기 아주 쉽다. 우리는 브랜치 전략으로 main브랜치에서 develop와 feature, bugfix, docs, conf 등의 브랜치를 가지는 전략을 취하기로 하였다. ➤ Issue1-올리지 말아야할 파일 처음 main브랜치에 프로젝트 초기 셋팅을 잡아 main브랜치에 push를 하게 되었는데, github에 초기 프로젝트를 처음 올리기 때문에 .g..
2023.04.10