{"id":2315,"date":"2024-08-02T08:02:12","date_gmt":"2024-08-01T23:02:12","guid":{"rendered":"https:\/\/secondlife.lol\/?p=2315"},"modified":"2024-08-02T15:14:50","modified_gmt":"2024-08-02T06:14:50","slug":"rental-lease-renewal-termination-schedule-visual-r","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/en\/rental-lease-renewal-termination-schedule-visual-r\/","title":{"rendered":"Create a Gantt Chart Without Excel (feat. R &amp; Lease Renewal)"},"content":{"rendered":"<p>It's not easy to keep track of the renewal and termination dates in the Residential Tenancy Act from text alone. You can use a Gantt chart in Excel, but there's an easier way. All you need to do is copy &amp; paste the source code for the Gantt chart and run it.<\/p>\n\n\n\n<p>In this post, we'll see how to use R to visualize a schedule of lease renewals and terminations. After signing a two-year lease on February 3, 2021, we'll use <a href=\"https:\/\/bravilife.com\/tacit-renewal-jeonse-contract\/\" target=\"_blank\" rel=\"noopener\">Implicit renewals<\/a>We've also created a visual representation of when landlords and tenants should each give notice of non-renewal, so you can get a clearer picture of the important dates.<\/p>\n\n\n<style>.kb-image2315_4640db-9a .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image2315_4640db-9a\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2024\/08\/image-1-2-600x400.jpg\" alt=\"\uac04\ud2b8\ucc28\ud2b8 \uc5d1\uc140\uc5c6\uc774 \ub9cc\ub4dc\ub294 R \uc2dc\uac01\ud654 \uadf8\ub9bc\" class=\"kb-img wp-image-2331\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2024\/08\/image-1-2-600x400.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2024\/08\/image-1-2-300x200.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2024\/08\/image-1-2-768x512.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2024\/08\/image-1-2.jpg 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption>(Result of creating a Gantt chart using R)<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Create a Gantt Chart without Excel<\/h2>\n\n\n\n<p>Here's the lease schedule you want to visualize<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>February 3, 2021: Contract starts<\/li>\n\n\n\n<li>February 2, 2023: End of contract<\/li>\n\n\n\n<li>August 3, 2022 - December 2, 2022: When landlords\/tenants must give notice of non-renewal<\/li>\n\n\n\n<li>May 1, 2023: Tenant termination notice for cause after implied renewal<\/li>\n\n\n\n<li>August 1, 2023: End of contract and release of security deposit<\/li>\n<\/ul>\n\n\n\n<p>If you sign a 2-year worldwide lease on February 3, 2021, your landlord will be able to legally terminate your lease for cause before the end date (February 2, 2023). <strong>6 months<\/strong>On or before August 3, 2022, the contract end date <strong>2 months<\/strong>Landlords and tenants must give notice of non-renewal between December 2, 2022, and the end of the lease if they need to move for personal reasons. <strong>2 months<\/strong>December 2, 2022, to give notice of non-renewal.<\/p>\n\n\n\n<p>In this situation, assuming the implied renewal extended the worldwide lease for two more years, if the tenant gives notice to terminate on May 1, 2023, the landlord would be required to return the security deposit on August 1, 2023, three months after receiving the notice.<\/p>\n\n\n\n<p>Now, let's visualize this complex schedule using R.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">R Code to Create Gantt Charts without Excel Explained<\/h2>\n\n\n\n<p>First, install and load the required packages.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (!require(ggplot2)) install.packages(\"ggplot2\")\nif (!require(dplyr)) install.packages(\"dplyr\")\nlibrary(ggplot2)\nlibrary(dplyr)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Create a data frame<\/h3>\n\n\n\n<p>Create a data frame for the data you want to visualize. Create a data frame with each time period and start and end dates.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df &lt;- data.frame(\n  Task = c(&quot;Initial Contract Term&quot;, &quot;Landlord Notice Period&quot;, &quot;Tenant Notice Period&quot;,\n           &quot;Renewal Contract Term&quot;, &quot;3 months after notice&quot;),\n  Start = as.Date(c(&quot;2021-02-03&quot;, &quot;2022-08-03&quot;, &quot;2022-08-03&quot;,\n                    &quot;2023-02-03&quot;, &quot;2023-05-01&quot;))),\n  End = as.Date(c(&quot;2023-02-02&quot;, &quot;2022-12-02&quot;, &quot;2022-12-02&quot;,\n                  &quot;2025-02-02&quot;, &quot;2023-07-30&quot;))),\n  Section = c(&quot;Initial Contract&quot;, &quot;Notice of Non-Renewal&quot;, &quot;Notice of Non-Renewal&quot;,\n              &quot;Renewal Contract&quot;, &quot;Contract Termination&quot;)\n)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Create a significant date data frame<\/h3>\n\n\n\n<p>Create a data frame of important dates. The data frame you created above is for framing purposes, and the dates in it are what you need to show dotted lines and date labels in your chart. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>important_dates &lt;- as.Date(c(&quot;2021-02-03&quot;, &quot;2023-02-02&quot;, &quot;2022-08-03&quot;, &quot;2022-12-02&quot;,\n                             &quot;2023-01-02&quot;, &quot;2023-02-03&quot;, &quot;2025-02-02&quot;,\n                             &quot;2023-05-01&quot;, &quot;2023-08-01&quot;)))\nimportant_dates &lt;- sort(important_dates)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Improved date label repositioning function<\/h3>\n\n\n\n<p>Define a function to reposition the date labels so that they don't overlap each other. This is the tricky part, because if the date labels we want to display are too close together, they will overlap and be hard to see, so we implement a function that checks for dates that are within 7 days of each other and separates them up or down.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>adjust_label_position &lt;- function(dates) {\n  n &lt;- length(dates)\n  positions &lt;- rep(0, n)\n  last_position &lt;- 0\n  for (i in 2:n) {\n    if (as.numeric(dates[i] - dates[i-1]) &lt;= 7) { # Check for closest dates within 7 days\n      positions[i] &lt;- (last_position + 1) %% 2 # alternate up and down based on previous position\n      last_position &lt;- positions[i]\n    } else {\n      last_position &lt;- 0\n    }\n  }\n  return(positions)\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Adjust the date label position<\/h3>\n\n\n\n<p>Use the function defined above to adjust the date label position.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>label_positions &lt;- adjust_label_position(important_dates)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Create a date label data frame<\/h3>\n\n\n\n<p>Create a data frame with label positions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>date_labels &lt;- data.frame(\n  x = important_dates,\n  y = length(df$Task) + 1,\n  label = format(important_dates, &quot;%Y-%m-%d&quot;),\n  position = label_positions\n)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Create and output plots (charts)<\/h3>\n\n\n\n<p>Generate a plot using ggplot2.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>p &lt;- ggplot() +\n  geom_segment(data = df, aes(x = Start, xend = End, y = Task, yend = Task, color = Section), size = 8) +\n  geom_vline(xintercept = important_dates, linetype = &quot;dashed&quot;, color = &quot;darkgray&quot;) +\n  geom_text(data = date_labels,\n            aes(x = x, y = y + ifelse(position == 0, -0.5, 0.5), label = label),\n            angle = 90, hjust = ifelse(date_labels$position == 0, 1, 0), vjust = 0.5, size = 3) +\n  scale_x_date(date_labels = &quot;%Yyear %mmonth&quot;, date_breaks = &quot;3 months&quot;) +\n  scale_y_discrete(limits = c(df$Task, &quot;&quot;, &quot;&quot;)) +\n  theme_minimal() +\n  labs(title = &quot;Lease renewal and termination schedule (example)&quot;,\n       x = &quot;date&quot;, y = &quot;&quot;) +\n  theme(legend.position = &quot;bottom&quot;,\n        plot.title = element_text(hjust = 0.5, size = 16),\n        axis.text.x = element_text(angle = 45, hjust = 1),\n        panel.grid.minor = element_blank())\n\nprint(p)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Save as PNG format<\/h3>\n\n\n\n<p>Save the resulting plot as a PNG file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ggsave(\"lease_renewal_process_with_alternating_labels.png\", plot = p, width = 15, height = 10, dpi = 300)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Full source code<\/h2>\n\n\n\n<p>Below is the full source code described above. Paste it in and run it to see the image you saw at the top of the post.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud544\uc694\ud55c \ud328\ud0a4\uc9c0 \uc124\uce58 \ubc0f \ub85c\ub4dc\nif (!require(ggplot2)) install.packages(\"ggplot2\")  # ggplot2 \ud328\ud0a4\uc9c0\uac00 \uc5c6\uc73c\uba74 \uc124\uce58\nif (!require(dplyr)) install.packages(\"dplyr\")      # dplyr \ud328\ud0a4\uc9c0\uac00 \uc5c6\uc73c\uba74 \uc124\uce58\nlibrary(ggplot2)  # ggplot2 \ud328\ud0a4\uc9c0 \ub85c\ub4dc (\uadf8\ub798\ud504 \uc0dd\uc131\uc6a9)\nlibrary(dplyr)    # dplyr \ud328\ud0a4\uc9c0 \ub85c\ub4dc (\ub370\uc774\ud130 \uc870\uc791\uc6a9)\n\n# \ub370\uc774\ud130 \ud504\ub808\uc784 \uc0dd\uc131\ndf &lt;- data.frame(\n    Task = c(\"\ucd08\uae30 \uacc4\uc57d \uae30\uac04\", \"\uc9d1\uc8fc\uc778 \ud1b5\uc9c0 \uac00\ub2a5 \uae30\uac04\", \"\uc138\uc785\uc790 \ud1b5\uc9c0 \uac00\ub2a5 \uae30\uac04\",\"\uac31\uc2e0 \uacc4\uc57d \uae30\uac04\", \"\ud1b5\ubcf4 \ud6c4 3\uac1c\uc6d4\"),  # \uac01 \uae30\uac04\uc758 \uc774\ub984\n    Start = as.Date(c(\"2021-02-03\", \"2022-08-03\", \"2022-08-03\",\"2023-02-03\", \"2023-05-01\")),  # \uac01 \uae30\uac04\uc758 \uc2dc\uc791\uc77c\n    End = as.Date(c(\"2023-02-02\", \"2022-12-02\", \"2022-12-02\",\"2025-02-02\", \"2023-07-30\")),    # \uac01 \uae30\uac04\uc758 \uc885\ub8cc\uc77c\n    Section = c(\"\ucd08\uae30 \uacc4\uc57d\", \"\uac31\uc2e0 \uac70\uc808 \ud1b5\uc9c0\", \"\uac31\uc2e0 \uac70\uc808 \ud1b5\uc9c0\",\"\uac31\uc2e0 \uacc4\uc57d\", \"\uacc4\uc57d \ud574\uc9c0\")  # \uac01 \uae30\uac04\uc758 \ubd84\ub958\n)\n\n# \uc911\uc694\ud55c \ub0a0\uc9dc \ub370\uc774\ud130 \ud504\ub808\uc784 \uc0dd\uc131\nimportant_dates &lt;- as.Date(c(\"2021-02-03\", \"2023-02-02\", \"2022-08-03\", \"2022-12-02\",\n                             \"2023-01-02\", \"2023-02-03\", \"2025-02-02\",\n                             \"2023-05-01\", \"2023-08-01\"))  # \uc911\uc694\ud55c \ub0a0\uc9dc\ub4e4\uc744 \ubca1\ud130\ub85c \uc815\uc758\nimportant_dates &lt;- sort(important_dates)  # \ub0a0\uc9dc\ub97c \uc624\ub984\ucc28\uc21c\uc73c\ub85c \uc815\ub82c\n\n# \ub0a0\uc9dc \ub808\uc774\ube14 \uc704\uce58 \uc870\uc815 \ud568\uc218 \uac1c\uc120\nadjust_label_position &lt;- function(dates) {\n    n &lt;- length(dates)\n    positions &lt;- rep(0, n)  # \ubaa8\ub4e0 \uc704\uce58\ub97c 0\uc73c\ub85c \ucd08\uae30\ud654\n    last_position &lt;- 0\n    for (i in 2:n) {\n        if (as.numeric(dates&#91;i] - dates&#91;i-1]) &lt;= 7) {  # 7\uc77c \uc774\ub0b4\uc758 \uadfc\uc811\ud55c \ub0a0\uc9dc \ud655\uc778\n            positions&#91;i] &lt;- (last_position + 1) %% 2     # \uc774\uc804 \uc704\uce58\uc5d0 \ub530\ub77c \uc0c1\ud558 \uad50\ub300 (0 \ub610\ub294 1)\n            last_position &lt;- positions&#91;i]\n        } else {\n            last_position &lt;- 0\n        }\n    }\n    return(positions)\n}\n\n# \ub0a0\uc9dc \ub808\uc774\ube14 \uc704\uce58 \uc870\uc815\nlabel_positions &lt;- adjust_label_position(important_dates)\n\n# \ub0a0\uc9dc \ub808\uc774\ube14 \ub370\uc774\ud130 \ud504\ub808\uc784 \uc0dd\uc131\ndate_labels &lt;- data.frame(\n    x = important_dates,  # x\ucd95 \uc704\uce58 (\ub0a0\uc9dc)\n    y = length(df$Task) + 1,  # y\ucd95 \uc704\uce58 (\ubaa8\ub4e0 Task \uc704\uc5d0 \uc704\uce58)\n    label = format(important_dates, \"%Y-%m-%d\"),  # \ub808\uc774\ube14 \ud14d\uc2a4\ud2b8 (\ub0a0\uc9dc \ud615\uc2dd)\n    position = label_positions  # \ub808\uc774\ube14\uc758 \uc0c1\ud558 \uc704\uce58 (0 \ub610\ub294 1)\n)\n\n# \ud50c\ub86f \uc0dd\uc131\np &lt;- ggplot() +\n    geom_segment(data = df, aes(x = Start, xend = End, y = Task, yend = Task, color = Section), size = 8) +\n    # \uac01 Task\uc5d0 \ub300\ud55c \uae30\uac04\uc744 \ub098\ud0c0\ub0b4\ub294 \uc120\ubd84. x: \uc2dc\uc791\uc77c, xend: \uc885\ub8cc\uc77c, y: Task \uc774\ub984, color: Section\uc73c\ub85c \uc0c9\uc0c1 \uad6c\ubd84\n    \n    geom_vline(xintercept = important_dates, linetype = \"dashed\", color = \"darkgray\") +\n    # \uc911\uc694\ud55c \ub0a0\uc9dc\uc5d0 \uc218\uc9c1\uc120 \ucd94\uac00. linetype: \uc810\uc120, color: \uc9c4\ud55c \ud68c\uc0c9\n    \n    geom_text(data = date_labels,\n              aes(x = x, y = y + ifelse(position == 0, -0.5, 0.5), label = label),\n              angle = 90, hjust = ifelse(date_labels$position == 0, 1, 0), vjust = 0.5, size = 3) +\n    # \ub0a0\uc9dc \ub808\uc774\ube14 \ucd94\uac00. x: \ub0a0\uc9dc \uc704\uce58, y: Task \uc704 \ub610\ub294 \uc544\ub798, label: \ub0a0\uc9dc \ud14d\uc2a4\ud2b8\n    # angle: 90\ub3c4 \ud68c\uc804, hjust &amp; vjust: \ub808\uc774\ube14 \uc815\ub82c, size: \uae00\uc790 \ud06c\uae30\n    \n    scale_x_date(date_labels = \"%Y\ub144 %m\uc6d4\", date_breaks = \"3 months\") +\n    # x\ucd95 \ub0a0\uc9dc \ud615\uc2dd \uc124\uc815. date_labels: \ub144\uc6d4 \ud45c\uc2dc \ud615\uc2dd, date_breaks: 3\uac1c\uc6d4 \uac04\uaca9\uc73c\ub85c \ub208\uae08 \ud45c\uc2dc\n    \n    scale_y_discrete(limits = c(df$Task, \"\", \"\")) +\n    # y\ucd95 \uc124\uc815. limits: Task \uc774\ub984\ub4e4\uacfc \ucd94\uac00 \uc5ec\ubc31 \uc124\uc815\n    \n    theme_minimal() +  # \ucd5c\uc18c\ud55c\uc758 \ud14c\ub9c8 \uc801\uc6a9\n    labs(title = \"\uc784\ub300\ucc28 \uacc4\uc57d \uac31\uc2e0 \ubc0f \ud574\uc9c0 \uc2a4\ucf00\uc974 (\uc608\uc2dc)\",\n         x = \"\ub0a0\uc9dc\", y = \"\") +  # \uadf8\ub798\ud504 \uc81c\ubaa9, x\ucd95 \ub808\uc774\ube14 \uc124\uc815\n    theme(legend.position = \"bottom\",  # \ubc94\ub840 \uc704\uce58\ub97c \uc544\ub798\ub85c \uc124\uc815\n          plot.title = element_text(hjust = 0.5, size = 16),  # \uc81c\ubaa9 \uc911\uc559 \uc815\ub82c \ubc0f \ud06c\uae30 \uc124\uc815\n          axis.text.x = element_text(angle = 45, hjust = 1),  # x\ucd95 \ub808\uc774\ube14 45\ub3c4 \ud68c\uc804\n          panel.grid.minor = element_blank())  # \uc791\uc740 \uaca9\uc790\uc120 \uc81c\uac70\n\n# \ud50c\ub86f \ucd9c\ub825\nprint(p)\n\n# PNG \ud615\uc2dd\uc73c\ub85c \uc800\uc7a5\nggsave(\"lease_renewal_process_with_alternating_labels.png\", plot = p, width = 15, height = 10, dpi = 300)\n# \ud30c\uc77c\uba85, \ud50c\ub86f \uac1d\uccb4, \ub108\ube44, \ub192\uc774, \ud574\uc0c1\ub3c4 \uc124\uc815<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Organize<\/h2>\n\n\n\n<p>In this post, we learned how to use R to visualize a lease renewal and termination schedule. Representing a complex contract schedule as a visualized schedule table makes it easy to see important dates at a glance.<\/p>\n\n\n\n<p>First, I installed the necessary packages, prepared the data, and wrote a function to adjust the date labels so that they don't overlap. Then, I explained the process of using ggplot2 to create a visualization of the lease term and important dates, and saving it as a PNG file.<\/p>\n\n\n\n<p>This visualization technique can help you not only with lease agreements, but also with a variety of scheduling and project planning. As you continue to explore different data visualization techniques, practice communicating the meaning of your data clearly. Additionally, we hope that you will develop the ability to make better decisions through visualized data.<\/p>","protected":false},"excerpt":{"rendered":"<p>It's difficult to understand the dates for renewal and termination of a lease under the Residential Tenancy Act from the text...<\/p>","protected":false},"author":3,"featured_media":2320,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[6],"tags":[176,174,187,186,164,185],"class_list":["post-2315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-r-coding","tag-ggplot2","tag-r-","tag-187","tag-186","tag-164","tag-185"],"taxonomy_info":{"category":[{"value":6,"label":"\uc54c(R)"}],"post_tag":[{"value":176,"label":"ggplot2"},{"value":174,"label":"R \ud504\ub85c\uadf8\ub798\ubc0d"},{"value":187,"label":"\uac04\ud2b8\ucc28\ud2b8"},{"value":186,"label":"\uac31\uc2e0 \uac70\uc808 \ud1b5\uc9c0"},{"value":164,"label":"\ub370\uc774\ud130 \uc2dc\uac01\ud654"},{"value":185,"label":"\uc784\ub300\ucc28 \uacc4\uc57d"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2024\/08\/\uac04\ud2b8\ucc28\ud2b8-\uc5d1\uc140\uc5c6\uc774-\ub9cc\ub4e4\uae30-thumbnail-600x600.jpg",600,600,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/en\/author\/tere\/"},"comment_info":0,"category_info":[{"term_id":6,"name":"\uc54c(R)","slug":"r-coding","term_group":0,"term_taxonomy_id":6,"taxonomy":"category","description":"","parent":20,"count":61,"filter":"raw","cat_ID":6,"category_count":61,"category_description":"","cat_name":"\uc54c(R)","category_nicename":"r-coding","category_parent":20}],"tag_info":[{"term_id":176,"name":"ggplot2","slug":"ggplot2","term_group":0,"term_taxonomy_id":176,"taxonomy":"post_tag","description":"","parent":0,"count":15,"filter":"raw"},{"term_id":174,"name":"R \ud504\ub85c\uadf8\ub798\ubc0d","slug":"r-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d","term_group":0,"term_taxonomy_id":174,"taxonomy":"post_tag","description":"","parent":0,"count":15,"filter":"raw"},{"term_id":187,"name":"\uac04\ud2b8\ucc28\ud2b8","slug":"%ea%b0%84%ed%8a%b8%ec%b0%a8%ed%8a%b8","term_group":0,"term_taxonomy_id":187,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":186,"name":"\uac31\uc2e0 \uac70\uc808 \ud1b5\uc9c0","slug":"%ea%b0%b1%ec%8b%a0-%ea%b1%b0%ec%a0%88-%ed%86%b5%ec%a7%80","term_group":0,"term_taxonomy_id":186,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":164,"name":"\ub370\uc774\ud130 \uc2dc\uac01\ud654","slug":"%eb%8d%b0%ec%9d%b4%ed%84%b0-%ec%8b%9c%ea%b0%81%ed%99%94","term_group":0,"term_taxonomy_id":164,"taxonomy":"post_tag","description":"","parent":0,"count":52,"filter":"raw"},{"term_id":185,"name":"\uc784\ub300\ucc28 \uacc4\uc57d","slug":"%ec%9e%84%eb%8c%80%ec%b0%a8-%ea%b3%84%ec%95%bd","term_group":0,"term_taxonomy_id":185,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts\/2315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/comments?post=2315"}],"version-history":[{"count":9,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts\/2315\/revisions"}],"predecessor-version":[{"id":2333,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts\/2315\/revisions\/2333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/media\/2320"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/media?parent=2315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/categories?post=2315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/tags?post=2315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}