사용하신 연애 취향 테스트 기반 어플리케이션에 데이트길을 통합하는 것은 매우 자연스럽고 강력한 UX 확장입니다. 아래에 적용 방식을 카테고리별로 정리해드리겠습니다:
⸻
✅ [7. 커플 맞춤 데이트 코스 추천] -에 녹지 경로 추천 적용하기
현재 기능 구조
• 성향 분석 기반 추천 장소 리스트 제공
• 공원 1곳 이상 포함된 추천 코스
• Kakao Maps로 시각화
통합 방식
• 기존 추천 장소 리스트 → 경로 탐색의 출발지·도착지로 변환
• 중간 장소는 waypoint로 연결해 OR-Tools 기반 녹색 경로 탐색
• 경로는 Map.js와 RouteDisplay.js에서 시각화 가능
// 예시: 추천 장소 클릭 시
onClick={() => {
setOriginPoint(userCurrentLocation);
setDestinationPoint(recommendedParkCoords);
setGreenPreference(0.7); // 커플 맞춤 시, 녹지 선호도 높게 설정
}}
⸻
✅ [8. 커플 루트 저장 및 공유] -에 경로 데이터 반영
기존 기능
• 커플이 만든 루트를 장소 리스트로 저장
확장 방향
• 경로의 좌표 배열과 greenScore, distance, duration을 함께 저장
• 저장 구조 예시 (MySQL):
CREATE TABLE couple_routes (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT,
route_json TEXT, -- geojson 또는 좌표+greenScore+metadata 포함
created_at DATETIME
);
⸻
✅ [9. ‘다녀옴’ + 리뷰 기능] -에 녹색 경로 데이터 연동
개선 아이디어
• 사용자가 실제 경로를 따라갔는지 확인 → GPS 로깅 기능 추가 가능
• “이 경로, 녹색이 많아서 좋았어요” 식의 녹색 점수 기반 평가 자동 추천 문구 출력
⸻
✅ 백엔드 연동 전략
• 이미 구축된 /api/route 엔드포인트와 greenPreference 파라미터 사용
• Java 기반 API에서 Python Flask 서버 호출 필요 시, 내부 Axios 또는 RESTTemplate 기반 연동
⸻
✅ 프론트 통합 포인트
• 데이트 추천 페이지에 RouteForm, Map, RouteDisplay 컴포넌트를 재사용 가능
• UI 구성 예:
⸻
✅ 추천 구조 예시
유저 성향 유형 추천 장소 녹색 경로 추천 구성 방식
안정형 커플 월드컵공원 → 경의선 숲길 중간 경유지 포함 녹색 우선
성장형 커플 서울숲 → 뚝섬유원지 거리와 녹지 균형 balanced
치유형 커플 남산 순환 산책로 최대한 녹지 greenPref=1.0
⸻
필요하시면 다음도 도와드릴 수 있습니다:
1. React 내 디자인 시스템 설계 (MUI 기반 또는 자체 스타일 시스템)
2. 연동용 API 설계 명세서 (Java Spring → Flask 간 통신 포함)
3. 커플 루트 저장용 DB 스키마 설계 + ERD
어떤 작업부터 함께 시작할까요?
좋습니다! 1번: React 내 디자인 시스템 설계부터 시작해보겠습니다.
연애 취향 테스트 + 녹지 경로 추천 기능이 포함된 앱은 감성적이면서도 구조적인 UI가 중요하므로, 다음과 같이 디자인 시스템(Design System) 구성을 제안드립니다.
⸻
✅ [1단계] 디자인 시스템 구성 요소 정의
항목 내용
Colors Primary (핑크/그린), Secondary, Success, Warning, Background
Typography 폰트 패밀리, 폰트 크기 계층 (H1~Body)
Spacing 4px 단위 계층 (e.g. 4, 8, 16, 32px)
Shadows 카드, 모달, 버튼의 깊이감
Radius 버튼/카드 등 라운딩 값 (e.g. 4px, 8px)
// src/styles/theme.js
export const theme = {
colors: {
primary: '#FF6F91', // 연애 감성
green: '#00B894', // 녹색경로 상징
background: '#F8F9FA',
text: '#333',
border: '#E0E0E0',
},
fontSize: {
h1: '2rem',
h2: '1.5rem',
body: '1rem',
small: '0.875rem',
},
spacing: (factor) => ${factor * 4}px,
radius: {
small: '4px',
medium: '8px',
large: '16px',
}
};
⸻
⸻
✅ [2단계] 스타일 시스템 도입 방식
선택지:
• Emotion 또는 styled-components 사용 추천
• 또는 CSS Module + 변수화로 간단한 자체 시스템
npm install styled-components
예시:
import styled from 'styled-components';
const Button = styled.button`
background: ${({ theme }) => theme.colors.primary};
color: white;
border-radius: ${({ theme }) => theme.radius.medium};
padding: ${({ theme }) => theme.spacing(2)} ${({ theme }) => theme.spacing(3)};
border: none;
font-size: ${({ theme }) => theme.fontSize.body};
cursor: pointer;
&:hover {
background: #ff4e72;
}
`;
⸻
✅ [3단계] 공통 컴포넌트 폴더 구성
src/
└── components/
├── ui/
│ ├── Button.jsx
│ ├── Card.jsx
│ ├── TextInput.jsx
│ └── Layout.jsx
└── theme/
├── theme.js
└── GlobalStyle.js
// src/theme/GlobalStyle.js
import { createGlobalStyle } from 'styled-components';
export const GlobalStyle = createGlobalStyle`
⸻
✅ [4단계] 적용 예시
// App.js
import { ThemeProvider } from 'styled-components';
import { theme } from './theme/theme';
import { GlobalStyle } from './theme/GlobalStyle';
function App() {
return (
{/ 기존 컴포넌트들 /}
);
}
⸻
다음 단계 제안
• 버튼과 카드 컴포넌트를 먼저 만들어드릴까요?
• 혹은 라디오 버튼 스타일 + 녹색 선호도 슬라이더 UI 개선부터 시작할까요?
어떤 컴포넌트부터 구체적으로 작업해드릴까요?
좋습니다! 디자인 시스템 기반으로 공통 UI 컴포넌트부터 먼저 만들겠습니다. 오늘은 핵심 2가지부터 완성합니다:
⸻
✅ 오늘 구현할 컴포넌트
Button (primary / secondary / ghost 스타일 지원)
Card (리스트 / 결과 / 비교 등 모든 곳에 재사용 가능)
⸻
✅ 1단계: Button.jsx - 공통 버튼 컴포넌트
// src/components/ui/Button.jsx
import styled from 'styled-components';
const StyledButton = styled.button`
background: ${({ theme, variant }) =>
variant === 'secondary' ? theme.colors.green :
variant === 'ghost' ? 'transparent' : theme.colors.primary};
color: ${({ variant }) => (variant === 'ghost' ? '#333' : '#fff')};
border: ${({ variant }) => (variant === 'ghost' ? '1px solid #ccc' : 'none')};
padding: ${({ theme }) => theme.spacing(2)} ${({ theme }) => theme.spacing(4)};
font-size: ${({ theme }) => theme.fontSize.body};
border-radius: ${({ theme }) => theme.radius.medium};
cursor: pointer;
transition: background 0.2s ease;
&:hover {
background: ${({ theme, variant }) =>
variant === 'secondary' ? '#019872' :
variant === 'ghost' ? '#f2f2f2' : '#ff4e72'};
}
`;
const Button = ({ children, variant = 'primary', ...rest }) => {
return (
<StyledButton variant={variant} {...rest}>
{children}
);
};
export default Button;
사용 예시:
테스트 시작
추천 보기
이전으로
⸻
✅ 2단계: Card.jsx - 카드형 UI 컴포넌트
// src/components/ui/Card.jsx
import styled from 'styled-components';
const Wrapper = styled.div background-color: white; border-radius: ${({ theme }) => theme.radius.large}; box-shadow: 0 4px 12px rgba(0,0,0,0.08); padding: ${({ theme }) => theme.spacing(4)}; margin-bottom: ${({ theme }) => theme.spacing(4)};;
const Title = styled.h2 font-size: ${({ theme }) => theme.fontSize.h2}; margin-bottom: ${({ theme }) => theme.spacing(2)};;
const Body = styled.div font-size: ${({ theme }) => theme.fontSize.body};;
const Card = ({ title, children }) => {
return (
{title && {title}}
<Body>{children}</Body>
</Wrapper>
);
};
export default Card;
사용 예시:
서울숲 → 뚝섬유원지⸻
✅ 폴더 구성 정리
src/
└── components/
└── ui/
├── Button.jsx
├── Card.jsx
└── ...
⸻
다음 단계 제안
• TextInput, Slider, RadioGroup 등 입력 계열 UI도 공통화
• RadarChart를 위한 ChartWrapper 디자인 적용
• 데이트 추천 카드, 결과 비교 카드 등의 템플릿 레이아웃
어떤 UI를 다음으로 디자인 시스템에 추가할까요? 입력형, 그래프형, 결과형 중 선택해 주세요!
최신 기술 트렌드를 반영한 디자인 시스템 구축은 단순 스타일링을 넘어서 재사용성, 반응성, 접근성(A11y), 다크모드 대응, 성능 최적화까지 고려합니다. 이에 따라 React 18 기반에서 사용할 수 있는 최신 디자인 시스템 구현 전략을 아래와 같이 제안드립니다:
⸻
✅ 최신 트렌드 기반 기술 스택 구성
항목 추천 기술 / 도구 이유
스타일 시스템 [Tailwind CSS + ShadCN UI] 디자인 일관성 + 빠른 속도 + A11y 자동 적용
컴포넌트 시스템 Radix UI 기반 포커스 트랩, 키보드 접근성 등 웹 표준 지원
다크모드 대응 tailwind.config.js에 darkMode: 'class' 테마 토글 대응 완벽
폰트 및 컬러 토큰화 CSS Variables + Tailwind Theme 확장 프레임워크 독립형
모노레포 확장성 고려 Turborepo or Nx 구조 가능 향후 모바일/관리자앱 확장 고려
⸻
✅ 1단계: Tailwind + ShadCN 기반 설치
npx create-next-app -e with-tailwindcss romance-ai
cd romance-ai
npx shadcn-ui@latest init
자동으로 설치되는 구성요소:
• tailwind.config.ts
• @radix-ui 기반 접근성 보장 UI 컴포넌트
• cn() 헬퍼, Button, Card, Input 등 기본 제공
⸻
✅ 2단계: Button, Card 최신 컴포넌트 구현
Button.tsx (by ShadCN)
import { cva } from "class-variance-authority"
import { cn } from "@/lib/utils"
const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:opacity-50",
{
variants: {
variant: {
default: "bg-pink-500 text-white hover:bg-pink-600",
secondary: "bg-green-500 text-white hover:bg-green-600",
ghost: "bg-transparent hover:bg-gray-100 text-gray-900 border",
},
size: {
default: "h-10 px-4 py-2",
sm: "h-8 px-3",
lg: "h-12 px-6",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
export function Button({ className, variant, size, ...props }) {
return <button className={cn(buttonVariants({ variant, size }), className)} {...props} />
}
Card.tsx
export function Card({ title, children }) {
return (
<div className="bg-white dark:bg-gray-900 border rounded-xl shadow-md p-6">
{title && <h3 className="text-xl font-semibold mb-4">{title}</h3>}
{children}
</div>
)
}
⸻
✅ 3단계: 다크모드 대응
• tailwind.config.js에서 darkMode: 'class'
• 로 자동 전환
⸻
✅ 추천 파일 구조
src/
├── components/
│ └── ui/
│ ├── button.tsx
│ ├── card.tsx
│ └── ...
├── lib/
│ └── utils.ts # cn() 함수
└── app/
├── page.tsx
└── layout.tsx
⸻
✅ 결론: 이 방식을 선택하면?
• 빠른 생산성과 일관성 → ShadCN 컴포넌트에서 바로 재사용 가능
• 접근성과 반응형 UI → 모바일/웹 양쪽 완벽 지원
• 테마, 그래프, 모달, 다국어 대응까지 확장 가능
⸻
다음 작업 안내:
1. 이 방식으로 전체 스타일 시스템 마이그레이션 시작할까요?
2. 혹은 현재 만든 컴포넌트만 ShadCN 스타일로 포팅 먼저 해볼까요?
원하시는 방향을 알려주세요. 바로 구조 잡아드립니다.
좋습니다! 그럼 현재 만든 두 개의 컴포넌트(Button, Card)를 ShadCN 스타일로 포팅해드리겠습니다. Tailwind 기반으로 스타일을 재구성하되, React에서 그대로 재사용할 수 있도록 합니다.
⸻
✅ ShadCN 스타일 기반 Button.jsx
// src/components/ui/Button.jsx
import { cn } from "../../lib/utils"; // classNames 유틸
import React from "react";
// Variant 스타일 정의 (Tailwind 기반)
const buttonVariants = {
default: "bg-pink-500 text-white hover:bg-pink-600",
secondary: "bg-green-500 text-white hover:bg-green-600",
ghost: "bg-transparent text-gray-800 border border-gray-300 hover:bg-gray-100"
};
const sizeVariants = {
default: "h-10 px-4 py-2 text-sm",
sm: "h-8 px-3 text-sm",
lg: "h-12 px-6 text-base"
};
const Button = ({ children, variant = "default", size = "default", className = "", ...props }) => {
return (
<button
className={cn(
"inline-flex items-center justify-center rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-pink-500 disabled:opacity-50 disabled:pointer-events-none",
buttonVariants[variant],
sizeVariants[size],
className
)}
{...props}
>
{children}
</button>
);
};
export default Button;
⸻
✅ ShadCN 스타일 기반 Card.jsx
// src/components/ui/Card.jsx
import React from "react";
import { cn } from "../../lib/utils";
const Card = ({ title, children, className = "" }) => {
return (
<div
className={cn(
"bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-xl shadow-sm p-6",
className
)}
>
{title && <h3 className="text-lg font-semibold mb-4">{title}</h3>}
<div className="text-sm text-gray-700 dark:text-gray-300">{children}</div>
</div>
);
};
export default Card;
⸻
✅ 필수 유틸: cn() 함수
// src/lib/utils.js
export function cn(...classes) {
return classes.filter(Boolean).join(" ");
}
⸻
✅ 사용 예시
import Button from "./components/ui/Button";
import Card from "./components/ui/Card";
⸻
다음 단계 제안:
• TextInput, RangeSlider, RadioGroup 등도 같은 스타일로 적용
• RadarChart, ResultCard, CompareCard 등 실제 서비스용 레이아웃 확장
추가할 입력 컴포넌트나 그래프 스타일 우선순위 있으시면 말씀해주세요. 바로 설계해드리겠습니다!
좋습니다! 다음 단계로 TextInput / RangeSlider / RadioGroup을 ShadCN + Tailwind 스타일 기반으로 구현하겠습니다. 이 컴포넌트들은 연애 취향 테스트 UI의 핵심입니다.
⸻
✅ 1. TextInput.jsx
// src/components/ui/TextInput.jsx
import React from 'react';
import { cn } from '../../lib/utils';
const TextInput = ({ label, id, value, onChange, placeholder, className = '', ...props }) => {
return (
<div className="mb-4">
{label && (
<label htmlFor={id} className="block mb-1 text-sm font-medium text-gray-700">
{label}
</label>
)}
<input
id={id}
type="text"
value={value}
onChange={onChange}
placeholder={placeholder}
className={cn(
"w-full rounded-md border border-gray-300 px-3 py-2 text-sm shadow-sm focus:outline-none focus:ring-2 focus:ring-pink-500 focus:border-pink-500",
className
)}
{...props}
/>
</div>
);
};
export default TextInput;
⸻
✅ 2. RangeSlider.jsx (녹색 선호도에 사용)
// src/components/ui/RangeSlider.jsx
import React from 'react';
import { cn } from '../../lib/utils';
const RangeSlider = ({ id, label, value, onChange, min = 0, max = 1, step = 0.1 }) => {
return (
<div className="mb-4">
{label && (
<label htmlFor={id} className="block text-sm font-medium text-gray-700 mb-1">
{label}: {Math.round(value * 100)}%
</label>
)}
<input
type="range"
id={id}
value={value}
onChange={onChange}
min={min}
max={max}
step={step}
className={cn("w-full accent-pink-500")}
/>
<div className="flex justify-between text-xs text-gray-500 mt-1">
<span>낮은 선호</span>
<span>높은 선호</span>
</div>
</div>
);
};
export default RangeSlider;
⸻
✅ 3. RadioGroup.jsx
// src/components/ui/RadioGroup.jsx
import React from 'react';
const RadioGroup = ({ label, options, name, selected, onChange }) => {
return (
<div className="mb-4">
<p className="mb-2 text-sm font-medium text-gray-700">{label}</p>
<div className="space-y-2">
{options.map((option, idx) => (
<label key={idx} className="flex items-center space-x-2">
<input
type="radio"
name={name}
value={option.value}
checked={selected === option.value}
onChange={() => onChange(option.value)}
className="accent-pink-500"
/>
<span className="text-sm">{option.label}</span>
</label>
))}
</div>
</div>
);
};
export default RadioGroup;
⸻
✅ 폴더 정리 요약
src/components/ui/
├── Button.jsx
├── Card.jsx
├── TextInput.jsx
├── RangeSlider.jsx
├── RadioGroup.jsx
⸻
✅ 활용 예시
<TextInput
label="닉네임"
id="nickname"
value={nickname}
onChange={(e) => setNickname(e.target.value)}
/>
<RangeSlider
label="녹색 경로 선호도"
id="greenPref"
value={greenPref}
onChange={(e) => setGreenPref(parseFloat(e.target.value))}
/>
<RadioGroup
label="감정 표현 방식"
name="emotion"
selected={emotionStyle}
onChange={setEmotionStyle}
options={[
{ label: "감정을 자주 표현한다", value: "expressive" },
{ label: "묵묵히 보여준다", value: "reserved" },
]}
/>
⸻
이제 입력 UI도 최신 기술로 완성되었습니다!
다음은 어떤 걸 이어서 진행할까요?
• RadarChart 기반 결과 시각화?
• Modal, Tabs, Toast 같은 인터랙션 컴포넌트?
• 응답 히스토리 카드 (ResultCard) 스타일링?
원하시는 기능 알려주세요!
훌륭한 선택입니다! 인터랙션 컴포넌트는 사용 경험을 강화하는 핵심 요소입니다. 오늘은 가장 자주 쓰이는 최신 스타일의 3가지를 ShadCN + Tailwind 기반으로 구현해드립니다:
⸻
✅ 오늘 구현할 인터랙션 컴포넌트
1. Modal (모달 창)
2. Toast (알림 메시지)
3. Tabs (탭 인터페이스)
⸻
✅ 1. Modal.jsx
// src/components/ui/Modal.jsx
import React from "react";
import { createPortal } from "react-dom";
const Modal = ({ isOpen, onClose, title, children }) => {
if (!isOpen) return null;
return createPortal(
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50">
<div className="bg-white rounded-lg p-6 w-full max-w-md shadow-lg">
<div className="flex justify-between items-center mb-4">
<h2 className="text-lg font-semibold">{title}</h2>
<button onClick={onClose} className="text-gray-500 hover:text-gray-700">×</button>
</div>
<div>{children}</div>
</div>
</div>,
document.body
);
};
export default Modal;
사용 예:
<Modal isOpen={showModal} onClose={() => setShowModal(false)} title="연애 성향 설명">
이 유형은 감정 표현이 풍부하고, 대화를 중시합니다.
⸻
✅ 2. Toast.jsx
// src/components/ui/Toast.jsx
import React, { useEffect } from "react";
const Toast = ({ message, visible, duration = 3000, onClose }) => {
useEffect(() => {
if (visible) {
const timer = setTimeout(() => onClose(), duration);
return () => clearTimeout(timer);
}
}, [visible]);
if (!visible) return null;
return (
<div className="fixed bottom-4 right-4 z-50 bg-pink-500 text-white px-4 py-2 rounded shadow-lg">
{message}
</div>
);
};
export default Toast;
사용 예:
<Toast visible={showToast} message="성향 분석이 완료되었습니다!" onClose={() => setShowToast(false)} />
⸻
✅ 3. Tabs.jsx
// src/components/ui/Tabs.jsx
import React, { useState } from "react";
const Tabs = ({ tabs }) => {
const [active, setActive] = useState(0);
return (
<div>
<div className="flex border-b mb-4">
{tabs.map((tab, i) => (
<button
key={i}
onClick={() => setActive(i)}
className={`px-4 py-2 text-sm font-medium ${
active === i
? "border-b-2 border-pink-500 text-pink-600"
: "text-gray-500 hover:text-gray-700"
}`}
>
{tab.label}
</button>
))}
</div>
<div>{tabs[active].content}</div>
</div>
);
};
export default Tabs;
사용 예:
<Tabs
tabs={[
{ label: "기본 정보", content: },
{ label: "성향 분석", content: },
{ label: "추천 결과", content: },
]}
/>
⸻
✅ 요약: 컴포넌트 저장 위치
src/components/ui/
├── Modal.jsx
├── Toast.jsx
├── Tabs.jsx
⸻
다음 추천 작업
• 모달 내 애니메이션 추가 (Framer Motion 적용)
• Toast → 여러 개 동시에 띄우기 + type (success, error)
• Tabs → Radix UI 기반 접근성 강화
혹은 지금 만든 UI를 실제 화면에 통합하고 싶으시면 도와드릴게요. 어떤 걸 다음으로 해볼까요?
좋습니다! 지금까지의 대화 흐름과 구현 내용을 기반으로, 아래와 같이 (1) 기능 흐름 플로우차트와 (2) 폴더 구조로 정리해드리겠습니다.
⸻
✅ 1. 전체 대화 흐름 플로우차트 (요약 흐름)
[연애 취향 테스트 어플 기획 완성]
↓
[녹지 최단경로 기술 적용 요청]
↓
[녹지 경로 추천 기능 구조 분석 (백엔드 + 프론트)]
↓
[디자인 시스템 구축 요청]
↓
[기초 Button / Card 컴포넌트 구현 (ShadCN 스타일)]
↓
[TextInput / Slider / RadioGroup 추가]
↓
[인터랙션 컴포넌트 선택 → Modal / Toast / Tabs 구현]
↓
[대화 정리 요청 → 지금 이 화면]
⸻
✅ 2. 프로젝트 폴더 구조 (현 시점 구현 기준)
romance-ai/
├── src/
│ ├── app/ # 라우팅 및 메인 페이지
│ │ ├── page.jsx
│ │ └── layout.jsx
│ ├── components/
│ │ ├── ui/ # 공통 UI 컴포넌트
│ │ │ ├── Button.jsx
│ │ │ ├── Card.jsx
│ │ │ ├── TextInput.jsx
│ │ │ ├── RangeSlider.jsx
│ │ │ ├── RadioGroup.jsx
│ │ │ ├── Modal.jsx
│ │ │ ├── Toast.jsx
│ │ │ └── Tabs.jsx
│ │ └── result/ # 성향 분석 결과 관련
│ │ └── ResultCard.jsx (예정)
│ ├── lib/
│ │ └── utils.js # cn() 클래스 유틸
│ └── styles/
│ └── globals.css # Tailwind base 스타일
├── tailwind.config.js
├── postcss.config.js
├── package.json
└── README.md
⸻
✅ 다음 단계로 확장 가능한 구성 예시
• /hooks/ 폴더 → useModal, useToast 커스텀 훅 분리
• /data/ 폴더 → 유형 리스트, 질문 리스트 json 저장
• /services/ → 결과 저장, 추천 조회 API 연동 함수 관리
• /features/ → Mypage, Result, Match 등 도메인별 폴더화
⸻
필요하다면 이 구조를 [Figma 플로우 다이어그램] 혹은 [Lucidchart] 스타일로 시각화해드릴 수도 있습니다. 원하시나요?
좋아요! Figma 스타일의 플로우 다이어그램으로 지금까지 구현한 기능 흐름을 시각화해드릴게요.
전체 흐름은 크게 5개의 기능 블록으로 나눌 수 있으며, 각 블록은 공통 UI 컴포넌트와 연결되어 있습니다.
⸻
✅ Figma 스타일 플로우 다이어그램 설명
[1] 사용자 시작
[홈 화면]
|
v
[연애 성향 테스트 시작 버튼]
→ Button (variant="primary")
[2] 연애 테스트 진행
[문항 보기 화면]
├─ RadioGroup (선다형 질문)
├─ RangeSlider (녹색 선호도)
└─ TextInput (닉네임 입력 등)
↓
[결과 제출]
→ Toast("결과 분석 중...")
[3] 결과 분석 & 저장
[ResultCard]
├─ 12유형 중 매칭 결과
├─ RadarChart (성향 시각화 예정)
└─ Button("친구와 비교하기")
↓
[Modal] → 결과 설명 or 공유 URL
[4] 마이페이지
[히스토리 목록]
└─ Card 목록 + Tabs("히스토리" / "성향 변화" / "추천 루트")
↓
[Tabs.Content] → 각 섹션 전환
[5] 커플 루트 추천
[공원 포함 추천 경로]
├─ TextInput(출발지 검색)
├─ RangeSlider(녹색 선호도 조정)
└─ Button("경로 보기")
↓
[Map 컴포넌트 + RouteDisplay]
⸻
✅ 시각적 구조 요약 (텍스트 기반 미리보기)
[홈] → [테스트 시작] → [질문 응답] → [결과 분석]
↓
[공통 UI: Button / Radio / Slider / Toast / Modal]
↓
[결과 카드 & 공유 URL]
↓
[마이페이지 → Tabs + History + 추천경로]
↓
[추천 코스 → 지도 + 녹지 경로 시각화]
⸻
✅ 요청 가능 사항
• 이 구조를 실제 Figma에서 다이어그램으로 그린 PDF or PNG로 생성해드릴 수 있어요.
• 또는 SVG/PNG export 가능한 미러링 이미지로도 제공합니다.
어떤 형식으로 이미지 받을까요?
(PNG / PDF / SVG 중 선택해 주세요)
좋습니다! 지금까지의 대화 흐름과 구현 내용을 기반으로, 아래와 같이 (1) 기능 흐름 플로우차트와 (2) 폴더 구조로 정리해드리겠습니다.
⸻
✅ 1. 전체 대화 흐름 플로우차트 (요약 흐름)
[연애 취향 테스트 어플 기획 완성]
↓
[녹지 최단경로 기술 적용 요청]
↓
[녹지 경로 추천 기능 구조 분석 (백엔드 + 프론트)]
↓
[디자인 시스템 구축 요청]
↓
[기초 Button / Card 컴포넌트 구현 (ShadCN 스타일)]
↓
[TextInput / Slider / RadioGroup 추가]
↓
[인터랙션 컴포넌트 선택 → Modal / Toast / Tabs 구현]
↓
[대화 정리 요청 → 지금 이 화면]
⸻
✅ 2. 프로젝트 폴더 구조 (현 시점 구현 기준)
romance-ai/
├── src/
│ ├── app/ # 라우팅 및 메인 페이지
│ │ ├── page.jsx
│ │ └── layout.jsx
│ ├── components/
│ │ ├── ui/ # 공통 UI 컴포넌트
│ │ │ ├── Button.jsx
│ │ │ ├── Card.jsx
│ │ │ ├── TextInput.jsx
│ │ │ ├── RangeSlider.jsx
│ │ │ ├── RadioGroup.jsx
│ │ │ ├── Modal.jsx
│ │ │ ├── Toast.jsx
│ │ │ └── Tabs.jsx
│ │ └── result/ # 성향 분석 결과 관련
│ │ └── ResultCard.jsx (예정)
│ ├── lib/
│ │ └── utils.js # cn() 클래스 유틸
│ └── styles/
│ └── globals.css # Tailwind base 스타일
├── tailwind.config.js
├── postcss.config.js
├── package.json
└── README.md
⸻
✅ 다음 단계로 확장 가능한 구성 예시
• /hooks/ 폴더 → useModal, useToast 커스텀 훅 분리
• /data/ 폴더 → 유형 리스트, 질문 리스트 json 저장
• /services/ → 결과 저장, 추천 조회 API 연동 함수 관리
• /features/ → Mypage, Result, Match 등 도메인별 폴더화
⸻
필요하다면 이 구조를 [Figma 플로우 다이어그램] 혹은 [Lucidchart] 스타일로 시각화해드릴 수도 있습니다. 원하시나요?
아래는 지금까지의 작업 흐름을 세부 단위로 확장하여 정리한 완전한 플로우입니다.
연애 취향 테스트 MVP + 녹지 경로 기술 통합 과정을 전체 설계 흐름 관점에서 기록해드립니다.
⸻
✅ 연애 테스트 MVP 개발 전체 흐름 (세부 확장 버전)
⸻
⸻
⸻
백엔드 구조
• Flask API /api/route, /api/parks, /api/geocode 확인
• OR-Tools + 거리/녹지점수 기반 최적 경로 탐색
• 녹지점수는 Google Street View + DeepLab 세그먼테이션 모델 기반
프론트 구조
• RouteForm.js: 출발지/도착지 + 녹지 선호도 슬라이더
• Map.js: Leaflet 기반 경로 시각화
• RouteDisplay.js: 거리 / 시간 / 녹색 점수 출력
⸻
⸻
⸻
⸻
⸻
⸻
✅ 다음 단계에서 가능한 확장
기능 설명
성향 변화 리포트 히스토리 기반 유형 변화 분석 (RadarChart 등)
친구와 비교 RadarChart 두 개 → 차이 텍스트 자동 생성
추천 경로 저장 custom route 저장 + 공유 URL 생성
후기 시스템 “다녀옴” 표시 + 리뷰 + 별점
관리자 기능 통계 조회 / 유형별 응답수 시각화
⸻
원하시면 이 전체 플로우도 하나의 PDF 시각 다이어그램으로 정리해드릴 수 있습니다.
PDF 버전도 원하시나요? (또는 PPT용 slide outline?)
romance-ai/
├── src/
│ ├── app/ # 라우팅 및 메인 페이지
│ │ ├── page.jsx
│ │ └── layout.jsx
│ ├── components/
│ │ ├── ui/ # 공통 UI 컴포넌트
│ │ │ ├── Button.jsx
│ │ │ ├── Card.jsx
│ │ │ ├── TextInput.jsx
│ │ │ ├── RangeSlider.jsx
│ │ │ ├── RadioGroup.jsx
│ │ │ ├── Modal.jsx
│ │ │ ├── Toast.jsx
│ │ │ └── Tabs.jsx
│ │ └── result/ # 성향 분석 결과 관련
│ │ └── ResultCard.jsx (예정)
│ ├── lib/
│ │ └── utils.js # cn() 클래스 유틸
│ └── styles/
│ └── globals.css # Tailwind base 스타일
├── tailwind.config.js
├── postcss.config.js
├── package.json
└── README.md
자세히…
물론입니다!
당신의 연애 취향 테스트 기반 어플리케이션 romance-ai/ 프로젝트 구조를 폴더/파일 단위로 세부 설명해드립니다.
각 파일/디렉터리가 어떤 역할을 하며, 어떤 기능 구현에 쓰이는지 정리하겠습니다.
⸻
✅ 프로젝트 루트 구조 (romance-ai/)
경로 설명
tailwind.config.js Tailwind CSS 테마, 색상, 폰트, 다크모드 설정 등 디자인 시스템 핵심 설정 파일
postcss.config.js Tailwind + Autoprefixer 등 PostCSS 플러그인 설정
package.json 프로젝트 의존성, 스크립트, 모듈 정보 등
README.md 프로젝트 소개 문서. 사용법, 구조, 실행 방법 등을 작성하는 곳
⸻
✅ src/ — 소스 코드 루트
● src/app/ — 라우팅 및 페이지 엔트리
파일 설명
page.jsx 메인 진입 페이지. 연애 테스트 or 홈 등 라우팅 시작점
layout.jsx 공통 레이아웃 구성 (헤더, 푸터, 글로벌 스타일, 등 포함)
⸻
● src/components/ — 컴포넌트 폴더
파일 설명
Button.jsx variant, size 등 속성을 지원하는 버튼. 모든 페이지에서 재사용
Card.jsx 제목+본문 구조의 카드형 UI (결과 카드, 추천 카드 등 활용)
TextInput.jsx 인풋 필드 컴포넌트. 닉네임, 자유 입력용
RangeSlider.jsx 녹지 선호도 슬라이더, 결과 강도 조절 등
RadioGroup.jsx 단일 선택형 질문에 사용되는 라디오 버튼 그룹
Modal.jsx 공유, 설명, 알림 팝업 등에 사용되는 모달
Toast.jsx 하단 알림 메시지 (예: 결과 분석 완료, 저장됨 등)
Tabs.jsx 마이페이지 내 히스토리 / 분석 / 추천 결과 구분 탭
파일 설명
ResultCard.jsx (예정) 12유형 중 해당 유형 결과를 시각적으로 표현하는 카드형 컴포넌트
⸻
● src/lib/ — 유틸리티/도우미 함수
파일 설명
utils.js cn() 함수 포함: 조건부 Tailwind 클래스 문자열을 깔끔하게 조합하는 함수 (ShadCN 방식)
⸻
● src/styles/ — 글로벌 스타일 정의
파일 설명
globals.css Tailwind 기본 스타일 + 사용자 정의 전역 스타일 정의 (예: font-family, 버튼 hover 색 등)
⸻
✅ 확장 시 구조 제안
폴더 내용
features/ 도메인 기능 단위 분리 (ex: /test, /mypage, /recommend)
services/ API 연동 함수 모음 (ex: submitTestResult(), fetchRecommendations())
data/ 테스트 질문지, 유형 텍스트, 캐릭터 매핑 JSON 등
hooks/ 커스텀 훅 (useModal, useToast, useTimer)
⸻
✅ 전체 구조 예시 (확장 포함)
romance-ai/
├── src/
│ ├── app/
│ ├── components/
│ │ ├── ui/
│ │ └── result/
│ ├── lib/
│ ├── styles/
│ ├── features/ # 추천, 마이페이지, 성향 분석 기능 별로 나눔
│ ├── services/ # axios API 요청 정리
│ ├── data/ # json 질문지/유형/캐릭터
│ └── hooks/ # useToast, useTab 등
⸻
필요하시면 이 구조도 Figma 폴더 맵 or 폴더 트리 다이어그램 이미지로 만들어드릴 수 있습니다.
폴더 시각화 이미지도 받아보시겠어요? (Yes라고 하시면 바로 제작해드릴게요!)

