1편 세팅편 : https://www.clien.net/service/board/lecture/17960697CLIEN
2편 VueJS적용 : https://www.clien.net/service/board/lecture/17962453CLIEN
3편 프론트작업1 : https://www.clien.net/service/board/lecture/17964735CLIEN
4편 프론트작업2 : https://www.clien.net/service/board/lecture/17966827CLIEN
오늘은 백엔드 작업을 시작 합니다! 짝짝짝~
백단에서 작업해야 할것은 크게 세가지가 있는데요..
1. DB 테이블 작업
2. 동행복권에서 최신 데이터를 가져와 테이블에 넣는 로직작업
3. 사용자의 요청에 맞춰서 json데이터를 출력해줄 로직작업
그중 가장 급선무는 DB 테이블이 있어야 저장을하고 조회를 할테니까 오늘은 DB에 대해서 얘기할겁니다.
테이블을 만들고 쿼리를 요청해서 어디까지 저장됐는지 볼거에요
1. DB(Database)
그누보드를 설치해서 쓰고 계시다면, 아마도 한번쯤은 그누보드의 DB테이블을 힐끗 보신적이 있으실 겁니다.
보통 그누보드는 Cafe24같은 호스팅 업체에 설치하게 되고(저는 나스에 있어요)
호스팅 업체는 자체 공간이 원격에 있으니까 일반 사용자들이 찾아가서 usb복사는 못하는 고로..
웹에 관리할수 있는 기능들을 제공하죠.
그중하나가 그누보드 DB를 볼수있게 해주는 phpMyAdmin 입니다.
사실 뭐 굳이 phpMyAdmin이어야 하는건 아니고요…
저는 집에서는 사실 DBeaver 를 쓰는걸 좋아합니다.
어떻게 됐던 DB접속을 하시면 돼요..
집마다 그누보드를 설치한 환경마다 접속방법은 다르니 적절한 방법을 찾아서 들어가야 합니다.
여튼 디비에 접속해서 쿼리(DB명령어)를 보낼수 있는 환경은 알아서 찾으셔야 해요.
그누보드를 설치했다면 보통 DB정보를 한번 적고 까먹으실텐데 보통 그누보드의 /data/dbconfig.php 에 정보가 들어있어요.
이거는 밖에서는 볼수없고 파일로 들어갈수 있는 권한이 있는분만 볼수있으니 까먹으셨으면 거기에 들어가서 보시고
혹시 비번 까먹으셨다면 저거보고 하시면 됩니다.
독립적인 테이블을 사용할거라 굳이 그누보드의 구조를 몰라도 되긴 합니다만...
단지 그누보드는 MySQL을 쓰고 있고 그누보드가 만들어논 DB환경에 제가 만든 새기능의 공간을 만든다… 정도만 아시면 돼요.
그럼 뭔가 막혔을때 mysql 치고 그때그때 검색해서 쓰는거죠 뭐.
지금 강좌에서는 INSERT, UPDATE, SELECT, DELETE 기본문법만 아시면 돼요
어차피 복잡한 데이터가 들어가는게 아니니까요.
그것도 정 모르겠으면 GPT한테 물어보면 돼요 ㅋ
2. 테이블 구조
프론트 만들면서 살짝 언급했는데 우리는 RestAPI를 만들어서 프론트에게 데이터를 줄겁니다.
그리고 전편에서 봤던 데이터구조로 특정 주소에 요청하면 최신회차를 하나 던질겁니다.
어제 보셨던 예제 데이터는 다음과 같았죠.
사실 이 데이터 구조는 제가 즉흥적으로 만들긴 했지만 그냥 테이블 구조에 맞춰서 만든것 뿐입니다.
저는 동행복권에서 나오는 데이터를 저렇게 저장하고 싶었던거죠.
그래서 저는 제가 쓰는 그누보드 공간의 DB에 새로운 테이블을 만들 었고 구조는 다음과 같습니다.
순서대로 이름 - 데이터형식 - 빈데이터 허용여부 입니다.
idx 는 회차를 기록할거에요.
저는 오래할 포부가 크기 때문에 큰수도 받을수 있도록 했답니다.
num1~bonus 까지는 로또 숫자가 하나씩 들어가는데 1부터 45까지의 수니까 작은 공간만 있어도 되니까 tinyint 형식을 썼습니다.
winner는 1등 당첨금액인데 수십억에서 수백억까지 되니까 그냥 bigint 를 썼습니다.
lotto_date는 추첨일
bigo는 혹시 코멘트를 할일이 있을까 싶어서 만들었는데… 사실 아직까진 쓰이지 않는군요.
update_time은 데이터가 들어갈때 시간을 확인하려고 넣었어요. 저렇게하면 자동으로 들어가니 신경쓰지 않아도 돼요.
DB에 접속해서 쿼리를 실행하면 그 테이블이 만들어지죠.
이렇게 만들어지면 아무래도 데이터를 먼저 받는게 좋을듯 하니까 우선 나눔로또에서 데이터를 받는거 부터 하죠.
3. 로직 흐름
약간의 머리를 써야 하는 구간인데 흐름은 어렵지 않습니다.
저희의 로직은 페이지가 로딩될때 한번 실행돼요.(php니까 어떤 주소를 호출할겁니다)
지금 방금 테이블을 만들었으니까 테이블이 비어 있습니다.
그리고 로또 API는 특정 번호를 넣어서 보내면 그 한회차의 정보를 보여줍니다.
1. 우선 내 디비를 뒤져서 최신회차가 뭔지 본다
2. 최신회차에서 1을 더해서 동행복권에 요청해본다.
3. 정보가 있다면 테이블에 저장하고 없다면 끝낸다.
아주 간단한 흐름입니다.
하지만 이건 어디까지나 개념적인 일이고 짜는건 우리가 짜야하니까 이제 스탭바이 스탭으로 진행해보죠.
4. 내 로또 테이블에서 최신회차 조회
우선 어떤 주소를 호출해서 PHP로직을 실행시킨 다는건 php에서는 그냥 주소에 php명을 쓰는거 밖에 없어요.
그래서 제가 그누보드를 좋아하긴 하는데...
그냥 php환경이 있다면 파일하나 떨궈도 뭔가 유의미한 결과를 낼수 있으니까요.
집에서 작업할때는 사실 그게 편해서 쓰는것도 있긴 합니다(데헷)
그누보드는 보통 lib파일에 특수기능을 가진 php들을 넣는 경향이 있으니 우리도 그렇게 해봅시다.
그누보드의 lib 폴더에 새로운 파일을 하나 만듭니다.
제 사이트에는 이미 만들어져 있으니까 우선은 testRestAPI.php로 만들어보죠.
빈 php에 저렇게 쳐서 로직을 짤 준비를 해봅니다.
저 명령어들은 별거 없고 보통 php에서 에러가 난거를 숨기는 경향이 있는데(페이지에 에러메시지가 뜨면 좀 그러니까요)
하지만 우리는 개발중이기 때문에 저 명령어로 에러메시지를 켜도록 합시다 개발중에 저거 안보이면 엄청 불편해요 ㅋ
그런데 저나 여러분이나 php는 잘 못다룰 가능성이 크고 우리는 ChatGPT의 시대가 왔어요~
우선은 물어나 봅시다.
질문을 구체적으로 하면 사실상 얘가 다만들어줬습니다;;;
설명조차도 필요가 없네요…
사실 저기에 db랑 username password 치고 저대로 하시면 돌아갈겁니다.
실제로 저도 하다 귀찮아서 저렇게 치고 쓰기도 했는데 쿼리에 직접 변수를 넣고 restAPI를 만들때는 쿼리가 오염되지 않도록 신경을 쓰긴 해야합니다.
지금 쿼리는 아무것도 받지않고 내부에서만 돌아가기 때문에 제가 뭔짓을 해도 별로 위험할일이 없어서 그냥 두는거에요.
그래도 그누보드를 쓰니까 저대로 치면 좀 재미가 없고...
이미 DB 쿼리를 날릴수 있도록 쉽게 만들어논 함수셋이 그누보드에는 있으니까 그걸 써보도록 할게요.
이런것들은 bbs폴더에 bbs.php라던지 ajax 뭐시기~ php 보시면 insert나 select를 하는 모습이 보이는데 그런걸 참조하면서 따라하시면 돼요.
자 우선 코드를 보여드립니다.
아까 GPT가 얘기해준 것 보다 훨씬 간결해 졌습니다.
이거는 이미 그누보드 프레임워크가 선작업을 다 해놨기 때문이에요.
DB 사용자정보 얻어서 DB에 접속하고 쿼리받을 밑작업들을 다 해논거죠.
sql_fetch는 그누보드에서 제공한건데 저렇게 한줄의 결과가 나오는 쿼리에서 보통 써요.
sql변수에 넣은 저 쿼리의 의미는 lottonumber 테이블을 뒤져서 가장 큰 idx값을 가져오는 겁니다.
MAX함수는 쿼리에서 가장 큰값을 가져오는 거고요.
바깥에 nvl은 테이블에 아예 값이 없을수가 있잖아요?
데이터가 하나도 없으면 null이 나오는데 null 대신 제가 적은 0이 나오게 하라고 정한겁니다.
추가1) nvl함수는 제가 깔아쓰는 mariaDB 에서 제공하는 기능이었습니다. mysql사용자는 nvl 대신 ifnull로 고쳐쓰셔야 합니다
값이 잘 나오는지 확인해야 하니 결과값을 var_dump 로 출력해봅니다.
var_dump는 변수부터 배열까지 자동으로 내부를 출력해 주니까 알아두면 종종 써먹기 좋아요.
그리고 저장한 뒤에 도메인/lib/testRestAPI.php를 인터넷 주소창에 쳐보시면?
다음과 같이 정상적으로 값이 들어와 있는걸 알수 있어요.
저는 이미 서비스를 하고 있으니까 max_idx 가 1058이 나왔지만
처음 만드시면 데이터가 없으니까 0이 나올거에요.
5. 중간에 끊고
개념적으로 복잡하진 않은데 제가 풀어내려고 머리를 쓰다보니 벌써 시간이 너무 지나버렸네요;;
다음편에는 이렇게 얻어낸 회차에서 +1을 해서 동행복권에서 값을 얻어오는 방법을 보도록 해요~
동행복권에서 정보를 얻어와 저장하고
저장한것을 표출하는 작업이 들어가니까 한두편 뒤에 다뤄볼 예정이에요~
그리고 NVL은 오라클 함수인데 MySQL에서 지원이 되는걸까요?
회사에서 오라클만 쓰다보니 관성적으로 썼는데 지원이 돼서 저는 mysql버전이 올라가서 되는줄 알았네요 ㄷㄷㄷ
mariaDB에서는 nvl이 ifnull 함수의 링크같이 제공되고 있었습니다;;
말씀하신대로 mysql쓰시는 분들은 저부분을 ifnull로 바꾸셔야 겠습니다.
테이블인덱스는 다른 테이블에서는 만드는게 좋겠지만 기능을 올리는데 문제없는 수준까지만 하고 있습니다..
로또 회차가 천몇개정도 되고 한주에 한개씩 늘어나니 굳이 할 필요는 못느꼈습니다^^;