Skip to content

241112 회의록

KWAKMANBO edited this page Nov 12, 2024 · 2 revisions

오늘 할 일

  • 3주차 이슈 뽑기
  • 역할 분배, 이슈 assign
  • 백엔드 이슈 input / output 논의
  • 백엔드 인가 수준 정하기
  • svg 뷰 방식 공유

SVG 뷰 방식 공유

  • 테스트 용도를 위해서 간단하게 직사각형 두개로 이루어진 공연장 구성
    • 섹션은 2개로 이루어져 있으며, 한 섹션은 9 * 5 좌석으로 이루어진다.
    • A섹션은 9*5가 가득 채워진 좌석 배치를, B섹션은 중간중간 빈칸이 있는 좌석으로 이루어지게 해서
  • 추후 데모를 위해서 살짝 더 복잡한 도형(도형을 어떻게 그렸지라는 신기함이 들도록)으로 변경할예정
image
// 위 svg이미지에서 섹션들의 point들
const SECTIONS = [
  {
    id: "A",
    points: [
      [447.121, 869.114],
      [447.121 + 1118.19, 869.114],
      [447.121 + 1118.19, 869.114 + 1822.87],
      [447.121, 869.114 + 1822.87],
    ],
  },
  {
    id: "B",
    points: [
      [2662.6, 869.114],
      [2662.6 + 1118.11, 869.114],
      [2662.6 + 1118.11, 869.114 + 1822.9],
      [2662.6, 869.114 + 1822.9],
    ],
  },
];
//DB  Place Table
{
	"id" : 1,
	"name" : "공연장 이름",
	"overview-points" : "1_points.json",
	"overview-svg-url" : "/static/1_overview.svg", //백그라운드가 들어갈 이미지 URL
	"overview-height" : 1180,
	"overview-width" : 1800,
	"sections" : [1, 2],
}

//DB 1_points.json
{
    id: "A",
    points: [
      [447.121, 869.114],
      [447.121 + 1118.19, 869.114],
      [447.121 + 1118.19, 869.114 + 1822.87],
      [447.121, 869.114 + 1822.87],
    ],
  },
  {
    id: "B",
    points: [
      [2662.6, 869.114],
      [2662.6 + 1118.11, 869.114],
      [2662.6 + 1118.11, 869.114 + 1822.9],
      [2662.6, 869.114 + 1822.9],
    ],
  },
  • Place 테이블에 Overview svg에 대한 넓이와 높이를 같이 저장해야한다.
    • 테이블에 overview_height, overview_width 필드 추가해야한다.
    • 이러면 정규화를 통해서 분리하는게 맞지 않나?
      • overview → overview_height, overview_width
      • 하지만 overview가 PK가 아니기 때문에 3정규화에 만족하지 않는다
      • 하지만 join의 수를 줄이기 위해서 반정규화를 생각해볼 수 있다.
    • overview라는 데이터가 place 별로 중복되어 사용되는 경우가 없다고 판단해서 하나의 테이블에 유지하는 것이 더 효율적일 것 같다.
  • 결론 : place table에 overview_height, overview_width 필드를 추가한다.

3주차 이슈생성하기

  • 엔티티 생성
    • Program → /Program
    • Event → /Event
    • Reservation → /Reservation
    • Place → /Place
    • Section → /Place
  • 목 API 구현 → /mock path로 통일
    • /mock/reservation [GET]
    • /mock/booking/re-permission/:event-id [GET] - sse
      • 연결이 되면 100명 정도 남아 있고,
      • 1초마다 10명씩 줄어들도록
      • 0명이 되면, 입장 가능 요청을 보내고 연결을 끊는다.
    • /mock/reservation/:event-id [GET] - sse
      • 특정 좌석들에 대해서 랜덤으로 변경
      • 1초마다 랜덤(구현 힘들면 정해진 패턴도 무관)으로 변화된 좌석 현황이 변화된 정보를 보낸다.
    • 좌석 배치도에 대해서 1개라도 만들어서 DB에 목 데이터로 넣기
  • 메인페이지 데이터 제공 → /programs
  • 상세 프로그램 정보 제공 → /programs/:program-id
  • 이벤트 정보 제공 → /event/:event-id
  • 좌석 데이터 제공 → /seats/:place-id
  • 유저 입장 요청 → /booking/permission/:event-id
    • 입장 중인 유저 풀 관리 방식 결정
  • 예약 인원수 전달 → /booking/count
  • 좌석 현황 요청(SSE) → /reservation/:event-id
    • 특정 시간 혹은 특정 이벤트(좌석 점유에 변화가 생겼을때) 클라이언트에게 최신화된 좌석 정보 제공
    • 좌석 선택 페이지에 들어온 유저 수에 따라서 클라이언트에게 정보를 전달하는 빈도를 동적으로 변경하는 방식도 좋을 듯 하다.
  • 좌석 선택 및 점유 → /reservation
  • 좌석 확정 → /reservation/confirmation

인가 수준 정하기

  • 동적으로 상태가 변한다
    • 로그인된 상태(기본)
    • 대기큐에 들어간 상태
    • 좌석 점유 페이지에 입장한 상태
    • 관리자
  • 인가 상태를 트리 구조와 같이 위계 구조를 가지기 보다는 키워드를 통해서 관리하도록 한다.
  • 인가를 변경해주는 함수 필요 → auth.service에서 제공
    • 인가 변경
      • 로그인, 대기큐, 좌석 점유, 관리자 각 상태로 변경할 수 있는 함수만들기
  • 세션은 만료 시간을 가짐
    • 세션을 참조할 때마다 만료 시간이 갱신
//session
SID(key)| user-id. user-status. target-event  expiredTime
UUID1   |  1.       대기큐        1             2024-11-12:16:40
UUID2   |  2        좌석 선택      1
UUID3   |  3        기본          null