Laravel + MongoDB 세팅
먼저 JSON 데이터로 되어있는 게임 데이터를 최적화 하여 사용 할 수 있도록 MongoDB를 세팅을 진행 하였다.
https://github.com/jenssegers/laravel-mongodb
위 라이브러리를 사용하였다.
현재 Laravel이 10버전이라서, dev버전을 require 시켜 주었다. (글 쓴 시점 기준으로는 10버전에서 안정적인 버전이 나와있지 않아서, 일반버전으로는 추가가 되지 않았다.)
composer require jenssegers/mongodb:dev-master
MongoDB를 PHP에서 사용하기 위해서는 확장 dll을 다운받은 뒤 ini 파일을 설정해야 했다.
PHP 버전과, nts인지 ts인지를 잘 확인하고, 맞는 dll파일을 다운 받은 뒤 php.ini 파일에 extension을 알맞게 추가해주었다.
pecl을 이용해서 다운 받을 수 도 있지만, 현재 개발 환경이 window라서 직접 찾아서 다운받아 주었다.
아래 링크에서 자기에게 적합한 dll 파일을 찾아주자.
https://github.com/mongodb/mongo-php-driver/releases
현재 사용중인 php 버전이 8.2 버전이라서 1.15.1 버전을 다운받아 주었다.
이후 Laravel에서 추가적인 세팅을 마저 진행 했다.
config/app.php에
Jenssegers\Mongodb\MongodbServiceProvider::class,
위 내용을 추가 해 주고,
config/database.php에 설정 관련값을 추가 해 주었다.
'mongodb' => [
'driver' => 'mongodb',
'host' => env('MONGODB_HOST', '127.0.0.1'),
'port' => env('MONGODB_PORT', 27017),
'database' => env('MONGODB_DATABASE', 'database'),
'username' => env('MONGODB_USERNAME', ''),
'password' => env('MONGODB_PASSWORD', ''),
'options' => [
'appname' => 'homestead',
],
],
이후 .env에 변수 추가를 진행 하였다.
MongoDB 연결 확인
일단 적당한 모델을 만들어 준 뒤, 모델을 아래와 같이 편집했다.
use Jenssegers\Mongodb\Eloquent\Model;
class Operators extends Model
{
protected $connection = 'mongodb';
protected $primaryKey = 'id';
}
이후 데이터를 수동으로 일단 넣어 본 뒤, 테스트를 진행했다.
웬만한 쿼리는 Laravel의 Eloquent ORM을 따르고 있는 것 같고, 추가적인 설명은 git의 readme를 참조했다.
일단 데이터가 정상적으로 나오는 걸 확인하고, 데이터편집과 API 몇가지를 만들어 보기로 했다.
그전에, S3 File Upload와 Oauth 로그인 구현
그전에 일단 데이터 자체를 관리할 관리자 계정과 fileUpload, S3 세팅을 진행 했다.
기존에 정리해 둔 내용이 있어서 이부분은 패스..
Operator 데이터 편집과 테스트
일단 기존에 받은 JSON 파일에는 공개모집과 관련된 데이터를 찾을 수 없었다.
어떤 캐릭터가 공개모집에서 나오는지, 어떤 태그를 사용해야 나오는지..
그래서 해당 부분을 먼저 편집해 주어야 했다.
https://minase.co.kr/arknights/recr.html
위 사이트에서 공개모집 태그와 가능한 오퍼레이터 목록을 적절히... 가져오고 가공하여 JSON 데이터를 편집 할 수 있도록 진행했다.
public function setRecruitmentTagList() {
$recruitmentOpList = [
"FO03",
"...",
"RCX4"
];
$allOpList = Operators::all();
$recruitmentTagList = RecruitmentTags::select("tag_code", "name.kr", "type")->get();
$recruitmentTagIndexName = [];
foreach($recruitmentTagList as $recruitmentTag) {
$recruitmentTagIndexName[$recruitmentTag->name['kr']] = $recruitmentTag->tag_code;
}
// allOpList 전체 돌면서
// displayNumber 가 $recruitmentOpList 에 있으면 isRecruitment:true 없으면 false
// 1성 전부 로보트임 6성 고급특별채용, 5성: 특별채용 (rarity 0,4,5)
// position :: RANGED => 원거리:: 4, MELEE => 근거리 :: 3
// tagList 매칭
// profession : TANK(디팬더) :6,
// MEDIC(메딕) : 7,
// WARRIOR(가드): 5,
// SPECIAL(스페셜리스트): 11,
// SNIPER(스나이퍼) : 10,
// PIONEER(뱅가드) : 8,
// CASTER(캐스터) : 12,
// SUPPORT(서포터) : 9
foreach($allOpList as $operator) {
$updataData = [];
// 공개모집 가능 여부 판단
if(in_array($operator->displayNumber, $recruitmentOpList)) {
$updataData['isRecruitment'] = true;
} else {
$updataData['isRecruitment'] = false;
}
if($updataData['isRecruitment']) {
$tagList = [];
// 로봇, 특별채용, 고급특별채용
switch($operator->rarity) {
case 0:
array_push($tagList, 18); // 로봇
break;
case 4:
array_push($tagList, 29); // 특별채용
break;
case 5:
array_push($tagList, 30); // 고급특별채용
break;
}
// Position
switch($operator->position) {
case "RANGED":
array_push($tagList, 4);
break;
case "MELEE":
array_push($tagList, 3);
break;
}
// profession
switch($operator->profession) {
case "TANK":
array_push($tagList, 6);
break;
case "MEDIC":
array_push($tagList, 7);
break;
case "WARRIOR":
array_push($tagList, 5);
break;
case "SPECIAL":
array_push($tagList, 11);
break;
case "SNIPER":
array_push($tagList, 10);
break;
case "PIONEER":
array_push($tagList, 8);
break;
case "CASTER":
array_push($tagList, 12);
break;
case "SUPPORT":
array_push($tagList, 9);
break;
}
// tagList 매칭
foreach($operator->tagList as $tagInfo) {
if(isset($recruitmentTagIndexName[$tagInfo])) {
array_push($tagList, $recruitmentTagIndexName[$tagInfo]);
}
}
$updataData['recruitmentTagCodeList'] = $tagList;
}
Operators::where('_id',$operator->_id)->update($updataData, ['upsert'=>true]);
}
return $allOpList;
}
// 공개모집 가능한 얘들 가져오기
public function getRecruitmentOp() {
return Operators::select('name', 'rarity', 'isRecruitment', 'recruitmentTagCodeList')->get();
}
정확히 들어갔는지 확인 및 데이터 검증까지 마무리!
일단, 태그 계산기를 위한 내용은 처리가 완료 되었으니 클라이언트쪽 세팅과 퍼블리싱을 먼저 진행 후 위 내용을 붙혀보기로 하고
추가적인 기능들은 하나씩 추가 하는 방향으로 개발을 진행해보려고 한다.
'프로그래밍 일지 > 명빵' 카테고리의 다른 글
[개인프로젝트] EC2 laravel 배포 (Ubuntu22 nginx Laravel 배포) (0) | 2023.03.20 |
---|---|
[개인프로젝트] 공개모집 태그 로직 정리 및 임시 통신 (SSR) 처리(교집합, 부분집합, Combination 처리) (0) | 2023.03.20 |
[개인프로젝트] next.js 퍼블리싱 / Layout / Component / propType 처리 (0) | 2023.03.20 |
[개인프로젝트] 명일방주 정보 조회용 프론트엔드 세팅 (Next.js + SCSS) (0) | 2023.03.16 |
[개인프로젝트] 명일방주 정보 조회용 개인프로젝트 시작 (0) | 2023.03.16 |