์ฟผ๋ฆฌ ํด๋ž˜์Šค

์ฐธ๊ณ : ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” NDB ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. NDB ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„๊ตํ•  ๋•Œ Memcache API๋ฅผ ํ†ตํ•œ ์ž๋™ ํ•ญ๋ชฉ ์บ์‹ฑ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด์ „ DB ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ DB์—์„œ NDB๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Query ํด๋ž˜์Šค๋Š” App Engine Datastore์—์„œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. SQL๊ณผ ์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด์ธ GQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ด€๋ จ GqlQuery ํด๋ž˜์Šค๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

Query์€ ๋ชจ๋“ˆ google.appengine.ext.db์— ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ƒ‰์ธ ๊ธฐ์ค€ ์ฟผ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ˆ ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡๋ช‡ ์ข…๋ฅ˜์˜ ์ฟผ๋ฆฌ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์กฐ์ธ ๋ฐ ์ง‘๊ณ„ ์ฟผ๋ฆฌ๋Š” Datastore ์ฟผ๋ฆฌ ์—”์ง„์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Datastore ์ฟผ๋ฆฌ์˜ ์ œํ•œ์‚ฌํ•ญ์€ Datastore ์ฟผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์†Œ๊ฐœ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠน์ • ํ•ญ๋ชฉ ์ข…๋ฅ˜์˜ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด Query ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

class Song(db.Model):
  title = db.StringProperty()
  composer = db.StringProperty()
  date = db.DateTimeProperty()

q = db.Query(Song)

๋˜๋Š” ์ข…๋ฅ˜์˜ ๋ชจ๋ธ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ all()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

q = Song.all()

Query ํด๋ž˜์Šค์˜ ๊ฒฐ๊ณผ ์ธ์Šคํ„ด์Šค๋Š” ์ถ”๊ฐ€ ์ˆ˜์ • ์—†์ด ์ง€์ •๋œ ์ข…๋ฅ˜์˜ ๊ธฐ์กด ํ•ญ๋ชฉ์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ์ฒด์—์„œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ํ•„ํ„ฐ ๊ธฐ์ค€, ์ƒ์œ„ ์กฐ๊ฑด, ์ •๋ ฌ ์ˆœ์„œ์™€ ํ•จ๊ป˜ ์ฟผ๋ฆฌ๋ฅผ ๋งž์ถค์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

q.filter('title =', 'Imagine')
q.ancestor(ancestor_key)
q.order('-date')

ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ๋‹จ์ผ ๊ตฌ๋ฌธ์—์„œ ํ•˜์œ„๋กœ ์ „ํŒŒ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

q.filter('title =', 'Imagine').ancestor(key).order('-date')

๊ทธ๋Ÿฌ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    for song in q:
      print song.title

    ์ด๋Š” ์•”์‹œ์ ์œผ๋กœ ์ฟผ๋ฆฌ์˜ run() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

    for song in q.run():
      print song.title

    ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ limit์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ ์ˆ˜์— ํ•œ๋„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    for song in q.run(limit=5):
      print song.title

    ๋ฐ˜๋ณต์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฟผ๋ฆฌ ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๋ฐ˜๋ณต์ž๋ฅผ ๋งŒ๋“ค๋ฉด ๋™์ผํ•œ ์ฟผ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

  • Datastore์—์„œ ์ฐพ์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ์ผ ์ผ์น˜ ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ฟผ๋ฆฌ์˜ get() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    song = q.get()
    print song.title
  • ์ง€์ •๋œ ๊ฒฐ๊ณผ ์ˆ˜๋งŒํผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ฟผ๋ฆฌ์˜ fetch() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    results = q.fetch(limit=5)
    for song in results:
      print song.title

    run()๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋Š” ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ fetch()๋ฅผ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœํ•˜๋ฉด ๋™์ผํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ : ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— run()์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž

Query ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

class Query(model_class=None, keys_only=False, cursor=None, namespace=None, projection=None, distinct=False)

App Engine Datastore์—์„œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  Query ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋Š” ์ถ”๊ฐ€ ์ˆ˜์ • ์—†์ด model_class์—์„œ ์ง€์ •๋œ ์ข…๋ฅ˜์˜ ๋ชจ๋“  ๊ธฐ์กด ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ filter(), ancestor(),, order()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ํ•„ํ„ฐ ๊ธฐ์ค€, ์ƒ์œ„ ์กฐ๊ฑด, ์ •๋ ฌ ์ˆœ์„œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋งž์ถค์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ˆ˜

