JJONG`sFACTORY
반응형
 

Laravel + MongoDB 세팅

먼저 JSON 데이터로 되어있는 게임 데이터를 최적화 하여 사용 할 수 있도록 MongoDB를 세팅을 진행 하였다.

 

https://github.com/jenssegers/laravel-mongodb

 

GitHub - jenssegers/laravel-mongodb: A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)

A MongoDB based Eloquent model and Query builder for Laravel (Moloquent) - GitHub - jenssegers/laravel-mongodb: A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)

github.com

위 라이브러리를 사용하였다.

현재 Laravel이 10버전이라서, dev버전을 require 시켜 주었다. (글 쓴 시점 기준으로는 10버전에서 안정적인 버전이 나와있지 않아서, 일반버전으로는 추가가 되지 않았다.)

php
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

 

Releases · mongodb/mongo-php-driver

The Official MongoDB PHP driver. Contribute to mongodb/mongo-php-driver development by creating an account on GitHub.

github.com

현재 사용중인 php 버전이 8.2 버전이라서 1.15.1 버전을 다운받아 주었다.

 

이후 Laravel에서 추가적인 세팅을 마저 진행 했다.

config/app.php에

php
Jenssegers\Mongodb\MongodbServiceProvider::class,

위 내용을 추가 해 주고,

 

config/database.php에 설정 관련값을 추가 해 주었다.

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 연결 확인

일단 적당한 모델을 만들어 준 뒤, 모델을 아래와 같이 편집했다.

php
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 세팅을 진행 했다.

기존에 정리해 둔 내용이 있어서 이부분은 패스..

 

 

Laravel - passport를 이용한 로그인 구현 (Oauth)

서론 로그인 구현 방식에는 여러가지 방식이 있지만, 요즘에는 Oauth 방식을 이용한 로그인 방식이 많이 사용 됩니다. 라라벨에서는 passport라는 인증 관련 확장 프로그램을 제공해 주어, 쉽게 Oauth

jjong-factory.tistory.com

 

 

AWS S3 private + IAM + CloudFront로 보안을 첨가한 파일 업로드 구현

서론 기존에 Laravel을 이용하여 S3 파일업로드에 대하여 설명을 한 적이 있었습니다. 다만, 이때는 public으로 열어둔 S3에 손쉽게 업로드를 구현하는 방법을 설명 드렸었습니다. [Laravel] AWS S3 연동

jjong-factory.tistory.com

 

Operator 데이터 편집과 테스트

일단 기존에 받은 JSON 파일에는 공개모집과 관련된 데이터를 찾을 수 없었다.

어떤 캐릭터가 공개모집에서 나오는지, 어떤 태그를 사용해야 나오는지..

그래서 해당 부분을 먼저 편집해 주어야 했다.

 

https://minase.co.kr/arknights/recr.html

 

명일방주 공개모집 계산기

 

minase.co.kr

위 사이트에서 공개모집 태그와 가능한 오퍼레이터 목록을 적절히... 가져오고 가공하여 JSON 데이터를 편집 할 수 있도록 진행했다.

php
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; }

 

php
// 공개모집 가능한 얘들 가져오기 public function getRecruitmentOp() { return Operators::select('name', 'rarity', 'isRecruitment', 'recruitmentTagCodeList')->get(); }

정확히 들어갔는지 확인 및 데이터 검증까지 마무리!

 

일단, 태그 계산기를 위한 내용은 처리가 완료 되었으니 클라이언트쪽 세팅과 퍼블리싱을 먼저 진행 후 위 내용을 붙혀보기로 하고

추가적인 기능들은 하나씩 추가 하는 방향으로 개발을 진행해보려고 한다.

반응형