구글은 자사의 서비스를 여러방면으로 사용할수 있게 수많은 API를 제공합니다.
이번에 게임을 제작하면서 각종 게임 벨런싱 문서들을 구글 스프레드시트에 올려두고
기획자에게 스프레드시트의 권한을 제공한 다음 직접 문서를 수정하게 했습니다.
다음은 JAVA 서버에서 기획자가 수정한 스프레드시트의 벨런싱 문서를 가져와서 서버에 적용하며,
외국 사이트등을 참고해서 만든 구글 API를 이용한 스프레드시트 내용 긁어 오기 demo 입니다.
우선 구글 api를 사용하기 위해서 구글 라이브러리를 다운 받아야 합니다.
구글 라이브러리 다운[바로가기]
위와 같이 구글은 많은 언어의 라이브러리를 제공합니다.
저희는 java 서버이니 java 라이브러리를 다운 받겠습니다.
자바 라이브러리는 겁나 많습니다.
총 43개나 되네요.
근데 어느 사이트도 어떤 라이브러리를 추가해야 한다고 콕 찝어 주지 않았습니다.
당연히 다 쓰진 않겠기에 필요해보이는 한두개를 추가하고 에러가나면 또 추가하고 하는 식을 몇개 추렸습니다.
gdata-client-1.0.jar
gdata-client-meta-1.0.jar
gdata-core-1.0.jar
gdata-spreadsheet-3.0.jar
gdata-spreadsheet-meta-3.0.jar
일단 필요해 보이는 애들을 추가해가며 넣은거라 위에서 필요 없는 아이들도 있을수 있습니다.
우선은 이렇게 추가하면 컴파일 에러가 하나 발생합니다.
이리 저리 찾아보니 또다른 라이브러리를 다운 받아야 하더군요
그녀석이 아래녀석입니다.
guava-18.0.jar
위에 라이브러리를 추가하니 에러가 발생하지 않습니다.
우선 사용자 인증을 해야합니다.
SpreadsheetService service = new SpreadsheetService("Gdata Test");
service.setUserCredentials("계정 E-Mail", "계정비번");
위에서 "Gdata Test"의 명은 아무것이나 입력해도 됩니다.
그리고 내가 접근 가능한 계정의 스프레드시트 Full feed를 읽어 옵니다.
URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
SpreadsheetFeed feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
위에서 많이 헤멨습니다.
주소 때문에요.
당연히 스프레드시트의 주소를 넣어야 한다고 생각하여 스프레드 시트 주소를 넣고 돌렸지만 에러밖에 나지 않습니다.
꼭 "https://spreadsheets.google.com/feeds/spreadsheets/private/full" 이주소를 넣어 주셔야합니다.
해당 주소를 직접 들어가보시면 아시겠지만, 내가 접근 가능한 스프레드시트의 full feed를 보여주는 주소입니다.
feed를 받은 다음 그 feed를 파싱해가며 접근하는 구조인가 봅니다.
다음은 데모코드 입니다.
import com.google.gdata.client.spreadsheet.*; import java.net.URL; import com.google.gdata.data.spreadsheet.*; import java.util.*;
public class GdataTest {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try{ SpreadsheetService service = new SpreadsheetService("Gdata Test"); service.setUserCredentials("", ""); URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"); SpreadsheetFeed feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class); List<SpreadsheetEntry> spreadsheets = feed.getEntries(); for(int i=0; i< spreadsheets.size(); i++) { SpreadsheetEntry entry = spreadsheets.get(i); if(entry.getTitle().getPlainText().equals("스프레드시트 파일 이름")) // 파일 타이틀 { List<WorksheetEntry> worksheets = entry.getWorksheets(); // 시트 타이틀 for(int k=0;k< worksheets.size();k++) { WorksheetEntry worksheet = worksheets.get(k); System.out.println(worksheet.getTitle().getPlainText()); URL cellFeedUrl = worksheet.getCellFeedUrl(); CellFeed cellFeed = service.getFeed(cellFeedUrl, CellFeed.class); for (CellEntry cell : cellFeed.getEntries()) { System.out.println("getPlainText : "+cell.getTitle().getPlainText()); // value의 위치 System.out.println("getValue : "+cell.getCell().getValue()); // value의 내용 } } } } }catch(Exception e){ e.printStackTrace(); } }
} |
데모코드를 돌려보면, // 파일 타이틀 부분
"스프레드시트 파일 이름" 이라는 문서를 만나면
// 시트 타이틀 부분 에서 시트의 개수만큼 for 문을 수행하며, 그 안에 내용들을 긁어와서 화면에 찍어줍니다.
System.out.println("getPlainText : "+cell.getTitle().getPlainText()); // value의 위치
System.out.println("getValue : "+cell.getCell().getValue()); // value의 내용
두부분이 실제적으로 안의 내용을 찍어주는 역활을 합니다.
getPlainText : A22
getValue : store_list
getPlainText : B22
getValue : store_price
결과는 위와 같이 찍힙니다.
A22셀의 내용은 store_list
B22셀의 내용은 store_price
위와같이 22번 셀을 기준으로 A -> B 순으로 오른쪽으로 순차적으로 읽어 오네요.
개발후 결론
생각보다 무지 느려요. '-' 못써요.
진짜 벨런싱 수정용으로 밖에 못쓸거 같아요.
게임 서비스 하면서도 각종 설정파일들을 읽어와서 서버에 실시간 적용을 위해서
구글의 막강한 스프레드시트를 이용해서 개발한건데 ㅠ.ㅠ 너무 너무 느려서 서비스중인 게임엔 적용이 힘들것 같구요.
기획자들의 편의를 위해 사용하자는 기존의 목적대로 밖에 못쓸것 같습니다.
기획자들은 적용이 완료될때까지 기다려 줄테니까요 ^ㅡ^
결론2
기획자들의 편의를 위해 제공한다면 굳이 구글 스프레드시트가 아닌 엑셀파일이나 더 쉽게는 csv 파일을 제공하여,
그 파일에서 직접 읽어오는게 속도는 훨씬 빠릅니다.
결론3
그래도 구글 스프레드시트를 이용하면 웹이접근되는 모든 공간에서 수정과 실시간 반영을 해줄수 있으니,
또 나름 괜찮아요 ^ㅡ^