6. 커스텀 모듈
6.1 모듈 개요
섹션 제목: “6.1 모듈 개요”dcamp 웹사이트는 Drupal의 기본 기능 외에 dcamp의 특수한 요구사항을 충족하기 위해 자체 개발 모듈들을 포함하고 있습니다. 이 모듈들은 기존 오픈소스 모듈로는 구현하기 어려운 기능을 제공합니다.
┌─────────────────────────────────────────────────────────────────┐│ 커스텀 모듈 구조 │├─────────────────────────────────────────────────────────────────┤│ ││ [핵심 모듈] ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ admin │ │ dcamp_admin │ │ dcamp_event │ ││ │ (기반 기능) │ │ (관리 UI) │ │ (프로그램) │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ ││ [데이터 모듈] ││ ┌─────────────┐ ┌─────────────┐ ││ │ dcamp_ │ │ dcamp_email │ ││ │ portfolio │ │ (이메일) │ ││ │(포트폴리오) │ │ │ ││ └─────────────┘ └─────────────┘ ││ ││ [인증/보조 모듈] ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ admin_user │ │ oauth_relay │ │download_log │ ││ │ (회원인증) │ │(소셜로그인) │ │(다운로드) │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ │└─────────────────────────────────────────────────────────────────┘6.2 핵심 모듈 상세
섹션 제목: “6.2 핵심 모듈 상세”admin (기반 모듈)
섹션 제목: “admin (기반 모듈)”시스템 전반에 사용되는 공통 기능을 제공합니다.
| 기능 | 설명 |
|---|---|
| JSON:API 확장 | API 응답 형식 커스터마이징, 추가 엔드포인트 |
| 파일 저장소 연동 | AWS S3, Cloudflare R2 연동 |
| 공통 서비스 | 여러 모듈에서 사용하는 유틸리티 함수 |
하위 모듈:
- admin_user: 회원 인증, JWT 토큰 관리, 이메일 인증
- admin_jsonapi_webform_submission: 신청서 제출 API 지원
dcamp_admin (관리 UI)
섹션 제목: “dcamp_admin (관리 UI)”관리자 인터페이스와 사이트 설정을 담당합니다.
| 기능 | 설명 |
|---|---|
| 메인 대시보드 | 관리자 메인 화면 (Svelte 기반 SPA) |
| 사이트 설정 | 메인 페이지, 서브 페이지별 설정 관리 |
| 문의 관리 | 고객 문의 내역 관리 |
왜 별도 UI를 만들었나?
Drupal의 기본 관리 화면은 범용적이지만, dcamp의 특수한 운영 흐름에 맞지 않는 부분이 있었습니다. 자주 사용하는 기능에 빠르게 접근하고, 직관적인 화면을 제공하기 위해 일부 관리 화면을 Svelte로 자체 개발했습니다.
dcamp_event (프로그램/심사)
섹션 제목: “dcamp_event (프로그램/심사)”프로그램 운영과 심사 시스템의 핵심 모듈입니다.
| 기능 | 설명 |
|---|---|
| 프로그램 유형 관리 | 참가 모집형, 심사형 프로그램 지원 |
| 신청 관리 | 신청서와 프로그램 연결, 신청 현황 |
| 심사 시스템 | 심사위원 배정, 점수 입력, 결과 집계 |
| 메일 발송 | 합격/불합격 안내 메일 발송 |
심사 시스템 흐름:
[프로그램 등록] │ ▼[신청서 양식 연결] ───► Webform과 연동 │ ▼[신청 접수 기간] │ ▼[심사위원 배정] ───► 관리자가 심사위원 선택 │ ▼[심사 진행] ───► 심사위원이 점수 입력 │ ▼[결과 집계] ───► 자동 합산, 순위 정렬 │ ▼[결과 발표] ───► 메일 발송dcamp_portfolio (포트폴리오)
섹션 제목: “dcamp_portfolio (포트폴리오)”스타트업, 파트너사 정보를 관리하는 모듈입니다.
| 기능 | 설명 |
|---|---|
| 스타트업 관리 | 회사 정보, 멤버, 투자 정보 관리 |
| 파트너사 관리 | 협력사, 투자사 정보 관리 |
| 캠퍼스 관리 | dcamp 공간 정보 관리 |
| 데이터 내보내기 | 스타트업 목록 JSON/Excel 추출 |
자체 엔티티를 만든 이유:
스타트업 정보는 일반 콘텐츠(글)와 다른 특수한 구조를 가집니다. 멤버 정보, 투자 이력, 연관 프로그램 등 복잡한 관계를 효율적으로 관리하기 위해 별도의 엔티티로 설계했습니다.
6.3 인증/보조 모듈
섹션 제목: “6.3 인증/보조 모듈”admin_user (회원 인증)
섹션 제목: “admin_user (회원 인증)”회원 가입, 로그인, 인증 관련 기능을 담당합니다.
| 기능 | 설명 |
|---|---|
| 회원 가입 | 이메일 인증 기반 가입 |
| JWT 인증 | 토큰 기반 API 인증 |
| 비밀번호 관리 | 재설정, 변경 기능 |
| 계정 분리 | 일반회원/관리자 완전 분리 처리 |
oauth_relay (소셜 로그인)
섹션 제목: “oauth_relay (소셜 로그인)”카카오, 네이버, 구글 소셜 로그인을 처리합니다.
| 기능 | 설명 |
|---|---|
| 카카오 로그인 | 카카오계정 연동 |
| 네이버 로그인 | 네이버 아이디 연동 |
| 구글 로그인 | Google 계정 연동 |
| 계정 연결 | 기존 회원과 소셜 계정 연결 |
동작 방식:
[사용자] [dcamp.kr] [관리 시스템] [소셜서비스] │ │ │ │ │ 카카오 로그인 │ │ │ │ ───────────────► │ │ │ │ │ │ │ │ │ 카카오 인증 요청 │ │ │ │ ────────────────────────────────────► │ │ │ │ │ 카카오 인증 화면 │ │ │ │ ◄────────────────────────────────────────────────────── │ │ │ │ │ │ 인증 완료 │ │ │ │ ───────────────────────────────────────────────────────► │ │ │ │ │ │ 인증 정보 전달 │ │ │ │ ◄──────────────────────────────────── │ │ │ │ │ │ │ 토큰 요청 │ │ │ │ ───────────────► │ │ │ │ │ 회원 확인/생성 │ │ │ 토큰 반환 │ │ │ │ ◄─────────────── │ │ │ 로그인 완료 │ │ │ │ ◄─────────────── │ │ │dcamp_email (이메일)
섹션 제목: “dcamp_email (이메일)”시스템 이메일 발송을 담당합니다.
| 기능 | 설명 |
|---|---|
| 인증 메일 | 회원가입 인증, 비밀번호 재설정 |
| 알림 메일 | 프로그램 신청 확인, 결과 안내 |
| 템플릿 관리 | 메일 양식 관리 |
download_log (다운로드 로깅)
섹션 제목: “download_log (다운로드 로깅)”파일 다운로드 기록을 저장합니다.
| 기능 | 설명 |
|---|---|
| 다운로드 기록 | 누가, 언제, 어떤 파일을 다운로드했는지 기록 |
| 통계 | 다운로드 횟수 집계 |
6.4 모듈 의존성
섹션 제목: “6.4 모듈 의존성” ┌─────────────┐ │ admin │ ◄─── 모든 모듈의 기반 └──────┬──────┘ │ ┌────────────────┼────────────────┐ │ │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ admin_user │ │ dcamp_admin │ │dcamp_email │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ oauth_relay │ │ dcamp_event │ ◄─── dcamp_email 사용 └─────────────┘ └──────┬──────┘ │ ▼ ┌─────────────┐ │ dcamp_ │ │ portfolio │ └─────────────┘