diff --git a/README.md b/README.md index 3e6145c..6018550 100644 --- a/README.md +++ b/README.md @@ -1 +1,190 @@ -# repo_1 \ No newline at end of file +# 소셜미디어 통합 Feed 서비스 +
+ +## Table of Contents +- [개요](#개요) +- [기술스택](#기술스택) +- [설치](#설치) +- [테스트](#테스트) +- [APIs](#APIs) +- [팀원 및 회고](#팀원-및-회고) + +
+## 개요 +- 본 서비스는 복수의 SNS에 게시된 게시물을 하나의 서비스에서 확인할 수 있는 통합 Feed 어플리케이션입니다. +- `인스타그램`, `스레드`, `페이스북`, `트위터` 등 사용하고 있는 다양한 SNS에 게시된 게시물을 유저 계정 해시태그 (예, `#dami` ) 또는 특정 해시태그를 기반으로 확인할 수 있습니다. +- 본 서비스의 이용을 원하는 고객은 가입 진행 시 계정, 비밀번호, 이메일 정보를 제공해야 하며, 가입 승인을 위해 이메일로 발송된 코드를 입력하여 가입 승인을 받아야 서비스 이용이 가능합니다. +- 본 서비스의 메뉴는 통합 Feed 단일이며, 조회된 게시물의 제목 및 내용과 관련한 키워드를 검색 할 수 있고, 검색하여 나온 결과를 통해 원하는 게시물들을 조회할 수 있습니다. +- 본 서비스의 고객은 본인의 기호에 따라 게시물에 좋아요를 클릭하여 `view_count` 횟수를 증가 시킬 수 있으며, 해당 횟수는 제한이 없습니다. 또한 게시물 공유가 가능하며 공유 시 `share_count`가 증가하게 됩니다. +- 본 서비스의 고객은 해시태그를 기반으로 일자별, 시간별 게시물 개수 통계를 확인할 수 있습니다. 일자별 조회는 최대 한달(30일)이며, 시간별 조회는 최대 일주일(7일) 조회가 가능합니다. + +## 기술스택 +### Backend +
+
+ + + + + +
+ +
+Why? + +Django +``` +1. 간단한 설정 및 빠른 개발 +https://docs.djangoproject.com/ko/4.2/misc/design-philosophies/ +장고의 철학 중 하나인 신속한 개발이 포함. 해당 과제를 수행으로 +빠른 기능 구현을 위해 사용 +2. 강력한 ORM +길어질 수 있는 SQL쿼리를 직접 작성하지 않고 데이터베이스를 조작하기 위해 ORM +을 사용 가능하기에 사용 +3. 커뮤니티 활성화 +파이썬 프레임워크 커뮤니티 중 가장 거대하고 활성화가 되어있고 자료 검색 용이를 +위해 사용 +``` + +DRF(Django Rest Framework) +``` +1. RESTfrul API 지원 +DRF에서 RESTful API구축하는데 필요한 모든 도구와 기능을 제공 +(시리얼라이저, URL, 테스트 API 뷰 등등) +2. 직렬화 및 역질렬화 +데이터 모델을 JSON 또는 다른 형식의 데이터로 변환하고 그 역도 가능하도록 +도와주는 강력한 직렬화 및 역직렬화 기능을 제공 +3. 인증 및 권한 관리 +DRF는 사용자 인증 및 권한 관리를 위한 다양한 방법을 제공 +``` + +Docker & Docker-compose +``` +배포를 위해서가 아니라 github actions와 데이터베이스(Postgres)를 사용 +어느 동일한 개발 환경을 테스트를 위해 격리된 환경을 제공하고 환경 설정할 수 있기에 +사용 docker-compose의 경우 두개 이상의 컨테이너가 존재하기에 yaml파일을 정의해서 +간단하게 사용 가능하기에 사용 +``` +
+ +
+ +### DB + +
+Why? +데이터베이스 변경 이슈 + +해당 과제에 간단한 CRUD만 된다고 생각하여 기본으로 제공하는 SQLite를 사용하기로 했습니다. 하지만 아래의 문제점, 원인으로 인하여 PostgreSQL를 사용했습니다. +문제점: 통계 API 작성 중에서 날짜 집계 함수를 사용하려고 했습니다. TruncDay라는 함수가 있는데 django.db.utils.OperationalError: user- +defined function raised exception가 발생= +원인: SQLite에서 datetime을 지원하지 않아 함수 사용이 불가 + +Postgres +```json +1. Djang는 PostgreSQL에서만 작동하는 다양한 데이터 유형을 제공 +2. Django에는 PostgreSQL에서 데이터베이스 작업을 수행하기 위한 django.contrib.postgres가 있음 + +``` +- Django공식문서 Postgres + +[PostgreSQL 관련 집계 함수](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/aggregates/) + +[PostgreSQL 관련 데이터베이스 제약 조건](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/constraints/) + +[PostgreSQL 관련 양식 필드 및 위젯](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/forms/) + +[PostgreSQL 관련 데이터베이스 기능](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/functions/) + +[PostgreSQL 관련 모델 인덱스](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/indexes/) + +[PostgreSQL 관련 조회](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/lookups/) + +[데이터베이스 마이그레이션 작업](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/operations/) + +[전체 텍스트 검색](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/search/) + +[인덱스](https://docs.djangoproject.com/en/5.0/ref/contrib/postgres/validators/) +
+
+ +### Managements +
+ + + +
+
+Why? +Git & Github + +```json +1. 버전관리 +소스 코드를 효과적으로 버전 관리할 수 있는 도구로, +개발자들은 변경 내용을 추적하고 이전 버전으로 되돌릴 수 있음 +이를 통해 협업 중 코드 충돌을 방지하고 안정적인 코드베이스를 유지 + +2. GitHub +Git 저장소를 호스팅하고 협업을 간편하게 할 수 있게 해주는 플랫폼 +여러 개발자가 동시에 작업하고 변경 사항을 추적하며 코드 검토 및 이슈 관리를 쉽게 할 수 있음 + +``` + +Github Actions + +```json +팀 내의 코드 컨벤션, 테스트 코드 작성, 이를 바탕으로 CI를 적용하기 위해서 +깃 허브에서 간단한 설정 및 연동이 가능한 github actions를 사용 +``` +
+ +
+ +## 설치 +docker-compose로 django(어플리케이션)과 postgre(데이터베이스)를 구성합니다. +- docker-compose로 django(어플리케이션)과 postgre(데이터베이스)를 구성하였습니다. + +```python +docker compose up # running server to http://127.0.0.1:8000 +``` + +
+ +## 테스트 +- django 컨테이너에서 poetry로 구성하면서 app과 app/src로 구성되며, src의 test를 진행합니다. + +```python +docker compose run django poetry run python3 src/manage.py test src/ +``` + +![test](test.png) + +
+ +## APIs +| 앱 | 기능 | URL | Method | Parameter | Return | +| --- | --- | --- | --- | --- | --- | +| users | 회원 가입 | /users/confirm/ | POST | {email, username, password} | {email, username, confirmcode} | +| | 가입 승인 | /users/login/ | POST | {username, password, code} | {username, isConfirmed} | +| | 로그인 | /users/signup/ | POST | {username, password} | {username, token{refresh, access}} | +| | token 재발급 | /users/token/refresh | POST | {refresh_token} | {access_token} | +| posts | 게시물 리스트 조회 | /posts/ | GET | {limit, offset, type, search, ordering, hastag} | PostList{contentId, postType, title, content, viewCount, likeCount, shareCount, createdAt, updatedAt, hashtag, user} | +| | 게시물 상세 조회 | /posts/{id} | GET | {content_id} | PostDetail{contentId, postType, title, content, viewCount, likeCount, shareCount, createdAt, updatedAt, hashtag, user} | +| | 통계 정보 조회 | /posts/statistics | GET | {type, start, end, hashtag, value} | {datetime, count} | +| | 최근 많이 사용된 해시태그 조회 | /posts/hashtag/recommend | GET | | {hashtag_id, hashtag_name} | +| likes | 게시물에 좋아요 | /likes/{id} | POST | {content_id} | | +| shares | 게시물 공유 | /shares/{id} | POST | {content_id} | | + +
+ +## 팀원 및 회고 +
+ +| name | title | profile link | email | review | +|------|-------|--------------|-------|--------| +| 윤성원 | 팀장 | [@lfoyh6591](https://github.com/lfoyh6591) | lfoyh6591@naver.com | https://determined-chamomile-42b.notion.site/835d8c6783a2477499438c07e1a7c125?pvs=4 +| 사재혁 | 팀원 | [@saJaeHyukc](https://github.com/saJaeHyukc) | wogur981208@gmail.com | https://determined-chamomile-42b.notion.site/f86b007c44954ab6947dbf2a445ee67f?pvs=4 +| 박대준 | 팀원 | [@Chestnut90](https://github.com/Chestnut90) | cowzon90@gmail.com | https://determined-chamomile-42b.notion.site/09b567f9f59747ee86d4074659211a3a?pvs=4 +| 이슬기 | 팀원 | [@simseulnyang](https://github.com/simseulnyang) | https://determined-chamomile-42b.notion.site/5491797e84834a26a32a0f8ce58e51d8?pvs=4 + +
diff --git a/test.png b/test.png new file mode 100644 index 0000000..38e591b Binary files /dev/null and b/test.png differ