Cloud Datastore 사용

Google Cloud Datastore를 사용하여 App Engine 앱의 애플리케이션 데이터를 저장할 수 있습니다. Cloud Datastore는 자동 확장, 고성능, 간편한 애플리케이션 개발을 목적으로 설계된 데이터베이스입니다.

이 문서에서는 Google Cloud 클라이언트 라이브러리를 사용해 App Engine 앱에서 Cloud Datastore를 통해 데이터를 저장하고 검색하는 방법을 설명합니다.

선행 조건 및 설정

App Engine에서 자바용 'Hello, World!'의 안내에 따라 환경 및 프로젝트를 설정하고 App Engine 자바 앱의 구조화 방식에 대해 알아보세요. 이 문서에 설명된 샘플 애플리케이션을 실행할 때 필요하므로 프로젝트 ID를 기록해 둡니다.

저장소 복제

샘플을 다운로드(복제)합니다.

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/datastore

프로젝트 구성 수정 및 종속성 설정

pom.xml에서 Cloud Datastore의 사용을 허용하는 종속성을 설정합니다.

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-datastore</artifactId>
  <version>1.34.0</version>
</dependency>

애플리케이션 코드

샘플 애플리케이션은 방문자 IP를 기록, 검색, 표시합니다. 로그 항목은 visit 유형이 지정된 단순한 2개 필드로 이루어진 클래스에 해당하며 데이터 저장소 add() 명령어를 사용해 Cloud Datastore에 저장됨을 알 수 있습니다. 이후 데이터 저장소 run() 명령어를 사용해 10개의 최근 방문이 내림차순으로 검색됩니다.

@SuppressWarnings("serial")
@WebServlet(name = "datastore", value = "")
public class DatastoreServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException,
      ServletException {
    // store only the first two octets of a users ip address
    String userIp = req.getRemoteAddr();
    InetAddress address = InetAddress.getByName(userIp);
    if (address instanceof Inet6Address) {
      // nest indexOf calls to find the second occurrence of a character in a string
      // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf()
      userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*";
    } else if (address instanceof Inet4Address) {
      userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*";
    }

    Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
    KeyFactory keyFactory = datastore.newKeyFactory().setKind("visit");
    IncompleteKey key = keyFactory.setKind("visit").newKey();

    // Record a visit to the datastore, storing the IP and timestamp.
    FullEntity<IncompleteKey> curVisit = FullEntity.newBuilder(key)
        .set("user_ip", userIp).set("timestamp", Timestamp.now()).build();
    datastore.add(curVisit);

    // Retrieve the last 10 visits from the datastore, ordered by timestamp.
    Query<Entity> query = Query.newEntityQueryBuilder().setKind("visit")
        .setOrderBy(StructuredQuery.OrderBy.desc("timestamp")).setLimit(10).build();
    QueryResults<Entity> results = datastore.run(query);

    resp.setContentType("text/plain");
    PrintWriter out = resp.getWriter();
    out.print("Last 10 visits:\n");
    while (results.hasNext()) {
      Entity entity = results.next();
      out.format("Time: %s Addr: %s\n", entity.getTimestamp("timestamp"),
          entity.getString("user_ip"));
    }
  }
}

index.yaml 파일 사용

샘플 앱에서는 간단한 쿼리를 수행합니다. 보다 정교한 Datastore 쿼리를 실행하려면 색인이 한 개 이상 필요하며, 이는 앱과 함께 업로드하는 index.yaml 파일에서 지정해야 합니다. 이 파일은 수동으로 만들거나 로컬에서 앱을 테스트하는 동안 자동으로 생성될 수 있습니다.

추가 정보

최적화와 개념을 비롯하여 Cloud Datastore에 대한 자세한 내용은 Cloud Datastore 문서를 참조하세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

App Engine flexible environment for Java docs