Post

Flashcards (1) 도메인 모델 초안 그리기

Intro

시간 제한을 걸어두지 않으니까 너무 잘 하려는 마음에 프로젝트를 시작조차 하지못하고 있습니다. 주제 선정부터 시간이 오래걸려서 Java 배우고나서 처음 Console로 만들었던 Flashcards 앱(링크)을 웹앱으로 다시 만들어보기로 결정했습니다.

먼저 요구사항을 생각나는대로 정리해본 후 도메인 모델 설계를 시작합니다.

요구사항

그냥 일단 Flashcards 에서 만들고 싶은거 생각나는대로 일단 적어봅니다.

TypeRequirementPlan
기능사용자 회원 가입 및 로그인
기능카드 덱 생성/조회/수정/삭제
기능카드 생성/조회/수정/삭제
기능학습 간격은 Spaced Repetition 알고리즘으로 자동 계산
기능카드 태깅 
기능태그 그룹화 
기능태그 입력 시 태그 추천 
기능카드 덱 별 기본 태그 설정 
기능스터디 그룹 
기능카드 공유 
기능카드 학습 일정 확인 
기능타이머 
기능원하는 카드만 복습 기능(예. 시험 전 표시해둔 카드만 복습) 
기능카드와 관련된 자료 저장 및 링크 연결 
기능작성한 카드 내용을 기반으로한 요약 및 문제 생성 
기능구글 드라이브에 데이터 저장 - Bard로 요약, 검색 등 가능성 열어둠 
기능블로깅 기능 - 카드와 연결(구체화 필요) 
기능자료에서 핵심을 요약하고 카드 문제로 자동 변환 
기능사용자 작성 답안에 대한 피드백 
기능Anki Collections import 기능 
비기능모바일 앱 
비기능데스크톱 앱 
비기능브라우저 extension(웹 페이지에서 학습 내용 추출 목적) 
비기능Obsidian Plugin 

브레인스토밍 하듯 그냥 생각나는대로 다 적어보았습니다. 그리고 이번에 할 것만 Plan 열에 ✅ 표시해 봤습니다.

사용자 스토리(User Story)

Designing APIs with Swagger and OpenAPI 에서 본 아래 양식을 바탕으로 사용자 스토리를 작성해 봅니다. 이전에 GPT로 사용자 스토리를 만들어서 동사와 명사를 추출해보기도 했었는데, 나름 사용되는 방법인가 봅니다.

As a <role> I can <capability>, so that <receive benefit>.
so that 절은 선택 사항이며, 사용자 스토리 배경 정보 제공
Given <prerequisite>, I can <capability>.

Flashcards 웹앱에서 생각나는 역할(role)은 학습자(Learner), 관리자(Admin) 두 가지 역할이 있습니다. 현재 진행할 기능을 바탕으로 역할별 사용자 스토리를 생각나는대로 쭉 작성해 보겠습니다.

학습자(Learner)

  • 나는 새로운 계정을 만들 수 있고, 로그인 할 수 있다.
  • 나는 내 계정 정보를 수정할 수 있다.
  • 나는 카드 덱을 만들 수 있으며, 카드 덱 안에 하위 카드 덱을 생성할 수 있다.
  • 나는 카드를 생성할 수 있으며, 카드는 원하는 카드 덱에 저장된다.
  • 나는 내가 가진 카드 덱 목록을 조회할 수 있다.
  • 나는 내가 가진 카드 목록을 조회할 수 있다.
  • 나는 내가 가진 카드 덱 중 하나를 선택하여, 하위에 포함된 모든 카드로 학습을 시작할 수 있다.
  • 나는 학습을 시작하면 카드 앞면을 보고 답을 입력한 후 뒷면에 작성된 답안과 비교할 수 있다.
  • 카드를 뒤집어 답을 확인했다면, 알고리즘에 의해 계산된 다음 학습 일정을 난이도에 따라 선택할 수 있다.
  • 생성된 카드 덱이 있다면, 카드를 생성할 수 있다.
  • 생성된 카드 덱이 있다면, 학습자는 카드 덱을 삭제함으로써 카드 덱에 포함된 카드와 함께 동시에 삭제할 수 있다.
  • 생성된 카드가 있다면, 학습자는 카드를 통해 학습할 수 있다.
  • 생성된 카드가 있다면, 학습자는 선택한 카드를 삭제할 수 있다.
  • 생성된 카드와 카드 덱이 있다면, 학습자는 카드와 카드 덱을 수정할 수 있다.

관리자(Admin)

  • 나는 로그인할 수 있고, 관리자 기능에 접근할 수 있다.
  • 나는 내 계정 정보를 수정할 수 있다.
  • 나는 학습자 계정을 수정할 수 있다.
  • 나는 학습자 계정을 삭제할 수 있다.
  • 나는 학습자가 생성한 카드 덱과 카드를 수정할 수 있다.
  • 나는 학습자가 생성한 카드 덱과 카드를 삭제할 수 있다.
  • 나는 학습자가 생성한 카드 덱과 카드를 조회할 수 있다.

요구사항과 사용자 스토리를 바탕으로 명사에서 객체를, 동사에서 행동을 추출해 보겠습니다.

명사

객체를 식별하기 위해 명사를 뽑아보자면, 아래와 같습니다.

  • 학습자
  • 관리자
  • 계정
  • 카드 덱
  • 카드
  • 학습 일정
  • 알고리즘

학습자, 관리자, 계정은 사용자(User) 객체로 통합하고, 카드 덱(Deck), 카드(Card) 는 각각의 객체로 볼 수 있습니다. 학습 일정(Plan) 의 경우 카드와 관련된 내용이므로 카드에 속한 정보 객체가 됩니다.

동사

각 객체의 행동이 될 수 있는 동사를 찾아보면 아래와 같습니다.

  • 조회하다
  • 생성하다
  • 수정하다
  • 삭제하다
  • 로그인하다
  • 학습하다
  • 뒤집다
  • 계산하다
  • 계획하다

다음 학습 일정을 선택한다는 표현에서 선택한다는 조회하다와 혼동이 있을 수 있어 어떻게 표현할까 고민하다가, 언제 공부할지 계획하는 행위이므로 계획하다 를 추가하였습니다.

도메인 모델

앞서 사용자 스토리에서 추출한 객체와 동사를 바탕으로 도메인 모델의 다이어그램을 간단하게 그려보면 아래와 같습니다.

도메인 모델 초안

위 그림에서 알고리즘(Algorithm)과 카드(Card) 객체는 Anki에서도 사용하는 SM-2 알고리즘을 기준으로 작성했습니다. 구현 시에는 알고리즘 교체 가능성도 고려해서 구현을 해야겠습니다.

Outro

드디어 스타트를 끊었습니다. 오래 붙들고 있어봤자 답이 안나오는데, 뭐 이리 쓸데없는 고민만 많이 한건지 스스로에게 답답함을 느낍니다.

다음은 OpenAPI 문서 작성을 진행해보겠습니다.

This post is licensed under CC BY 4.0 by the author.