model_class
์ฟผ๋ฆฌ๊ฐ€ ์ ์šฉํ•˜๋Š” ํ•ญ๋ชฉ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชจ๋ธ(๋˜๋Š” Expando) ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
keys_only
true์ธ ๊ฒฝ์šฐ ์ „์ฒด ํ•ญ๋ชฉ ๋Œ€์‹  ํ‚ค๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์ „์šฉ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.
cursor
์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
namespace
์ฟผ๋ฆฌ์— ์‚ฌ์šฉํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
projection
๋ฐ˜ํ™˜ํ•  ์†์„ฑ ์ด๋ฆ„์˜ ๋ชฉ๋ก ๋˜๋Š” ํŠœํ”Œ์ž…๋‹ˆ๋‹ค. ์ง€์ •๋œ ์†์„ฑ์„ ๊ฐ€์ง„ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ์˜ ์ƒ‰์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

distinct
ํ”„๋กœ์ ์…˜ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ distinct=True๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์—์„œ ์™„์ „ํžˆ ๊ณ ์œ ํ•œ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ์ ์…˜๋˜๋Š” ์†์„ฑ ๊ฐ’์ด ๋™์ผํ•œ ํ•ญ๋ชฉ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
์ฐธ
ํ”„๋กœ์ ์…˜์—์„œ ๊ณ ์œ ํ•œ ๊ฐ ์†์„ฑ ๊ฐ’ ์„ธํŠธ์— ๋Œ€ํ•ด ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
๊ฑฐ์ง“
๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ

Query ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

filter(property_operator, value)

์ฟผ๋ฆฌ์— ์†์„ฑ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„ํ„ฐ๋ฅผ ์ถฉ์กฑํ•˜๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

property_operator
์†์„ฑ ์ด๋ฆ„ ๋ฐ ์„ ํƒ์  ๋น„๊ต ์—ฐ์‚ฐ์ž(=, !=, <, <=, >, >=, IN)๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด๋กœ, 'age >'์™€ ๊ฐ™์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ์ž ์—†์ด ์†์„ฑ ์ด๋ฆ„๋งŒ ์ง€์ •ํ•˜๋ฉด ํ•„ํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋กœ ๊ท ๋“ฑ(=)ํ•œ์ง€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
value
์†์„ฑ๊ฐ’๊ณผ ๋น„๊ตํ•  ๊ฐ’์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

q.filter('height >', 42).filter('city =', 'Seattle')
q.filter('user =', users.get_current_user())

์ง€์ •๋œ ๋น„๊ต ๊ฐ’๊ณผ ๋น„๊ตํ•  ์†์„ฑ ๊ฐ’์˜ ๊ฐ’ ์œ ํ˜•์ด ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ancestor(ancestor)

์ฟผ๋ฆฌ์— ์ƒ์œ„ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„๊ฐ€ ์ง€์ •๋œ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

ancestor
์ƒ์œ„ ํ•ญ๋ชฉ ๋˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค.
order(property)

์ฟผ๋ฆฌ์— ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ ฌ ์ˆœ์„œ๊ฐ€ ๋‘˜ ์ด์ƒ ์ถ”๊ฐ€๋˜๋ฉด ์ง€์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

property
์ •๋ ฌ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ์†์„ฑ์˜ ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด ์•ž์— ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ดํ”ˆ์„ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
# Order alphabetically by last name:
q.order('last_name')

# Order by height, tallest to shortest:
q.order('-height')
projection()

ํ”„๋กœ์ ์…˜์˜ ์†์„ฑ ํŠœํ”Œ ๋˜๋Š” None์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

is_keys_only()

์ฟผ๋ฆฌ๊ฐ€ ํ‚ค ์ „์šฉ ์ฟผ๋ฆฌ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

run (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, limit=None, batch_size=20, keys_only=False, projection=None, start_cursor=None, end_cursor=None)

์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฃจํ”„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค์ •์œผ๋กœ ์ฟผ๋ฆฌ์˜ ์ž‘์—…์„ ์ง€์ •ํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. offset ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ๊ฒฐ๊ณผ ์ˆ˜๋งŒํผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  2. limit ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜๋งŒํผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฃจํ”„์˜ ์„ฑ๋Šฅ์€ offset๊ณผ limit์˜ ํ•ฉ๊ณ„์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•˜๋ ค๋Š” ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด limit ๊ฐ’์„ ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋น„๋™๊ธฐ์‹ ํ”„๋ฆฌํŽ˜์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Datastore์—์„œ ์†Œ๊ทœ๋ชจ ๋ฐฐ์น˜๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•˜์—ฌ ํ•„์š” ์ด์ƒ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ: ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด batch_size๋ฅผ 1000๊ณผ ๊ฐ™์ด ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.

