Initial project setup with env template and gitignore

- .gitignore: Java/Maven, Node.js, IDE, OS, credentials
- .env.sample: backend + frontend environment variable template
- README.md: project overview and getting started guide
- CLAUDE.md: development rules and guidelines
- docs/: SUNDOL spec and design patterns guide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-30 06:37:07 +00:00
commit 5d8b0fcdb8
6 changed files with 1447 additions and 0 deletions

55
.env.sample Normal file
View File

@@ -0,0 +1,55 @@
# ============================================
# SUNDOL Environment Variables
# Copy this file to .env and fill in values
# cp .env.sample .env
# ============================================
# ---------------------
# Database (Oracle 23ai)
# ---------------------
DB_HOST=localhost
DB_SERVICE=FREEPDB1
DB_USER=sundol
DB_PASSWORD=
# ---------------------
# JWT
# ---------------------
JWT_SECRET=
# ---------------------
# Google OAuth
# ---------------------
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# ---------------------
# OCI GenAI
# ---------------------
OCI_COMPARTMENT_ID=
OCI_REGION=us-chicago-1
# ---------------------
# YouTube (optional)
# ---------------------
YOUTUBE_API_KEY=
# ---------------------
# Redis
# ---------------------
REDIS_HOST=localhost
REDIS_PORT=6379
# ---------------------
# Frontend (Next.js)
# ---------------------
NEXT_PUBLIC_API_URL=http://localhost:8080
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=
API_URL=http://localhost:8080
# ---------------------
# Gitea
# ---------------------
GITEA_USER=joungmin
GITEA_PASSWORD=

69
.gitignore vendored Normal file
View File

@@ -0,0 +1,69 @@
# ========================
# Environment / Secrets
# ========================
.env
.env.local
.env.production
.env.*.local
# ========================
# Java / Maven (Backend)
# ========================
target/
*.class
*.jar
*.war
*.ear
*.log
hs_err_pid*
# Maven wrapper
.mvn/wrapper/maven-wrapper.jar
# ========================
# Node.js (Frontend)
# ========================
node_modules/
.next/
out/
build/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# ========================
# IDE
# ========================
.idea/
*.iml
*.iws
.vscode/
*.swp
*.swo
*~
# ========================
# OS
# ========================
.DS_Store
Thumbs.db
# ========================
# OCI / Cloud credentials
# ========================
.oci/
Wallet_*/
*.pem
*.key
# ========================
# Docker
# ========================
oracle_data/
# ========================
# Claude Code
# ========================
.claude/

70
CLAUDE.md Normal file
View File

