왜 멀티테넌트 퍼스널 프로필 솔루션이 꼬이는가
대부분 이 구조에서 실패하는 이유는 "SNS를 만들려다가 프로필 카드를 만들어야 했던" 범위 혼선입니다. 멀티테넌트로 가면서 사용자별 커스터마이징, 콘텐츠 관리, 팔로우/소셜 그래프를 동시에 욕심내면 순식간에 복잡도가 폭발합니다.
핵심 원칙은 **"SNS가 아니라 명함+포트폴리오의 살아있는 버전"**으로 범위를 고정하는 것입니다.
레퍼런스 플랫폼 분석
| 플랫폼 | 취할 장점 | 버릴 단점 |
|---|---|---|
| 싸이월드 미니홈피 | 공간 소유감, 방문자 개념 | 무거운 꾸미기, 폐쇄성 |
| 인스타그램 | 비주얼 중심, 링크 공유 | 알고리즘 종속, 피드 노이즈 |
| X (트위터) | 실시간성, 짧은 생각 표현 | 소음 과다, 맥락 없는 타임라인 |
| 링크드인 | 커리어 구조화 | 딱딱함, 허세 문화 |
| Linktree | 단순 링크 허브 | 너무 단순, 개성 없음 |
| 카카오스토리 | 지인 기반 공유 | 폐쇄적, 국내 한정 |
권장 설계 방향
1. 핵심 철학: "살아있는 명함"
SNS처럼 피드를 소비하는 게 아니라, 자신을 정의하는 카드 한 장이 핵심. 방문자는 구독하는 게 아니라 저장하고 공유하는 행동을 함.
2. 데이터 모델 (단순하게)
User
├── handle (고유 슬러그, @webjangee)
├── Profile Card
│ ├── 이름/별명/한 줄 소개
│ ├── 대표 이미지 (1장)
│ ├── 태그 (최대 5개, 자신을 설명하는 키워드)
│ ├── Links[] (SNS, 포트폴리오, 쇼핑몰 등)
│ └── Sections[] (자유 블록)
└── Updates (선택 모듈)
└── 짧은 근황 업데이트 (트위터 감각, 타임라인 X)
3. 멀티테넌트 설계의 함정을 피하는 법
이전 ONE CARD가 꼬인 건 아마 테넌트별 스키마 분리나 권한 체계를 너무 일찍 복잡하게 잡았기 때문일 가능성이 높습니다.
권장 방식은 싱글 스키마 + handle 기반 라우팅입니다:
yourdomain.com/@webjangee ← 공개 카드
yourdomain.com/edit ← 로그인 후 편집
멀티테넌트를 "기업 고객별 분리 운영"으로 잡으면 복잡해지고, **"모든 사용자가 각자의 슬러그를 가진 단일 플랫폼"**으로 잡으면 훨씬 단순해집니다.
4. 차별화 포인트 3가지
① 업데이트 스트림이 아닌 "상태(Status)" 개념
- 피드 타임라인 없음
- 현재 나를 설명하는 상태값만 관리 ("요즘은 Flutter 공부 중", "책 집필 마무리 단계")
- 최신 상태 1~3개만 카드에 노출
② QR + 링크 동시 공유
- 명함 대체재 포지셔닝
- 오프라인 명함에 QR 코드 인쇄 → 바로 카드로 연결
- 이게 Linktree와 가장 큰 차별점
③ 지인 그룹별 카드 레이어 (ONE CARD의 핵심 재활용)
- 공개용 / 지인용 / 비즈니스용 레이어를 하나의 계정에서 관리
- 방문자가 코드/링크로 특정 레이어 접근
- 소셜 그래프 없이 "공유 방식"으로만 관리 → 복잡도 폭발 방지
기술 스택 추천
웹장이 운영 환경 + Flutter 확장을 고려하면:
- 백엔드: PHP (기존 역량) + REST API로 단순하게
- 프론트 웹: HTML/CSS (카드 렌더링은 단순할수록 좋음)
- 모바일: Flutter (편집 앱, QR 생성/스캔)
- DB: MySQL, users + profiles + links + updates 테이블 4개로 시작
- 호스팅: 서브도메인 대신 경로 기반 (
/@handle)으로 단순화
결론적으로
ONE CARD가 꼬인 건 범위 문제였을 가능성이 큽니다. 다시 만든다면:
- 소셜 그래프(팔로우/피드) 제거 → 명함+포트폴리오로 포지셔닝
- 멀티테넌트를 "기업 분리"가 아닌 "사용자별 슬러그"로 단순화
- 레이어 공개 설정으로 지인/비즈니스/공개 분리
- QR 코드 오프라인 연동으로 명함 대체재 포지셔닝

