티스토리 뷰

Projects/Askers

[Askers] 기능 소개(v1) 및 DB

장일영 2024. 8. 11. 15:39

기능 소개(v1)

Askers는 질문 기반 서비스다.

Askers v1에서는 가장 기초적이지만 서비스의 핵심이 되는 기능을 우선적으로 개발했다.

익명으로 질문을 보내고, 선택적으로 답변하고, 이를 SNS(Twitter)에 공유할 수 있다.

Askers

 

 

회원가입 및 로그인 기능

질문은 서비스에 가입하지 않아도 보낼 수 있지만 답변은 Askers 가입 유저만 할 수 있다.

Askers 회원가입, 로그인 페이지

  • Email 회원 가입
  • OAuth2(Google) 회원 가입

Email 회원 가입의 경우, 허수 가입자를 배제하기 위해 Email 인증 절차를 구현했다. 입력한 Email로 6자리 코드를 전송하고, 이를 올바르게 입력해야 가입이 가능하다.

 

 

질문 전송 및 답변 관련 기능

Askers 유저 프로필 페이지

  • 질문 전송 기능
  • 답변 내역 조회 기능
  • 특정 답변 취소 기능

유저의 프로필 화면에서 해당 유저에게 질문을 보낼 수 있다. v1에서는 익명으로 보내는 질문만 우선 지원한다.

답변 유저 본인은 특정 답변을 취소할 수 있다. 답변을 취소하면, 질문은 답변을 하지 않은 상태로 돌아가고 받은 질문 목록에서 확인할 수 있다.

 

 

받은 질문 관련 기능

 

  • 받은 질문 목록 조회
  • 특정 질문 삭제
  • 답변 생성

받은 질문 관련 기능은 로그인한 유저만 접근이 가능하다. 해당 페이지는 로그인하지 않았거나, 해당 유저 본인이 아닌 경우, 페이지 접근이 불가하고 서버 측으로 보내는 요청 역시 거부된다.

 

 

답변 상세 조회 기능

  • 특정 답변 상세 조회

외부에 답변을 공유하는 경우 이 페이지 링크를 공유하게 되며, Open Graph가 적용되어 있다. 트위터, 카카오톡 등으로 링크를 공유할 때 미리보기 이미지를 지원한다. [Askers] Open Graph 적용

 

 

 

DB

Askers(v1) 서비스를 구성하는 데이터를 정의하고, 각 데이터 간의 관계를 정의했다.

 

테이블

질문(ask) 데이터는 회원(user) 데이터 없이 존재할 수 있다. 따라서 `author_id`에 `NULL`이 올 수 있다.

답변(answer) 데이터는 질문(ask) 데이터 없이 존재할 수 없다. 반드시 질문 데이터를 가지고 있어야 한다. 

전송(dispatch) 데이터는 질문과 질문 수신자에 대한 정보를 의미한다. 즉, 질문이 누구에게 언제 전송되었는지 기록한다.

질문에 대한 정보와, 수신자에 대한 정보를 분리해서 관리하기 위해 전송 테이블을 추가로 정의했다. 추가적인 이점으로는 만약 이후 버전에서 에서 하나의 질문을 여러 유저에게 보낼 수 있도록 요구사항이 변경되는 경우 유연하게 대처할 수 있다. 하나의 질문을 여러 유저에게 보낸다면 동일한 `ask_id`에 대해 여러 `target_user_id`가 있을 수 있다.

 

 

인덱스

추가적으로 서비스 내에서 빈번하게 호출되는 쿼리를 고려해 인덱스를 생성했다.

서비스 내에서 가장 빈번하게 호출되는 쿼리는 다음과 같다.

  • 특정 유저가 받은 질문 내역 중, 답변하지 않은 질문만 조회
  • 특정 유저의 답변 내역 조회(답변 조회 시 질문 테이블 JOIN)

우선 특정 유저가 받은 질문 내역 중 답변하지 않은 질문만 조회하는 경우는 유저가 받은 질문 목록을 요청하는 경우다. 이 경우 쿼리는 다음과 같다.

SELECT a.*
FROM ask a
JOIN dispatch d ON a.ask_id = d.ask_id
LEFT JOIN answer ans ON a.ask_id = ans.ask_id AND d.target_user_id = ans.author_id
WHERE d.target_user_id = ? AND ans.ask_id is NULL;

 

질문 목록을 조회하되 dispatch 테이블과 JOIN해 `target_user_id`를 기반으로 조회하므로 `target_user_id` 컬럼에 인덱스를 추가했다.

 

특정 유저의 답변 내역을 조회하는 경우, answer 테이블의 FK인 `author_id`를 기준으로 조회하므로 `author_id` 컬럼에 인덱스를 추가했다.

 

또, 다음 유니크 제약 조건을 추가했다.

유저는 동일한 질문을 여러 개 받을 수 없다. dispatch 테이블의 `target_user_id`와 `ask_id` 조합은 유니크해야 한다.

하나의 질문에 특정 유저가 여러 번 답변할 수 없다. answer 테이블의 `author_id`와 `ask_id` 조합은 유니크해야 한다.

 

 

'Projects > Askers' 카테고리의 다른 글

[Askers] Open Graph 적용  (0) 2024.08.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함