11package com .back .global .initdata ;
22
3- import com .back .domain .user .entity .Gender ;
4- import com .back .domain .user .entity .Mbti ;
5- import com .back .domain .user .entity .Role ;
6- import com .back .domain .user .entity .User ;
3+ import com .back .domain .node .dto .PivotListDto ;
4+ import com .back .domain .node .dto .base .BaseLineBulkCreateRequest ;
5+ import com .back .domain .node .dto .base .BaseLineBulkCreateResponse ;
6+ import com .back .domain .node .dto .decision .DecNodeDto ;
7+ import com .back .domain .node .dto .decision .DecisionNodeFromBaseRequest ;
8+ import com .back .domain .node .dto .decision .DecisionNodeNextRequest ;
9+ import com .back .domain .node .entity .NodeCategory ;
10+ import com .back .domain .node .service .NodeService ;
11+ import com .back .domain .user .entity .*;
712import com .back .domain .user .repository .UserRepository ;
813import lombok .RequiredArgsConstructor ;
914import org .springframework .boot .CommandLineRunner ;
1015import org .springframework .security .crypto .password .PasswordEncoder ;
1116import org .springframework .stereotype .Component ;
1217
1318import java .time .LocalDateTime ;
19+ import java .util .List ;
1420
1521/**
16- * 애플리케이션 시작 시 초기 데이터를 생성하는 컴포넌트.
17- * 개발 환경에서 필요한 기본 사용자(관리자, 일반 사용자)를 데이터베이스에 저장합니다.
22+ * [요약] 기동 시 admin·user1 생성 → user1에 베이스라인(총7: 헤더+피벗5+테일) 1개와 결정라인(총5 노드) 1개 시드 주입.
1823 */
1924@ Component
2025@ RequiredArgsConstructor
2126public class InitData implements CommandLineRunner {
2227
2328 private final UserRepository userRepository ;
2429 private final PasswordEncoder passwordEncoder ;
30+ private final NodeService nodeService ;
2531
32+ // 가장 중요한 함수 위에 한줄로만 요약
33+ // user1을 만들고 베이스라인(7)과 결정라인(5)을 시드로 주입한다
2634 @ Override
27- public void run (String ... args ) throws Exception {
28- // 애플리케이션 시작 시 초기 사용자 데이터 생성
35+ public void run (String ... args ) {
2936 if (
userRepository .
findByEmail (
"[email protected] " ).
isEmpty ()) {
30- User admin = User .builder ()
37+ var admin = User .builder ()
31383239 .password (passwordEncoder .encode ("admin1234!" ))
3340 .role (Role .ADMIN )
@@ -41,19 +48,119 @@ public void run(String... args) throws Exception {
4148 userRepository .save (admin );
4249 }
4350
44- if (
userRepository .
findByEmail (
"[email protected] " ).
isEmpty ()) {
45- User user1 = User .builder ()
46- 47- .password (passwordEncoder .encode ("user1234!" ))
48- .role (Role .USER )
49- .username ("사용자1" )
50- .nickname ("사용자닉네임" )
51- .birthdayAt (LocalDateTime .of (1995 , 5 , 10 , 0 , 0 ))
52- .gender (Gender .F )
53- .mbti (Mbti .ENFP )
54- .beliefs ("개인주의" )
55- .build ();
56- userRepository .save (user1 );
57- }
51+ var user1 =
userRepository .
findByEmail (
"[email protected] " )
52+ .orElseGet (() -> userRepository .save (
53+ User .builder ()
54+ 55+ .password (passwordEncoder .encode ("user1234!" ))
56+ .role (Role .USER )
57+ .username ("사용자1" )
58+ .nickname ("사용자닉네임" )
59+ .birthdayAt (LocalDateTime .of (1995 , 5 , 10 , 0 , 0 ))
60+ .gender (Gender .F )
61+ .mbti (Mbti .ENFP )
62+ .beliefs ("개인주의" )
63+ .build ()
64+ ));
65+
66+ // 피벗 5개만 전송(서비스가 헤더/테일 자동 부착 -> 총 7노드)
67+ BaseLineBulkCreateResponse baseRes = nodeService .createBaseLineWithNodes (
68+ new BaseLineBulkCreateRequest (
69+ user1 .getId (),
70+ "user1-기본 라인" ,
71+ List .of (
72+ new BaseLineBulkCreateRequest .BaseNodePayload (
73+ NodeCategory .EDUCATION , "중학교 진학" , "일반계 선택" , 13 , "중등 입학 및 진로 탐색 시작"
74+ ),
75+ new BaseLineBulkCreateRequest .BaseNodePayload (
76+ NodeCategory .EDUCATION , "고교 진학" , "이과 트랙" , 16 , "수학·물리 집중 선택"
77+ ),
78+ new BaseLineBulkCreateRequest .BaseNodePayload (
79+ NodeCategory .EDUCATION , "대학 합격" , "컴공 전공" , 19 , "알고리즘/네트워크 관심"
80+ ),
81+ new BaseLineBulkCreateRequest .BaseNodePayload (
82+ NodeCategory .CAREER , "인턴 경험" , "백엔드 인턴" , 23 , "스프링 부트 실무 체험"
83+ ),
84+ new BaseLineBulkCreateRequest .BaseNodePayload (
85+ NodeCategory .CAREER , "첫 직장" , "주니어 백엔드" , 25 , "API/DB 설계 중심"
86+ )
87+ )
88+ )
89+ );
90+
91+ Long baseLineId = baseRes .baseLineId ();
92+ PivotListDto pivots = nodeService .getPivotBaseNodes (baseLineId );
93+ if (pivots .pivots () == null || pivots .pivots ().isEmpty ()) return ;
94+
95+ DecNodeDto d0 = nodeService .createDecisionNodeFromBase (
96+ new DecisionNodeFromBaseRequest (
97+ user1 .getId (),
98+ baseLineId ,
99+ 0 ,
100+ null ,
101+ 0 ,
102+ NodeCategory .CAREER ,
103+ "개발자 커리어 진입" ,
104+ List .of ("자바/스프링" , "파이썬/데이터" , "프론트/리액트" ),
105+ null ,
106+ "백엔드 중심 트랙을 초기 선택지로 제시"
107+ )
108+ );
109+
110+ nodeService .createDecisionNodeNext (
111+ new DecisionNodeNextRequest (
112+ user1 .getId (),
113+ d0 .id (),
114+ NodeCategory .CAREER ,
115+ "클라우드 기초" ,
116+ null ,
117+ List .of ("AWS 기초" , "GCP 기초" ),
118+ 0 ,
119+ 0 ,
120+ "EC2/RDS·CI/CD 파이프라인 구축"
121+ )
122+ );
123+
124+ DecNodeDto d2 = nodeService .createDecisionNodeNext (
125+ new DecisionNodeNextRequest (
126+ user1 .getId (),
127+ d0 .id (),
128+ NodeCategory .CAREER ,
129+ "보안 기초" ,
130+ null ,
131+ List .of ("웹 보안" , "네트워크 보안" ),
132+ 0 ,
133+ 0 ,
134+ "JWT·세션·CSRF/XSS 대응 심화"
135+ )
136+ );
137+
138+ DecNodeDto d3 = nodeService .createDecisionNodeNext (
139+ new DecisionNodeNextRequest (
140+ user1 .getId (),
141+ d2 .id (),
142+ NodeCategory .CAREER ,
143+ "대용량 처리" ,
144+ null ,
145+ List .of ("캐시·큐" , "검색" ),
146+ 0 ,
147+ null ,
148+ "Redis·Kafka·Elasticsearch 실습"
149+ )
150+ );
151+
152+ nodeService .createDecisionNodeNext (
153+ new DecisionNodeNextRequest (
154+ user1 .getId (),
155+ d3 .id (),
156+ NodeCategory .CAREER ,
157+ "운영/관측성" ,
158+ null ,
159+ List .of ("로그·모니터링" , "SLO/알림" ),
160+ 0 ,
161+ null ,
162+ "프로덕션 운영 지표와 알림 체계 정착"
163+ )
164+ );
58165 }
59- }
166+ }
0 commit comments