-
Notifications
You must be signed in to change notification settings - Fork 1
[25.02.07 / TASK-111] Feature - post 모델링 업데이트, 대응 개발 - slug 값 추가 #13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
""" Walkthrough전체 변경 사항은 Django 애플리케이션에서 사용자 포스트를 비동기적으로 업데이트하는 기능을 추가합니다. 새롭게 도입된 모듈에서는 aiohttp와 asyncio를 활용해 토큰 복호화, 외부 API 호출, 데이터베이스 업데이트를 수행하며, 별도 스레드에서 main 함수를 실행합니다. 또한 Post 모델에 slug 필드가 추가되고, 관련 마이그레이션이 생성되었습니다. scraping 모듈에서는 GraphQL 쿼리와 메서드 파라미터의 명명 규칙이 수정되고, 새로운 필드가 포함되었습니다. 의존성 파일에도 uvicorn, click, h11 등이 추가되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant T as Shell/Thread
participant R as run_async_main
participant M as main()
participant S as aiohttp Session
participant U as update_user_posts()
participant API as 외부 API
participant DB as Database
T->>R: 스레드 시작
R->>M: asyncio.run(main())
M->>M: 전체 사용자 목록 조회
M->>S: ClientSession 생성
M->>U: 각 사용자에 대해 update_user_posts() 호출 (비동기 태스크 생성)
U->>U: 사용자 토큰 AES 복호화
U->>API: 비동기 HTTP 요청 전송
API-->>U: 응답 수신
U->>DB: Post 객체 업데이트 (없으면 예외 처리)
U-->>M: 작업 완료
sequenceDiagram
participant S as Scraper
participant U as update_old_tokens()
participant P as process_user()
participant B as bulk_create_posts()
participant DS as update_daily_statistics()
participant API as 외부 API
S->>U: origin_access_token, origin_refresh_token 전달하여 토큰 갱신 요청
U-->>S: 토큰 업데이트 완료
S->>P: 사용자 처리 요청 (비동기)
P->>B: 포스트 대량 생성 요청 (url_slug 포함)
B->>API: 포스트 데이터 요청
API-->>B: 포스트 데이터 응답
B-->>P: 포스트 생성 완료
S->>DS: daily_stats의 updated_at 갱신 요청
DS-->>S: 통계 업데이트 완료
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🔭 Outside diff range comments (1)
scraping/main.py (1)
70-83: 게시글 생성 시 슬러그 필드 처리 개선이 필요합니다.게시글 대량 생성 시 슬러그 필드에 대한 오류 처리가 누락되어 있습니다. url_slug가 없는 경우에 대한 처리가 필요합니다.
다음과 같이 개선할 것을 제안합니다:
await Post.objects.abulk_create( [ Post( post_uuid=post["id"], title=post["title"], user=user, - slug=post["url_slug"], + slug=post.get("url_slug", ""), released_at=post["released_at"], ) for post in fetched_posts ], ignore_conflicts=True, batch_size=500, )
🧹 Nitpick comments (4)
modules/post_slug_update_batch.py (2)
34-60: 데이터베이스 업데이트 시 에러 로깅을 고려해 주세요.
Post.DoesNotExist예외를 단순히 걸러내는 것도 좋지만, 원인 분석이나 모니터링을 위해 초당 발생 빈도 등을 로깅할 수 있으면 운영상 유용할 수 있습니다.
69-70: 직접 실행 로직을 별도 CLI 명령으로 분리 고려
모듈을 호출해 사용할 때와 CLI로 직접 돌릴 때를 구분하면 유지보수성이 향상될 수 있습니다.posts/migrations/0004_post_slug.py (1)
1-23: slug 필드의 길이와 인덱스 고려
최대 길이가 500으로 설정되어 있으므로, 빈번한 쿼리에 대한 성능 및 인덱스 활용 방안도 함께 검토해 보세요.posts/models.py (1)
25-30: 슬러그 필드 구현 개선이 필요합니다.슬러그 필드가 URL에서 사용될 것으로 예상되므로 다음 사항들을 고려해주세요:
- 조회 성능 향상을 위한 인덱스 추가
- 슬러그 값의 유효성 검증
- 제목으로부터 자동 슬러그 생성 로직
다음과 같이 개선할 것을 제안합니다:
slug = models.CharField( blank=True, null=True, max_length=500, verbose_name="게시글 슬러그", + db_index=True, )추가로 슬러그 자동 생성을 위한 save 메서드 오버라이드를 제안합니다:
from django.utils.text import slugify def save(self, *args, **kwargs): if not self.slug and self.title: self.slug = slugify(self.title) super().save(*args, **kwargs)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
poetry.lockis excluded by!**/*.lock
📒 Files selected for processing (7)
modules/post_slug_update_batch.py(1 hunks)posts/migrations/0004_post_slug.py(1 hunks)posts/models.py(1 hunks)pyproject.toml(1 hunks)requirements.txt(3 hunks)scraping/constants.py(1 hunks)scraping/main.py(5 hunks)
🔇 Additional comments (11)
pyproject.toml (1)
18-18: uvicorn 의존성 추가 확인
해당 변경 사항은 uvicorn 의존성을 버전 "^0.34.0"으로 추가합니다. ASGI 서버와 비동기 처리를 지원하기 위한 의존성 추가로 보이며, 다른 ASGI 관련 설정과의 호환성도 확인해주시기 바랍니다.requirements.txt (3)
10-10: click 의존성 추가 확인
추가된 "click==8.1.8" 패키지는 CLI 관련 기능에서 활용될 수 있습니다. 해당 버전이 프로젝트의 다른 의존성과 충돌 없이 잘 동작하는지 확인 부탁드립니다.
24-24: h11 의존성 추가 확인
"h11==0.14.0" 패키지가 추가되었습니다. h11은 HTTP/1.1 프로토콜 구현에 사용되므로, 관련 네트워크 통신이 올바르게 처리되는지 검토해보시기 바랍니다.
60-60: uvicorn 의존성 추가 확인 (requirements.txt)
requirements.txt에도 "uvicorn==0.34.0"이 추가되어, pyproject.toml과 일관성을 유지하고 있습니다. ASGI 서버 운영에 적합한 버전인지, 그리고 배포 시 관련 설정이 올바른지 점검 바랍니다.modules/post_slug_update_batch.py (4)
1-14: 샘플 사용 예시에 대한 안내가 간결하고 명확합니다.
개발 혹은 운영 환경에서 배치 작업을 실행하는 방법을 간단히 보여주어 유용합니다.
16-22: 필요한 라이브러리 임포트 구문이 잘 구성되어 있습니다.
Django 비동기 처리에 필요한 요소들을 적절히 임포트했습니다.
28-33: AES 키 설정을 확인해 주세요.
현재 KEYS 배열에 있는 문자열이 임시 값으로 보이므로 실제 운영 키를 설정하거나, 안전한 비밀관리 방법을 적용했는지 검토가 필요합니다.
62-67: 비동기 태스크를 일괄 처리하는 접근이 깔끔합니다.
asyncio.gather를 통해 여러 사용자에 대한 작업을 병렬적으로 실행하는 것은 효율적입니다.scraping/constants.py (1)
11-11: GraphQL 쿼리에 url_slug 필드가 추가되어 유용합니다.
게시글 정보를 확장해 slug를 함께 활용하기에 손색이 없습니다.scraping/main.py (2)
212-214: 중요: 속도 제한 및 타임아웃 구현이 필요합니다.TODO 주석에서 언급된 다음 사항들의 구현이 필요합니다:
- Semaphore를 통한 동시 요청 제한
- 요청 간 지연 시간 추가
- 작업 타임아웃 설정
이는 안정적인 스크래핑 작업을 위해 중요한 요구사항입니다.
이러한 기능들의 구현을 도와드릴까요? 다음과 같은 개선사항들을 제안할 수 있습니다:
- Semaphore 구현
- 요청 간 지연 시간 설정
- 타임아웃 로직 추가
37-64: 토큰 관련 변수명 변경이 적절합니다.
old_access_token에서origin_access_token으로의 변수명 변경은 의도를 더 명확하게 전달합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
run.sh (2)
12-15: Django 관리 명령어 실행 부분 검토
collectstatic과 migrate 명령어를 순차적으로 실행하여 정적 파일 관리와 데이터베이스 마이그레이션을 수행하는 부분은 올바르게 작성되었습니다. 주석에 환경변수 설정(example: DJANGO_SETTINGS_MODULE)이 포함되어 있어, 필요 시 활성화할 수 있다는 점도 긍정적입니다.
17-20: Gunicorn 서버 실행 부분 검토
gunicorn을 --daemon 옵션과 함께 실행하여 백그라운드에서 서버를 구동하는 방식은 적절해 보입니다. 로그 파일 경로, 워커 수, 최대 요청 수 등의 파라미터도 명시되어 있어 운영 환경에 맞춘 설정입니다.추가 제안: 이와 같은 하드코딩된 파라미터들은 환경변수 또는 외부 설정 파일로 추출하여 환경에 따라 유동적으로 변경할 수 있도록 개선하면 배포시 유연성이 높아질 수 있습니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
poetry.lockis excluded by!**/*.lock
📒 Files selected for processing (4)
pyproject.toml(1 hunks)requirements.txt(3 hunks)run-kill.sh(1 hunks)run.sh(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- requirements.txt
🔇 Additional comments (5)
run-kill.sh (1)
1-9: 프로덕션용 프로세스 강제 종료 스크립트 검토
해당 스크립트는 gunicorn 프로세스를 강제 종료(-9 옵션)하는 간단한 방식으로 잘 작성되었습니다. 다만, -9 옵션을 사용할 경우 강제 종료로 인해 로그나 자원 정리 측면에서 예기치 못한 부작용이 발생할 수 있으므로, 운영 환경에서 사용 시 주의가 필요합니다.추가 제안: 주석에 강제 종료 사용의 부작용 및 사용 시 주의사항을 명시하면 가독성과 유지보수 측면에서 좋을 듯합니다.
run.sh (3)
1-6: 초기 설정 및 Kill 스크립트 실행 부분 검토
스크립트의 처음 부분에서 set -e 옵션을 사용하여 오류 발생 시 스크립트를 종료하도록 설정한 점은 매우 좋습니다. 또한, run-kill.sh를 소스하여 기존의 gunicorn 프로세스를 종료하는 방식은 프로덕션 배포 전 잠재적 충돌을 방지하는 데 유용합니다.추가 제안: run-kill.sh 파일의 존재 여부나 실행 결과를 확인하는 로직을 추가하여, 파일이 누락된 경우나 오류 발생 시 명확한 에러 메시지를 제공하면 더 안정적일 것입니다.
8-11: 가상환경 활성화 및 의존성 설치 부분 검토
가상환경을 활성화하고 requirements.txt로부터 의존성을 설치하는 부분은 매우 표준적인 방식으로 작성되었습니다.추가 제안: pip 설치 시 로그 레벨이나 실패 시 알림 처리를 고려해 보시면 좋겠습니다.
22-26: 프로세스 모니터링 및 로그 확인 부분 검토
ps 명령어와 tail을 사용해 gunicorn 프로세스와 로그 파일 상태를 확인하는 부분은 운영 시 모니터링에 도움이 됩니다.추가 제안: tail 명령어의 옵션에 따라 로그의 최신 상태를 보다 명확히 출력하거나, 로그 파일의 경로가 추후 변경될 가능성에 대비하는 것도 고려할 수 있습니다.
pyproject.toml (1)
18-19: 신규 의존성 추가 검토 (uvicorn과 gunicorn)
pyproject.toml 파일에 uvicorn과 gunicorn 패키지가 추가된 것은 새로운 운영 스크립트(run.sh)와 연계하여 서버 운영 및 관리에 필요한 의존성을 보완하기 위한 것으로 보입니다.추가 제안: 의존성 버전이 다른 프로젝트 구성요소와 호환되는지, 그리고 보안 업데이트가 정기적으로 이루어지고 있는지 주기적으로 점검해 보시길 바랍니다.
six-standard
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기도 코드 잘 확인했습니다!
문제 없는 것 같아요!
Summary by CodeRabbit