@@ -0,0 +1,70 @@
# 작업 규칙 (절대 규칙)
- 코드를 수정하기 전에 반드시 계획을 사용자에게 설명하고 컨펌을 받은 후 진행할 것. 컨펌 없이 코드를 절대 건드리지 말 것.
- 사용자가 질문하면 질문에만 답할 것. 답변 후 임의로 코드를 수정하지 말 것.
- 문제를 발견해도 직접 고치지 말고 보고만 할 것.
- 전략 로직(매수/매도 조건, LLM 프롬프트, 계층 구조)은 절대 자의적으로 변경 금지.
- 존댓말 사용.
- null 처리, exception 처리 시 무시/빈값 처리 하지 않도록 한다. (ignored, 빈 리스트 반환 등 금지)
- 변경이 단순하더라도 절차를 생략하지 말 것. "단순하니까 괜찮겠지"라는 임의 판단 금지.
# 배포 전 필수 절차 (순서대로)
1. 컴파일 확인
2. PMD 정적 분석 실행
3. 변경된 코드 전체를 다시 읽고 로직 리뷰 (재시도 시 데이터 중복 적재, null 참조, 카운터/리스트 누적 등 세는 로직 문제 확인)
4. 점검 결과를 사용자에게 보고하고 승인받은 후 배포 진행
# 빌드/배포
- 빌드: `cd backend && export JAVA_HOME=/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home && set -a && source ../.env && set +a && mvn package -q -DskipTests`
- 컴파일만: `cd backend && export JAVA_HOME=/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home && set -a && source ../.env && set +a && mvn compile`
- 배포 시 반드시 `git push origin main` 포함
# DB 접속 (Oracle Autonomous DB - SQLcl)
- 환경변수 파일: `/Users/joungminko/devkit/account_manager/.env`
- SQLcl 실행:
```bash
export JAVA_HOME=/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home
export TNS_ADMIN=/Users/joungminko/devkit/db_conn/Wallet_WKW7PT1B3PIK6DTI
/opt/homebrew/Caskroom/sqlcl/25.4.2.044.1837/sqlcl/bin/sql admin/Dhfkzmf#12345@wkw7pt1b3pik6dti_medium
```
- DDL 변경이 필요하면 SQLcl로 직접 ALTER TABLE 실행할 것
# 코드 설계 원칙
- 최대한 모듈화하여 재활용 가능하도록 설계할 것
- 아래 디자인 패턴 가이드를 참조하여 적절한 패턴을 적용할 것
- 과도한 패턴 사용은 지양하고, 문제 복잡도에 맞는 수준으로 적용할 것
# 소프트웨어 디자인 패턴 참조 가이드
디자인 패턴은 개발자들이 직면하는 반복적인 문제들을 해결하기 위한 검증된 방법론입니다.
## 1. 생성 패턴 (Creational Patterns)
- **싱글톤 (Singleton)**: 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장 (전역 설정, 로깅, 캐시 관리)
- **팩토리 (Factory)**: 객체 생성 로직을 캡슐화하여 클라이언트에서 직접 생성하지 않도록 함 (조건부 객체 생성)
- **빌더 (Builder)**: 복잡한 객체를 단계별로 구성하여 생성 (매개변수가 많거나 선택적일 때)
- **프로토타입 (Prototype)**: 기존 객체를 복제하여 기능 확장
## 2. 구조 패턴 (Structural Patterns)
- **퍼사드 (Facade)**: 복잡한 내부 시스템을 단순한 인터페이스로 감싸기 (API 래퍼, 복잡한 라이브러리 단순화)
- **어댑터 (Adapter)**: 서로 호환되지 않는 인터페이스를 연결
- **프록시 (Proxy)**: 실제 객체 대신 대리인 객체를 사용하여 접근 제어나 부가 기능 수행 (지연 로딩, 캐싱)
## 3. 행위 패턴 (Behavioral Patterns)
- **옵저버 (Observer/Pub-Sub)**: 한 객체의 상태 변화를 여러 구독자들에게 알림 (이벤트 기반 시스템)
- **이터레이터 (Iterator)**: 컬렉션의 내부 구조를 노출하지 않고 요소들을 순회
- **전략 (Strategy)**: 알고리즘을 외부에서 주입받아 사용하여 동작을 확장 (Open-Closed 원칙 준수)
- **메디에이터 (Mediator)**: 객체들이 직접 통신하지 않고 중재자를 거쳐 복잡한 관계 단순화
- **스테이트 (State)**: 객체의 내부 상태에 따라 행동이 달라지게 함 (복잡한 조건문을 클래스로 대체)
## 패턴 적용 주의사항
- 단순한 문제에 복잡한 패턴 적용 지양
- 일부 패턴은 성능 오버헤드 발생 가능하므로 성능 고려
- 팀원들이 이해할 수 있는 수준의 패턴 선택

59
README.md Normal file
View File

@@ -0,0 +1,59 @@
# SUNDOL
**Smart Unified Natural Dog-Operated Layer**
Personal Knowledge House · AI Assistant · Productivity Hub
## Features
- **Knowledge Ingestion** — YouTube, blog, news, raw text 자동 수집 및 처리
- **Semantic Search** — Oracle 23ai VECTOR 기반 의미 검색
- **AI Chat (RAG)** — 지식 기반 대화, 출처 인용
- **Study Cards (SRS)** — SM-2 간격 반복 학습 카드
- **Todos** — 작업/하위작업 관리
- **Habit Tracker** — 습관 추적, 스트릭 관리
## Tech Stack
| Layer | Technology |
|-------|-----------|
| Backend | Spring Boot 3, Java 21 |
| Frontend | Next.js 14, TypeScript, Tailwind CSS |
| Database | Oracle 23ai (VECTOR support) |
| AI | OCI Generative AI (Cohere / Llama) |
| Auth | Google SSO + JWT |
| Cache | Redis |
## Getting Started
```bash
# 1. 환경변수 설정
cp .env.sample .env
# .env 파일에 실제 값 입력
# 2. Docker Compose로 실행
docker-compose up -d
# 3. 개별 실행 (Backend)
cd sundol-backend
mvn spring-boot:run
# 4. 개별 실행 (Frontend)
cd sundol-frontend
npm install && npm run dev
```
## Project Structure
```
sundol/
├── sundol-backend/ # Spring Boot 3
├── sundol-frontend/ # Next.js 14
├── db/migration/ # Flyway SQL scripts
├── docs/ # Specifications
├── docker-compose.yml
├── .env.sample # Environment variable template
└── README.md
```
자세한 스펙은 [docs/SUNDOL_SPEC.md](docs/SUNDOL_SPEC.md) 참조.

View File

