Unigenμ μΌλ° μ¬μ©μμ μλμ΄ μ¬μ©μλ₯Ό μν ν΅ν© μμ λ€νΈμν¬ νλ«νΌμ λλ€. νλμ μΈ SNS κ²½νκ³Ό μλμ΄ μΉνμ μΈ μΈν°νμ΄μ€λ₯Ό λͺ¨λ μ 곡ν©λλ€.
- π± Instagram μ€νμΌμ νΌλ λ° νλ‘ν
- πΈ μ΄λ―Έμ§ μ λ‘λ λ° κ³΅μ
- π¬ λκΈ λ° μ’μμ κΈ°λ₯
- π μ€ν 리 κΈ°λ₯
- π₯ 릴μ€(Reels) λΉλμ€ μ½ν μΈ
- π₯ νλ‘μ°/νλ‘μ μμ€ν
- π νμ νμ΄μ§
- π± ν° κΈμ¨μ κ°μνλ UI
- π΄π΅ μλμ΄ μΉνμ μΈ λμμΈ
- π κ°νΈν κ²μλ¬Ό μμ±
- π λ€ν¬/λΌμ΄νΈ λͺ¨λ
- π μΉ΄μΉ΄μ€ μμ λ‘κ·ΈμΈ
- π§ μ΄λ©μΌ μΈμ¦
- π λΉλ°λ²νΈ μ¬μ€μ
- π€ AI κΈ°λ° μ½ν μΈ μμ±
- βοΈ AWS S3 μ΄λ―Έμ§ μ μ₯
- π± λ°μν λμμΈ
unigen/
βββ unigen-back/ # λ°±μλ μλ² (Node.js + Express)
β βββ app.mjs # λ©μΈ μ ν리μΌμ΄μ
νμΌ
β βββ package.json
β βββ src/
β βββ config/ # μ€μ νμΌ
β β βββ db.mjs # λ°μ΄ν°λ² μ΄μ€ μ€μ
β β βββ swagger.mjs # Swagger API λ¬Έμ
β βββ controllers/ # λΉμ¦λμ€ λ‘μ§
β β βββ aiController.mjs
β β βββ authController.mjs
β β βββ commentController.mjs
β β βββ postController.mjs
β β βββ seniorController.mjs
β β βββ storyController.mjs
β β βββ userController.mjs
β βββ middleware/ # λ―Έλ€μ¨μ΄
β β βββ authMiddleware.mjs
β β βββ uploadMiddleware.mjs
β βββ router/ # API λΌμ°νΈ
β β βββ aiRouter.mjs
β β βββ authRouter.mjs
β β βββ commentRouter.mjs
β β βββ postRouter.mjs
β β βββ seniorRouter.mjs
β β βββ storyRouter.mjs
β β βββ userRouter.mjs
β βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β βββ dateUtils.mjs
β βββ kakaoClient.mjs
β βββ s3Client.mjs
β βββ usernameValidator.mjs
β
βββ unigen-front/ # νλ‘ νΈμλ (React + Vite)
βββ index.html
βββ package.json
βββ vite.config.js
βββ src/
βββ App.jsx
βββ main.jsx
βββ assets/ # μ μ 리μμ€
βββ components/ # μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈ
β βββ normal/ # μΌλ° λͺ¨λ μ»΄ν¬λνΈ
β β βββ BottomNav.jsx
β β βββ CameraModal.jsx
β β βββ LeftSidebar.jsx
β β βββ PostDetailModal.jsx
β β βββ RightSidebar.jsx
β βββ senior/ # μλμ΄ λͺ¨λ μ»΄ν¬λνΈ
β βββ BottomNav.jsx
βββ context/ # React Context
β βββ AppContext.jsx
βββ pages/ # νμ΄μ§ μ»΄ν¬λνΈ
β βββ normal/ # μΌλ° μ¬μ©μ νμ΄μ§
β β βββ Home.jsx
β β βββ Explore.jsx
β β βββ Reels.jsx
β β βββ Profile.jsx
β β βββ Upload.jsx
β β βββ ...
β βββ senior/ # μλμ΄ μ¬μ©μ νμ΄μ§
β β βββ SeniorHome.jsx
β β βββ Write.jsx
β β βββ Profile.jsx
β β βββ ...
β βββ onboarding/ # μΈμ¦ κ΄λ ¨ νμ΄μ§
β βββ Welcome.jsx
β βββ NormalLogin.jsx
β βββ SeniorLogin.jsx
β βββ ...
βββ services/ # API ν΅μ λ μ΄μ΄
β βββ comment.js
β βββ post.js
β βββ senior.js
β βββ sms.js
β βββ story.js
β βββ user.js
βββ styles/ # μ€νμΌ κ΄λ ¨
β βββ GlobalStyles.js
βββ utils/ # μ νΈλ¦¬ν° ν¨μ
βββ kakaoAuth.js
βββ timeFormat.js
βββ usernameValidator.js
- λ°νμ: Node.js
- νλ μμν¬: Express.js
- λ°μ΄ν°λ² μ΄μ€: MySQL
- μΈμ¦: JWT, Kakao OAuth
- νμΌ μ μ₯μ: AWS S3
- AI: OpenAI API
- λ¬Έμν: Swagger
- νλ μμν¬: React 18
- λΉλ λꡬ: Vite
- μ€νμΌλ§: styled-components
- λΌμ°ν : React Router
- μν κ΄λ¦¬: React Context API
- μμ΄μ½: Lucide React
- HTTP ν΄λΌμ΄μΈνΈ: Axios
- Node.js (v16 μ΄μ)
- npm λλ yarn
- MySQL λ°μ΄ν°λ² μ΄μ€
- AWS S3 κ³μ (μ΄λ―Έμ§ μ μ₯μ©)
- Kakao Developers κ³μ (μμ λ‘κ·ΈμΈμ©)
- OpenAI API ν€ (AI κΈ°λ₯μ©)
- λ°±μλ λλ ν λ¦¬λ‘ μ΄λ:
cd unigen-back- μμ‘΄μ± μ€μΉ:
npm install- νκ²½ λ³μ μ€μ (
.envνμΌ μμ±):
# λ°μ΄ν°λ² μ΄μ€
DB_HOST=localhost
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=unigen
# JWT
JWT_SECRET=your_jwt_secret
# AWS S3
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
AWS_REGION=your_aws_region
S3_BUCKET_NAME=your_bucket_name
# Kakao OAuth
KAKAO_CLIENT_ID=your_kakao_client_id
KAKAO_REDIRECT_URI=your_kakao_redirect_uri
# OpenAI
OPENAI_API_KEY=your_openai_api_key
# μλ²
PORT=3000- μλ² μ€ν:
npm start- νλ‘ νΈμλ λλ ν λ¦¬λ‘ μ΄λ:
cd unigen-front- μμ‘΄μ± μ€μΉ:
npm install- νκ²½ λ³μ μ€μ (
.envνμΌ μμ±):
VITE_API_URL=http://localhost:3000
VITE_KAKAO_CLIENT_ID=your_kakao_client_id
VITE_KAKAO_REDIRECT_URI=your_kakao_redirect_uri- κ°λ° μλ² μ€ν:
npm run dev- λΉλ:
npm run buildλ°±μλ μλ² μ€ν ν Swagger λ¬Έμ νμΈ:
http://localhost:3000/api-docs
POST /api/auth/register- νμκ°μPOST /api/auth/login- λ‘κ·ΈμΈPOST /api/auth/kakao- μΉ΄μΉ΄μ€ λ‘κ·ΈμΈPOST /api/auth/verify-email- μ΄λ©μΌ μΈμ¦POST /api/auth/forgot-password- λΉλ°λ²νΈ μ¬μ€μ
GET /api/posts- κ²μλ¬Ό λͺ©λ‘ μ‘°νPOST /api/posts- κ²μλ¬Ό μμ±GET /api/posts/:id- κ²μλ¬Ό μμΈ μ‘°νPUT /api/posts/:id- κ²μλ¬Ό μμ DELETE /api/posts/:id- κ²μλ¬Ό μμ POST /api/posts/:id/like- μ’μμDELETE /api/posts/:id/like- μ’μμ μ·¨μ
GET /api/comments/:postId- λκΈ λͺ©λ‘ μ‘°νPOST /api/comments- λκΈ μμ±DELETE /api/comments/:id- λκΈ μμ
GET /api/users/profile- νλ‘ν μ‘°νPUT /api/users/profile- νλ‘ν μμ POST /api/users/follow/:userId- νλ‘μ°DELETE /api/users/follow/:userId- μΈνλ‘μ°
GET /api/senior/posts- μλμ΄ νΌλ μ‘°νPOST /api/senior/posts/:id/like- κ²μλ¬Ό μ’μμGET /api/senior/comments/:postId- λκΈ μ‘°ν
POST /api/ai/generate- AI μ½ν μΈ μμ±
- ν: νλ‘μ μ¬μ©μμ κ²μλ¬Ό νΌλ
- νμ: μΈκΈ° κ²μλ¬Ό λ° μλ‘μ΄ μ¬μ©μ λ°κ²¬
- 릴μ€: μ§§μ λΉλμ€ μ½ν μΈ
- νλ‘ν: κ°μΈ νλ‘ν λ° κ²μλ¬Ό κ΄λ¦¬
- μ λ‘λ: μ κ²μλ¬Ό μμ±
- μΉκ΅¬μμ: ν° κΈμ¨λ‘ 보λ νΌλ
- κΈμ°κΈ°: κ°νΈν κ²μλ¬Ό μμ±
- νλ‘ν: νλ‘ν νμΈ λ° μμ
- λμλ§: κ°μ‘± μ°λ λ° μ¬μ© μλ΄
- JWT κΈ°λ° μΈμ¦
- λΉλ°λ²νΈ ν΄μ±
- CORS μ μ± μ μ©
- XSS λ°©μ§
- SQL Injection λ°©μ§
- νμΌ μ λ‘λ κ²μ¦
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ₯Ό λ°λ¦ λλ€.
νλ‘μ νΈ κ΄λ ¨ λ¬Έμμ¬νμ΄ μμΌμλ©΄ μ΄μλ₯Ό λ±λ‘ν΄ μ£ΌμΈμ.