> For the complete documentation index, see [llms.txt](https://judy-valentine.gitbook.io/judy/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://judy-valentine.gitbook.io/judy/projects/additional-projects/social-q-and-a-platform.md).

# Social Q\&A Platform

질문 / 답변 / 태그 기반 SNS형 지식 공유 플랫폼

### 1. Overview

SNS 기반 실시간 Q\&A 플랫폼을 개발했습니다.

***

### 2. System Architecture

<figure><img src="https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2FH6704if53yjNjSVmg3PB%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202026-04-11%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.33.20.png?alt=media&amp;token=10315328-cf60-40b5-9262-ef10350c2cd3" alt=""><figcaption></figcaption></figure>

***

### 3. Tech Stack

`Django REST Framework` `PostgreSQL` `React Native` `Docker` `AWS EC2` `Amazon EFS` `Nginx` `Python`

***

### 4. Domain Modeling

<table><thead><tr><th width="182.6875">엔티티</th><th>역할</th></tr></thead><tbody><tr><td>User</td><td>사용자 계정 및 활동 관리</td></tr><tr><td>Question</td><td>질문 정보 및 상태</td></tr><tr><td>Answer</td><td>질문에 대한 답변</td></tr><tr><td>Comment</td><td>답변에 대한 댓글</td></tr><tr><td>Tag</td><td>질문 분류 및 탐색</td></tr><tr><td>Like</td><td>사용자 좋아요 행동</td></tr><tr><td>Badge</td><td>사용자 활동 기반 뱃지</td></tr></tbody></table>

```
Question ↔ Answer   (1:N)
Answer   ↔ Comment  (1:N)
Question ↔ Tag      (M:N)
User     ↔ Like     (1:N)
```

***

### 5. Contributions

* **질문/답변/댓글 도메인**
  * `Django REST framework`를 사용한 질문, 답변, 태그, 댓글, 좋아요, 뱃지 도메인 RESTful API 설계 및 개발
  * `QuerySet`을 활용하여 조회 및 인기순, 날짜순 정렬, 태그 필터링 기능 추가
  * `drf-yasg`을 사용하여 `Swagger`를 통한 API 문서 작성 자동화
* **소셜 로그인 기능**
  * `django-allauth`, `djangorestframework-simplejwt`를 사용한 카카오 소셜 로그인 구현
  * `Postman`을 통한 소셜 로그인 및 기타 API 테스트
* **Backend 서비스 배포**
  * `Django`, `Nginx`, `PostgreSQL` 각각의 컨테이너를 `docker-compose`를 통해 한 번에 관리
  * `AFS(Amazon File System)`를 mount하여 메모리 공간을 동적으로 확장 후 `AWS EC2`에 배포

***

### 6. API Design — RESTful

```
GET  /questions              # 전체 질문 목록
GET  /questions?tag=python   # 태그 기반 필터링
GET  /questions?sort=popular # 인기순 정렬
POST /questions              # 질문 생성
POST /answers                # 답변 등록
POST /comments               # 댓글 등록
```

***

### 7. Authentication — Kakao Social Login + JWT

사용자 인증은 소셜 로그인 기반으로 구현했습니다. django-allauth로 카카오 로그인을 연동하고, djangorestframework-simplejwt로 JWT 기반 인증을 구성했습니다.

```
Kakao 로그인 → Access Token 획득 → 서버 인증 → JWT 발급
```

```python
class KakaoLoginView(APIView):
    def post(self, request):
        kakao_token = request.data.get('access_token')

        # 카카오 사용자 정보 조회
        kakao_user = KakaoClient.get_user(kakao_token)

        # 사용자 생성 또는 조회
        user, _ = User.objects.get_or_create(
            kakao_id=kakao_user['id'],
            defaults={'nickname': kakao_user['properties']['nickname']}
        )

        # JWT 발급
        refresh = RefreshToken.for_user(user)
        return Response({
            'access': str(refresh.access_token),
            'refresh': str(refresh),
        })
```

***

### 8. Query Optimization & Filtering

질문 조회 시 N+1 문제를 방지하기 위해 `prefetch_related`와 `annotate`를 적용했습니다.

필요한 데이터만 조회하도록 설계해 불필요한 DB 조회를 줄이고 응답 성능을 개선했습니다.

```python
# N+1 방지 — 태그와 답변을 한 번에 조회
queryset = Question.objects.annotate(
    like_count=Count('likes'),
    answer_count=Count('answers')
).select_related('author') \
 .prefetch_related('tags', 'answers__comments')
```

***

### 9. Deployment & Infrastructure

Docker Compose로 Django, PostgreSQL, Nginx를 통합 구성하고, AWS EC2에 배포했습니다.

```yaml
# docker-compose.yml
services:
  web:
    build: .
    command: gunicorn config.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/app/static

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data

  nginx:
    image: nginx:alpine
    volumes:
      - static_volume:/app/static
    ports:
      - "80:80"
```

***

### 10. Lessons Learned

#### 개선할 점

* **캐싱 미적용** — 인기순 조회는 매번 DB에서 집계했습니다. Redis로 캐싱하면 반복 조회 비용을 줄일 수 있습니다.
* **검색 기능 부재** — 태그 필터링만 지원하고 전문 검색은 없었습니다. Elasticsearch를 붙이면 질문 본문 기반 검색이 가능해집니다.
* **테스트 코드 부재** — API 동작을 수동으로만 검증했습니다. pytest-django 기반 테스트를 도입했으면 리팩토링 안정성이 높아졌을 것입니다.

***

## Landing Page

{% embed url="<https://handsuplanding.imweb.me/>" %}