ํŒ: ๊ธฐ๋ณธ ์ธ์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ๋ฃจํ”„๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์œผ๋กœ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ๋ณธ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ run()์ด ์•”์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

read_policy
์›ํ•˜๋Š” ์ˆ˜์ค€์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์ง€์ •ํ•˜๋Š” ์ฝ๊ธฐ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
STRONG_CONSISTENCY
์ตœ์‹  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ ๋‹จ์ผ ํ•ญ๋ชฉ ๊ทธ๋ฃน์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
EVENTUAL_CONSISTENCY
์—ฌ๋Ÿฌ ํ•ญ๋ชฉ ๊ทธ๋ฃน์„ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์˜ค๋ž˜๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋Š” ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์‹คํ–‰๋˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ƒ์œ„๊ฐ€ ์•„๋‹Œ ์ „์—ญ ์ฟผ๋ฆฌ๋Š” ์ด ์ธ์ˆ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

deadline
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ค‘๋‹จ๋˜๊ธฐ ์ „ Datastore์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’(60์ดˆ)๋ณด๋‹ค ๋†’๊ฒŒ ์„ค์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํŠน์ • ์ž‘์—…์ด ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ๋” ๋นจ๋ฆฌ ๋ฐ˜ํ™˜, ์ž‘์—… ์žฌ์‹œ๋„, ๋‹ค๋ฅธ ์ž‘์—… ์‹œ๋„, ํƒœ์Šคํฌ ํ์— ์ž‘์—… ์ถ”๊ฐ€).
offset
์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๊ฑด๋„ˆ๋›ธ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค.
limit
๋ฐ˜ํ™˜ํ•  ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ None์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
batch_size
๋ฐฐ์น˜๋‹น ๊ฒ€์ƒ‰์„ ์‹œ๋„ํ•  ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค. limit๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ง€์ •๋œ ํ•œ๋„๋กœ ๊ธฐ๋ณธ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ 20์ž…๋‹ˆ๋‹ค.
keys_only
true์ธ ๊ฒฝ์šฐ ์ „์ฒด ํ•ญ๋ชฉ ๋Œ€์‹  ํ‚ค๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์ „์šฉ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.
projection
๋ฐ˜ํ™˜ํ•  ์†์„ฑ ์ด๋ฆ„์˜ ๋ชฉ๋ก ๋˜๋Š” ํŠœํ”Œ์ž…๋‹ˆ๋‹ค. ์ง€์ •๋œ ์†์„ฑ์„ ๊ฐ€์ง„ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ์˜ ์ƒ‰์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

start_cursor
์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
end_cursor
์ฟผ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
get (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, keys_only=False, projection=None, start_cursor=None, end_cursor=None)

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด None์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

read_policy
์›ํ•˜๋Š” ์ˆ˜์ค€์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์ง€์ •ํ•˜๋Š” ์ฝ๊ธฐ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
STRONG_CONSISTENCY
์ตœ์‹  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ ๋‹จ์ผ ํ•ญ๋ชฉ ๊ทธ๋ฃน์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
EVENTUAL_CONSISTENCY
์—ฌ๋Ÿฌ ํ•ญ๋ชฉ ๊ทธ๋ฃน์„ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์˜ค๋ž˜๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋Š” ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์‹คํ–‰๋˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ƒ์œ„๊ฐ€ ์•„๋‹Œ ์ „์—ญ ์ฟผ๋ฆฌ๋Š” ์ด ์ธ์ˆ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

deadline
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ค‘๋‹จ๋˜๊ธฐ ์ „ Datastore์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’(60์ดˆ)๋ณด๋‹ค ๋†’๊ฒŒ ์„ค์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํŠน์ • ์ž‘์—…์ด ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ๋” ๋นจ๋ฆฌ ๋ฐ˜ํ™˜, ์ž‘์—… ์žฌ์‹œ๋„, ๋‹ค๋ฅธ ์ž‘์—… ์‹œ๋„, ํƒœ์Šคํฌ ํ์— ์ž‘์—… ์ถ”๊ฐ€).
offset
์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๊ฑด๋„ˆ๋›ธ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค.
keys_only
true์ธ ๊ฒฝ์šฐ ์ „์ฒด ํ•ญ๋ชฉ ๋Œ€์‹  ํ‚ค๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์ „์šฉ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.
projection
๋ฐ˜ํ™˜ํ•  ์†์„ฑ ์ด๋ฆ„์˜ ๋ชฉ๋ก ๋˜๋Š” ํŠœํ”Œ์ž…๋‹ˆ๋‹ค. ์ง€์ •๋œ ์†์„ฑ์„ ๊ฐ€์ง„ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ์˜ ์ƒ‰์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

