44import com .example .ForDay .domain .activity .repository .ActivityRepository ;
55import com .example .ForDay .domain .hobby .entity .Hobby ;
66import com .example .ForDay .domain .hobby .repository .HobbyRepository ;
7+ import com .example .ForDay .domain .hobby .type .HobbyStatus ;
78import com .example .ForDay .domain .record .entity .ActivityRecord ;
89import com .example .ForDay .domain .record .repository .ActivityRecordRepository ;
910import com .example .ForDay .domain .record .type .RecordVisibility ;
1011import com .example .ForDay .domain .user .entity .User ;
1112import com .example .ForDay .domain .user .repository .UserRepository ;
13+ import com .example .ForDay .domain .user .type .Role ;
14+ import com .example .ForDay .domain .user .type .SocialType ;
1215import lombok .RequiredArgsConstructor ;
16+ import lombok .extern .slf4j .Slf4j ;
17+ import org .springframework .boot .context .event .ApplicationReadyEvent ;
1318import org .springframework .context .annotation .Profile ;
19+ import org .springframework .context .event .EventListener ;
1420import org .springframework .stereotype .Component ;
21+ import org .springframework .transaction .annotation .Transactional ;
1522
1623import java .util .List ;
24+ import java .util .Random ;
25+ import java .util .UUID ;
1726
18- //@Component
27+ @ Slf4j
28+ @ Component
1929@ Profile ("local" )
2030@ RequiredArgsConstructor
2131public class DataInitializer {
2232
23- private final ActivityRecordRepository activityRecordRepository ;
2433 private final UserRepository userRepository ;
2534 private final HobbyRepository hobbyRepository ;
2635 private final ActivityRepository activityRepository ;
36+ private final ActivityRecordRepository activityRecordRepository ;
2737
28- private void insertDummyRecords () {
29- User user = userRepository .findById ("7746f373-4dea-41af-8512-b3a3ad3f2608" )
30- .orElseThrow (() -> new IllegalStateException ("User not found" ));
38+ @ EventListener (ApplicationReadyEvent .class )
39+ @ Transactional
40+ public void initData () {
41+ if (userRepository .count () >= 12 ) {
42+ log .info ("이미 더미 데이터가 존재하여 생성을 건너뜁니다." );
43+ return ;
44+ }
3145
32- // hobby 1 → activity 1,2,3
33- createRecords (user , 1L , List .of (1L , 2L , 3L ));
46+ log .info ("더미 데이터 생성을 시작합니다..." );
3447
35- // hobby 2 → activity 4~9
36- createRecords (user , 2L , List .of (4L , 5L , 6L , 7L , 8L , 9L ));
37- }
48+ // 1. 12명의 유저 생성 (3명씩 hobbyInfoId 1, 2, 3, 4 할당을 위해)
49+ for (int i = 1 ; i <= 12 ; i ++) {
50+ User user = User .builder ()
51+ .email ("user" + i + "@example.com" )
52+ .nickname ("Hobbyist_" + i )
53+ .role (Role .USER )
54+ .socialType (SocialType .KAKAO )
55+ .socialId ("kakao_social_id_" + UUID .randomUUID ().toString ().substring (0 , 8 ))
56+ .onboardingCompleted (true )
57+ .build ();
58+ userRepository .save (user );
3859
39- private void createRecords (
40- User user ,
41- Long hobbyId ,
42- List <Long > activityIds
43- ) {
44- Hobby hobby = hobbyRepository .findById (hobbyId )
45- .orElseThrow (() -> new IllegalStateException ("Hobby not found: " + hobbyId ));
60+ // 2. 유저당 1개의 취미 생성 (hobbyInfoId: 1~4 반복 할당)
61+ long hobbyInfoId = ((i - 1 ) / 3 ) + 1 ; // 1~3번: 1, 4~6번: 2 ...
62+ Hobby hobby = Hobby .builder ()
63+ .user (user )
64+ .hobbyInfoId (hobbyInfoId )
65+ .hobbyName ("Hobby Name " + hobbyInfoId )
66+ .hobbyPurpose ("Purpose of hobby " + i )
67+ .hobbyTimeMinutes (30 )
68+ .executionCount (0 )
69+ .currentStickerNum (0 )
70+ .status (HobbyStatus .IN_PROGRESS )
71+ .build ();
72+ hobbyRepository .save (hobby );
4673
47- for (Long activityId : activityIds ) {
48- Activity activity = activityRepository .findById (activityId )
49- .orElseThrow (() -> new IllegalStateException ("Activity not found: " + activityId ));
74+ // 3. 취미당 1개의 활동 생성
75+ Activity activity = Activity .builder ()
76+ .user (user )
77+ .hobby (hobby )
78+ .content ("Main Activity for " + hobby .getHobbyName ())
79+ .aiRecommended (false )
80+ .collectedStickerNum (0 )
81+ .build ();
82+ activityRepository .save (activity );
83+
84+ // 4. 활동 1개당 3개의 기록 생성
85+ List <String > stickerImages = List .of ("smile.jpg" , "sad.jpg" , "laugh.jpg" , "angry.jpg" );
86+ Random random = new Random ();
87+
88+ for (int j = 1 ; j <= 10 ; j ++) {
89+ // 2. 리스트에서 랜덤하게 하나 추출
90+ String randomSticker = stickerImages .get (random .nextInt (stickerImages .size ()));
5091
51- for (int i = 1 ; i <= 3 ; i ++) {
5292 ActivityRecord record = ActivityRecord .builder ()
5393 .user (user )
5494 .hobby (hobby )
5595 .activity (activity )
56- .sticker ("STICKER_" + i )
57- .memo ("activity " + activityId + " record " + i )
96+ .sticker (randomSticker ) // 랜덤 이미지 적용
97+ .memo ("Day " + j + " record for user " + i )
5898 .visibility (RecordVisibility .PUBLIC )
59- .imageUrl ("https://dummy.image/activity_ " + activityId + "_" + i + ".jpg" )
99+ .imageUrl ("https://dummy.image/record_ " + i + "_" + j + ".jpg" )
60100 .build ();
61101
62102 activityRecordRepository .save (record );
63103 }
104+
105+ // Entity의 비즈니스 로직 호출 (카운트 증가 등 연관관계 편의 로직)
106+ activity .record ();
64107 }
65108 }
66- }
109+ }
0 commit comments