댓글 (3)
myoc.kr 현황 분석
실제로 구현된 것들
현재 페이지를 보면 생각보다 많이 만들어져 있습니다.
프로필 카드 (사진, 약력, 연락처)
vCard 다운로드 (/vcard/download)
전화/문자 링크
게시판 모듈 5종 (소식, 영상, 갤러리, 정보나눔, 방명록)
SNS 링크 연결
로그인/회원가입 (멀티테넌트 시도 흔적)
YouTube 썸네일 자동 임베드
문제로 보이는 부분들
구조적 문제
지금 이 페이지는 "오케이맘 설상옥" 한 사람의 전용 페이지처럼 보입니다. 처음 목표였던 멀티테넌트(여러 사람이 각자의 카드를 갖는 구조)가 실제로 동작하는지 의문입니다. /register가 있긴 한데 신규 가입자가 자기 카드를 갖는 구조가 제대로 됐는지가 관건이죠.
범위 과잉
게시판이 5개(소식, 영상, 갤러리, 정보나눔, 방명록)나 있습니다. "퍼스널 프로필 카드"를 목표로 했는데 사실상 미니 홈페이지 + 블로그가 되어버린 겁니다. 이게 아마 "꼬인" 핵심 원인일 가능성이 높습니다.
UX 포지셔닝 혼선
명함 대체재인가? → vCard 있음 ✓
SNS 대체재인가? → 게시판 있음 ✓
포트폴리오인가? → 약력 있음 ✓
커뮤니티인가? → 방명록 있음 ✓
전부 다 하려다 보니 정체성이 불명확합니다.
실패 원인 진단 (제 추측)
멀티테넌트 권한 분리가 생각보다 복잡해서 → DB 설계가 꼬임
게시판 모듈 추가할수록 각 테넌트별 데이터 격리 문제 발생
커스터마이징 범위를 어디까지 허용할지 기준이 없어서 → 테마/레이아웃 설정이 복잡해짐
재설계한다면
이 코드베이스를 버리고 새로 짠다면, 지금 있는 것 중 살릴 것과 버릴 것을 명확히 해야 합니다.
살릴 것 → 프로필 카드 + vCard + SNS링크 + 영상 임베드
버릴 것 → 게시판 5종 (소식/갤러리/정보나눔/방명록은 전부 제거)
새로 추가 → /@handle 라우팅, 레이어별 공개 설정
지금 PHP 기반으로 만들었다면, 이 방향으로 대폭 축소 리팩토링하는 게 새로 짜는 것보다 빠를 수도 있습니다. 현재 코드 구조가 어떻게 돼 있는지 보여주시면 더 구체적으로 진단해 드릴 수 있어요.
목표 = 여기에 SNS 소셜 레이어를 얹어서 대중성 확보
핵심 질문부터 던져볼게요
SNS 기능을 "대폭 보강"하는 방향이 맞는지 저는 좀 회의적입니다. 이유를 말씀드리면:
인스타/카카오스토리와 경쟁하는 순간 질 수밖에 없습니다.
좋아요, 공유, 팔로우를 넣는 순간 이 서비스는 "기능이 부족한 SNS"가 됩니다. 사람들이 이미 인스타에 있는데 굳이 여기 올 이유가 없어요.
반면 지금 myoc.kr이 가진 포지션인 **"디지털 명함 + 내 링크 허브"**는 인스타도 카카오도 제대로 못 하는 영역입니다.
진짜 문제는 "왜 이 카드를 갖고 싶은가"
지금 구조에서 일반인이 myoc.kr/ssok05를 만들어야 할 동기가 약합니다. 명함 대용이라면:
명함이 없는 사람도 써야 함 → 일반인 포함
받은 사람이 실제로 주소록에 저장해야 함 → vCard UX가 핵심
내 카드를 자랑하고 싶어야 함 → 카드 자체가 예뻐야 함
SNS 기능보다 이 세 가지가 먼저입니다.
그래도 소셜 기능을 넣는다면, 이렇게 범위를 잡아야 합니다
SNS 전체를 복제하는 게 아니라 **"명함 맥락에서 자연스러운 소셜"**만 선택적으로 추가해야 합니다.
넣어야 할 것 넣으면 안 되는 것
─────────────────────────────────────────────────
방문자 카운터 (싸이월드 감성) 팔로우/팔로워 그래프
카드 공유하기 (카카오톡/링크) 알고리즘 피드
방명록 (지인 인사) 댓글 시스템 전체
"저장하기" (내 연락처에 추가) 좋아요 집계 노출
근황 한 줄 업데이트 스토리/릴스 형태
대중성 확보의 진짜 열쇠
SNS 기능이 아니라 "퍼짐"의 메커니즘입니다.
① 카카오톡 공유가 왕
링크 하나를 카톡으로 보냈을 때 미리보기가 예쁘게 뜨는 것(OG 태그)만으로도 확산력이 달라집니다. 지금 myoc.kr이 카톡 공유 시 어떻게 보이는지가 중요합니다.
② 명함 QR의 오프라인 접점
온라인 SNS로 유입시키는 게 아니라 오프라인 명함 → QR → 카드 → vCard 저장 이 흐름이 완성되면 그게 최강의 바이럴입니다. 명함을 받은 사람이 QR 찍고 "오 이게 뭐야?" 하는 순간이 핵심.
③ 카드 꾸미기 욕구
싸이월드가 폭발한 이유는 소셜 기능이 아니라 미니홈피 꾸미기였습니다. 내 카드가 예쁘면 공유하고 싶어집니다. 테마/컬러/레이아웃 선택권을 주는 것만으로 참여 동기가 생깁니다.
현실적인 다음 스텝 제안
지금 myoc.kr을 버리지 말고, 우선순위를 이렇게 잡는 게 낫습니다:
1순위 (지금 당장)
→ 카드 디자인 개선 + 테마 선택 기능
→ 카카오톡 공유 OG 태그 최적화
→ vCard 저장 UX 개선 (버튼 크게, 안내 문구)
2순위 (사용자 생기면)
→ 방문자 수 표시
→ 근황 한 줄 업데이트
→ 카드 간 링크 (이 카드를 만든 사람의 다른 카드들)
3순위 (검증 후)
→ 좋아요 또는 응원 기능 (단순하게)
→ 방명록 고도화
→ 알림 시스템
SNS를 만들려고 하면 또 꼬입니다. 디지털 명함을 완성하는 것이 먼저고, 소셜은 그 위에 얇게 얹는 레이어여야 합니다. 어떻게 생각하세요?
잘 만들어진 것들 (버리지 말 것)
MVC 구조, Router, 멀티테넌트 site_id 기반 단일 스키마 → 분석자료 권장 방식과 일치
site_settings JSON blob → 설정 확장이 자유로움
vCard 다운로드, SNS 아이콘 시스템, YouTube 임베드
템플릿 시스템(modern-gray, violet) → 카드 꾸미기 확장 기반
문제점 (코드 확인으로 확정)
OG 태그가 /profile 경로에만 있음 — 메인 /에는 없어서 카카오톡 공유 시 빈 미리보기
/@handle 라우팅 없음 — 현재 /ssok05/ prefix 방식, 공유 링크가 직관적이지 않음
QR 코드 기능 없음 — 오프라인 명함 → QR → 카드 흐름이 완성 안 됨
근황 Status 없음 — 게시판 5종이 있는데 "현재 나를 설명하는 한 줄"이 없음
방문자 카운터 없음 — 싸이월드 감성 동기 부여 장치 없음
개선 우선순위 (코드 기준)
1순위 — 지금 바로 (각 2~3시간)
① OG 태그를 메인 /에도 적용
app/Controllers/ProfileController.php:27 renderProfile() 메서드에 meta 배열 추가
app/Views/layout.php에 OG 태그 블록 추가
카카오톡 공유 시 사진+이름+한줄소개가 뜨도록
② /@handle 라우팅 추가
index.php:67 routes 배열에 /\@(?P<handle>[a-z0-9_-]+) 패턴 추가
SiteModel::findByHostPath() 에서 handle → site 조회 연결
yourdomain.com/@webjangee 형태로 공유 가능
③ QR 코드 생성
PHP endroid/qr-code 라이브러리 (composer) 또는 Google Chart API 호출
/vcard 또는 contact 섹션에 카드 URL QR 버튼 1개 추가
복잡한 구현 불필요, <img src="https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=URL"> 수준으로 시작 가능
2순위 — 사용자 생기면
④ 근황 Status 필드 추가
site_settings JSON에 status 키 추가 (DB 스키마 변경 불필요)
어드민 설정 화면에 "요즘은... (최대 60자)" 입력 추가
프로필 카드 상단에 노출
⑤ 방문자 카운터
sites 테이블에 visit_count 컬럼 추가 (마이그레이션 파일 1개)
ProfileController::index() 에서 UPDATE sites SET visit_count = visit_count + 1
프로필에 방문 N명 표시
3순위 — 검증 후
⑥ 게시판 간소화
소식/갤러리/방명록/정보나눔 게시판을 admin에서 비활성화 가능하게 (이미 section_enabled 설정이 있어서 UI만 추가하면 됨)
영상 게시판은 YouTube 임베드 = 차별점이므로 유지
가장 ROI 높은 작업
지금 당장 가장 임팩트 큰 것은 ① OG 태그입니다. 카카오톡으로 링크 공유 시 썸네일과 이름이 예쁘게 뜨는 것만으로 전파력이 크게 달라지는데, layout.php를 확인하면 금방 추가할 수 있을 것 같습니다.
댓글 쓰기