start_cursor
์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
end_cursor
์ฟผ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
fetch (limit, read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, keys_only=False, projection=None, start_cursor=None, end_cursor=None)

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  (๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”) ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. offset ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ๊ฒฐ๊ณผ ์ˆ˜๋งŒํผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  2. limit ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜๋งŒํผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ์˜ ์„ฑ๋Šฅ์€ offset๊ณผ limit์˜ ํ•ฉ๊ณ„์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๋ฉ”์„œ๋“œ๋Š” run() ๋ฉ”์„œ๋“œ ์ฃผ๋ณ€์˜ ์”ฌ ๋ž˜ํผ์— ๋ถˆ๊ณผํ•˜๋ฉฐ run()์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์„ฑ์€ ๋‚ฎ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋” ๋งŽ์ด ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค. fetch()๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ฃผ๋กœ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ „์ฒด ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ํŒ: fetch() ๋ฉ”์„œ๋“œ๋Š” limit ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ๊ฒฐ๊ณผ ์ˆ˜๋งŒํผ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด fetch() ๋Œ€์‹  run()๋ฅผ ํฐ ๊ฐ’(์˜ˆ: run(batch_size=1000))์œผ๋กœ ์„ค์ •ํ•ด ์‚ฌ์šฉํ•˜์„ธ์š”.

์ธ์ˆ˜

limit
๋ฐ˜ํ™˜ํ•  ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค. None์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ€ ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.
read_policy
์›ํ•˜๋Š” ์ˆ˜์ค€์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์ง€์ •ํ•˜๋Š” ์ฝ๊ธฐ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
STRONG_CONSISTENCY
์ตœ์‹  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ ๋‹จ์ผ ํ•ญ๋ชฉ ๊ทธ๋ฃน์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
EVENTUAL_CONSISTENCY
์—ฌ๋Ÿฌ ํ•ญ๋ชฉ ๊ทธ๋ฃน์„ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์˜ค๋ž˜๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋Š” ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์‹คํ–‰๋˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ƒ์œ„๊ฐ€ ์•„๋‹Œ ์ „์—ญ ์ฟผ๋ฆฌ๋Š” ์ด ์ธ์ˆ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

deadline
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ค‘๋‹จ๋˜๊ธฐ ์ „ Datastore์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’(60์ดˆ)๋ณด๋‹ค ๋†’๊ฒŒ ์„ค์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํŠน์ • ์ž‘์—…์ด ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ๋” ๋นจ๋ฆฌ ๋ฐ˜ํ™˜, ์ž‘์—… ์žฌ์‹œ๋„, ๋‹ค๋ฅธ ์ž‘์—… ์‹œ๋„, ํƒœ์Šคํฌ ํ์— ์ž‘์—… ์ถ”๊ฐ€).
offset
์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๊ฑด๋„ˆ๋›ธ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค.
keys_only
true์ธ ๊ฒฝ์šฐ ์ „์ฒด ํ•ญ๋ชฉ ๋Œ€์‹  ํ‚ค๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์ „์šฉ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.
projection
๋ฐ˜ํ™˜ํ•  ์†์„ฑ ์ด๋ฆ„์˜ ๋ชฉ๋ก ๋˜๋Š” ํŠœํ”Œ์ž…๋‹ˆ๋‹ค. ์ง€์ •๋œ ์†์„ฑ์„ ๊ฐ€์ง„ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฒฝ์ œ์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ์˜ ์ƒ‰์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

start_cursor
์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
end_cursor
์ฟผ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
count (read_policy=STRONG_CONSISTENCY, deadline=60, offset=0, limit=1000, start_cursor=None, end_cursor=None)

์ฟผ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ์‹ค์ œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ์ •ํ•œ ๋น„์œจ๋งŒํผ ๋” ๋น ๋ฅด์ง€๋งŒ ์‹คํ–‰ ์‹œ๊ฐ„์€ ์—ฌ์ „ํžˆ offset๊ณผ limit์˜ ํ•ฉ์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์ˆ˜๊ฐ€ ์ž‘์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด limit ์ธ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณ„์ˆ˜๊ฐ€ ๋๋‚˜๊ฑฐ๋‚˜ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

