Skip to content
Kim Woojoo edited this page Feb 5, 2026 · 11 revisions

Episode

image
흩어진 경험을 한 편의 이야기로 잇다.

사용자는 경험을 활동 타입–활동명–상세 경험 구조의 마인드맵과 STAR 기법으로 정리하고, 핵심 역량 태그를 통해 경험을 체계적으로 관리·조회할 수 있습니다.⛓️‍💥📑

지금 에피소드에서 경험을 구조화하고, 필요한 순간 바로 꺼낼 수 있는 준비를 시작해 보세요. .


목차

  • [주요 기능]({위키 링크})

    • [~~~]({위키 링크})
  • [FE 기술적 도전]({위키 링크})

    • [~~~]({위키 링크})
  • [BE 기술적 도전]({위키 링크})

    • [~~~]({위키 링크})
  • [기술 스택]({위키 링크})

  • [프로젝트 아키텍처]({위키 링크})

  • [프로젝트 Flow]({위키 링크})

  • [팀원]({위키 링크})

⭐️ 주제 선정 동기

~~ 작성 예정

🎞️ 주요 기능

자기소개서 문항을 통한 세부 역량의 빈틈 진단

제시된 자기소개서 문항을 통해 사용자는 답변 가능 여부를 체크합니다. 사용자는 해당 답변을 기반으로 부족한 역량이 어떤 카테고리에 속하는 역량인지 확인할 수 있습니다.

본인의 경험을 보기 쉬운 형태로 정리할 수 있는 마인드맵과 STAR표 제공

본인의 활동 카테고리를 선택하여 기본 노드를 생성하고, 그 하위에 활동 명 -> 에피소드 계층 으로 이루어진 마인드맵을 그릴 수 있도록 공간을 제공해줍니다. 각각의 에피소드에 경험을 체계적으로 정리할 수 있는 기법인 star 방식을 차용하여 정리할 수 있는 창이 있으며, 해당 에피소드가 어떤 역량에 해당하는지 라벨링 할 수 있습니다. 정리해두었던 경험에서 원하는 역량에 해당하는 경험을 빠르게 찾을 수 있도록 마인드맵 내부에서 역량 별 필터링 기능을 제공합니다.

함께 정리할 수 있는 팀 마인드맵

협업했던 경험에 대해 함께 정리할 수 있도록 공유 마인드맵을 제공합니다.

🔧 기술 스택

분류 기술 스택

프론트엔드

백엔드

배포

협업

🔧 프로젝트 아키텍처

아키텍처

🔧 프로젝트 flow

