command->info('사용자 배송지 더미 데이터 생성을 시작합니다.'); $this->deleteExistingAddresses(); $this->createAddresses(); $count = UserAddress::count(); $this->command->info("사용자 배송지 더미 데이터 {$count}건이 성공적으로 생성되었습니다."); } /** * 기존 배송지 삭제 */ private function deleteExistingAddresses(): void { $deletedCount = UserAddress::count(); if ($deletedCount > 0) { UserAddress::query()->delete(); $this->command->warn("기존 배송지 데이터 {$deletedCount}건을 삭제했습니다."); } } /** * 사용자별 배송지 생성 */ private function createAddresses(): void { $userCount = $this->getSeederCount('address_users', self::USER_COUNT); $users = User::take($userCount)->get(); if ($users->isEmpty()) { $this->command->error('사용자가 없습니다. 먼저 사용자를 생성해주세요.'); return; } $this->command->line(" - 사용자 {$users->count()}명의 배송지 생성 중..."); $domesticCount = 0; $internationalCount = 0; foreach ($users as $user) { $addressCount = rand(self::MIN_ADDRESSES_PER_USER, self::MAX_ADDRESSES_PER_USER); $usedDomesticIndices = []; $usedInternationalIndices = []; for ($i = 0; $i < $addressCount; $i++) { $isInternational = $i > 0 && rand(1, 100) <= self::INTERNATIONAL_ADDRESS_CHANCE; if ($isInternational) { [$index, $name] = $this->pickUniqueName($usedInternationalIndices, self::INTERNATIONAL_NAMES); $usedInternationalIndices[] = $index; UserAddress::factory() ->forUser($user) ->international() ->state([ 'name' => $name, 'is_default' => false, ]) ->create(); $internationalCount++; } else { [$index, $name] = $this->pickUniqueName($usedDomesticIndices, self::DOMESTIC_NAMES); $usedDomesticIndices[] = $index; UserAddress::factory() ->forUser($user) ->state([ 'name' => $name, 'is_default' => $i === 0, ]) ->create(); $domesticCount++; } } } $total = $domesticCount + $internationalCount; $this->command->line(" - 배송지 {$total}건 생성 완료 (국내 {$domesticCount}건, 해외 {$internationalCount}건)"); } /** * 중복되지 않는 배송지명을 선택합니다. * * @param array $usedIndices 이미 사용된 배송지명 인덱스 목록 * @param array $namePool 배송지명 후보 목록 * @return array [인덱스, 배송지명] */ private function pickUniqueName(array $usedIndices, array $namePool): array { $availableIndices = array_values(array_diff(array_keys($namePool), $usedIndices)); if (empty($availableIndices)) { $index = array_rand($namePool); $suffix = ' '.rand(2, 9); return [-1, $namePool[$index].$suffix]; } $index = $availableIndices[array_rand($availableIndices)]; return [$index, $namePool[$index]]; } }