@@ -0,0 +1,104 @@
# 소프트웨어 디자인 패턴 참조 가이드
디자인 패턴은 개발자들이 직면하는 반복적인 문제들을 해결하기 위한 검증된 방법론입니다.
## 1. 생성 패턴 (Creational Patterns)
객체 생성 방식과 관련된 패턴들
### 싱글톤 (Singleton)
- **목적**: 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장
- **사용 예**: 앱 전체의 설정 데이터, 전역 상태 관리, 공유 자원 접근
- **특징**: 애플리케이션 전체에서 단일 인스턴스 보장
### 팩토리 (Factory)
- **목적**: 객체 생성 로직을 캡슐화하여 클라이언트에서 직접 생성하지 않도록 함
- **사용 예**: 플랫폼에 따라 다른 버튼 객체 생성, 버거 주문 시스템
- **특징**: new 키워드 대신 함수나 메서드를 통한 객체 생성
### 빌더 (Builder)
- **목적**: 복잡한 객체를 단계별로 구성하여 생성
- **사용 예**: 많은 파라미터가 필한 객체 생성
- **특징**: 메서드 체이닝을 통한 단계별 구성 후 build() 메서드로 완성
### 프로토타입 (Prototype)
- **목적**: 클래스 상속 대신 기존 객체를 복제하여 기능 확장
- **사용 예**: 자바스크립트의 프로토타입 상속
- **특징**: 객체 복제(Clone)를 통한 기능 확장
## 2. 구조 패턴 (Structural Patterns)
객체 간의 관계와 조합에 관련된 패턴들
### 퍼사드 (Facade)
- **목적**: 복잡한 내부 시스템을 단순한 인터페이스로 감싸기
- **사용 예**: API 래퍼 클래스, 복잡한 라이브러리의 간단한 인터페이스
- **특징**: 복잡한 세부사항을 숨기고 상위 수준의 인터페이스 제공
### 어댑터 (Adapter)
- **목적**: 서로 호환되지 않는 인터페이스를 연결
- **사용 예**: 마이크로 USB를 USB 포트에 연결하는 어댑터
- **특징**: 기존 클래스를 수정하지 않고 다른 인터페이스와 호환
### 프록시 (Proxy)
- **목적**: 실제 객체 대신 대리인 객체를 사용하여 접근 제어나 부가 기능 수행
- **사용 예**: Vue.js의 반응형 시스템, 지연 로딩, 캐싱
- **특징**: 실제 객체에 대한 접근을 제어하거나 추가 기능 제공
## 3. 행위 패턴 (Behavioral Patterns)
객체 간의 통신과 상호작용에 관련된 패턴들
### 옵저버 (Observer/Pub-Sub)
- **목적**: 한 객체의 상태 변화를 여러 구독자들에게 알림
- **사용 예**: Firebase의 실시간 데이터 업데이트, 유튜브 구독 알림 시스템
- **특징**: 1:N 관계의 실시간 알림 시스템
### 이터레이터 (Iterator)
- **목적**: 컬렉션의 내부 구조를 노출하지 않고 요소들을 순회
- **사용 예**: 배열, 연결 리스트, 트리 등의 순회
- **특징**: 복잡한 자료구조 내부를 몰라도 표준화된 방법으로 순회 가능
### 전략 (Strategy)
- **목적**: 알고리즘을 외부에서 주입받아 사용하여 동작을 확장
- **사용 예**: 정렬 알고리즘 선택, 결제 방식 선택
- **특징**: Open-Closed 원칙 준수, 기존 코드 수정 없이 동작 확장
### 메디에이터 (Mediator)
- **목적**: 객체들이 직접 통신하지 않고 중재자를 거쳐 복잡한 관계 단순화
- **사용 예**: Express.js의 미들웨어, 채팅방 시스템
- **특징**: 객체 간 결합도 감소, 중앙 집중식 통신 관리
### 스테이트 (State)
- **목적**: 객체의 내부 상태에 따라 행동이 완전히 달라지게 함
- **사용 예**: 게임 캐릭터 상태, UI 컴포넌트 상태
- **특징**: 복잡한 조건문(if/switch)을 클래스로 대체하여 관리
## 패턴 적용 가이드
### 언제 사용할까?
- **싱글톤**: 전역 설정, 로깅, 캐시 관리
- **팩토리**: 객체 생성이 복잡하거나 조건부일 때
- **빌더**: 생성자 매개변수가 많거나 선택적일 때
- **옵저버**: 이벤트 기반 시스템, 상태 변화 알림
- **전략**: 알고리즘 교체가 필요한 경우
- **퍼사드**: 복잡한 API를 단순화할 때
### 주의사항
- **과도한 패턴 사용 금지**: 단순한 문제에 복잡한 패턴 적용 지양
- **성능 고려**: 일부 패턴은 성능 오버헤드 발생 가능
- **팀 이해도**: 팀원들이 이해할 수 있는 수준의 패턴 선택

1090
docs/SUNDOL_SPEC.md Normal file

File diff suppressed because it is too large Load Diff