read_policy
์›ํ•˜๋Š” ์ˆ˜์ค€์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์ง€์ •ํ•˜๋Š” ์ฝ๊ธฐ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
STRONG_CONSISTENCY
์ตœ์‹  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ ๋‹จ์ผ ํ•ญ๋ชฉ ๊ทธ๋ฃน์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
EVENTUAL_CONSISTENCY
์—ฌ๋Ÿฌ ํ•ญ๋ชฉ ๊ทธ๋ฃน์„ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์˜ค๋ž˜๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋Š” ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์„ ์ง€๋‹Œ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์‹คํ–‰๋˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ƒ์œ„๊ฐ€ ์•„๋‹Œ ์ „์—ญ ์ฟผ๋ฆฌ๋Š” ์ด ์ธ์ˆ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

deadline
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ค‘๋‹จ๋˜๊ธฐ ์ „ Datastore์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’(60์ดˆ)๋ณด๋‹ค ๋†’๊ฒŒ ์„ค์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํŠน์ • ์ž‘์—…์ด ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ๋” ๋นจ๋ฆฌ ๋ฐ˜ํ™˜, ์ž‘์—… ์žฌ์‹œ๋„, ๋‹ค๋ฅธ ์ž‘์—… ์‹œ๋„, ํƒœ์Šคํฌ ํ์— ์ž‘์—… ์ถ”๊ฐ€).
offset
์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์ˆ˜ํ•˜๊ธฐ ์ „์— ๊ฑด๋„ˆ๋›ธ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค.
limit
๊ณ„์ˆ˜ํ•  ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜์ž…๋‹ˆ๋‹ค.
start_cursor
์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
end_cursor
์ฟผ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•  ์ปค์„œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
index_list()

๊ธฐ๋ณธ, ๋ณตํ•ฉ, ์ข…๋ฅ˜, ๋‹จ์ผ ์†์„ฑ ์ƒ‰์ธ์„ ๋น„๋กฏํ•˜์—ฌ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ‰์ธ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜: ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ฟผ๋ฆฌ์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด AssertionError ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” ๋นˆ ๋ชฉ๋ก์ด๊ฑฐ๋‚˜ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ณตํ•ฉ ์ƒ‰์ธ์ด ํฌํ•จ๋œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ‰์ธ์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

# other imports ...
import webapp2
from google.appengine.api import users
from google.appengine.ext import db

class Greeting(db.Model):
  author = db.StringProperty()
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp2.RequestHandler):
  def get(self):
    user = users.get_current_user()
    q = db.Query(Greeting)
    q.filter("author =", user.user_id())
    q.order("-date")
    q.fetch(100)
    index_list = q.index_list()
    for ix in index_list:
      self.response.out.write("Kind: %s" % ix.kind())
      self.response.out.write("<br />")
      self.response.out.write("Has ancestor? %s" % ix.has_ancestor())
      self.response.out.write("<br />")
      for name, direction in ix.properties():
        self.response.out.write("Property name: "+name)
        self.response.out.write("<br />")
        if direction == db.Index.DESCENDING:
          self.response.out.write("Sort direction: DESCENDING")
        else:
          self.response.out.write("Sort direction: ASCENDING")
        self.response.out.write("<br />")

์ด๋Š” ๊ฐ ์ƒ‰์ธ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Kind: Greeting
Has ancestor? False
Property name: author
Sort direction: ASCENDING
Property name: date
Sort direction: DESCENDING
cursor()

๊ฒ€์ƒ‰๋œ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ ๋‹ค์Œ์— ์˜ค๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ปค์„œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ปค์„œ ๋ฌธ์ž์—ด์€ HTTP GET ๋ฐ POST ๋งค๊ฐœ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜๋ฉฐ Datastore ๋˜๋Š” Memcache์—๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ start_cursor ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” with_cursor() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ด ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•˜๋ฉด ์ด ์œ„์น˜์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์† ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜: ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ฟผ๋ฆฌ์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด AssertionError ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์ปค์„œ์™€ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด๋Š” Datastore ์ฟผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

with_cursor (start_cursor, end_cursor=None)

๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ๋‚ด์˜ ์‹œ์ž‘ ์œ„์น˜์™€ (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ์ข…๋ฃŒ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ cursor()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ์ž‘ ์œ„์น˜์™€ ์ข…๋ฃŒ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ปค์„œ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฟผ๋ฆฌ๋Š” ํ•ญ๋ชฉ ์ข…๋ฅ˜, ์†์„ฑ ํ•„ํ„ฐ, ์ƒ์œ„ ํ•„ํ„ฐ, ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด์ „ ํ˜ธ์ถœ๊ณผ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜

start_cursor
์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ปค์„œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
end_cursor
์ฟผ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ปค์„œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.