FUI 작업을 하면 까다로운것이 쉐이프를 꺼내오는것이 힘들다는것이다.
이게 평소에 관리해두면 모르겠지만 관리가 상당히 까다롭다.

기능

관리에 유용한 기능이 있다면 다음과 같을 것이다.

  • 썸네일로 한눈에 보기 쉬워야 한다.
  • 일러스트레이터나 다른 디자인툴에서 복사, 붙여넣기로 쉽게 등록이 쉬워야 한다.
  • 웹 브라우저에서 사용할 수 있다면 좋을거 같다.
  • 필터링 및 검색
  • 그루핑
  • 등록이 쉽고 재구성이 잘 되어서 프리셋이 많이 늘어날 수 있으면 좋겠다. (제네레이팅 관련)

기술스택

  • 첨부데이터는 파일로
  • 데이터베이스는 sqlite로 해보는것은 어떨까?? mysql에서 벗어나고 독립적으로 사용하고 싶다.
  • vue, svelte든지 상관없다.
  • 플러터로 해보는건 어떨지..

컨텐츠

  • 쉐이프 인덱스
  • 상세보기
  • 등록하기

다음은 각 컨텐츠에 들어가는 요소들이다.

인덱스

  • 썸네일 목록
  • 필터링
  • 태그 (구현이 확실해 진다면..)
  • 콜렉션 (폴더)

상세보기

  • 프리뷰
  • 제목, 설명
  • 등록일, 수정일
  • 수정
  • 삭제

등록하기

  • 외부에서 가져오기
  • 제목, 설명
  • 이미지 첨부
  • 콜렉션
  • 필터링 정보

데이터베이스

컨텐츠를 바탕으로 데이터베이스 구조를 만들어볼 수 있을것이다.

shapes

쉐이프 데이터로 사용할 수 있다. 메인 데이터

  • id
  • id_file
  • id_collection
  • title
  • description

files

첨부되어 있는 파일들의 모음

  • id
  • id_shape
  • name
  • path
  • type
  • size
  • regdate
  • update

collections

쉐이프들을 그루핑하는 역할을 한다.

  • id
  • id_shape
  • name
  • regdate

화면구성

  • 목록(첫페이지)
  • 쉐이프 상세화면
  • 쉐이프 등록/편집

메타데이터

조회수
355
좋아요
0

5개의 댓글

쉐이프를 그루핑하는게 과연 의미가 있을까?
그냥 쭉 목록화하고 태그나 상태값으로 필터링하는 형태로 탐색하는것이 좋아보인다.

콜렉션 목록으로 사이드 영역을 차지하게 된다면 필터링 공간을 사이드 영역으로 만들어내기 어려울거 같다.
콜렉션 데이터를 포기하면 데이터가 좀더 심플해질것이다.

아마도 상태값 부분에서 대단히 복잡해질지도..

나중에 작은 조각을 새로 조립하는 에디터를 충분히 구현할 수 있어 보인다.
완성품을 만드는것까진 아니고 올라와져 있는 유닛들을 그루핑하여 쉐이프 이미지를 새로 만드는 과정으로 새로 svg로 만들 수 있어보인다.

콜렉션은 강제로 담겨져 있는건 아니고 커스터마이즈할 수 있는 자루라고 생각하고 쓰면 좋을거 같다.
예를 들어서 음악에서 플레이 리스트같이..
기초적인 작업에서는 제외하고 추가기능 작업으로 진행할 수 있어보인다.

다음은 chat gpt에게 물어본 db 테이블 구성이다.


SQLite를 사용하여 음악 플레이리스트를 구현하는 예제를 보여드리겠습니다. 아래 예제에서는 SQLite 데이터베이스를 사용하여 플레이리스트, 음악 트랙 및 플레이리스트와 음악 트랙 간의 관계를 저장합니다.

먼저, 다음과 같이 테이블을 생성할 수 있습니다:

CREATE TABLE Playlist (
    playlist_id INTEGER PRIMARY KEY,
    title TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE Song (
    song_id INTEGER PRIMARY KEY,
    title TEXT,
    artist TEXT,
    album TEXT,
    duration INTEGER
);

CREATE TABLE PlaylistSong (
    playlist_id INTEGER,
    song_id INTEGER,
    FOREIGN KEY (playlist_id) REFERENCES Playlist(playlist_id),
    FOREIGN KEY (song_id) REFERENCES Song(song_id),
    PRIMARY KEY (playlist_id, song_id)
);

이제 각 테이블에 데이터를 추가할 수 있습니다. 예를 들어, 샘플 데이터를 삽입하는 방법은 다음과 같습니다:

-- Playlist 테이블에 샘플 데이터 삽입
INSERT INTO Playlist (title) VALUES ('My Favorites');
INSERT INTO Playlist (title) VALUES ('Party Mix');

-- Song 테이블에 샘플 데이터 삽입
INSERT INTO Song (title, artist, album, duration) VALUES ('Song 1', 'Artist 1', 'Album 1', 240);
INSERT INTO Song (title, artist, album, duration) VALUES ('Song 2', 'Artist 2', 'Album 2', 180);
INSERT INTO Song (title, artist, album, duration) VALUES ('Song 3', 'Artist 3', 'Album 3', 300);

-- PlaylistSong 테이블에 샘플 데이터 삽입
INSERT INTO PlaylistSong (playlist_id, song_id) VALUES (1, 1); -- My Favorites 플레이리스트에 Song 1 추가
INSERT INTO PlaylistSong (playlist_id, song_id) VALUES (1, 2); -- My Favorites 플레이리스트에 Song 2 추가
INSERT INTO PlaylistSong (playlist_id, song_id) VALUES (2, 2); -- Party Mix 플레이리스트에 Song 2 추가
INSERT INTO PlaylistSong (playlist_id, song_id) VALUES (2, 3); -- Party Mix 플레이리스트에 Song 3 추가

위 예제에서는 SQLite를 사용하여 플레이리스트, 음악 트랙 및 플레이리스트와 음악 트랙 간의 관계를 저장하는 방법을 보여줍니다. 데이터베이스 연결 및 쿼리 실행은 SQLite3와 PHP를 사용하는 환경에 맞게 수정하여 사용할 수 있습니다.


보아하니 관계 테이블을 따로 만들어서 콜렉션과 쉐이프 테이블을 연결시킬 수 있어보인다.

특정 테이블 접근권한에 대한 DB 테이블 구성에 대하여 chatgpt 에게 물어봤다.
일단 다른것들과 마찬가지로 A, B 테이블 브릿지 역할을 해주는 C 테이블을 따로 만들어서 관리해라는 거였다.
이거 생각 이상으로 테이블이 많아진다.


SQLite에서 "FOO"와 "BAR" 테이블의 접근 권한을 관리하기 위해서는 다음과 같은 세 가지 테이블을 구성할 수 있습니다.

  1. "FOO" 테이블: "FOO" 테이블은 사용자가 작업할 수 있는 데이터나 리소스를 포함합니다. 필요한 컬럼에 따라 스키마를 설정할 수 있습니다.

    CREATE TABLE FOO (
        foo_id INTEGER PRIMARY KEY AUTOINCREMENT, -- FOO 테이블의 고유 식별자
        column1 TEXT,
        column2 INTEGER,
        -- 기타 컬럼 추가 가능
    );
    
  2. "BAR" 테이블: "BAR" 테이블은 "FOO" 테이블과 별도로 다른 데이터나 리소스를 포함합니다. 이 테이블 역시 필요한 컬럼에 따라 스키마를 설정할 수 있습니다.

    CREATE TABLE BAR (
        bar_id INTEGER PRIMARY KEY AUTOINCREMENT, -- BAR 테이블의 고유 식별자
        column1 TEXT,
        column2 INTEGER,
        -- 기타 컬럼 추가 가능
    );
    
  3. "USER" 테이블: 사용자의 정보를 저장합니다.

    CREATE TABLE USER (
        user_id INTEGER PRIMARY KEY AUTOINCREMENT, -- USER 테이블의 고유 식별자
        username TEXT NOT NULL UNIQUE, -- 사용자 이름 (고유)
        password TEXT NOT NULL, -- 비밀번호 (보안을 위해 암호화 권장)
        -- 기타 사용자 정보를 위한 컬럼 추가 가능
    );
    
  4. "USER_PERMISSIONS" 테이블: "FOO"와 "BAR" 테이블에 대한 사용자 권한을 관리하기 위해 사용됩니다. 이 테이블은 각 사용자가 "FOO"와 "BAR" 테이블에 대해 가지는 권한 유형(예: 읽기, 쓰기, 삭제)을 저장합니다.

    CREATE TABLE USER_PERMISSIONS (
        permission_id INTEGER PRIMARY KEY AUTOINCREMENT, -- 권한의 고유 식별자
        user_id INTEGER, -- USER 테이블의 외래 키
        resource_type TEXT, -- "FOO" 또는 "BAR" 중 하나를 나타냄
        resource_id INTEGER, -- FOO 테이블의 foo_id 또는 BAR 테이블의 bar_id
        permission_type TEXT, -- 권한 유형: "읽기", "쓰기", "삭제" 등
        FOREIGN KEY (user_id) REFERENCES USER(user_id),
        CHECK (resource_type IN ('FOO', 'BAR'))
        -- resource_type에 따른 외래 키 검증은 SQLite에서 기본 지원하지 않으므로 애플리케이션 레벨에서 검증
    );
    
  • 설명:
    • resource_type 컬럼은 "FOO" 또는 "BAR" 중 하나를 나타내며, 어떤 테이블에 대한 권한인지 지정합니다.
    • resource_id 컬럼은 resource_type에 따라 FOO 테이블의 foo_id 또는 BAR 테이블의 bar_id에 해당합니다.
    • permission_type 컬럼은 "읽기", "쓰기", "삭제" 등의 권한 유형을 나타냅니다.

이러한 구조를 사용하여 "FOO"와 "BAR" 테이블의 접근 권한을 관리할 수 있습니다. 각 사용자의 요청을 처리할 때 "USER_PERMISSIONS" 테이블을 쿼리하여 사용자의 권한을 확인하고 해당 테이블에 대한 접근을 허용하거나 거부할 수 있습니다.