-
Notifications
You must be signed in to change notification settings - Fork 1
2022 11 21
Seyeon Ko edited this page Nov 21, 2022
·
1 revision
- 기종: 공부와 코딩… 왜 그랬어
- 정욱: 드라마(재벌집 막내아들)
- 종찬: 게임(갓오브워 라그나로크)이 나왔다
- 수 : 오후 3시 반 ~ 저녁엔 돌아옴
- 목 : 오후 1시~4시 후 돌아옴
- 금 : 오후 1시~2시랑 4시 이후
- 세연: 침착맨
- 전 주에 발생한 변경 사항에 따라 backlog를 보완합니다.
- 이번 주의 우선순위, 구현할 기능(Feature), 작업 크기, 담당자를 결정한다.
- 구현할 기능에 대한 데모 시나리오를 자세히 작성합니다.
- 사전에 정의한 기능과 동작을 완성했는지 확인할 수 있도록 다음의 내용을 반드시 포함해야 합니다. (테스트 목적과 상황 / 시나리오 진행에 필요한 값 / 시나리오 진행에 필요한 조건 / 시나리오 완료 시 보장하는 결과)
- 기능 목록 업데이트를 포함한 회의 내용을 프로젝트 저장소 Wiki에 작성하고 결과를 요약하여 Slack 분야 별 채널에 공유합니다. (매주 월 13:00까지)
플레이어 이동, 개인공간 맵 생성, Notion 데이터 가공
- 월 : 공간 ID 추출, 개인공간 라우팅, 메인 비석-키워드 모음 렌더링, 각 게시글의 공간과 길 렌더링, 게시글 추출
- 화 : 각 게시글 비석, 키워드 모음 렌더링, 자연어 처리, 게시글 그룹화, 맵 좌표 생성
- 수 : 각 게시글 사진 파편, 하이퍼링크 렌더링, 이미지 픽셀 추출, 하이퍼링크 추출
- 목 : 로딩, 플레이어 위치에 따른 렌더링 최적화, 맵 데이터 저장, 클라이언트상에서 API 불러오기, 개인공간 진짜 라우팅
- 최소 목표
- 공간생성 확인화면(/create)의 버튼을 클릭하면 데이터를 받아오는 것이 아니라 POST /space(공간생성 요청 API)를 호출해야 하며, 그 결과가 완료되면 제작된 공간 페이지로 페이지를 리다이렉트해야 한다.
- 개인공간의 라우팅이 완료되어야 한다.
- 개인공간 페이지에서는 선택된 페이지에 해당하는 생성된 공간의 정보를 불러와서 렌더링을 할 수 있어야 한다.
- 개인공간 페이지에서는 메인 비석과 각 공간의 비석이 보여져야 한다.
- 메인 비석에 가까이 가면 모든 페이지의 키워드가 보여져야 한다.
- 각 페이지 공간에는 제목, h1, 각 페이지에서 추출한 키워드가 보여져야 한다.
- 중앙 비석과 각 페이지 공간을 잇는 길 역시 보여져야 한다.
- 백엔드에서는 Notion OAuth 액세스 토큰으로 받아온 페이지의 데이터를 가공해서 맵의 형식으로 가공된 것을 DB에 저장해야 한다.
- Python 서버는 자연어 처리로 각 페이지의 타이틀에서 따 온 키워드를 추출해 Node.js 서버로 보내줘야 한다.
- 데이터베이스의 하위 페이지 역시 가공할 수 있어야 한다.
- 추가 목표
- 사용자가 로그인했을 때 사용자가 만든 개인공간이 존재하면 메인화면에서 자신 공간 이동-공간 동기화를 선택할 수 있어야 한다.
- 각 페이지 공간의 하이퍼링크 패널이 보여져야 하며, 하이퍼링크 패널에 플레이어가 서면 해당하는 공간으로 새 페이지를 띄워주어야 한다.
- 사용자가 선택한 테마에 따라 렌더링되는 오브젝트의 색상이 달라져야 한다.
- 페이지에 첨부된 이미지의 픽셀을 추출해서 그 결과를 저장해야 한다.
- 이미지 파편을 클릭하면 해당하는 이미지 파편이 합쳐져서 원본 이미지처럼 보여져야 한다.
- 개인공간 페이지의 각 페이지 공간과 길 밖으로 플레이어가 이동할 수 없어야 한다.
- 기타 아름다운 효과 및 인터랙션을 자유롭게 추가한다.
GET /gallery/(사용자 uuid)/(공간 uuid)
/gallery/(사용자 uuid)
→ /gallery/(사용자 uuid)/(가장 최근에 동기화한 공간 uuid)
로 리다이렉트
해당 주소에 해당하는 페이지는 동일한 html을 반환해야 함
서버쪽에서 올바르지 않은 사용자 uuid, 공간 uuid가 있을 때 404 에러를 띄워줄 수 있음
접근하는 쪽이 비공개 페이지일 때는 로그인된 사용자+사용자 uuid가 일치하는지를 파악해서 일치하지 않으면 403 에러를 띄워줘야 함
GET /api/gallery/(사용자 uuid)/(공간 uuid)
//res.body
{
"uuid" : <uuid>,
"totalKeywords" : <Dict<String, Number>>, //전체 맵 키워드 통계
// 3개 키워드, 1개는 해당 키워드들이 아예 없는 것들
"pages" : [
{
"position" : [<Number>, <Number>], // x좌표, z좌표. 인덱스 말고 포지션 데이터
"title" : <String>,
"subTitle" : <String[]>,
"keywords" : <Dict<String, Number>>, //페이지 당 키워드 통계
"links" : [
{
"href" : <String>, // 외부 링크 url
"favicon" : <String> // 외부 링크 url의 favicon url
}
],
"imagePixel" : <Number[]>, // 첫번째로 나오는 이미지, 2개이상 [Optional]
}],
"nodes": [[0,1],[0,2]] // 페이지간 관계성 표현에 쓰임 -1:(루트 페이지) 0~99999999:각 페이지 번호
}
export interface IKeywordMap {
[keyword: string]: number;
}
export interface IGallaryPageData {
position: Array<number>;
title: string;
subtitle: Array<string>;
keywords: IKeywordMap;
links?: {
href: string;
favicon?: string;
};
imagePixel?: Array<Array<number>>;
}
export interface IGallaryMapData {
uuid: string;
totalKeywords: IKeywordMap;
pages: Array<IGallaryPageData>;
nodes: Array<Array<number>>; // 도당체 왜 타스는 [12,34]를 [number,number]로 인식을 못할까요 거지같은타스
}
POST /preprocess
//req.body
pages : {
pageid : {
title : string,
h1 : string[],
h2 : string[],
h3 : string[],
paragraph : string[],
...
},
...
//res.body
totalkeywords: dict{
keyword1: 23,
keyword2: 2
...
}
pages : {
pageid : {
keywords : dict{
keyword1: 23,
keyword2: 2
...
}
title : string,
h1 : keywords[],
h2 : keywords[],
h3 : keywords[],
paragraph : keywords[],
...
},
...
- 각 페이지 내부에 nodes가 들어가는 이유는 길을 표현하려고 만든 건데 중복처리가 힘들 수 있다
- 아예 중복을 제거한 nodes를 pages 밖으로 빼서 보내주는 게 나을 수 있음
- 각 노드의 숫자는 배열로 표현된 영역의 인덱스를 의미함
- -1은 중앙 영역을 의미(0, 0)
- 픽셀단위로 저장하는 까닭은 클라이언트에서 렌더링을 용이하게 함
- 클라이언트에서 이미지 프로세싱을 하면 렌더링하기도 벅찬데 이미지 프로세싱까지 끼얹으면 클라이언트에 부담이 증가함
- 클라이언트 상에서 이미지 픽셀 데이터를 axios로 요청하는 거다 보니 cors 에러가 뜰 수 있음
종찬님이 수/목요일이 자리비우는데 ㅠㅠ (수:3:307:00 목:14시 → 졸업 이슈)
금에는 오후 1시~2시랑 4시 이후부터 자리에 없을 것 같습니다