From a34806f92946c31c9353ef4166859a796dc31466 Mon Sep 17 00:00:00 2001 From: rorrxr Date: Fri, 25 Sep 2026 03:10:04 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EC=95=A0=ED=94=8C=EB=A6=AC=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=82=AC=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SkillCategoryInitializer 추가: SkillCategoryType enum 중 skill_category 테이블에 없는 카테고리만 추가 - 카테고리 row 누락으로 스킬 등록/수정 시 SKILL_CATEGORY_NOT_FOUND 발생하던 문제 방지 - LoadTestDataSeeder 카테고리 생성 시 기존 row 재사용하도록 변경 (unique 제약 충돌 방지) Co-Authored-By: Claude Opus 5.5 --- .../service/SkillCategoryInitializer.java | 55 +++++++++++++++++++ .../global/loadtest/LoadTestDataSeeder.java | 3 +- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/swyp/linkit/domain/user/service/SkillCategoryInitializer.java diff --git a/src/main/java/org/swyp/linkit/domain/user/service/SkillCategoryInitializer.java b/src/main/java/org/swyp/linkit/domain/user/service/SkillCategoryInitializer.java new file mode 100644 index 00000000..d5c69db1 --- /dev/null +++ b/src/main/java/org/swyp/linkit/domain/user/service/SkillCategoryInitializer.java @@ -0,0 +1,55 @@ +package org.swyp.linkit.domain.user.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.swyp.linkit.domain.user.entity.SkillCategory; +import org.swyp.linkit.domain.user.entity.SkillCategoryType; +import org.swyp.linkit.domain.user.repository.SkillCategoryRepository; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 애플리케이션 시작 시 SkillCategoryType enum 과 skill_category 테이블 동기화 + * - enum 에는 있지만 DB 에 없는 카테고리만 추가 (기존 데이터는 변경하지 않음) + * - 카테고리 row 누락으로 스킬 등록/수정 시 SKILL_CATEGORY_NOT_FOUND 가 발생하는 것을 방지 + * - 다른 Runner(부하 테스트 시더 등)보다 먼저 실행 + */ +@Slf4j +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@RequiredArgsConstructor +public class SkillCategoryInitializer implements ApplicationRunner { + + private final SkillCategoryRepository skillCategoryRepository; + + @Override + @Transactional + public void run(ApplicationArguments args) { + Set existingTypes = skillCategoryRepository.findAll().stream() + .map(SkillCategory::getCategoryType) + .collect(Collectors.toSet()); + + List missingCategories = Arrays.stream(SkillCategoryType.values()) + .filter(type -> !existingTypes.contains(type)) + .map(SkillCategory::create) + .toList(); + + if (missingCategories.isEmpty()) { + return; + } + + skillCategoryRepository.saveAll(missingCategories); + + log.info("스킬 카테고리 초기화: 추가된 카테고리={}", + missingCategories.stream().map(SkillCategory::getCategoryType).toList()); + } +} diff --git a/src/main/java/org/swyp/linkit/global/loadtest/LoadTestDataSeeder.java b/src/main/java/org/swyp/linkit/global/loadtest/LoadTestDataSeeder.java index 415f42d6..792ce6bc 100644 --- a/src/main/java/org/swyp/linkit/global/loadtest/LoadTestDataSeeder.java +++ b/src/main/java/org/swyp/linkit/global/loadtest/LoadTestDataSeeder.java @@ -214,7 +214,8 @@ public void run(String... args) { */ private List createCategories() { List list = Arrays.stream(SkillCategoryType.values()) - .map(type -> skillCategoryRepository.save(SkillCategory.create(type))) + .map(type -> skillCategoryRepository.findByCategoryType(type) + .orElseGet(() -> skillCategoryRepository.save(SkillCategory.create(type)))) .collect(Collectors.toList()); log.info("[Seeder] SkillCategory {}개", list.size()); return list;