sequenceDiagram
    autonumber
    actor User as 👤 사용자
    participant FE as 🖥️ Frontend
    participant Kakao as 🟡 Kakao OAuth
    participant BE as ⚙️ Backend (Node/Spring)
    participant DB as 🗄️ Database
    participant Redis as 🔴 Redis (Cache)
    participant S3 as 📦 AWS S3 (File)

    %% 0. 공통 인증
    rect rgb(240, 248, 255)
    note right of User: 0. 공통 인증 (Authentication)
    User->>FE: 카카오 로그인 시도
    FE->>Kakao: 인가 코드 요청
    Kakao-->>FE: 인가 코드 반환
    FE->>BE: 로그인 요청 (인가 코드 전달)
    BE->>Kakao: 토큰 발급 요청 및 사용자 정보 조회
    BE->>DB: 사용자 정보 저장/갱신
    BE-->>FE: JWT 발급 (HttpOnly Cookie)
    end

    %% 1. 마인드맵 서비스
    rect rgb(255, 250, 240)
    note right of User: 1-A. 마인드맵 생성 및 초기화
    FE->>BE: 마인드맵 생성 요청
    BE->>DB: 메타데이터 저장 (제목, 소유자)
    BE->>S3: Presigned URL(POST) 생성 요청
    S3-->>BE: URL 반환
    BE-->>FE: Presigned URL 전달
    FE->>S3: 초기 스냅샷(Yjs) 업로드
    end

    rect rgb(255, 245, 230)
    note right of User: 1-B. 실시간 편집 (WebSocket & Redis)
    User->>FE: 마인드맵 접속 & 편집
    FE->>BE: WebSocket 연결 및 Update 패킷 전송
    BE->>Redis: Update 패킷 임시 저장 (List)
    BE->>FE: 다른 사용자들에게 변경사항 브로드캐스트
    end

    rect rgb(255, 240, 230)
    note right of User: 1-C. 세션 종료 및 병합 (Node.js Worker)
    BE->>BE: 모든 연결 종료 감지 (Presence 0)
    BE->>S3: 기존 스냅샷 다운로드
    BE->>Redis: 누적된 Update 패킷 조회
    BE->>BE: 데이터 병합 (Merge Snapshot)
    BE->>S3: 최신 스냅샷 덮어쓰기 (업로드)
    BE->>Redis: 임시 데이터 삭제
    end

    %% 2. 자기 역량 진단 서비스
    rect rgb(245, 255, 245)
    note right of User: 2-A. 직무 선택 및 문항 수령
    User->>FE: 직무 선택 (로그인/설정)
    FE->>BE: 해당 직무 기출 문항 요청 (15개)
    BE->>DB: 직무별/역량별 문항 조회
    DB-->>BE: 문항 리스트 반환
    BE-->>FE: 문항 데이터 응답
    User->>FE: 답변 불가 문항 체크
    end

    rect rgb(235, 255, 235)
    note right of User: 2-B. 결과 분석
    FE->>BE: "답변 불가" 문항 ID 리스트 전송
    BE->>DB: 문항 ID로 상세 역량 매핑 조회
    BE->>BE: 부족 역량 집계 및 분석
    BE-->>FE: 부족 역량 데이터 결과 반환
    end
Loading

flow 추가 설명

1. 실시간 협업 마인드맵 서비스

사용자가 마인드맵을 생성하고, 여러 명이 동시에 편집하며, 최종적으로 데이터를 동기화 및 백업하는 과정입니다.

A. 마인드맵 생성 및 초기화

  1. 생성 요청: 프론트엔드가 마인드맵 생성을 요청합니다.
  2. DB 저장: 백엔드는 마인드맵 메타데이터(제목, 소유자 등)를 DB에 저장합니다.
  3. S3 통로 확보: Yjs Snapshot 저장을 위한 **S3 Presigned URL(POST)**을 생성하여 프론트에 전달합니다.
  4. 초기 저장: 프론트엔드는 전달받은 URL을 통해 S3에 초기 Yjs Snapshot을 업로드합니다.

B. 실시간 편집 및 동기화 (WebSocket & Redis)

  1. 접속: 사용자가 특정 마인드맵 ID로 웹소켓 연결을 시도합니다.
  2. 데이터 변경: 편집 시 발생하는 Y.Doc Update 패킷이 서버로 전송됩니다.
  3. 브로드캐스트: 서버는 같은 룸(마인드맵 ID)에 접속한 다른 클라이언트들에게 해당 패킷을 즉시 전파합니다.
  4. 임시 저장 (Redis): 실시간 업데이트 패킷들은 S3에 매번 쓰기에는 무거우므로, Redis에 리스트 형태로 쌓아두어 유실을 방지하고 빠른 처리를 지원합니다.

C. 세션 종료 및 최종 백업 (Node.js Worker)

  1. 연결 종료 감지: 특정 마인드맵의 모든 웹소켓 연결이 끊기면(Presence 0), 백업 로직이 트리거됩니다.
  2. 데이터 병합: Node.js 서버는 S3의 기존 Snapshot과 Redis에 쌓인 Update 패킷들을 가져와 하나의 최신 Snapshot으로 병합합니다.
  3. S3 백업: 최종 병합된 데이터를 S3에 덮어쓰고, Redis 내 임시 데이터는 삭제하여 정리합니다.

2. 자기 역량 진단 서비스

사용자의 직무 기반 데이터를 활용하여 부족한 역량을 분석하고 시각화하는 과정입니다.

