π T-log : AI κΈ°λ° λν μ¬ν νλ«νΌ
π μΈλ€μΌμ ν΄λ¦νλ©΄ YouTubeμμ μμ²νμ€ μ μμ΅λλ€.
T-logλ MBTI λ° μ±ν₯ λΆμ κΈ°λ°μΌλ‘ AIλ₯Ό νμ©ν΄ μ΅μ μ μ¬ν λνμ λ§€μΉνκ³ , μ¬ν μΌμ κ³Ό νκΈ°λ₯Ό 곡μ ν μ μλ νλ«νΌμ
λλ€.
μ΄λ¦
μν
μκ·λ¦¬
-
λ°°νΈλΉ
-
π‘ μ£Όμ κΈ°λ₯ (Key Factors)
κΈ°λ₯
μ€λͺ
π MBTI & νκ·Έ κΈ°λ° λν μΆμ²
μ¬μ©μμ MBTI λ° μ¬ν νκ·Έ κΈ°λ°μΌλ‘ ChatGPTκ° μ΄μΈλ¦¬λ λν μΌμ μλ μΆμ²
π νκΈ° μλ μμ½
μ¬ν ν μμ±λ νκΈ°λ₯Ό AIκ° μλ μμ½
π§Ύ μ±ν₯ ν
μ€νΈ κΈ°λ₯
κ°λ¨ν ν
μ€νΈλ‘ λ³ΈμΈμ μ¬ν MBTI μ±ν₯ λ° μΆμ² μ¬ν μ€νμΌ μ 곡
π‘οΈ μ κ³ μμ€ν
μ¬μ©μ μμ μ μν κΈ°λ₯ μ 곡 λ° κ΄λ¦¬μ κΆν κΈ°λ₯ ꡬν
βοΈ μ§λ¬Έ κ²μν & κ΄λ¦¬μ λ΅λ³
μ¬μ©μ μ§λ¬Έ λ±λ‘ λ° κ΄λ¦¬μ μ μ© λ΅λ³ κΈ°λ₯
π
μΌμ 곡μ λ° λ³΅μ¬ κΈ°λ₯
곡μ λ μΌμ μ 볡μ¬νμ¬ κ°μΈ μΌμ μΌλ‘ νμ© κ°λ₯
ꡬλΆ
λ΄μ©
π€ AI λν μΆμ²
Spring AI + ChatGPTλ₯Ό μ΄μ©ν΄ μ¬μ©μ μ±ν₯ κΈ°λ° λν ꡬμΈκΈ μΆμ²
βοΈ νκΈ° λΆμ
μ¬μ©μ νκΈ° μλ μμ½
ꡬλΆ
μ¬μ© κΈ°μ / λꡬ
μ€λͺ
π§© λ°±μλ
Spring Boot, Spring Security, Spring AI, MyBatis
API μλ², 보μ μΈμ¦, AI ν΅ν©, DB λ§€ν
π μΈμ¦ λ° λ³΄μ
JWT (JJWT), Redis
AccessToken/RefreshToken κ΄λ¦¬
π§ AI μ°λ
Spring AI, OpenAI (ChatGPT)
νκΈ° μμ½, λν μΆμ², κ°μ± νκ·Έ μμ±
πΎ λ°μ΄ν°λ² μ΄μ€
MySQL
μ¬μ©μ, μ¬ν μΌμ , νκΈ° λ± μ μ₯
π νλ‘ νΈμλ
Vue.js, Vite, Vuetify
SPA κ°λ°, λΉ λ₯Έ λΉλ, UI νλ μμν¬
πΊοΈ μ§λ API
Kakao Map API
λ§μ»€ κΈ°λ° κ΄κ΄μ§ μκ°ν
βοΈ ν΄λΌμ°λ
AWS S3, Spring Cloud AWS
μ΄λ―Έμ§ μ
λ‘λ λ° μλ μ€μ
βοΈ μ΄λ©μΌ μ μ‘
JavaMailSender (spring-boot-starter-mail)
λΉλ°λ²νΈ μ°ΎκΈ° λ± λ©μΌ κΈ°λ₯
π JSON μ²λ¦¬
Gson
REST ν΅μ λ° AI μλ΅ μ²λ¦¬
π§° κΈ°ν μ νΈ
Lombok, Validation (Jakarta)
μ½λ κ°κ²°ν λ° DTO κ²μ¦, μλ²μ¬μ΄λ λ λλ§ μΌλΆ
β
API λͺ
μΈ μ 리 (EnjoyTrip νλ‘μ νΈ)
Base URL : /api
μΈμ¦ : @AuthenticationPrincipal μ¬μ© μ λ‘κ·ΈμΈ νμ
κ΄λ¦¬μ κΆν νμ : @PreAuthorize("hasRole('ADMIN')")
1. π μΈμ¦ (AuthController)
λ©μλ
URL
μ€λͺ
μΈμ¦
μμ² λ°λ
μλ΅ λ°λ
POST
/auth/login
λ‘κ·ΈμΈ
β
LoginRequest
RefreshTokenResponse
POST
/auth/refresh
AccessToken μ¬λ°κΈ
β
RefreshTokenRequest
RefreshTokenResponse
POST
/auth/logout
λ‘κ·Έμμ (Redis RT μμ )
β
μμ
μμ (204)
2. π€ μ¬μ©μ (UserController)
λ©μλ
URL
μ€λͺ
μΈμ¦
μμ² λ°λ
μλ΅ λ°λ
POST
/users
νμκ°μ
β
SignupRequest
UserProfileResponse
GET
/users/email-exists
μ΄λ©μΌ μ¬μ© κ°λ₯ μ¬λΆ νμΈ
β
μμ (쿼리: email)
Boolean
GET
/users/me
λ΄ νλ‘ν μ‘°ν
β
μμ
UserProfileResponse
PUT
/users/me
λ΄ νλ‘ν μμ
β
UpdateProfileRequest
UserProfileResponse
PUT
/users/me/password
λ΄ λΉλ°λ²νΈ λ³κ²½
β
ChangePasswordRequest
μμ (204)
DELETE
/users/me
νμ νν΄ (soft delete)
β
μμ
μμ (204)
POST
/users/forgot-password
μμ λΉλ°λ²νΈ μ μ‘
β
ForgotPasswordRequest
μμ (204)
POST
/users/oauth
OAuth μ¬μ©μ μΆκ° μ 보 μ μ₯
β
UpdateProfileRequest
UserProfileResponse
GET
/users/{id}
νΉμ μ¬μ©μ μ‘°ν (κ΄λ¦¬μ)
β
μμ
UserDto
GET
/users
μ¬μ©μ λͺ©λ‘ (κ΄λ¦¬μ, νμ΄μ§)
β
쿼리: page/size
UserListResponse
PUT
/users/{id}/status
μ¬μ©μ μν λ³κ²½ (κ΄λ¦¬μ)
β
StatusUpdateRequest
μμ (204)
PUT
/users/{id}/score
μ¬μ©μ μ μ μ‘°μ (κ΄λ¦¬μ)
β
ScoreAdjustRequest
μμ (204)
3. π λν λͺ¨μ§ (CompanionController & CompanionApplicantController)
λ©μλ
URL
μ€λͺ
μΈμ¦
POST
/companions
λν λͺ¨μ§ κΈ μμ±
β
GET
/companions
λν λͺ©λ‘ μ‘°ν (MBTI, μ±λ³ λ± νν°λ§ κ°λ₯)
β
GET
/companions/me
λ΄κ° μμ±ν λν κΈ λͺ©λ‘ μ‘°ν
β
GET
/companions/{id}
λν μμΈ μ‘°ν
β
PUT
/companions/{id}
λν λͺ¨μ§ κΈ μμ
β
DELETE
/companions/{id}
λν λͺ¨μ§ κΈ μμ
β
POST
/companions/{id}/applicants
λν μ μ²
β
GET
/companions/{id}/applicants
μ μ²μ λͺ©λ‘ μ‘°ν (μμ±μ μ μ©)
β
GET
/companions/{id}/applicants/accepted
μλ½λ μ μ²μ λͺ©λ‘ μ‘°ν
β
GET
/companions/{id}/applicants/status
νμ¬ μ¬μ©μ μ μ² μν μ‘°ν
β
PATCH
/companions/{id}/applicants/{applicantId}
μ μ² μν λ³κ²½ (μλ½/κ±°μ , μμ±μ μ μ©)
β
DELETE
/companions/{id}/applicants/{applicantId}
μ μ² μ² ν
β
GET
/companions/{id}/applicants/me/applied
λ΄κ° μ μ²ν λν κΈ λͺ©λ‘ μ‘°ν
β
4. ποΈ μΌμ κ΄λ¦¬ (PlanController)
λ©μλ
URL
μ€λͺ
μΈμ¦
GET
/plans
λ΄ μΌμ λͺ©λ‘ μ‘°ν
β
GET
/plans/{id}
λ΄ μΌμ μμΈ μ‘°ν
β
POST
/plans
μΌμ μμ±
β
PUT
/plans/{id}
μΌμ μμ
β
DELETE
/plans/{id}
μΌμ μμ
β
PATCH
/plans/{id}/share
곡μ μν μ€μ (true/false)
β
POST
/plans/{id}/copy
곡μ λ μΌμ 볡μ¬
β
GET
/plans/shared
μΈκΈ° 곡μ μΌμ λͺ©λ‘ μ‘°ν
β
POST
/plans/{id}/details
μΈλΆ μΌμ μΆκ°
β
PUT
/plans/{id}/details/{detailId}
μΈλΆ μΌμ μμ
β
DELETE
/plans/{id}/details/{detailId}
μΈλΆ μΌμ μμ
β
5. π κ΄κ΄μ§ (TripController)
λ©μλ
URL
μ€λͺ
GET
/trips/sidos
μ/λ λͺ©λ‘ μ‘°ν
GET
/trips/guguns/{sidoCode}
μꡰꡬ λͺ©λ‘ μ‘°ν (μλ κΈ°λ°)
GET
/trips/contentTypes
κ΄κ΄ νμ
λͺ©λ‘ μ‘°ν
GET
/trips/allTrips/{lat}/{lng}
λ°κ²½ 5km μ΄λ΄ κ΄κ΄μ§ μ 체 μ‘°ν
GET
/trips/siGunGu/{sidoCode}/{gugunCode}
μλ + μꡰꡬ κΈ°λ° κ΄κ΄μ§ μ‘°ν
GET
/trips/contentType/{sido}/{gugun}/{type}
μꡰꡬ + κ΄κ΄ νμ
λ³ κ΄κ΄μ§ μ‘°ν
GET
/trips/allContentType/{type}/{lat}/{lng}
κ΄κ΄ νμ
+ λ°κ²½ 5km μ΄λ΄ κ΄κ΄μ§ μ‘°ν
GET
/trips/tripDetail/{no}
νΉμ μ¬νμ§ μμΈ + λ μ¨ μ 보 μ‘°ν
GET
/trips/search?keyword=foo
Trie κΈ°λ° κ΄κ΄μ§ μ΄λ¦ κ²μ
6. π·οΈ ν΄μνκ·Έ (HashtagController)
λ©μλ
URL
μ€λͺ
μΈμ¦
μλ΅ λ°λ
GET
/hashtags
μΉ΄ν
κ³ λ¦¬λ³λ‘ κ·Έλ£Ήνλ ν΄μνκ·Έ λͺ©λ‘
β
List
7. π 리뷰 (ReviewController)
λ©μλ
URL
μ€λͺ
μΈμ¦
POST
/reviews/places
μ₯μ νκΈ° μμ± (νμΌ ν¬ν¨)
β
PUT
/reviews/places/{id}
μ₯μ νκΈ° μμ
β
DELETE
/reviews/places/{id}
μ₯μ νκΈ° μμ
β
GET
/reviews/places/attraction/{id}
νΉμ κ΄κ΄μ§μ νκΈ° λͺ©λ‘ + μμ½
β
GET
/reviews/places/{id}
λ¨μΌ μ₯μ νκΈ° μμΈ μ‘°ν
β
POST
/reviews/places/{id}/likes
μ₯μ νκΈ° μ’μμ ν κΈ
β
GET
/reviews/places/me
λ΄ μ₯μ νκΈ° λͺ©λ‘ μ‘°ν
β
POST
/reviews/companions
λν νκΈ° μμ±
β
PUT
/reviews/companions/{id}
λν νκΈ° μμ
β
DELETE
/reviews/companions/{id}
λν νκΈ° μμ
β
GET
/reviews/companions/users/{userId}
νΉμ μ¬μ©μκ° λ°μ λν νκΈ°
β
GET
/reviews/companions/written/me
λ΄κ° μμ±ν λν νκΈ° λͺ©λ‘
β
GET
/review-tags/{reviewId}
νΉμ νκΈ°μ ν΄μνκ·Έ μ‘°ν
β
POST
/review-tags
νκΈ° ν΄μνκ·Έ μ μ₯
β
8. π¨ μ κ³ (ReportController)
λ©μλ
URL
μ€λͺ
μΈμ¦
POST
/reports
μ κ³ μμ±
β
GET
/reports
μ 체 μ κ³ λͺ©λ‘ μ‘°ν (μ΅μ
: μν νν°λ§)
β
(ADMIN)
GET
/reports/{id}
λ¨μΌ μ κ³ μμΈ μ‘°ν
β
(ADMIN)
DELETE
/reports/{id}
μ κ³ μμ (Soft Delete)
β
(ADMIN)
PATCH
/reports/{id}/reject
μ κ³ κ±°μ μ²λ¦¬
β
(ADMIN)
GET
/reports/check
μ¬μ©μμ μ κ³ μ¬λΆ νμΈ (μ€λ³΅ λ°©μ§μ©)
β
GET
/reports/users
μ¬μ©μ λμ μ κ³ λͺ©λ‘ μ‘°ν
β
(ADMIN)
PATCH
/reports/users/{id}/accept
μ¬μ©μ μ κ³ μλ½ + μ μ§κΈ°κ° λΆμ¬
β
(ADMIN)
GET
/reports/reviews
νκΈ° μ κ³ λͺ©λ‘ μ‘°ν
β
(ADMIN)
PATCH
/reports/reviews/{id}/accept
νκΈ° μ κ³ μλ½ (soft delete)
β
(ADMIN)
GET
/reports/companions
λνκΈ μ κ³ λͺ©λ‘ μ‘°ν
β
(ADMIN)
PATCH
/reports/companions/{id}/accept
λνκΈ μ κ³ μλ½ (soft delete)
β
(ADMIN)
9. νμΌ μ
λ‘λ (FileUploadController)
λ©μλ
URL
μ€λͺ
μΈμ¦
POST
/upload/profile
νλ‘ν μ΄λ―Έμ§ μ
λ‘λ
β
10. μ§λ¬Έ & λ΅λ³ (QuestionController)
λ©μλ
URL
μ€λͺ
μΈμ¦
POST
/questions
μ§λ¬Έ μμ±
β
PUT
/questions/{id}
μ§λ¬Έ μμ (λ³ΈμΈλ§ κ°λ₯)
β
DELETE
/questions/{id}
μ§λ¬Έ μμ (λ³ΈμΈ or κ΄λ¦¬μ)
β
GET
/questions/{id}
λ¨μΌ μ§λ¬Έ μμΈ μ‘°ν
β
GET
/questions
μ 체 μ§λ¬Έ λͺ©λ‘ (λ΅λ³ μ¬λΆ νν°)
β
GET
/questions/me
λ΄κ° μμ±ν μ§λ¬Έ λͺ©λ‘
β
POST
/questions/{id}/answers
μ§λ¬Έμ λν λ΅λ³ μμ±
β
(ADMIN)
PUT
/questions/answers/{id}
λ΅λ³ μμ (μμ± κ΄λ¦¬μλ§ κ°λ₯)
β
(ADMIN)
DELETE
/questions/answers/{id}
λ΅λ³ μμ (μμ± κ΄λ¦¬μλ§ κ°λ₯)
β
(ADMIN)
GET
/questions/answers/{id}
λ¨μΌ λ΅λ³ μμΈ μ‘°ν
β