ν둬ννΈ λ°μ λ°κ²¬νκ³ , 곡μ νλ 곡κ°
Pommyλ μ¬λ―Έμλ AI ν둬ννΈ λ°μ λͺ¨μλ³΄κ³ , λλ§μ λ°μ μ λ‘λν μ μλ μΉ νλ«νΌμ λλ€. λ€μν AI λꡬ(GPT, Gemini, Midjourney, SORA)λ‘ μμ±λ ν둬ννΈ λ°μ 곡μ νκ³ νμν μ μμ΅λλ€.
- νμ
- μ£Όμ κΈ°λ₯
- κΈ°μ μ€ν
- νλ‘μ νΈ κ΅¬μ‘°
- μμνκΈ°
- λ°μ΄ν°λ² μ΄μ€ μ€μ
- λΉλ λ° μ€ν
- μ£Όμ κΈ°λ₯ μ€λͺ
- μ 체 μνμ€ λ€μ΄μ΄κ·Έλ¨
- λΌμ΄μ μ€
Pommy νλ‘μ νΈλ₯Ό μ μν νμλ€μ μκ°ν©λλ€.
| μ΄νΈκ·Ό | μ μ€μ² | λ°μλ―Ό |
|---|---|---|
| @2ghrms | @Shin-Yun-Cheol | @ssumai-kr |
- μ¬μ©μ μΈμ¦: νμκ°μ , λ‘κ·ΈμΈ, λ‘κ·Έμμ κΈ°λ₯
- ν둬ννΈ λ° κ΄λ¦¬:
- ν둬ννΈ λ° μ λ‘λ (μ΄λ―Έμ§, μ λͺ©, μ€λͺ , ν둬ννΈ λ΄μ©)
- ν둬ννΈ λ° μ‘°ν λ° μμΈ λ³΄κΈ°
- ν둬ννΈ λ° μμ λ° μμ
- κ²μ κΈ°λ₯: μ λͺ© λ° μ€λͺ κΈ°λ° κ²μ
- λνΉ μμ€ν : μΈκΈ° ν둬ννΈ λ° λνΉ νμ
- AI νμ λΆλ₯: GPT, Gemini, Midjourney, SORA μ§μ
- ν΄λ¦½λ³΄λ 볡μ¬: ν둬ννΈ λ΄μ©μ ν΄λ¦½λ³΄λλ‘ λ³΅μ¬
- μ΄λ―Έμ§ 미리보기: μ λ‘λ μ μ΄λ―Έμ§ 미리보기 κΈ°λ₯
- Java 21: νλ‘κ·Έλλ° μΈμ΄
- Jakarta Servlet 6.0: μΉ μλ² κΈ°μ
- JSP: λ·° ν νλ¦Ώ
- MyBatis 3.5.11: ORM νλ μμν¬
- MySQL 8.0: λ°μ΄ν°λ² μ΄μ€
- HikariCP 5.0.1: 컀λ₯μ ν
- BCrypt: λΉλ°λ²νΈ ν΄μ±
- SLF4J + Logback: λ‘κΉ
- HTML/CSS/JavaScript: ν΄λΌμ΄μΈνΈ μ¬μ΄λ
- Maven 4.0: λΉλ λ° μμ‘΄μ± κ΄λ¦¬
Web/
βββ src/
β βββ main/
β β βββ java/
β β β βββ com/pommy/
β β β βββ controller/ # 컨νΈλ‘€λ¬ (μμ² μ²λ¦¬)
β β β β βββ AuthController.java
β β β β βββ IndexController.java
β β β β βββ MypageController.java
β β β β βββ PromptMemeController.java
β β β β βββ UploadController.java
β β β β βββ UserController.java
β β β βββ dao/ # λ°μ΄ν° μ κ·Ό κ°μ²΄
β β β β βββ PromptMemeMapper.java
β β β β βββ UserMapper.java
β β β βββ filter/ # νν° (μΈμ¦, μΈμ½λ©)
β β β β βββ AuthenticationFilter.java
β β β β βββ CharacterEncodingFilter.java
β β β βββ model/ # μν°ν° λͺ¨λΈ
β β β β βββ AIType.java
β β β β βββ PromptMeme.java
β β β β βββ User.java
β β β βββ service/ # λΉμ¦λμ€ λ‘μ§
β β β β βββ PromptMemeService.java
β β β β βββ PromptMemeServiceImpl.java
β β β β βββ UserService.java
β β β β βββ UserServiceImpl.java
β β β βββ util/ # μ νΈλ¦¬ν°
β β β βββ MyBatisUtil.java
β β β βββ PasswordUtil.java
β β βββ resources/
β β β βββ db.properties # λ°μ΄ν°λ² μ΄μ€ μ€μ
β β βββ webapp/
β β βββ images/ # μ΄λ―Έμ§ 리μμ€
β β βββ js/ # JavaScript νμΌ
β β β βββ clipboard.js
β β β βββ imagePreview.js
β β β βββ ranking.js
β β β βββ toggleSearch.js
β β βββ WEB-INF/
β β βββ jsp/ # JSP νμ΄μ§
β β β βββ auth/ # μΈμ¦ κ΄λ ¨
β β β βββ error/ # μλ¬ νμ΄μ§
β β β βββ home/ # ν νμ΄μ§
β β β βββ prompt/ # ν둬ννΈ λ° κ΄λ ¨
β β β βββ user/ # μ¬μ©μ κ΄λ ¨
β β βββ jspf/ # JSP Fragment
β β βββ web.xml # μΉ μ€μ
βββ database/
β βββ create_table.sql # λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§
βββ pom.xml # Maven μ€μ
βββ README.md # νλ‘μ νΈ λ¬Έμ
- Java 21 μ΄μ
- Maven 4.0 μ΄μ
- MySQL 8.0 μ΄μ
- Apache Tomcat 10.x μ΄μ (λλ Jakarta EE νΈν μλ²)
- MySQL λ°μ΄ν°λ² μ΄μ€ μμ± λ° ν μ΄λΈ μμ±:
mysql -u root -p < database/create_table.sqlλλ MySQL ν΄λΌμ΄μΈνΈμμ μ§μ μ€ν:
CREATE DATABASE IF NOT EXISTS pommy CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE pommy;
-- database/create_table.sql νμΌμ λ΄μ© μ€ν- λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ€μ :
src/main/resources/db.properties νμΌμ μ½μ
νμ¬ λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ 보λ₯Ό μ€μ νμΈμ:
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/pommy?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
db.username=your_username
db.password=your_password- νλ‘μ νΈ ν΄λ‘ :
git clone <repository-url>
cd Web- Mavenμ μ¬μ©νμ¬ νλ‘μ νΈ λΉλ:
mvn clean package- WAR νμΌ λ°°ν¬:
λΉλλ target/pommy.war νμΌμ Tomcatμ webapps λλ ν 리μ λ°°ν¬νκ±°λ, IDEμμ μ§μ μ€νν©λλ€.
λλ 컨ν
μ΄λ μ΄λ―Έμ§λ₯Ό ν΅ν΄μ λ°°ν¬ν©λλ€.
- μ ν리μΌμ΄μ μ μ:
λΈλΌμ°μ μμ http://localhost:8080/pommy/ μ μ
- νμκ°μ
(
/auth/signup): μλ‘μ΄ μ¬μ©μ κ³μ μμ± - λ‘κ·ΈμΈ (
/auth/login): κΈ°μ‘΄ μ¬μ©μ λ‘κ·ΈμΈ - λ‘κ·Έμμ: μΈμ μ’ λ£
- λΉλ°λ²νΈλ BCryptλ₯Ό μ¬μ©νμ¬ ν΄μ±λμ΄ μ μ₯λ©λλ€.
-
μ λ‘λ (
/prompt/upload):- μ λͺ©, μ€λͺ , ν둬ννΈ λ΄μ© μ λ ₯
- μ΄λ―Έμ§ νμΌ μ λ‘λ (μ΅λ 10MB)
- AI νμ μ ν (GPT, Gemini, Midjourney, SORA)
- SNS λ§ν¬ μΆκ° (μ νμ¬ν)
-
μ‘°ν:
- λ©μΈ νμ΄μ§ (
/prompt/main): μ 체 ν둬ννΈ λ° λͺ©λ‘ - μμΈ νμ΄μ§ (
/prompt/detail): κ°λ³ ν둬ννΈ λ° μμΈ μ 보 - μ‘°νμ μλ μ¦κ°
- λ©μΈ νμ΄μ§ (
-
μμ /μμ : μμ±μλ§ μμ μ ν둬ννΈ λ°μ μμ /μμ ν μ μμ΅λλ€.
- μ λͺ© λ° μ€λͺ κΈ°λ° μ 체 ν μ€νΈ κ²μ
- κ²μ κ²°κ³Ό νμ΄μ§μμ νν°λ§ λ° μ λ ¬ κ°λ₯
- μΈκΈ° ν둬ννΈ λ°μ μ‘°νμ κΈ°μ€μΌλ‘ λνΉ νμ
- μλ μ¬λΌμ΄λ κΈ°λ₯μΌλ‘ μμ 3κ° ν둬ννΈ λ° μν νμ
- ν둬ννΈ λ΄μ©μ ν΄λ¦½λ³΄λλ‘ ν λ²μ 볡μ¬
- λ³΅μ¬ μ±κ³΅ μ μκ°μ νΌλλ°± μ 곡
- μΈμ¦ νν°: 보νΈλ νμ΄μ§ μ κ·Ό μ λ‘κ·ΈμΈ νμΈ
- λΉλ°λ²νΈ ν΄μ±: BCryptλ₯Ό μ¬μ©ν μμ ν λΉλ°λ²νΈ μ μ₯
- μΈμ κ΄λ¦¬: μλ² μΈ‘ μΈμ μ ν΅ν μ¬μ©μ μΈμ¦ μν κ΄λ¦¬
- νμΌ μ λ‘λ μ ν: μ΅λ νμΌ ν¬κΈ° μ ν (10MB)
| κ²½λ‘ | λ©μλ | μ€λͺ |
|---|---|---|
/ |
GET | ν νμ΄μ§ |
/auth/signup |
GET/POST | νμκ°μ |
/auth/login |
GET/POST | λ‘κ·ΈμΈ |
/auth/logout |
POST | λ‘κ·Έμμ |
/prompt/main |
GET | ν둬ννΈ λ° λͺ©λ‘ |
/prompt/detail |
GET | ν둬ννΈ λ° μμΈ |
/prompt/upload |
GET/POST | ν둬ννΈ λ° μ λ‘λ |
/prompt/edit |
GET/POST | ν둬ννΈ λ° μμ |
/prompt/delete |
POST | ν둬ννΈ λ° μμ |
/prompt/search |
GET | ν둬ννΈ λ° κ²μ |
/user/mypage |
GET | λ§μ΄νμ΄μ§ |
/user/edit |
GET/POST | μ¬μ©μ μ 보 μμ |
- μ¬μ©μ μ 보 μ μ₯ (μμ΄λ, λΉλ°λ²νΈ ν΄μ, λλ€μ)
- ν둬ννΈ λ° μ 보 μ μ₯ (μ λͺ©, μ€λͺ , ν둬ννΈ λ΄μ©, μ΄λ―Έμ§ URL, AI νμ , μ‘°νμ λ±)
- μΈμ μ 보 μ μ₯ (μΈμ ID, μ¬μ©μ ID, λ§λ£ μκ°)
Pommy μ ν리μΌμ΄μ μ μ£Όμ κΈ°λ₯λ³ μνμ€ λ€μ΄μ΄κ·Έλ¨μ λλ€. μ¬μ©μ μΈμ¦, ν둬ννΈ λ° μ λ‘λ, μ‘°ν, κ²μ, μμ /μμ λ±μ μ 체 νλ‘μ°λ₯Ό 보μ¬μ€λλ€.
Pommy μ ν리μΌμ΄μ μ μ 체 μμ€ν μν€ν μ²μ λλ€. ν΄λΌμ΄μΈνΈ λ μ΄μ΄λΆν° λ°μ΄ν° λ μ΄μ΄κΉμ§μ ꡬ쑰μ κ° μ»΄ν¬λνΈ κ°μ κ΄κ³λ₯Ό 보μ¬μ€λλ€.
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
Pommy - ν둬ννΈ λ°μ λ°κ²¬νκ³ , 곡μ νλ κ³΅κ° π¨

