<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Isoon Laohasoot on Medium]]></title>
        <description><![CDATA[Stories by Isoon Laohasoot on Medium]]></description>
        <link>https://medium.com/@icepanda501?source=rss-809b9a1ec58a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dlrHoNXjofTTifEAwiBBYw.jpeg</url>
            <title>Stories by Isoon Laohasoot on Medium</title>
            <link>https://medium.com/@icepanda501?source=rss-809b9a1ec58a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 12:33:46 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@icepanda501/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[ทุกคนครับ !! มาใช้ GraphQL กันเถอะ]]></title>
            <link>https://medium.com/@icepanda501/%E0%B8%97%E0%B8%B8%E0%B8%81%E0%B8%84%E0%B8%99%E0%B8%84%E0%B8%A3%E0%B8%B1%E0%B8%9A-%E0%B8%A1%E0%B8%B2%E0%B9%83%E0%B8%8A%E0%B9%89-graphql-%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B9%80%E0%B8%96%E0%B8%AD%E0%B8%B0-d8fa526f3f21?source=rss-809b9a1ec58a------2</link>
            <guid isPermaLink="false">https://medium.com/p/d8fa526f3f21</guid>
            <category><![CDATA[web-services]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Isoon Laohasoot]]></dc:creator>
            <pubDate>Sat, 05 May 2018 12:39:29 GMT</pubDate>
            <atom:updated>2018-05-07T15:42:41.115Z</atom:updated>
            <content:encoded><![CDATA[<p>กราบสวัสดีทุกท่านครับผม วันนี้ผมจะมาแนะนำ GraphQL จากประสบการณ์ การใช้งานจริง มาซักระยะนึงได้ สำหรับคนที่ไม่รู้จัก GraphQL นะครับ มันคือ Query Language แบบนึงที่ใช้สำหรับเรียกข้อมูลจากฝั่ง Server ไปยัง Client ซึ่งมันเป็นทางเลือกนึงสำหรับการเขียน WebService นั้นเอง ( เช่นเดียวกันกับ Restful )</p><h3>ขอท้าวความซักนิดนึง</h3><p>นี้เป็น blog แรกที่ผมเริ่มเขียนเพราะฉะนั้นอาจจะอธิบายดู งงๆ ไปบ้างขออภัยไว้ ณ. ที่นี้ด้วยนะครับ ส่วนเหตุผลที่เริ่มเขียนโดยเลือกเจ้า GraphQL เนี้ยเพราะว่าตัวผมเองพึ่งเริ่มใช้งานมันอย่างอย่างจริงจังเมื่อไม่กี่เดือนที่ผ่านมานี้เอง แต่กลับรู้สึกว่ามันเจ๋ง และ รู้สึกดีงามในการใช้งานมากกกกกก จนอยากระบายมันออกมา ( เผื่อจะมีคนอ่านละโดนป้ายยาบ้าง 555 ) เพราะฉะนั้นในบทความนี้จะ ไม่ใช่วิธีที่ถูกต้องครบถ้วน 100% แต่มันเป็นวิธีที่ผมเริ่มต้นกับมันนั้นเองครับ</p><h3>เริ่มต้นยังไงดีล่ะทีนี้ ?</h3><p>ก่อนที่เราจะมาเริ่มเขียน code กันอย่างจริงจัง ผมอยากให้ทุกคนเข้าใจการใช้งานเจ้า GraphQL นี้กันก่อนว่ามันแตกต่างจาก restful อย่างไรบ้าง โดยไอ้ GraphQL เนี้ยมันจะมีส่วนหลักๆ 3 ส่วนใหญ่ๆ ที่เรียกได้ว่าเป็นหัวใจหลักนั่นคือ query , mutation และ schema นั่นเองครับ</p><h3>1.Query</h3><p>ถ้าเปรียบเทียบมันก็เหมือน method get ของ restful นั้นแหละครับเพียงแต่เปลื่ยนจาก</p><pre>GET <a href="http://myservice/something">http://myservice/something</a></pre><p>เป็น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/713/1*yQNfn6OLFIliHXG5hj5vlw.png" /><figcaption>“ด้านซ้ายคือ query language ที่ใช้เรียกข้อมูล ส่วนด้านขวาคือ data ที่ออกมา”</figcaption></figure><p>มาถึงตรงนี้อาจจะ งง ว่าอ้าวเห้ยแล้วมันส่งข้อมูลไปยังไง ? ไม่ใช่ http เหรอ ?</p><p>“เปล่าครับ มันก็ส่งผ่าน http นั้นแหละเพียงแต่มันจะส่งไปในรูปแบบนี้”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/746/1*j50BcwRA0v8gTrUji1W8bg.png" /><figcaption>( ขออนุญาติ crop ภาพมาจาก postman นะครับ คิดว่าน่าจะดูเข้าใจง่ายดี )</figcaption></figure><p>จากที่เห็นจะสังเกตุได้ว่ามันส่ง query language ไปเป็น string ผ่าน method post เพื่อเรียกข้อมูลออกมา</p><p><strong>แต่ data จริงๆ มันซับซ้อนกว่านี้นี่ ??</strong></p><p>ใช่ครับ เพราะฉะนั้นเรามาลองดู data ที่ใกล้เคียงของจริงมาอีกซักนิด</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/788/1*4_l4YLpjCSJgU5gDHpbQXw.png" /></figure><blockquote>จะสังเกตุได้ว่า เราจำเป็นที่ต้องเขียน field ที่จะใช้ ลงใน Query ด้วย</blockquote><p>เพราะว่าเนื่องจาก GraphQL เนี่ย มันหวงข้อมูลมากกก มันจะไม่ใจง่ายให้ข้อมูลเราทั้งหมดแบบ Restful แต่เราต้องบอกมันว่า เราต้องการข้อมูลอะไรบ้างที่จะใช้</p><p>แน่นอนข้อดีของมันคือเราสามารถควบคุม data ที่จะออกมาได้ ทำให้ไม่มีพวก data ที่ไม่จำเป็นเก็บไปก็เปลือง ram เปล่าๆ แต่ถ้าเรา field ที่เราต้องการใช้มันเยอะมากๆหล่ะ ? เราสามารถเขียนให้มันออกมาทุก field เลยได้มั้ย คำตอบคือ “ไม่ได้ครับ” ไม่ว่าเราจะใช้ field เยอะแค่ไหน เราก็ต้องเขียนมันลงไปใน GraphQL ทั้งหมดครับผม</p><p>แล้วถ้าเกิดเป็น Object ซ้อน Object ล่ะ ????????? จะเขียนยังไง</p><p>มันก็จะเป็นแบบนี้ครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/839/1*a6AbBVfz4w-W-a41ZPfQ-g.png" /></figure><p>นั่นก็คือไม่ว่าจะเป็น object เดี่ยวๆ หรือ object ซ้อน object เราก็จำเป็นที่ต้องกำหนด field ที่เราต้องการอยู่ดี ( เห็นมั้ยว่า ไอ้เจ้า GraphQL เนี้ยมันหวงข้อมูลขนาดไหน )</p><p>แล้วถ้าเราอยากใส่ parameter ไปกับ query ล่ะจะทำยังไง ???</p><p>มันก็จะไปท่านี้ครับ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/751/1*bGkYxaYbZDWEKjBeBt87og.png" /><figcaption>จากตัวอย่างคือเราต้องการข้อมูลของ user ที่มี id = 1</figcaption></figure><p>ซึ่งเจ้า GraphQL มันก็มีช่องทางให้เรายัด parameter เผื่อไปประมวลผลดึง data มาเหมือนกันครับ โดยการใส่ไว้ในวงเล็บข้างๆ พร้อมบอกว่า parameter นั้นชื่ออะไรก็พอ</p><p>แต่ยังครับ GraphQL ยังมีทีเด็ดที่ผมชอบมากๆ อีกอย่างนึงคือ มันสามารถเรียก data หลายๆ ชุดพร้อมกันได้ด้วย !!!</p><p>ยกอย่างเช่น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/824/1*HxPh8rI__jfbw2UZCsw-eg.png" /></figure><p>จะเห็นได้ว่า นอกจากเราจะเรียก users มาแล้วเรายังสามารถเรียก companies มาโดยใช้เพียงแค่ 1 request เท่านั้น !!!!</p><blockquote>โอ้ววววววว จ๊อดดด มันสุดยอดมาก</blockquote><p>ลองนึกภาพตามนะครับ สมมุติว่าผมมี หน้า 1 หน้าที่จำเป็นต้องใช้ data ถึง 10 อย่าง เท่ากับว่าจากที่ผมเคยใช้ 10 request จะเหลือเพียงแค่ 1 เท่านั้น !! เรียกได้ว่าประหยัดจำนวน request ไปมากโขเลยทีเดียว</p><h3>2.Mutation</h3><p>ถ้าเปรียบเทียบกับ restful มันคือ method post,put,delete นั้นเอง เพียงแต่ GraphQL มันมัดรวมเจ้าพวกนี้ไว้ด้วยกันทั้งหมด เป็น mutation ( คือมันจะไม่สนเลยว่าเราจะ create update หรือ delete แต่มันสนแค่ว่า data จะถูก change แน่ๆ )</p><p>ตัวอย่าง</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*bFCYZ4Kxh6JjLp7nUNWEFg.png" /></figure><p>จะเห็นได้ว่าสิ่งที่เพิ่มเติมเข้ามาคือ createUser(firstName: “Jetsupa” , lastName: “krutang” , email: “jetsupa@jan.com”) ซึ่งในวงเล็บจะเป็น input เหมือนกับ Query ข้างบนเลยครับ แน่นอนว่าเราต้องเขียนบอกด้วยว่าจะเอา data output แบบไหน field อะไรบ้างเช่นเคย</p><p>แต่ในความเป็นจริงถ้าเรามี input เยอะๆ แบบนี้จะใช้งานยากมากเพราะ หน้าบ้านต้องคอย map data เข้าไปเป็น input อีกที เพราะฉะนั้นผมจึงแนะนำให้ใช้ท่านี้มากกว่า</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/709/1*hB8e-TQRrMIZWszmmGNcCw.png" /></figure><p>ก็คือเราก็ทำให้ input ที่เข้ามาเป็น Object ไปซะ ทีนี้ field input เราก็เหลือแค่อันเดียวแล้ว ชื่อว่า createUserInput รับเป็น Object นั้นเอง ( แต่เป็นก้อนใหญ่ๆ แทน )</p><h3>3.Schema</h3><p>schema คือหัวใจของทั้งหมดใน GraphQL เลยครับ เพราะว่ามันจะเป็นตัวกำหนด data type ต่างๆที่จะใช้ใน GraphQL รวมถึงการใช้ Query , Mutation ต่างๆว่า GraphQL ของเราจะมี Query , Mutation และ Type อะไรบ้างยกตัวอย่างเช่น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/505/1*WrVB8lr7gBr6G4G9ZqkY3g.png" /></figure><p>ถึงตอนนี้ทุกคนคงอุทานว่า “นี้มัน %$@ อะไรกันวะะะะ” ใจเย็นๆครับ ขอให้กระผมได้อธิบายซักนิด</p><p><strong>Type คืออะไร ????</strong></p><p>อธิบายง่ายๆ type คือ data type นั้นแหละครับ ( พวก string , int ) และสิ่งสำคัญใน GraphQL คือ เราต้องกำหนด field ของ Type ให้กับ data ต่างๆ ที่เราจะใช้ด้วยเช่นจากตัวอย่าง</p><p>Type Company ต้องมี field id เป็น Int , name เป็น string และ users เป็น User</p><p>ตรงนี้แหละครับที่ผมชอบมาก คือเรานอกจากเราจะสามารถสร้าง data Type เองได้แล้ว เรายังสามารถบอกความสัมพันธ์ของ data ได้เช่นบอกว่า field users ของ Company จะต้องออกมาเป็น array ที่มี object หน้าตาเหมือน User เท่านั้น !! และเช่นเดียวกันกับ User ครับ field company ต้องออกมาหน้าตาเป็นแบบ Company เท่านั้น !!!!!</p><p>และนี้คือเหตุผลว่าทำไมตอน Query<strong> </strong>เราถึงสามารถกำหนด field ที่จะใช้ใน Object ซ้อน Object ได้ ก็เพราะว่า เราต้องกำหนดให้มัน นั่นเองครับผม !!!!</p><p>เดี๋ยวนะ แล้วถ้ามัน relation กันเองแบบนี้ถ้าเกิดอยากเรียก users ใน company ที่อยู่ใน users อีกทีนึงล่ะ เรียกมันซะ 3 ชั้นไปเลย แบบนี้ทำได้มั้ย ??????</p><p>คำตอบคือ “ได้ครับ” ผม มันก็จะออกมาหน้าตาเป็นแบบนี้</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/878/1*Hj_0mz_tVaedhmHzawqFFQ.png" /></figure><p>เพราะฉะนั้นเจ้า GraphQL นี้มันไม่มีปัญหาใดๆ กับการเรียก data หลายๆชั้นเพียงแต่ว่าเรา<strong>“ต้องเขียนบอกมัน”</strong>เท่านั้นเอง</p><p><strong>แล้วไอ้ Input คืออะไรอ่ะ ??????</strong></p><p>สำหรับ input นั้นเป็นการบอกว่า data type อันนี้จะมีไว้สำหรับเป็น input เท่านั้นนะจ๊ะเธอจะเป็นอย่างอื่นไม่ได้นะ !! ตัวอย่างเช่น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/502/1*gOuQlO4mPb3QSgE_KabB9A.png" /></figure><p>จากตัวอย่างนี้ มันแปลออกมาได้ว่า</p><p>“Mutation ที่ชื่อ createUser<strong> </strong>เจ้าจะต้องรับ input เป็น object ที่มี field firstName , lastName , email เท่านั้น !! ”</p><p>แล้วถ้าเกิดว่าเราทะลึ่งใส่ field ที่ไม่ได้กำหนดใน schema มาล่ะ ??????</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pPNYh4PBsBjQfJFX5R1tbA.png" /><figcaption>จากรูปผมแอบใส่ phone เข้าไปเพิ่มแต่ไม่ได้เขียนไว้ใน schema</figcaption></figure><p>มันก็จะ error มาด่าเราทันทีเลยครับว่าเราไม่ได้ defind phone ไว้นะเฮ้ย !!!</p><p>เห็นมั้ยครับ GraphQL นี่มันเข้มจริงๆ</p><h3>สรุปกันดีกว่า</h3><blockquote>สำหรับผม ผมมองเจ้า GraphQL เป็นเหมือนกับ เจ้าหน้าที่ รปภ โหดๆ หน้าตาเข้มๆ ดุๆที่ตรวจคนเข้าออกอาคารตลอดเวลา และเราจะค้บพบว่าเขามีประโยชน์มาก ถ้าเรารู้จักใช้งานเขาอย่างถูกที่ถูกทาง</blockquote><p>โดยสรุปแล้วในบทความนี้ผมจะให้ทุกท่านได้ทำความเข้าใจกับ GraphQL กันแบบคร่าวๆ ก่อนว่ามันใช้งานยังไง แตกต่างจาก restful แบบไหนแล้วบทความหน้าผมจะมาต่อในส่วนของ Coding ทั้งฝั่ง Server (Node.js Express )และ Client (React ) และอาจจะเพิ่มเติมในเรื่องของ Subscription เพื่อทำ realtime application ด้วย ( ถ้ายังมีไฟพอนะครับ 555 )</p><h3><strong>ก่อนจากกันขอทิ้งท้ายไว้ซักนิด</strong></h3><p>และถ้าบังเอิญมีใครหลงเข้ามาอ่าน กระผมก็ขอขอบพระคุณเป็นอย่างยิ่ง หวังว่าบทความนี้จะให้ความรู้ท่านไม่มากก็น้อย ถ้ากระผมเขียนอะไรผิดไปหรืออยากถกเถียงถึงเนื้อหาใน blog นี้ก็ comment เข้ามากันได้นะครับ (ผมจะดีใจมาก)</p><p><strong>ยินดีรับฟังคำติชมทุกความเห็นนะครับ</strong></p><p>นอกจากนี้ GraphQL ยังมีของเจ๋งๆ อีกมากมาย ไม่ว่าจะเป็น fragment , scalar หรือการ extend type สามารถไปตามอ่านกันได้ที่ <a href="https://graphql.org/learn/">document ของ graphql ได้เลยครับ</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d8fa526f3f21" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>