A. 직무 선택 및 문항 수령

  1. 직무 설정: 로그인 OR 희망 직무 변경 시 사용자가 관심 직무를 선택합니다.
  2. 문항 생성/조회: 선택한 직무의 상세 역량(Sub-skills)별로 분류된 기출 문항 15개를 백엔드에서 호출합니다.
  3. 사용자 응답: 사용자는 각 문항에 대해 "답변 가능" 또는 "답변 불가능" 여부를 체크합니다.

B. 데이터 분석 및 결과 제공

  1. 데이터 전송: 프론트엔드는 사용자가 "대답하지 못한" 문항들의 ID 또는 리스트를 백엔드로 전송합니다.
  2. 역량 매핑: 백엔드는 DB를 조회하여 해당 문항들이 어떤 상세 역량(예: "리더십", "창의성")에 속하는지 매핑합니다.
  3. 결과 도출: 대답 못한 문항이 많은 순서대로 사용자의 부족 역량 데이터를 가공하여 응답합니다. (이후 마인드맵 노드 생성 등에 활용 가능)

🔧 프로젝트 ERD

erDiagram

    OCCUPATION ||--o{ JOB : has
    JOB ||--o{ USERS : assigned
    USERS ||--o{ DIAGNOSIS_RESULT : creates
    JOB ||--o{ DIAGNOSIS_RESULT : target

    COMPETENCY_TYPE ||--o{ QUESTION : categorizes
    QUESTION ||--o{ DIAGNOSIS_WEAKNESS : referenced
    DIAGNOSIS_RESULT ||--o{ DIAGNOSIS_WEAKNESS : contains

    USERS ||--o{ EPISODE : writes
    MINDMAP ||--o{ EPISODE : contains
    COMPETENCY_TYPE ||--o{ EPISODE : tagged

    USERS ||--o{ MINDMAP_PARTICIPANT : participates
    MINDMAP ||--o{ MINDMAP_PARTICIPANT : shared_with

    QUESTION ||--o{ QUESTION_JOB_MAPPING : mapped
    JOB ||--o{ QUESTION_JOB_MAPPING : mapped

    USERS ||--|| REFRESH_TOKEN : owns


    OCCUPATION {
        int id PK
        varchar name
    }

    JOB {
        int id PK
        varchar name
        int occupation_id FK
    }

    USERS {
        bigint kakao_id PK
        int job_id FK
        varchar nickname
        boolean has_watched_feature_guide
    }

    DIAGNOSIS_RESULT {
        int id PK
        bigint user_id FK
        int job_id FK
        datetime created_at
    }

    DIAGNOSIS_WEAKNESS {
        int id PK
        int diagnosis_result_id FK
        int question_id FK
    }

    COMPETENCY_TYPE {
        int id PK
        varchar type_name
        enum category
    }

    QUESTION {
        int id PK
        int competency_type_id FK
        varchar content
        varchar guidance_message
    }

    QUESTION_JOB_MAPPING {
        int id PK
        int question_id FK
        int job_id FK
    }

    MINDMAP {
        binary id PK
        datetime created_at
        datetime updated_at
        boolean is_shared
        varchar name
    }

    EPISODE {
        int node_id PK
        bigint user_id PK, FK
        binary mindmap_id FK
        int competency_type_id FK
        varchar situation
        varchar task
        varchar action
        varchar result
        varchar content
        datetime created_at
    }

    MINDMAP_PARTICIPANT {
        int id PK
        bigint user_id FK
        binary mindmap_id FK
        boolean is_favorite
    }

    REFRESH_TOKEN {
        bigint id PK
        bigint user_id FK
        varchar token_hash
        datetime expires_at
        datetime created_at
        datetime updated_at
    }


Loading

🧑🏻‍💻 FE 기술적 도전

기술적 도전 목적

도전 1

이미지

  • 설명
  • 설명

도전 2

이미지

  • 설명
  • 설명

🧑🏻‍💻 BE 기술적 도전

기능 1

[이미지]

  • 설명
  • 설명

기능 2

이미지

  • 설명
  • 설명

👥 팀원

기획 · 디자인 개발
김민우 이나경 김현지 문준호 김민우 이나경 김현지 문준호
김강민 강민서 김지윤 이주연 김현지 김우주 박세현 박은서
기획 디자인 디자인 디자인 BE BE FE FE

Clone this wiki locally