{"id":7380,"date":"2026-08-06T15:11:05","date_gmt":"2026-08-06T06:11:05","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=7380"},"modified":"2026-08-06T22:09:59","modified_gmt":"2026-08-06T13:09:59","slug":"nextjs-guestbook-sqlite","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/06\/nextjs-guestbook-sqlite\/","title":{"rendered":"[nextjs]\ubc29\uba85\ub85d + SQLite \/ Guestbook + SQLite"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \uae30\uc874\uc758 markdown\ud30c\uc77c\uc5d0 \uae00\uc744 \uc800\uc7a5\ud558\ub294 \ubd80\ubd84\uc744 SQLite\ub85c\ubc14\uafe8\uc2b5\ub2c8\ub2e4.<br>I replaced the part that saves text to existing Markdown files with SQLite.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uc774\uc804 \ud3ec\uc2a4\ud2b8 \/ Previous post<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-freelifemakers-org wp-block-embed-freelifemakers-org\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"kVrkxW4hDu\"><a href=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/04\/nextjs-guestbook-markdown\/\">[nextjs]\ubc29\uba85\ub85d +  markdown\ud30c\uc77c \/ Guestbook + Markdown file<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;[nextjs]\ubc29\uba85\ub85d +  markdown\ud30c\uc77c \/ Guestbook + Markdown file&#8221; &#8212; freelifemakers.org\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/04\/nextjs-guestbook-markdown\/embed\/#?secret=oJLCB70Ksu#?secret=kVrkxW4hDu\" data-secret=\"kVrkxW4hDu\" width=\"560\" height=\"315\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\ud83d\udcc1 \uc804\uccb4 \ub514\ub809\ud1a0\ub9ac \uad6c\uc870 \/ Overall directory structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp6\/ \n\u251c\u2500\u2500 app\/ \n\u2502   \u251c\u2500\u2500 api\/ \n\u2502   \u2502   \u2514\u2500\u2500 guestbookapp\/\n\u2502   \u2502       \u2514\u2500\u2500 <strong>route.js<\/strong> \n\u2502   \u251c\u2500\u2500 guestbookapp\/ \n\u2502   \u2502   \u2514\u2500\u2500 <strong>page.tsx <\/strong>\n\u2502   \u251c\u2500\u2500 favicon.ico \n\u2502   \u251c\u2500\u2500 globals.css \n\u2502   \u251c\u2500\u2500 layout.tsx \n\u2502   \u2514\u2500\u2500 page.tsx \n\u2502 \n\u2514\u2500\u2500 <strong>local.db<\/strong> (SQLite3 DB)\n<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uc124\uce58 \/ Project Installation<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npx create-next-app@latest<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 SQLite3 \uc124\uce58 \/ Installing SQLite3<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install better-sqlite3<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ucf54\ub4dc \uc124\uba85 \/ Code Description<\/p>\n\n\n\n<p>\u2714\ufe0f \uc774\uc804 \ubd80\ubd84\uc5d0\uc11c \ubc14\ub010\uac74 \ubc31\uc5d4\ub4dc route.js\uc785\ub2c8\ub2e4.<br>The change from the previous section is in the backend <code>route.js<\/code>.<\/p>\n\n\n\n<p>\u2714\ufe0f page.tsx\ud30c\uc77c\uc740 \uc81c\ubaa9\ub9cc \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4.<br>Only the title has been changed in the page.tsx file.<\/p>\n\n\n\n<p>\u2714\ufe0f \uae00\uc744 \uc800\uc7a5\ud558\uace0 \uc77d\uc5b4 \uc624\ub294 \ub85c\uc9c1\uc774md\ud30c\uc77c\uc5d0\uc11c sqlite\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4.<br>The logic for saving and retrieving posts has been changed from using Markdown files to an SQLite database.<\/p>\n\n\n\n<p>\u2714\ufe0f route.js<\/p>\n\n\n\n<p>&#8212; sqlite3 \ubaa8\ub4c8 \uc124\uc815 \/ Configuring the sqlite3 module<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import Database from 'better-sqlite3';<\/code><\/pre>\n\n\n\n<p>&#8212; \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc5c6\ub2e4\uba74 \uc0dd\uc131\ud569\ub2c8\ub2e4.<br>If the database does not exist, create it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const dbPath = path.join(process.cwd(), 'local.db');\nconst db = new Database(dbPath);\n\n\/\/ \uc11c\ubc84 \uc2dc\uc791 \uc2dc posts \ud14c\uc774\ube14\uc774 \uc5c6\uc73c\uba74 \uc0dd\uc131\ud569\ub2c8\ub2e4.\n\/\/ Create the posts table if it doesn't exist when the server starts.\ndb.exec(`\n  CREATE TABLE IF NOT EXISTS posts (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    slug TEXT UNIQUE NOT NULL,\n    title TEXT NOT NULL,\n    content TEXT NOT NULL,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n  )\n`);<\/code><\/pre>\n\n\n\n<p>&#8212; \ub370\uc774\ud130\uac00 \uc5c6\uc73c\uba74 \ucd08\uae30\ub370\uc774\ud130\ub97c \uc785\ub825 \ud569\ub2c8\ub2e4.<br>If there is no data, enter the initial data.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const checkEmpty = db.prepare('SELECT COUNT(*) as count FROM posts').get();\n\nif (checkEmpty.count === 0) {\n  const insertInitial = db.prepare('INSERT INTO posts (slug, title, content) VALUES (?, ?, ?)');\n  \n  const defaultTitle = '\ubc18\uac11\uc2b5\ub2c8\ub2e4! \uccab \ubc29\ubb38\uc744 \ud658\uc601\ud569\ub2c8\ub2e4.';\n  const defaultSlug = 'welcome-to-my-blog';\n  const defaultContent = `\uc548\ub155\ud558\uc138\uc694! \ube14\ub85c\uadf8 \uc2dc\uc2a4\ud15c\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uad6c\ucd95\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n  \\n\\n\uc774 \uae00\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ube44\uc5b4 \uc788\uc744 \ub54c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub418\ub294 \uccab \uc548\ub0b4\uae00\uc785\ub2c8\ub2e4. \uc790\uc720\ub86d\uac8c \uc0c8 \uae00\uc744 \uc791\uc131\ud558\uc5ec \ube14\ub85c\uadf8\ub97c \ucc44\uc6cc\ubcf4\uc138\uc694!\n  \\n\\nHello! The blog system has been successfully set up.\n  \\n\\nThis post is the first greeting that is automatically created when the database is empty. Feel free to write new posts and fill your blog!\n  `;\n\n  insertInitial.run(defaultSlug, defaultTitle, defaultContent);\n  console.log(' \ucd08\uae30 \uc778\uc0ac\ub9d0 \ub370\uc774\ud130\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \/ Initial greeting data has been successfully created.');\n}<\/code><\/pre>\n\n\n\n<p>&#8212; \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac80\uc0c9\ud574\uc11c json\uc73c\ub85c \uc751\ub2f5\ud569\ub2c8\ub2e4.(GET\uc694\uccad \ucc98\ub9ac)<br>Retrieves data from the database and responds with JSON (handles GET requests).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export async function GET() {\n  try {\n    \/\/ \ucd5c\uc2e0 \ub4f1\ub85d \uc21c\uc11c(created_at \ub0b4\ub9bc\ucc28\uc21c)\ub85c \ub370\uc774\ud130\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.\n    \/\/ Fetch data in the order of latest registration (descending order of created_at)\n    const stmt = db.prepare('SELECT slug, title, content FROM posts ORDER BY created_at DESC');\n    const posts = stmt.all();\n\n    return NextResponse.json(posts);\n  } catch (error) {\n    console.error(\"SQLite \uc870\ud68c \uc624\ub958 \/ SQLite read error:\", error);\n    return NextResponse.json(\n      { message: \"\ub370\uc774\ud130\ub97c \uc77d\uc5b4\uc624\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \/ Failed to read data.\" }, \n      { status: 500 }\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p>&#8212; \ub370\uc774\ud130 \ubca0\uc774\uc2a4\uc5d0 \uae00\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.(POST \uc694\uccad \ucc98\ub9ac)<br>Inserts the post into the database (handling the POST request).<\/p>\n\n\n\n<p>&#8212; \uae00 \uc800\uc7a5 \uc131\uacf5\uc2dc status:201\uc744 \ub9ac\ud134\ud569\ub2c8\ub2e4.<br>Returns status: 201 upon successful post saving.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/ Handle POST request (data registration)\nexport async function POST(request) {\n  try {\n    const body = await request.json();\n    const { title, content } = body;\n\n    if (!title || !content) {\n      return NextResponse.json(\n        { message: '\uc81c\ubaa9\uacfc \ub0b4\uc6a9\uc744 \ubaa8\ub450 \uc785\ub825\ud574\uc8fc\uc138\uc694. \/ Please enter both title and content.' }, \n        { status: 400 }\n      );\n    }\n\n    \/\/ slug \ub9cc\ub4e4\uae30 - \uacf5\ubc31\uc744 \ud558\uc774\ud508\uc73c\ub85c \ub300\uccb4\ud558\uace0 \ud2b9\uc218\ubb38\uc790 \uc81c\uac70\n    \/\/ Create slug - replace spaces with hyphens and remove special characters\n    const slug = title\n      .trim()\n      .replace(\/\\s+\/g, '-')\n      .replace(\/&#91;^a-zA-Z0-9\uac00-\ud7a3\\-]\/g, '');\n\n    \/\/ \uc911\ubcf5\ub41c slug(\uc81c\ubaa9)\uac00 \uc788\ub294\uc9c0 \ud655\uc778\n    \/\/ Check for duplicate slug (title)\n    const checkStmt = db.prepare('SELECT id FROM posts WHERE slug = ?');\n    const existingPost = checkStmt.get(slug);\n\n    if (existingPost) {\n      return NextResponse.json(\n        { message: '\uc774\ubbf8 \ub3d9\uc77c\ud55c \uc81c\ubaa9\uc758 \uae00\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4. \/ A post with the same title already exists.' }, \n        { status: 409 }\n      );\n    }\n\n    \/\/ \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc0c8 \uac8c\uc2dc\uae00 \uc0bd\uc785\n    \/\/ Insert new post into the database\n    const insertStmt = db.prepare('INSERT INTO posts (slug, title, content) VALUES (?, ?, ?)');\n    insertStmt.run(slug, title, content);\n\n    \/\/ \uc131\uacf5 \uc2dc \ubc18\ud658\ud560 \ub370\uc774\ud130 \uac1d\uccb4\n    \/\/ Data object to return on success\n    const newPost = { slug, title, content };\n\n    return NextResponse.json(newPost, { status: 201 });\n\n  } catch (error) {\n    console.error(\"SQLite \uc800\uc7a5 \uc624\ub958 \/ SQLite write error:\", error);\n    return NextResponse.json(\n      { message: '\uc11c\ubc84\uc5d0 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \/ Failed to save data.' }, \n      { status: 500 }\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \uc11c\ubc84 \uc2e4\ud589 \/ Start Server<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run dev<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 API\ud14c\uc2a4\ud2b8 \/ API Test<\/p>\n\n\n\n<p>&#8212; http:\/\/localhost:3000\/api\/guestbookapp<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"349\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-api-jpg.jpg\" alt=\"\" class=\"wp-image-7412\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-api-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-api-jpg-300x131.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-api-jpg-768x335.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-api-jpg-400x175.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">API<\/figcaption><\/figure>\n\n\n\n<p>\ud83d\udcc1 \uae00 \uc785\ub825 \ud14c\uc2a4\ud2b8 \/ Text input test<\/p>\n\n\n\n<p>&#8212;  http:\/\/localhost:3000\/guestbookapp<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"1024\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-frontend2-jpg-769x1024.jpg\" alt=\"\" class=\"wp-image-7414\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-frontend2-jpg-769x1024.jpg 769w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-frontend2-jpg-225x300.jpg 225w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-frontend2-jpg-768x1022.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-frontend2-jpg-400x533.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp6-frontend2-jpg.jpg 800w\" sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><figcaption class=\"wp-element-caption\">page.tsx<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1SQLite CLI<\/p>\n\n\n\n<p>\u2714\ufe0f \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \/ Database Connection<\/p>\n\n\n\n<p>&#8212;  \ud504\ub85c\uc81d\ud2b8 \ub85c\uceec\uc5d0 \ub9cc\ub4e4\uc5b4\uc9c4 local.db\ud30c\uc77c\uc744 \uc5f4\ub584 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br>This is used to open the <code>local.db<\/code> file created in the project&#8217;s local directory.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp6 % <strong>sqlite3 local.db<\/strong>\nSQLite version 3.51.0 2000-10-10 10:10:10\nEnter \".help\" for usage hints.\nsqlite> \n<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uc804\uccb4 \ud14c\uc774\ube14 \ubcf4\uae30<br>View full table<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlite> <strong>.tables<\/strong>\nposts<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ud14c\uc774\ube14 \uad6c\uc870 \ubcf4\uae30<br>View table structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlite> <strong>.schema posts<\/strong>\nCREATE TABLE posts (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    slug TEXT UNIQUE NOT NULL,\n    title TEXT NOT NULL,\n    content TEXT NOT NULL,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n  );<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlite> <strong>pragma table_info(posts);<\/strong>\n0|id|INTEGER|0||1\n1|slug|TEXT|1||0\n2|title|TEXT|1||0\n3|content|TEXT|1||0\n4|created_at|DATETIME|0|CURRENT_TIMESTAMP|0<\/code><\/pre>\n\n\n\n<p><code>- cid<\/code>: \uceec\ub7fc \uc21c\ubc88 (0, 1, 2&#8230;) \/ Column index (0, 1, 2\u2026)<br><code>- name<\/code>: \uceec\ub7fc \uc774\ub984 \/ Column name<br><code>- type<\/code>: \ub370\uc774\ud130 \ud0c0\uc785 (TEXT, INTEGER \ub4f1) \/ Data types (TEXT, INTEGER, etc.)<br><code>- notnull<\/code>: NOT NULL \uc5ec\ubd80 (1\uc774\uba74 \ud544\uc218 \uc785\ub825) \/ NOT NULL status (1 indicates a required field)<br><code>- dflt_value<\/code>: \uae30\ubcf8\uac12 \/ Default value<br><code>- pk<\/code>: \uae30\ubcf8\ud0a4 \uc5ec\ubd80 (1\uc774\uba74 PK) \/ Primary key status (1 if PK)<\/p>\n\n\n\n<p>\u2714\ufe0f \ub370\uc774\ud130 \ubca0\uc774\uc2a4 \uac80\uc0c9 \/ Database Search<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlite> <strong>select id,title from posts<\/strong>;\n1|\ubc18\uac11\uc2b5\ub2c8\ub2e4! \uccab \ubc29\ubb38\uc744 \ud658\uc601\ud569\ub2c8\ub2e4.\n2|test\nsqlite><\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb \uae30\uc874\uc758 markdown\ud30c\uc77c\uc5d0 \uae00\uc744 \uc800\uc7a5\ud558\ub294 \ubd80\ubd84\uc744 SQLite\ub85c\ubc14\uafe8\uc2b5\ub2c8\ub2e4.I replaced the part that saves text to existing Markdown files with SQLite. \ud83d\udc49\ud83c\udffb \uc774\uc804 \ud3ec\uc2a4\ud2b8 \/ Previous post \ud83d\udcc1 \uc804\uccb4 \ub514\ub809\ud1a0\ub9ac \uad6c\uc870 \/ Overall directory structure \ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uc124\uce58 \/ Project Installation \ud83d\udcc1 SQLite3 \uc124\uce58 \/ Installing SQLite3 \ud83d\udcc1 \ucf54\ub4dc \uc124\uba85 \/ Code Description \u2714\ufe0f \uc774\uc804 \ubd80\ubd84\uc5d0\uc11c \ubc14\ub010\uac74 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,1,7],"tags":[],"class_list":["post-7380","post","type-post","status-publish","format-standard","hentry","category-nextjs","category-uncategorized","category-website","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=7380"}],"version-history":[{"count":36,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7380\/revisions"}],"predecessor-version":[{"id":7419,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7380\/revisions\/7419"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=7380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=7380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=7380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}