Skip to content

Commit 78d0aee

Browse files
JIWONKIMSclaude
andcommitted
feat(be): Add dummy guide data initializer for dev environment
- DevConfig에 더미 가이드 2명 자동 생성 기능 추가 - 서울 가이드 1명, 부산 사하구 가이드 1명 - dev 프로필에서만 실행되며 중복 방지 로직 포함 - 생성/기존 통계 콘솔 출력 기능 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 421d087 commit 78d0aee

File tree

4 files changed

+89
-8
lines changed

4 files changed

+89
-8
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ dependencies {
3434
implementation("org.springframework.boot:spring-boot-starter-web")
3535
implementation("org.springframework.boot:spring-boot-starter-webflux")
3636
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
37+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
3738
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")
3839
implementation("org.jetbrains.kotlin:kotlin-reflect")
3940

src/main/kotlin/com/back/koreaTravelGuide/common/config/DevConfig.kt

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.back.koreaTravelGuide.common.config
22

3+
import com.back.koreaTravelGuide.domain.user.entity.User
4+
import com.back.koreaTravelGuide.domain.user.enums.Region
5+
import com.back.koreaTravelGuide.domain.user.enums.UserRole
6+
import com.back.koreaTravelGuide.domain.user.repository.UserRepository
37
import org.springframework.boot.CommandLineRunner
48
import org.springframework.context.annotation.Bean
59
import org.springframework.context.annotation.Configuration
@@ -93,4 +97,67 @@ class DevConfig {
9397
println("=".repeat(80) + "\n")
9498
}
9599
}
100+
101+
/**
102+
* dev 모드에서 더미 가이드 데이터 생성
103+
* 서버 시작시 자동으로 가이드 2명을 데이터베이스에 추가
104+
*/
105+
@Bean
106+
fun dummyGuideDataInitializer(userRepository: UserRepository): CommandLineRunner {
107+
return CommandLineRunner {
108+
// 생성할 더미 가이드 리스트
109+
val dummyGuides =
110+
listOf(
111+
User(
112+
oauthProvider = "dev",
113+
oauthId = "dev-guide-001",
114+
email = "[email protected]",
115+
nickname = "서울 투어 김가이드",
116+
profileImageUrl = "https://i.pravatar.cc/300?img=12",
117+
role = UserRole.GUIDE,
118+
location = Region.SEOUL,
119+
description =
120+
"안녕하세요! 서울에서 10년간 가이드 경험이 있는 김가이드입니다. " +
121+
"서울의 숨은 명소부터 핫플레이스까지 모두 안내해드릴 수 있습니다. " +
122+
"특히 한식 맛집과 전통시장 투어에 자신 있습니다!",
123+
),
124+
User(
125+
oauthProvider = "dev",
126+
oauthId = "dev-guide-002",
127+
email = "[email protected]",
128+
nickname = "부산 사하구 박가이드",
129+
profileImageUrl = "https://i.pravatar.cc/300?img=33",
130+
role = UserRole.GUIDE,
131+
location = Region.BUSAN,
132+
description =
133+
"부산 사하구 토박이 박가이드입니다! 다대포 해수욕장, 을숙도, 감천문화마을 등 " +
134+
"부산의 숨은 보석 같은 명소들을 소개해드립니다. " +
135+
"특히 사하구 맛집과 바다 뷰 카페 투어는 제가 제일 자신 있어요. 부산 사투리로 정감있게 안내해드립니다!",
136+
),
137+
)
138+
139+
println("\n📝 더미 가이드 데이터 초기화 시작...")
140+
var createdCount = 0
141+
var existingCount = 0
142+
143+
dummyGuides.forEach { guide ->
144+
val existing = userRepository.findByEmail(guide.email)
145+
if (existing == null) {
146+
userRepository.save(guide)
147+
createdCount++
148+
println("\n✅ 가이드 생성 완료:")
149+
println(" 📧 Email: ${guide.email}")
150+
println(" 👤 Nickname: ${guide.nickname}")
151+
println(" 📍 Location: ${guide.location?.displayName}")
152+
} else {
153+
existingCount++
154+
println("\n✅ 이미 존재하는 가이드: ${existing.nickname} (ID: ${existing.id})")
155+
}
156+
}
157+
158+
println("\n📊 더미 가이드 데이터 초기화 완료!")
159+
println(" ✨ 새로 생성: ${createdCount}")
160+
println(" ♻️ 기존 유지: ${existingCount}")
161+
}
162+
}
96163
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.back.koreaTravelGuide.common.config
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper
4+
import com.fasterxml.jackson.databind.SerializationFeature
5+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
6+
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
7+
import org.springframework.context.annotation.Bean
8+
import org.springframework.context.annotation.Configuration
9+
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder
10+
11+
@Configuration
12+
class JacksonConfig {
13+
@Bean
14+
fun objectMapper(): ObjectMapper {
15+
return Jackson2ObjectMapperBuilder()
16+
.modulesToInstall(JavaTimeModule())
17+
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
18+
.build<ObjectMapper>()
19+
.registerKotlinModule()
20+
}
21+
}

src/main/kotlin/com/back/koreaTravelGuide/common/config/RedisConfig.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import com.back.koreaTravelGuide.domain.ai.tour.dto.TourResponse
55
import com.back.koreaTravelGuide.domain.ai.weather.dto.MidForecastDto
66
import com.back.koreaTravelGuide.domain.ai.weather.dto.TemperatureAndLandForecastDto
77
import com.fasterxml.jackson.databind.ObjectMapper
8-
import com.fasterxml.jackson.module.kotlin.KotlinModule
98
import org.springframework.beans.factory.annotation.Value
109
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
1110
import org.springframework.cache.CacheManager
@@ -45,13 +44,6 @@ class RedisConfig {
4544
return LettuceConnectionFactory(redisConfiguration)
4645
}
4746

48-
@Bean
49-
fun objectMapper(): ObjectMapper =
50-
ObjectMapper().apply {
51-
// Kotlin 모듈 등록 (data class 생성자 인식)
52-
registerModule(KotlinModule.Builder().build())
53-
}
54-
5547
@Bean
5648
fun redisTemplate(connectionFactory: RedisConnectionFactory): RedisTemplate<String, String> {
5749
val template = RedisTemplate<String, String>()

0 commit comments

Comments
 (0)