Retrip์ ์ฌํ์ ์ข์ํ๋ ์ฌ๋๋ค์ ์ํ ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์ฌํ ์์ฝ SNS์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ์ฌํ ์ฌ์ง ์ ๋ฉํ๋ฐ์ดํฐ์ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ์ฌํ์ ์ ์ฒด์ ์ธ ๋ถ์๊ธฐ์ ์ ๋ณด๋ฅผ ํ๋์ ์ด๋ฏธ์ง๋ก ์์ฝํด์ฃผ๋ ํน๋ณํ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Retrip(Remember Your Trip)์ ์ฌํ์ ์ข์ํ๋ ์ฌ๋๋ค์ ์ํ ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์ฌํ ์์ฝ SNS์ ๋๋ค.
- ์ฌ์ฉ์์ ์ฌํ ์ฌ์ง์ ์ ๋ก๋ํ๋ฉด, ์์น ๋ฐ ์๊ฐ ์ ๋ณด์ ์ด๋ฏธ์ง ๋ถ์์ ํตํด ์ฌํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
- ์ถ์ถ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌํ ์์ฝ๋ณธ์ ์์ฑํ๊ณ , ํ๋์ ์ด๋ฏธ์ง๋ก ์๊ฐํํ์ฌ ์ ๊ณตํฉ๋๋ค.
- ์์ฑ๋ ์์ฝ ์ด๋ฏธ์ง๋ SNS ํผ๋์ฒ๋ผ ๊ณต์ ํ๊ฑฐ๋, ํ์คํ ๋ฆฌ ๊ธฐ๋ฅ์ ํตํด์ ์ถ์ต ์ฌํ์ ๋ ๋ ์ ์์ต๋๋ค.
- Front: HTML, Vue3, Vuetify3
- Back-end: Spring Boot 3.4.5, Java 21, Spring Data JPA, Spring Security
- Database: MySQL, Redis
- AI/ML: OpenAI GPT-4 Vision API
- ์ธํ๋ผ: Docker, Nginx, AWS S3
- ๋ฒ์ ๋ฐ ์ด์๊ด๋ฆฌ: Github, Github Issues, Github Project
- ํ์ ํด: Discord, Notion
- ์๋น์ค ๋ฐฐํฌ ํ๊ฒฝ: AWS EC2, Docker Compose
- Spring Boot 3.4.5 (Java 21) - ์ต์ LTS ๋ฒ์ ์ฌ์ฉ์ผ๋ก ์์ ์ฑ ํ๋ณด
- Spring Web MVC - RESTful API ๊ตฌํ
- Spring Data JPA - ORM์ ํตํ ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ
- Spring Security - OAuth2 ๊ธฐ๋ฐ ์์ ๋ก๊ทธ์ธ (Kakao)
- OpenAI GPT-4 Vision API - ์ด๋ฏธ์ง ๋ถ์ ๋ฐ ์ฌํ ํจํด ์ธ์
- metadata-extractor 2.18.0 - EXIF ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ (GPS, ์๊ฐ ์ ๋ณด)
- TwelveMonkeys ImageIO - HEIF, HEIC ๋ฑ ๋ค์ํ ์ด๋ฏธ์ง ํฌ๋งท ์ง์
- Thumbnailator - ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ๋ฐ ์ต์ ํ
- Spring Actuator - ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ชจ๋ํฐ๋ง
- Prometheus & Micrometer - ๋ฉํธ๋ฆญ ์์ง ๋ฐ ๋ชจ๋ํฐ๋ง
- main: ํ๋ก๋์ ๋ฐฐํฌ ๋ธ๋์น
- dev: ๊ฐ๋ฐ ํตํฉ ๋ธ๋์น
- feature/๊ธฐ๋ฅ๋ช : ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น
- refactor/๋ฆฌํฉํ ๋ง๋ช : ๋ฆฌํฉํ ๋ง ๋ธ๋์น
retrip-api/
โโโ src/main/java/ssafy/retrip/
โ โโโ api/
โ โ โโโ controller/ # REST API ์๋ํฌ์ธํธ
โ โ โ โโโ retrip/
โ โ โ โโโ RetripController.java
โ โ โ โโโ response/ # API ์๋ต DTO
โ โ โโโ service/
โ โ โโโ openai/ # OpenAI GPT ์ฐ๋
โ โ โ โโโ GptImageAnalysisService.java
โ โ โ โโโ OpenAiClient.java
โ โ โ โโโ response/ # GPT ์๋ต ๋ชจ๋ธ
โ โ โโโ retrip/ # ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง
โ โ โโโ RetripService.java
โ โ โโโ ImageConverter.java
โ โ โโโ info/ # ๋๋ฉ์ธ ์ ๋ณด ๊ฐ์ฒด
โ โโโ config/ # ์ค์ ํด๋์ค
โ โ โโโ SecurityConfig.java # Spring Security ์ค์
โ โ โโโ OpenAiConfig.java # OpenAI ํด๋ผ์ด์ธํธ ์ค์
โ โ โโโ RedisConfig.java # Redis ์ค์
โ โ โโโ WebConfig.java # CORS ์ค์
โ โโโ domain/ # JPA ์ํฐํฐ
โ โ โโโ retrip/
โ โ โ โโโ Retrip.java # ์ฌํ ์์ฝ ์ํฐํฐ
โ โ โ โโโ TimeSlot.java # ์๊ฐ๋ Enum
โ โ โ โโโ RetripRepository.java
โ โ โโโ place/
โ โ โโโ RecommendationPlace.java # ์ถ์ฒ ์ฅ์ ์ํฐํฐ
โ โโโ utils/ # ์ ํธ๋ฆฌํฐ ํด๋์ค
โ โโโ ImageMetaDataUtil.java # ์ด๋ฏธ์ง ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ
โ โโโ CoordinateUtil.java # GPS ์ขํ ์ฒ๋ฆฌ
โ โโโ DistanceUtil.java # ๊ฑฐ๋ฆฌ ๊ณ์ฐ
โโโ docker/ # Docker ์ค์
โโโ nginx/ # Nginx ์ค์ (SSL, ๋ฆฌ๋ฒ์ค ํ๋ก์)
โโโ scripts/ # ๋ฐฐํฌ ์คํฌ๋ฆฝํธ
โโโ src/main/resources/
โโโ application.yml # ์ ํ๋ฆฌ์ผ์ด์
์ค์
โโโ analysis.prompt # GPT ๋ถ์ ํ๋กฌํํธ
- AI ๋ชจ๋ธ ์ฐ๋ ๋ฐ ํ๋กฌํํธ ์์ง๋์ด๋ง
- ์ด๋ฏธ์ง ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ ๋ฐ ์ฒ๋ฆฌ
- GPS ๊ธฐ๋ฐ ์์น ๋ถ์ ๋ก์ง ๊ตฌํ
- Docker ๋ฐ ์ธํ๋ผ ๊ตฌ์ฑ
- Spring Boot ๋ฐฑ์๋ ์ํคํ ์ฒ ์ค๊ณ
- RESTful API ๊ฐ๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ๋ฐ JPA ๊ตฌํ
- Spring Security ๋ฐ OAuth2 ์ธ์ฆ ๊ตฌํ
- ์ ์ฒด ๊ฐ๋ฐ ๊ธฐ๊ฐ : 2025-04-28 ~ ing
- ๋ฐฑ์๋ API ๊ฐ๋ฐ : 2025-04-28 ~ 2025-05-10
- AI ๋ชจ๋ธ ์ฐ๋ : 2025-05-11 ~ 2025-05-20
- ์ธํ๋ผ ๊ตฌ์ถ : 2025-05-21 ~ 2025-05-25
- ํ ์คํธ ๋ฐ ์ต์ ํ : 2025-05-26 ~ ing
- Github Projects๋ฅผ ํ์ฉํ ์นธ๋ฐ ๋ณด๋ ์ด์
- ์ฃผ 2ํ ์ ๊ธฐ ๋ฏธํ ์ ํตํ ์งํ์ํฉ ๊ณต์
- Discord๋ฅผ ํตํ ์ค์๊ฐ ์ปค๋ฎค๋์ผ์ด์
- ๋์ฉ๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฆฌ์ฌ์ด์ง
- HEIF/HEIC ๋ฑ ์ต์ ์ด๋ฏธ์ง ํฌ๋งท ์ง์
- ๋ฉํ๋ฐ์ดํฐ ๋ณด์กดํ๋ฉด์ ์ด๋ฏธ์ง ํฌ๊ธฐ ์ต์ ํ
- GPT-4 Vision ํ๋กฌํํธ ์ต์ ํ๋ก ๋ถ์ ์ ํ๋ ํฅ์
- ์ด๋ฏธ์ง ๋ฉํ๋ฐ์ดํฐ์ AI ๋ถ์ ๊ฒฐ๊ณผ์ ๊ต์ฐจ ๊ฒ์ฆ
- ์์น ์ ๋ณด ๊ธฐ๋ฐ ๋ง์ถคํ ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ
- Spring Security๋ฅผ ํตํ ์ธ์ฆ/์ธ๊ฐ ์ฒ๋ฆฌ
- ์ด๋ฏธ์ง ์ ๋ก๋ ์ ์ ์ฑ ํ์ผ ๊ฒ์ฆ
- Rate Limiting์ผ๋ก API ๋จ์ฉ ๋ฐฉ์ง
- Prometheus + Grafana๋ฅผ ํตํ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
- ์ฃผ์ ๋น์ฆ๋์ค ๋ฉํธ๋ฆญ ์ถ์
- ์๋ฌ ๋ก๊น ๋ฐ ์๋ฆผ ์์คํ
- ๋ค์ค ์ด๋ฏธ์ง ์ ๋ก๋ (5~20์ฅ)
- ์ค์๊ฐ ์ ๋ก๋ ์งํ๋ฅ ํ์
- ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ์์ ์กฐ์
- AI ๊ธฐ๋ฐ ์ฌํ ์คํ์ผ ๋ถ์ (MBTI, ์ฌํ ์ฑํฅ)
- ์๊ฐ์ ์ฌํ ์์ฝ ์นด๋ ์์ฑ
- ์์น ๊ธฐ๋ฐ ์ถ์ฒ ์ฅ์ ์ ๊ณต
- ์ฌํ ํต๊ณ (์ด๋ ๊ฑฐ๋ฆฌ, ์ฃผ์ ํ๋ ์๊ฐ๋ ๋ฑ)
- ์์ฑ๋ ์์ฝ ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- ์ฃผ์ SNS ํ๋ซํผ ๊ณต์ ๊ธฐ๋ฅ
- ๊ณ ์ URL์ ํตํ ๊ฒฐ๊ณผ ๊ณต์
- ๋ฌธ์ : ๊ณ ํด์๋ ์ด๋ฏธ์ง ๋ค๋ ์ ๋ก๋ ์ OutOfMemoryError ๋ฐ์
- ํด๊ฒฐ:
- ImageIO ๋์ TwelveMonkeys ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
- ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ์ด๋ฏธ์ง ์ฒ๋ฆฌ
- ์ ์ ํ JVM ํ ๋ฉ๋ชจ๋ฆฌ ์ค์
- ๋ฌธ์ : ํ๋ก ํธ์๋-๋ฐฑ์๋ ๊ฐ CORS ์ ์ฑ ์๋ฐ
- ํด๊ฒฐ:
- WebConfig์์ ๋ช ์์ CORS ์ค์
- ํ๊ฒฝ๋ณ ํ์ฉ Origin ๋ถ๋ฆฌ ๊ด๋ฆฌ
- ๋ฌธ์ : GPT-4 Vision API ์๋ต ์๊ฐ์ด ๊ธธ์ด UX ์ ํ
- ํด๊ฒฐ:
- ์ด๋ฏธ์ง ์ฌ์ ์์ถ์ผ๋ก ์์ฒญ ํฌ๊ธฐ ๊ฐ์
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ ์งํ ์ํ ํ์
- ์๋ต ์บ์ฑ์ผ๋ก ์ฌ์์ฒญ ์ ์ฑ๋ฅ ํฅ์
- ๐ ์ค์๊ฐ ๋ถ์ ์งํ๋ฅ ํ์ (WebSocket)
- ๐ ๋ค๊ตญ์ด ์ง์ ํ๋
- ๐ ๋ ์ ๊ตํ ์ฌํ ํจํด ๋ถ์
- ๐จ ๋ค์ํ ์์ฝ ํ ํ๋ฆฟ ์ ๊ณต
- ๐ฅ ์์ ๊ธฐ๋ฅ ๊ฐํ (ํ๋ก์ฐ, ์ข์์, ๋๊ธ)
- ๐ฑ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ
AI ๊ธฐ์ ์ ์ค์ ์๋น์ค์ ์ ์ฉํ๋ฉด์ ํ๋กฌํํธ ์์ง๋์ด๋ง์ ์ค์์ฑ์ ๊นจ๋ฌ์์ต๋๋ค. ํนํ ์ด๋ฏธ์ง ๋ฉํ๋ฐ์ดํฐ์ AI ๋ถ์์ ๊ฒฐํฉํ์ฌ ๋ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ ๊ณผ์ ์ด ํฅ๋ฏธ๋ก์ ์ต๋๋ค. Docker์ ์ธํ๋ผ ๊ตฌ์ฑ์ ํตํด DevOps ์ญ๋๋ ํฅ์์ํฌ ์ ์์์ต๋๋ค.
Spring Boot์ JPA๋ฅผ ํ์ฉํ ๋ฐฑ์๋ ๊ฐ๋ฐ ๊ฒฝํ์ ์์ ์ ์์๊ณ , ํนํ ๋์ฉ๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ ๊ณผ์ ์์ ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. OAuth2 ์ธ์ฆ๊ณผ ๋ณด์ ์ค์ ์ ๊ตฌํํ๋ฉด์ ์ค๋ฌด์์ ํ์ํ ๋ณด์ ์ง์๋ ์ต๋ํ ์ ์์์ต๋๋ค.
- Java 21+
- MySQL 8.0+
- Redis 7.0+
- Docker & Docker Compose (์ ํ์ฌํญ)
# 1. ํ๋ก์ ํธ ํด๋ก
git clone https://github.com/ReTrip-Dev/ReTrip-api.git
cd ReTrip-api
# 2. application-secret.yml ์ค์
# src/main/resources/application-secret.yml ํ์ผ ์์ฑ ํ ํ์ํ ์ค์ ์ถ๊ฐ
# 3. ์ ํ๋ฆฌ์ผ์ด์
์คํ
./gradlew bootRun# ์ด๋ฏธ์ง ์
๋ก๋ ๋ฐ ๋ถ์
curl -X POST http://localhost:8080/api/images/uploads \
-F "images=@photo1.jpg" \
-F "images=@photo2.jpg" \
-F "images=@photo3.jpg" \
-F "images=@photo4.jpg" \
-F "images=@photo5.jpg"ํ๋ก์ ํธ์ ๋ํ ๋ฌธ์์ฌํญ์ Issues๋ฅผ ํตํด ๋จ๊ฒจ์ฃผ์ธ์.