-
[Flutter] 로또 추천번호 생성 앱 & 애드몹 (AdMob) 광고 붙이기 [2] 편 (백엔드서버)Flutter 2021. 4. 18. 12:53반응형
#로또 추천번호 생성 앱 & 애드몹 (AdMob) 광고 붙이기 [2] 편 (백엔드서버)
[Flutter] 로또 추천번호 생성 앱 & 애드몹 (AdMob) 광고 붙이기 [1] 편 (앱 설명 & 앱 구조)
플러터 앱이 사용할 데이터를 가져올 백엔드 서버가 필요하며
본글에선 라라벨을 백엔드로 사용하면서 백엔드 서버를 AWS 에 호스팅 하여 이용 중
[AWS] EC2 우분투(ubuntu) 환경에 라라벨 설치하기
1. 백단에서 하는일
회차별 로또 당첨 정보를 저장할 DB 가 필요하며 본글에선 아마존 RDS 를 이용.
백엔드 서버는 Rest API 를 사용하여 앱과 통신 하게 되며, 주요 업무는 모든 회차별 당첨정보를 DB에 저장,
최근 당첨정보 제공, 전체 당첨정보 제공, 로또 추첨시간이후 20분뒤 크론탭(Crontab) 스케쥴러 작을을 통해
최신 당첨정보를 DB에 저장 총 4가지의 기능을 처리하도록 되어있다.
2. 모델, 컨트롤러, 마이그레이션 파일 생성
다음 artisan 명령을 통해 모델, 컨트롤러, 마이그레이션 파일을 생성
php artisan make:model {파일명} -c -m
3. 로또 회차별 당첨 정보
나눔 로또에서 제공하는 로또 당첨 번호 API 를 사용하여 데이터를 가져온다.
// 로또 회차별 당청정보를 확인할수 있는 API https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo={회자번호} // EX) 로또 900회 당첨정보 조회 https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=900 // 900회 당첨정보 수신 데이터 { "totSellamnt":83639372000, // 총상금액 "returnValue":"success", // 수신결과 "drwNo":900 //로또 회차 "drwNoDate":"2020-02-29", // 추첨일 "firstWinamnt":3349851375, // 1등 상금액 "firstPrzwnerCo":6, // 1등 당첨인원 "firstAccumamnt":20099108250, "drwtNo1":7 // 로또번호1 "drwtNo2":13, // 로또번호2 "drwtNo3":16, // 로또번호3 "drwtNo4":18, // 로또번호4 "drwtNo5":35, // 로또번호5 "drwtNo6":38, // 로또번호6 "bnusNo":14, // 보너스 번호 }
4. 로또 DB (로또 테이블)
artisan 명령으로 만든 마이그레이션 파일에 수신 정보에 맞게 테이블을 만들어준다
$table->id(); $table->bigInteger('drwNo')->comment('로또 회차'); $table->date('drwNoDate')->comment('추첨일'); $table->bigInteger('totSellamnt')->comment('총 상금액'); $table->bigInteger('firstWinamnt')->comment('1등 상금액'); $table->integer('firstPrzwnerCo')->comment('1등 담청인원'); $table->bigInteger('firstAccumamnt'); $table->integer('drwtNo1')->comment('로또번호1'); $table->integer('drwtNo2')->comment('로또번호2'); $table->integer('drwtNo3')->comment('로또번호3'); $table->integer('drwtNo4')->comment('로또번호4'); $table->integer('drwtNo5')->comment('로또번호5'); $table->integer('drwtNo6')->comment('로또번호6'); $table->integer('bnusNo')->comment('보너스번호'); $table->timestamps();
테이블을 구조를 만들었다면 .env 파일에 본인의 DB 접속 정보를 입력 한다
다음 artisan 명령을 통해 마이그레이트 한다
php artisan migrate
4. 로또 Route (RestAPI)
routes 폴더에는 아래와 같이 파일이 4가지가 존재하는데 이중 api.php 파일에 Route 를 등록하면 된다.
// 최초 한번만실행하면되며 로또 모든 회차 당첨 정보를 DB에 저장시킨다 Route::get('/lottoAllListStore', [LottoController::class, 'lottoAllListStore']); // 크론탭으로 실행시키며 추첨시간 20분후 새 당첨정보를 DB에 저장 Route::get('/lottoNewListStore', [LottoController::class, 'lottoNewListStore']); // 제일 최근 당첨 정보를 가져온다 Route::get('/recentlyData', [LottoController::class, 'recentlyData']); // 저장된 전체 당첨 정보를 가져온다 Route::get('/lottoAllList', [LottoController::class, 'lottoAllList']);
4. 컨트롤러
route 를 등록해서 호출을 할수있다면 컨트롤러에선 실제로 요청을 실행시킨다
1) 전체 로또 데이터 DB에 저장
최초 한번만 api 를 호출하고 DB를 저장 했다면 이후엔 route를 지워도 된다.
로또 데이터가 얼마나 존재하는지 모르는 상태이니 while(true) 를 통해 무한으로 반복문을 실행
변수 $i 를 1이라 지정하고 반복문 안에선 i 가 증가하면서 curl 을 통해 로또 api 를 호출
받아온 데이터를 DB에 저장 한다
반복문이 종료되는 시점은 받아온 returnValue == 'fail' 일떄 if 문으로 빠지면서 break 되면서 종료
public function lottoAllListStore() { $i = 1; $ch = curl_init(); //curl 초기화 while (true) { $api_url = 'https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=' . $i; curl_setopt($ch, CURLOPT_URL, $api_url); //URL 지정하기 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //요청 결과를 문자열로 반환 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //connection timeout 10초 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //원격 서버의 인증서가 유효한지 검사 안함 $response = curl_exec($ch); $response = json_decode($response, true); if ($response['returnValue'] == 'fail') { break; } else { $lotto = new lotto(); $lotto->drwNo = $response['drwNo']; $lotto->drwNoDate = $response['drwNoDate']; $lotto->totSellamnt = $response['totSellamnt']; $lotto->firstWinamnt = $response['firstWinamnt']; $lotto->firstPrzwnerCo = $response['firstPrzwnerCo']; $lotto->firstAccumamnt = $response['firstAccumamnt']; $lotto->drwtNo1 = $response['drwtNo1']; $lotto->drwtNo2 = $response['drwtNo2']; $lotto->drwtNo3 = $response['drwtNo3']; $lotto->drwtNo4 = $response['drwtNo4']; $lotto->drwtNo5 = $response['drwtNo5']; $lotto->drwtNo6 = $response['drwtNo6']; $lotto->bnusNo = $response['bnusNo']; $lotto->save(); $i++; } } curl_close($ch); return 'finish'; }
2) 새로운 당첨정보 저장
크론탭 예약 작업을 통해 매주 토요일 오후 9:05 분에 새 당첨 정보를 업데이트 하게 하였다
5 21 * * 6 /usr/bin/curl -s -o /dev/null http://{서버 url}/lottoNewListStore
크론탭 사용법은 아래글 참고
[Linux] 크론 (Cron) 크론탭(Crontab) 사용법
$drwNo 변수를 생성, DB 에 저장된 가장 마지막 회차 번호에 +1 해준 값을 변수에 저장 후
로또 api 를 호출 후 결과값을 DB에 저장, 크론탭 작업이 정상적으로 실행되었는지 확인하기 위해
만들어둔 log 파일에 해당 날짜와 해당 회차를 로그기록으로 쓰도록 하였다.
public function lottoNewListStore() { $drwNo = null; $res = DB::select('select drwNo from lottos order by drwNo desc limit 1'); foreach ($res as $result) { $drwNo = $result->drwNo + 1; } $ch = curl_init(); //curl 초기화 $api_url = 'https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=' . $drwNo; curl_setopt($ch, CURLOPT_URL, $api_url); //URL 지정하기 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //요청 결과를 문자열로 반환 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //connection timeout 10초 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //원격 서버의 인증서가 유효한지 검사 안함 $response = curl_exec($ch); $response = json_decode($response, true); if ($response['returnValue'] == 'fail') { } else { $lotto = new lotto(); $lotto->drwNo = $response['drwNo']; $lotto->drwNoDate = $response['drwNoDate']; $lotto->totSellamnt = $response['totSellamnt']; $lotto->firstWinamnt = $response['firstWinamnt']; $lotto->firstPrzwnerCo = $response['firstPrzwnerCo']; $lotto->firstAccumamnt = $response['firstAccumamnt']; $lotto->drwtNo1 = $response['drwtNo1']; $lotto->drwtNo2 = $response['drwtNo2']; $lotto->drwtNo3 = $response['drwtNo3']; $lotto->drwtNo4 = $response['drwtNo4']; $lotto->drwtNo5 = $response['drwtNo5']; $lotto->drwtNo6 = $response['drwtNo6']; $lotto->bnusNo = $response['bnusNo']; $lotto->save(); } curl_close($ch); $logPath = "log/newlotto.txt"; //로그위치 지정 $log_file = fopen($logPath, "a"); fwrite($log_file, date("Y-m-d", time()) . ' / ' . $drwNo . '회차'); fclose($log_file); }
3) 최근 당첨정보
최근 당첨 정보를 리턴 한다
public function recentlyData() { $res = DB::select('select * from lottos order by drwNo desc limit 1'); return $res; }
4) 전체 당첨정보
전체 당첨 정보를 리턴한다
public function lottoAllList() { $res = DB::select('select * from lottos order by drwNo desc'); return $res; }
5. 모델
모델에 $fillable 추가
protected $fillable = [ 'drwNo', 'drwNoDate', 'totSellamnt', 'firstWinamnt', 'firstPrzwnerCo', 'firstAccumamnt', 'description', 'drwNo1', 'drwNo2', 'drwNo3', 'drwNo4', 'drwNo5', 'drwNo6', 'bnusNo', ];
6. 동작 확인
모든 설정을 마쳤으면 url 에 데이터를 요청해본다.
http://{서버 url}/api/lottoAllList
결과화면
이와 같이 전체 당첨 정보를 json 형태로 출력되는 모습을 확인할수 있다.
다음 포스팅에선 플러터 앱 코드를 리뷰 하도록 하겠다.
반응형'Flutter' 카테고리의 다른 글
[Flutter] 플러터 파이어베이스 연결 | 안드로이드 (0) 2021.04.25 [Flutter] Flutter 앱 출시 하기 (1) 2021.04.18 [Flutter] 플러터 앱 아이콘(icon) 변경하기 (1) 2021.04.18 [Flutter] 로또 추천번호 생성 앱 & 애드몹 (AdMob) 광고 붙이기 [3] 편 (플러터 앱 코드) (1) 2021.04.18 [Flutter] 로또 추천번호 생성 앱 & 애드몹 (AdMob) 광고 붙이기 [1] 편 (앱 설명 & 앱 구조) (1) 2021.04.17