Skip to content

Commit f002a65

Browse files
committed
initdata
1 parent ee2263e commit f002a65

File tree

5 files changed

+143
-27
lines changed

5 files changed

+143
-27
lines changed

back/src/main/java/com/back/domain/node/controller/BaseLineController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public ResponseEntity<BaseNodeDto> getBaseNode(@PathVariable Long baseNodeId) {
5252
// 사용자 전체 트리 조회 (베이스/결정 노드 일괄 반환)
5353
@GetMapping("/{baseLineId}/tree")
5454
public ResponseEntity<TreeDto> getTreeForBaseLine(@PathVariable Long baseLineId) {
55-
// 트리 조회 서비스 호출
5655
TreeDto tree = nodeService.getTreeForBaseLine(baseLineId);
5756
return ResponseEntity.ok(tree);
5857
}

back/src/main/java/com/back/domain/node/repository/BaseLineRepository.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
@Repository
1414
public interface BaseLineRepository extends JpaRepository<BaseLine, Long> {
1515
Optional<BaseLine> findByUser(User user);
16-
long countByUser(User user); // 기본 인덱스 계산용
16+
long countByUser(User user);
17+
// Guest 베이스라인 1개 제한 확인용
18+
boolean existsByUser_id(Long userId);
1719

18-
boolean existsByUserAndTitle(User user, String title); // 충돌 회피용
20+
boolean existsByUserAndTitle(User user, String title);
1921
}

back/src/main/java/com/back/domain/node/service/BaseLineService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.back.domain.node.mapper.NodeMappers;
1414
import com.back.domain.node.repository.BaseLineRepository;
1515
import com.back.domain.node.repository.BaseNodeRepository;
16+
import com.back.domain.user.entity.Role;
1617
import com.back.domain.user.entity.User;
1718
import com.back.domain.user.repository.UserRepository;
1819
import com.back.global.exception.ApiException;
@@ -35,9 +36,15 @@ class BaseLineService {
3536

3637
// 노드 일괄 생성(save chain)
3738
public BaseLineBulkCreateResponse createBaseLineWithNodes(BaseLineBulkCreateRequest request) {
39+
3840
support.validateBulkRequest(request);
3941
User user = userRepository.findById(request.userId())
4042
.orElseThrow(() -> new ApiException(ErrorCode.USER_NOT_FOUND, "User not found: " + request.userId()));
43+
44+
// Guest는 베이스라인 1개 제한
45+
if (user.getRole() == Role.GUEST && baseLineRepository.existsByUser_id(user.getId())) {
46+
throw new ApiException(ErrorCode.GUEST_BASELINE_LIMIT, "Guest user can have only one baseline.");
47+
}
4148
String title = support.normalizeOrAutoTitle(request.title(), user);
4249

4350
BaseLine baseLine = baseLineRepository.save(BaseLine.builder().user(user).title(title).build());

back/src/main/java/com/back/global/exception/ErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public enum ErrorCode {
4444
NODE_NOT_FOUND(HttpStatus.NOT_FOUND, "N001", "Node Not Found"),
4545
BASE_LINE_NOT_FOUND(HttpStatus.NOT_FOUND, "N002", "BaseLine Not Found"),
4646
DECISION_LINE_NOT_FOUND(HttpStatus.NOT_FOUND, "N003", "DecisionLine Not Found"),
47+
GUEST_BASELINE_LIMIT(HttpStatus.BAD_REQUEST, "N004" , "Guest Base Line Limit Exceeded"),
4748

4849
// Scenario Errors
4950
SCENARIO_NOT_FOUND(HttpStatus.NOT_FOUND, "SC001", "Scenario Not Found"),
Lines changed: 131 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
11
package 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.*;
712
import com.back.domain.user.repository.UserRepository;
813
import lombok.RequiredArgsConstructor;
914
import org.springframework.boot.CommandLineRunner;
1015
import org.springframework.security.crypto.password.PasswordEncoder;
1116
import org.springframework.stereotype.Component;
1217

1318
import 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
2126
public 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()
3138
3239
.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

Comments
 (0)