<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>양들의 성</title>
    <link>https://sheepscastle.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 12:40:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>양들의 훈</managingEditor>
    <item>
      <title>(내일배움캠프)260316 TIL</title>
      <link>https://sheepscastle.tistory.com/5</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;오늘은 Git 사용법에 대해서 공부 하였습니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;먼저 Git 이란?&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 만들거나 작성한 파일이나 코드들의 변경 사항을 저장하고 관리하는 도구로서, 여러 사람과 작업할 때 수정내역을 더 추적하기 쉽게하고 협업할 수 있게 해주는 것입니다. 버전 관리 시스템이라고도 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0HroT/dJMcaiWQZJe/rqggk6DtIasQfqMomHt0lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0HroT/dJMcaiWQZJe/rqggk6DtIasQfqMomHt0lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0HroT/dJMcaiWQZJe/rqggk6DtIasQfqMomHt0lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0HroT%2FdJMcaiWQZJe%2Frqggk6DtIasQfqMomHt0lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;50&quot; height=&quot;26&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;26&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git을 이용하여 폴더에 git init을 하여 초기화 해주면 폴더에 .git이라는 숨겨진 폴더가 생겨나는데 그 안에서 폴더에서 일어나는 모든 변화를 저장하고 기록을 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 폴더에 있는 기록을 이용해서 내가 작업하던 내역을 확인하거나 협업 중에 변경된 내용등을 쉽게 찾아볼 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그럼 Github는 무엇인가?&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 git만 이용하면 팀원과의 협업을 할 수가 없는데, 위에서 말했듯이 .git 폴더에 기록을 하는 것이기 때문에 팀원가 .git 폴더를 계속해서 공유를 하며 변화가 있을때마다 팀원에게서 .git 폴더를 받으면 많이 불편할겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 생긴게 Github로, 내가 만든 프로젝트를 Github에 올려 저장하여 어디에서든 다운로드, 코드 리뷰, 병합, 수정 등을 할 수 있게해주는 프로젝트 공유 사이트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브에서는 시각적으로 보이게 해주는 기능들도 많아서 편의성이 많이 좋아지는것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 Git 협업 과제로 나온 내용을 해결해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 계획 잡기&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 첫번째로 우리가 해야할 내용들을 진행과정을 볼 수 있도록 정리해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브에 있는 프로젝트와 이슈 기능을 사용하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxUN1f/dJMcaduscwn/Gk5uaPM2WzqY4q4MySEae0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxUN1f/dJMcaduscwn/Gk5uaPM2WzqY4q4MySEae0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxUN1f/dJMcaduscwn/Gk5uaPM2WzqY4q4MySEae0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxUN1f%2FdJMcaduscwn%2FGk5uaPM2WzqY4q4MySEae0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1804&quot; height=&quot;504&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀원이 해야할 내용을 Issue를 생성하여서 Ready 파트에 넣었습니다. Ready는 리소스나 준비등이 완료된 Issue를 넣는 곳으로 간단한 자기소개 md 문서를 작성하여서 올리는 것은 Ready 파트라고 생각하여 넣었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blt2I9/dJMcaf6VteJ/4GpYKkASK3jyeWxYYg4s41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blt2I9/dJMcaf6VteJ/4GpYKkASK3jyeWxYYg4s41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blt2I9/dJMcaf6VteJ/4GpYKkASK3jyeWxYYg4s41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblt2I9%2FdJMcaf6VteJ%2F4GpYKkASK3jyeWxYYg4s41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;349&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 브랜치 main 병합은 PullRequest를 통해서 팀원들에게 모두 리뷰를 받고 진행하기로 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 feature 브랜치에 양성훈이라는 브랜치를 만들려고 하니 이런 에러가 발생했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773659409859&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -b feature/양성훈&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1773658241683&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;19:48:22.842: [D:\_dev\spartaGit\sparta-infinity-git-cowork] git -c credential.helper= -c core.quotepath=false -c log.showSignature=false push --progress --porcelain origin refs/heads/feature/양성훈:refs/heads/feature/양성훈 --set-upstream
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
remote: fatal error in commit_refs        
error: failed to push some refs to 'https://github.com/tjdgns0618/sparta-infinity-git-cowork.git'
To https://github.com/tjdgns0618/sparta-infinity-git-cowork.git
!	refs/heads/feature/양성훈:refs/heads/feature/양성훈	[remote rejected] (failure)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유를 알고보니 feature라는 브랜치를 먼저 만들고 해서 오류가 나는거였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치를 지운다음 다시 하니 잘 작동하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LABKn/dJMcahRc6K6/3USEAj21Hpm861cXgTZLHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LABKn/dJMcahRc6K6/3USEAj21Hpm861cXgTZLHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LABKn/dJMcahRc6K6/3USEAj21Hpm861cXgTZLHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLABKn%2FdJMcahRc6K6%2F3USEAj21Hpm861cXgTZLHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;186&quot; height=&quot;130&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 자기소개 md 문서 작성 / PullRequest 작성&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;96&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNUGS/dJMcach42xJ/eoFxNOSia8813Xvt0WhTl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNUGS/dJMcach42xJ/eoFxNOSia8813Xvt0WhTl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNUGS/dJMcach42xJ/eoFxNOSia8813Xvt0WhTl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNUGS%2FdJMcach42xJ%2FeoFxNOSia8813Xvt0WhTl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;96&quot; height=&quot;33&quot; data-origin-width=&quot;96&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 양성훈.md를 만들어서 자기소개를 작성해주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blwH6s/dJMcad2izmn/SHKwOLjA5t8OkEZZGnMhm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blwH6s/dJMcad2izmn/SHKwOLjA5t8OkEZZGnMhm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blwH6s/dJMcad2izmn/SHKwOLjA5t8OkEZZGnMhm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblwH6s%2FdJMcad2izmn%2FSHKwOLjA5t8OkEZZGnMhm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;113&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치를 만들어서 체크아웃 하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;102&quot; data-origin-height=&quot;29&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/99h6j/dJMcahp9San/YkUiCvxg0L4jjjYN7kHLB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/99h6j/dJMcahp9San/YkUiCvxg0L4jjjYN7kHLB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/99h6j/dJMcahp9San/YkUiCvxg0L4jjjYN7kHLB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F99h6j%2FdJMcahp9San%2FYkUiCvxg0L4jjjYN7kHLB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;102&quot; height=&quot;29&quot; data-origin-width=&quot;102&quot; data-origin-height=&quot;29&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjNSq2/dJMcahjpIuf/59oOCE47MVVbXsOfLiSZ4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjNSq2/dJMcahjpIuf/59oOCE47MVVbXsOfLiSZ4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjNSq2/dJMcahjpIuf/59oOCE47MVVbXsOfLiSZ4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjNSq2%2FdJMcahjpIuf%2F59oOCE47MVVbXsOfLiSZ4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;152&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;members 폴더를 만들어 그안에 양성훈.md 문서를 넣어주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 members 폴더가 untracked 상태로 있는것을 확인하고 members 폴더를 Stage에 넣었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKfFzA/dJMb99Ta3EK/DOoXZOJezrGzfVIfqVc5Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKfFzA/dJMb99Ta3EK/DOoXZOJezrGzfVIfqVc5Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKfFzA/dJMb99Ta3EK/DOoXZOJezrGzfVIfqVc5Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKfFzA%2FdJMb99Ta3EK%2FDOoXZOJezrGzfVIfqVc5Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;204&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git add members를 통해서 폴더를 Stage 상태로 변경하고 commit을 진행하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZMnl6/dJMcajaoa84/wQXf5kJmhzce6K6jHepbMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZMnl6/dJMcajaoa84/wQXf5kJmhzce6K6jHepbMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZMnl6/dJMcajaoa84/wQXf5kJmhzce6K6jHepbMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZMnl6%2FdJMcajaoa84%2FwQXf5kJmhzce6K6jHepbMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;84&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 commit 제목을 간단히 적어주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmoODk/dJMcacWEZi8/NOkK0YpZ7kqpbpZvKymM7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmoODk/dJMcacWEZi8/NOkK0YpZ7kqpbpZvKymM7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmoODk/dJMcacWEZi8/NOkK0YpZ7kqpbpZvKymM7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmoODk%2FdJMcacWEZi8%2FNOkK0YpZ7kqpbpZvKymM7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;236&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;push를 통해서 새로 만든 브랜치와 커밋 내용을 깃허브에 적용해 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yZubt/dJMcaaYQIQ9/4tguPqNN9wHQEwPVR4JC2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yZubt/dJMcaaYQIQ9/4tguPqNN9wHQEwPVR4JC2K/img.png&quot; data-alt=&quot;깃허브에 잘 올라간 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yZubt/dJMcaaYQIQ9/4tguPqNN9wHQEwPVR4JC2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyZubt%2FdJMcaaYQIQ9%2F4tguPqNN9wHQEwPVR4JC2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;956&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;956&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깃허브에 잘 올라간 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 PullRequest를 작성해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RsfL9/dJMcabXLXZX/glUhkDlcqmKsLMEG85dTQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RsfL9/dJMcabXLXZX/glUhkDlcqmKsLMEG85dTQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RsfL9/dJMcabXLXZX/glUhkDlcqmKsLMEG85dTQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRsfL9%2FdJMcabXLXZX%2FglUhkDlcqmKsLMEG85dTQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1261&quot; height=&quot;698&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용은 위와 같이 작성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에는 main 브랜치와 병합만 하면 끝입니다!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hkp2J/dJMcahwVRhX/obM7wL1t30CCHwXsK6V7yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hkp2J/dJMcahwVRhX/obM7wL1t30CCHwXsK6V7yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hkp2J/dJMcahwVRhX/obM7wL1t30CCHwXsK6V7yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHkp2J%2FdJMcahwVRhX%2FobM7wL1t30CCHwXsK6V7yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;704&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>스파르타코딩클럽 Spring4기 내일배움캠프</category>
      <author>양들의 훈</author>
      <guid isPermaLink="true">https://sheepscastle.tistory.com/5</guid>
      <comments>https://sheepscastle.tistory.com/5#entry5comment</comments>
      <pubDate>Mon, 16 Mar 2026 20:00:35 +0900</pubDate>
    </item>
    <item>
      <title>(내일배움캠프)260312 TIL</title>
      <link>https://sheepscastle.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;어제 진행했던 과제에서 문제를 하나 발견했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-03-12 101610.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dixK24/dJMcabDqdGT/wP34d6vhEfA31knkb1vFWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dixK24/dJMcabDqdGT/wP34d6vhEfA31knkb1vFWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dixK24/dJMcabDqdGT/wP34d6vhEfA31knkb1vFWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdixK24%2FdJMcabDqdGT%2FwP34d6vhEfA31knkb1vFWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;643&quot; data-filename=&quot;스크린샷 2026-03-12 101610.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-03-12 101614.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctYCyk/dJMcafsgDli/Fl5oqS8Upl5Hkr8B8iOTY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctYCyk/dJMcafsgDli/Fl5oqS8Upl5Hkr8B8iOTY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctYCyk/dJMcafsgDli/Fl5oqS8Upl5Hkr8B8iOTY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctYCyk%2FdJMcafsgDli%2FFl5oqS8Upl5Hkr8B8iOTY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1710&quot; height=&quot;537&quot; data-filename=&quot;스크린샷 2026-03-12 101614.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pa6n2/dJMcabXIxSW/kJAe7kHORcAklmVZqzqK01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pa6n2/dJMcabXIxSW/kJAe7kHORcAklmVZqzqK01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pa6n2/dJMcabXIxSW/kJAe7kHORcAklmVZqzqK01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpa6n2%2FdJMcabXIxSW%2FkJAe7kHORcAklmVZqzqK01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;274&quot; height=&quot;132&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;분명 이름과 카테고리를 입력하지 않으면 등록 함수를 실행하지 않도록 하였는데 그냥 등록이 되어버렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773278327678&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getDatas(){
    const name = document.getElementById('resName').value;
    const category = document.getElementById('resCategory').value;
    const address = document.getElementById('resAddress').value;
    const call = document.getElementById('resCall').value;
    const rating = document.getElementById('resRating').value;
// --------------------이 부분----------------------
    if (!name || !category) {
        return alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
    }		
// --------------------이 부분----------------------
    return {
        name,
        category,
        address,
        call,
        rating: Number(rating)
    };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문제가 되는 곳은 어제 폼에 입력된 값들을 저장하여 json객체로 만드는 과정 중에 이름과 카테고리를 검사하는 부분이 함수로 같이 빠져버려서였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따로 만든 함수에서 저렇게 return alert을 하면 getDatas 함수에 대해서만 return alert을 한 것이기 때문에 그다음으로 진행되는 등록 함수 내용은 그대로 진행이 되는 것이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 구조를 보면 이름과 카테고리가 빠져있으면 밑에 내용 또한 진행하지 않기 때문에 address, call, rating에 대한 값을 입력하고 등록을 하여도 전부 사라지는 것을 알 수 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGq16U/dJMcagY0DTm/Mm5PwA9MKLcQnMvRd1iQp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGq16U/dJMcagY0DTm/Mm5PwA9MKLcQnMvRd1iQp1/img.png&quot; width=&quot;506&quot; height=&quot;279&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;453&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.6854%; margin-right: 10px;&quot; data-widthpercent=&quot;52.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGq16U/dJMcagY0DTm/Mm5PwA9MKLcQnMvRd1iQp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGq16U%2FdJMcagY0DTm%2FMm5PwA9MKLcQnMvRd1iQp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tc3dp/dJMcaaYNmKf/k9EhcEfFKPcHa6YSW2FI11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tc3dp/dJMcaaYNmKf/k9EhcEfFKPcHa6YSW2FI11/img.png&quot; data-origin-width=&quot;245&quot; data-origin-height=&quot;148&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.1518%;&quot; data-widthpercent=&quot;47.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tc3dp/dJMcaaYNmKf/k9EhcEfFKPcHa6YSW2FI11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftc3dp%2FdJMcaaYNmKf%2Fk9EhcEfFKPcHa6YSW2FI11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;245&quot; height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 해결 방안으로 저 부분을 등록, 수정 함수 부분으로 돌려놓기로 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773278693951&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function addRestaurant() {
    if(editId) return updateRestaurant();

    const placeData = getDatas();

    if (!placeData.name || !placeData.category) {
        return alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
    }
	......
}
async function updateRestaurant(){
    const placeData = getDatas();

    if (!placeData.name || !placeData.category) {
        return alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
    }
    ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;받아온 데이터에 name과 category를 검사해야 하기 때문에 placeData.name, placeData.category를 이용하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS8niq/dJMcadgVPeA/cGkMNqnHSDVaHd2BdNtbR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS8niq/dJMcadgVPeA/cGkMNqnHSDVaHd2BdNtbR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS8niq/dJMcadgVPeA/cGkMNqnHSDVaHd2BdNtbR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS8niq%2FdJMcadgVPeA%2FcGkMNqnHSDVaHd2BdNtbR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;592&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문제가 해결되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;완전 바이브 코딩으로 프론트엔드 끝내보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;v0라는 ai를 이용해서 맛집 관리 프로젝트 프론트엔드 구현해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v0는 프론트엔드 개발을 해주는 ai 인 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 지금까지의 내용을 바탕으로 생각나는 대로 프롬프트를 작성해 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773313766545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;다음 조건으로 맛집 관리 웹 앱을 만들어줘

내 Mock 서버 URL
https://---.mockapi.io/places

데이터 구조 예시
{  &quot;id&quot;: 1,  &quot;name&quot;: &quot;명동교자 본점&quot;,  &quot;address&quot;: &quot;서울 중구 명동10길 29&quot;,  &quot;call&quot;: &quot;02-776-5348&quot;,  &quot;category&quot;: &quot;한식&quot;,  &quot;rating&quot;: 5  }

필수 기능 예시
- 맛집 전체 조회 (GET /places)
- 맛집 등록 (POST /places)
- 맛집 삭제 (DELETE /places/:id)
- 맛집 수정 (PUT /places/:id)

기술 스택 예시
html로만 이루어지게 만드는데 css, js 기능도 구현해야해

요구사항 예시
- 최신 유행 트렌드에 맞춘 목록 UI
- 카테고리 별로 필터링하는 기능 구현
- 등록 폼은 모달 또는 별도 영역으로 구성
- 이름 검색 기능 구현
- 평점 순서, 등록 순서, 가나다 순서 등으로 정렬하는 기능 구현
- 수정 폼 또한 동일하나 UI 색깔이나 형태는 다르게 하기

-&amp;gt; 정렬 선택 창이 카테고리 바로 위 검색 밑으로 옮겨

-&amp;gt; 받은 데이터에서 평점이 5점을 넘어가면 5점으로 변경해&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;밑의 추가 구현 사항을 넣어서 UI를 깔끔하게 정돈하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6vKWq/dJMcajuEVzo/Zw6mkfhsAqCbgojTHCD26K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6vKWq/dJMcajuEVzo/Zw6mkfhsAqCbgojTHCD26K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6vKWq/dJMcajuEVzo/Zw6mkfhsAqCbgojTHCD26K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6vKWq%2FdJMcajuEVzo%2FZw6mkfhsAqCbgojTHCD26K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1460&quot; height=&quot;602&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이와 같이 깔끔하게 웹 페이지가 만들어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 필수 구현 기능인 맛집 전체 조회, 맛집 등록, 맛집 삭제, 맛집 수정 기능이 잘 구현되어 있는지 확인해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 맛집 전체 조회는 화면에서 보이듯 MockAPI 서버에서 잘 불러와진 것이 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSOCw9/dJMcacvAwpU/PrcYVXqCaQwk9kRWrXIuQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSOCw9/dJMcacvAwpU/PrcYVXqCaQwk9kRWrXIuQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSOCw9/dJMcacvAwpU/PrcYVXqCaQwk9kRWrXIuQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSOCw9%2FdJMcacvAwpU%2FPrcYVXqCaQwk9kRWrXIuQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;707&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;제가 추가로 추가 요구사항으로 넣었던 맛집 등록폼입니다. 모달을 이용하여서 화면에 깔끔하게 띄워주었네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제로 추가를 해보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3iWAy/dJMcafZ6m6m/1bWOJv3RrSia0tQlik4YVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3iWAy/dJMcafZ6m6m/1bWOJv3RrSia0tQlik4YVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3iWAy/dJMcafZ6m6m/1bWOJv3RrSia0tQlik4YVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3iWAy%2FdJMcafZ6m6m%2F1bWOJv3RrSia0tQlik4YVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;374&quot; data-filename=&quot;image (5).png&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xxMbF/dJMcacPRQNn/GKS6U94dgXHksPR4ZiN9yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xxMbF/dJMcacPRQNn/GKS6U94dgXHksPR4ZiN9yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xxMbF/dJMcacPRQNn/GKS6U94dgXHksPR4ZiN9yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxxMbF%2FdJMcacPRQNn%2FGKS6U94dgXHksPR4ZiN9yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;116&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제로 서버로 POST 요청이 갔고 화면에도 추가된 카드가 잘 그려졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 수정입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NjdGE/dJMcafeM1ZB/dlLnBgjra6s2n4xzX8tnvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NjdGE/dJMcafeM1ZB/dlLnBgjra6s2n4xzX8tnvK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;692&quot; data-filename=&quot;image (2).png&quot; width=&quot;476&quot; height=&quot;593&quot; style=&quot;width: 39.2421%; margin-right: 10px;&quot; data-widthpercent=&quot;39.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NjdGE/dJMcafeM1ZB/dlLnBgjra6s2n4xzX8tnvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjdGE%2FdJMcafeM1ZB%2FdlLnBgjra6s2n4xzX8tnvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDFCVC/dJMcagdFXo6/9NZuejkKRHDqBJk6C1rhr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDFCVC/dJMcagdFXo6/9NZuejkKRHDqBJk6C1rhr1/img.png&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;289&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.5951%;&quot; data-widthpercent=&quot;60.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDFCVC/dJMcagdFXo6/9NZuejkKRHDqBJk6C1rhr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDFCVC%2FdJMcagdFXo6%2F9NZuejkKRHDqBJk6C1rhr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnNlB/dJMcafeM12z/3TgNNziSlGOJhcYpWyPBck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnNlB/dJMcafeM12z/3TgNNziSlGOJhcYpWyPBck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnNlB/dJMcafeM12z/3TgNNziSlGOJhcYpWyPBck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtnNlB%2FdJMcafeM12z%2F3TgNNziSlGOJhcYpWyPBck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;143&quot; data-filename=&quot;image (4).png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;수정폼의 형태를 구분하기 위해서 요청했던 사항도 잘 적용되어 있었습니다. 그리고 실제로 서버로 PUT 요청을 보내서 정보 수정도 잘 이루어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 삭제입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlQwH3/dJMcajnQseT/hWLz33Cjh3Mc5kks4dkmK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlQwH3/dJMcajnQseT/hWLz33Cjh3Mc5kks4dkmK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlQwH3/dJMcajnQseT/hWLz33Cjh3Mc5kks4dkmK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlQwH3%2FdJMcajnQseT%2FhWLz33Cjh3Mc5kks4dkmK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;347&quot; data-filename=&quot;image (6).png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;삭제 버튼을 누르면 이와 같이 확인창이 나오게 되고 삭제하기를 누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nrrNL/dJMcaiWOc5t/22975xm6ECB9p1irV3z0OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nrrNL/dJMcaiWOc5t/22975xm6ECB9p1irV3z0OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nrrNL/dJMcaiWOc5t/22975xm6ECB9p1irV3z0OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnrrNL%2FdJMcaiWOc5t%2F22975xm6ECB9p1irV3z0OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1460&quot; height=&quot;602&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YJAFk/dJMcajnQsf2/tguIM98U3aYlcTj9VlPF0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YJAFk/dJMcajnQsf2/tguIM98U3aYlcTj9VlPF0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YJAFk/dJMcajnQsf2/tguIM98U3aYlcTj9VlPF0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYJAFk%2FdJMcajnQsf2%2FtguIM98U3aYlcTj9VlPF0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;163&quot; data-filename=&quot;image (7).png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 서버로 DELETE 요청이 잘 가고 삭제가 된 후 화면도 다시 잘 그려주는 것을 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;v0에서 만든 페이지는 실제로 배포도 해볼 수 있게 되어있어서 해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://v0-restaurant-management-app-self.vercel.app/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://v0-restaurant-management-app-self.vercel.app/index.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773314657049&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;맛집 관리&quot; data-og-description=&quot;&quot; data-og-host=&quot;v0-restaurant-management-app-self.vercel.app&quot; data-og-source-url=&quot;https://v0-restaurant-management-app-self.vercel.app/index.html&quot; data-og-url=&quot;https://v0-restaurant-management-app-self.vercel.app/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://v0-restaurant-management-app-self.vercel.app/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://v0-restaurant-management-app-self.vercel.app/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;맛집 관리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;v0-restaurant-management-app-self.vercel.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스파르타코딩클럽 Spring4기 내일배움캠프</category>
      <author>양들의 훈</author>
      <guid isPermaLink="true">https://sheepscastle.tistory.com/4</guid>
      <comments>https://sheepscastle.tistory.com/4#entry4comment</comments>
      <pubDate>Thu, 12 Mar 2026 20:24:49 +0900</pubDate>
    </item>
    <item>
      <title>(내일배움캠프)260311 TIL</title>
      <link>https://sheepscastle.tistory.com/3</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;어제 하던 과제를 이어서 진행하였습니다.&lt;/h4&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단계 1-4. API 명세서 만들어보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이번 단계의 목적&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연동한 API를 문서로 정리하며 API 명세서가 왜 필요한지 직접 느껴보기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;맛집 목록 전체 조회 API 명세서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domain: places&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url: dd6e73e4-a664-4b36-99ca-a6e84eb72f58.mock.pstmn.io/places&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;method: GET&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;API 설명&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에 저장된 모든 맛집 목록을 조회하는 API 입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요청(Request)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;a. Parameter &amp;amp; Querystring&lt;/p&gt;
&lt;pre id=&quot;code_1773205082932&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;none&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;none&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;none&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b. request headers&lt;/p&gt;
&lt;pre id=&quot;code_1773205257869&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'Content-Type': 'application/json'&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 55px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;데이터타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Content-Type&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;서버에게 요청하고 싶은 데이터의 형식을 적어주세요.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;application/json&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;json 형식의 데이터를 요청하기 위한 형식입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;c. request body&lt;/p&gt;
&lt;pre id=&quot;code_1773205340742&quot; class=&quot;ebnf&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;none&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;none&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;none&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;응답(respons)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;a. response header&lt;/p&gt;
&lt;pre id=&quot;code_1773205545508&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'Content-Type': 'application/json'&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;데이터타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 42px;&quot;&gt;Content-Type&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 42px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 42px;&quot;&gt;request headers에서 요청한 데이터의 형식으로 반환합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;application/json&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;request headers에서 요청한 json 형식의 데이터를 반환하는 형식입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b. response body&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;성공응답: 200 OK&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773205751266&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[
  {
    &quot;id&quot;: 1,
    &quot;name&quot;: &quot;명동교자 본점&quot;,
    &quot;address&quot;: &quot;서울 중구 명동10길 29&quot;,
    &quot;call&quot;: &quot;02-776-5348&quot;,
    &quot;category&quot;: &quot;한식&quot;,
    &quot;rating&quot;: 5
  },{
    &quot;id&quot;: 3,
    &quot;name&quot;: &quot;광주 오리탕&quot;,
    &quot;address&quot;: &quot;광주광역시 북구 동문로 123&quot;,
    &quot;call&quot;: &quot;062-123-4567&quot;,
    &quot;category&quot;: &quot;한식&quot;,
    &quot;rating&quot;: 10
  }
]&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 127px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;데이터타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;Integer&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;요청 받는 아이템의 고유 ID입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;name&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;요청 받은 아이템의 이름입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;address&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;요청 받은 아이템의 주소입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;call&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;요청 받은 아이템의 전화번호입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;category&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;요청 받은 아이템의 카테고리입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;rating&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Integer&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;요청 받은 아이템의 평점입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;API 명세서가 왜 필요한가?&lt;/p&gt;
&lt;pre id=&quot;code_1773205994546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;프론트엔드와 백엔드 간의 개발에 있어서 충돌이 안생기게 하고 동시에 개발을 진행할 수 있도록 하고,
너무 많은 API들이 생기면 관리가 어려워질 수 있으니 설명서를 적어두는 것이다.
많은 프론트개발자들에게 API 사용(서버 소통 방법)에 대한 설명을 하기 위해서 필요하다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단계 2-1. CRUD 를 직접 구현해보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이번 단계의 목적&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Postman Mock 서버와 달리 실제로 데이터가 존재하는 서버를 경험해보기&lt;/li&gt;
&lt;li&gt;CRUD 가 무엇인지 학습하기&lt;/li&gt;
&lt;li&gt;등록, 조회, 수정, 삭제 (CRUD) 4가지 기능이 각각 어떤 HTML Method와 대응되는지 직접 구현하며 체득하기&lt;/li&gt;
&lt;li&gt;API 호출 코드를 손으로 작성하면서 프론트엔드가 서버와 어떻게 통신하는지 흐름을 이해합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;a. mockapi.io 세팅&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mockapi.png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w5gzi/dJMcabpTDMK/o2keTK0NbFjYFPk0uEhekK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w5gzi/dJMcabpTDMK/o2keTK0NbFjYFPk0uEhekK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w5gzi/dJMcabpTDMK/o2keTK0NbFjYFPk0uEhekK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw5gzi%2FdJMcabpTDMK%2Fo2keTK0NbFjYFPk0uEhekK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;273&quot; data-filename=&quot;mockapi.png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mockapi.io에서 프로젝트를 생성하여 URL을 발급 받았습니다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebDkSF/dJMcacPQQvj/MN21t78SMxmFYKmCkOnrik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebDkSF/dJMcacPQQvj/MN21t78SMxmFYKmCkOnrik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebDkSF/dJMcacPQQvj/MN21t78SMxmFYKmCkOnrik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebDkSF%2FdJMcacPQQvj%2FMN21t78SMxmFYKmCkOnrik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;557&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음에는 resource를 추가하여 맛집 등록에 사용할 데이터들의 형식을 정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;219&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dljCyW/dJMcaadrtlo/WSdlS7L99PqXpXD1finOn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dljCyW/dJMcaadrtlo/WSdlS7L99PqXpXD1finOn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dljCyW/dJMcaadrtlo/WSdlS7L99PqXpXD1finOn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdljCyW%2FdJMcaadrtlo%2FWSdlS7L99PqXpXD1finOn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;219&quot; height=&quot;80&quot; data-origin-width=&quot;219&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이후 places의 저장된 데이터 개수가 표시되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;b. 등록 (CREATE) &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 폼에서 값을 받아 POST 요청을 보내는 JS를 작성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773208460078&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function addRestaurant() {
    const name = document.getElementById('resName').value;
    const category = document.getElementById('resCategory').value;
    const address = document.getElementById('resAddress').value;
    const call = document.getElementById('resCall').value;
    const rating = document.getElementById('resRating').value;

    let placeData = {
        name,
        category,
        address,
        call,
        rating: Number(rating)
    };

    if (!name || !category) {
        alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
        return;
    }

    try {
        const response = await fetch(API_URL, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(placeData)
        });
    } catch (error) {
        console.error('데이터 등록 중 오류 발생:', error);
    }

    // 직접 등록은 맨 위에 보이도록 prepend 사용
    renderCard(name, address, call, category, rating);

    // 입력창 초기화
    document.getElementById('resName').value = '';
    document.getElementById('resCategory').value = '';
    document.getElementById('resAddress').value = '';
    document.getElementById('resCall').value = '';
    document.getElementById('resRating').value = '';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch 함수와 async/await의 사용하여 비동기 방식으로 구현을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 방식이란 요청을 받은 뒤 먼저 작업이 끝난 순으로 실행되는 방식이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 여러가지 요청이 생기게 된다면 한번에 요청을 보내고 먼저 작업이 끝나는 것이 먼저 화면에 표시되거나 하는 방식으로 쓰일 것같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;등록 성공 후 목록이 자동으로 갱신되는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7bDUy/dJMcaaxJ5fk/iX6t5cpqC2VjQEAocX8nE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7bDUy/dJMcaaxJ5fk/iX6t5cpqC2VjQEAocX8nE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7bDUy/dJMcaaxJ5fk/iX6t5cpqC2VjQEAocX8nE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7bDUy%2FdJMcaaxJ5fk%2FiX6t5cpqC2VjQEAocX8nE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;575&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 입력한 후 등록하기 버튼을 눌러서 POST 요청을 보냈습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mockapicreate.png&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4Etca/dJMcagxVtJ2/2njsgInZ1YsQPlg43Vtkp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4Etca/dJMcagxVtJ2/2njsgInZ1YsQPlg43Vtkp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4Etca/dJMcagxVtJ2/2njsgInZ1YsQPlg43Vtkp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4Etca%2FdJMcagxVtJ2%2F2njsgInZ1YsQPlg43Vtkp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1480&quot; height=&quot;826&quot; data-filename=&quot;mockapicreate.png&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적으로 201 Created 상태 코드를 받았습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;확인 포인트:&lt;/span&gt; mockapi.io 대시보드에 데이터가 실제로 쌓이는지 눈으로 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s2u6S/dJMcajg5AtB/p2wmikVtlYMG9b22tNW3vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s2u6S/dJMcajg5AtB/p2wmikVtlYMG9b22tNW3vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s2u6S/dJMcajg5AtB/p2wmikVtlYMG9b22tNW3vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs2u6S%2FdJMcajg5AtB%2Fp2wmikVtlYMG9b22tNW3vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;76&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpce4L/dJMcagSf7sP/k4aT8r3EtUSMpqesxJKW91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpce4L/dJMcagSf7sP/k4aT8r3EtUSMpqesxJKW91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpce4L/dJMcagSf7sP/k4aT8r3EtUSMpqesxJKW91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpce4L%2FdJMcagSf7sP%2Fk4aT8r3EtUSMpqesxJKW91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;23&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;23&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mockapi.io에서 places를 확인해본 결과 제대로 데이터가 저장된 것을 볼 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;c. 조회(READ)&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET 요청으로 전체 목록을 불러와 화면에 렌더링합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773209540347&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function fetchRestaurants() {
    try {
        const response = await fetch(API_URL, {
            method : 'GET',
            headers : {
                'Content-Type': 'application/json'
            }
        });
        const data = await response.json();

        data.forEach(item =&amp;gt; {
            renderCard(item.name, item.address, item.call, item.category, item.rating);
        });
    } catch (error) {
        console.error('데이터 렌더링 중 오류 발생:', error);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET 요청을 보내서 서버에 존재하는 모든 데이터를 받아와서 renderCard함수의 매개변수로 넣어 주었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773209650919&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function renderCard(name, address, call, category, rating) {
    const list = document.getElementById('restaurantList');

    // 새로운 카드 엘리먼트 생성
    const card = document.createElement('div');
    card.className = 'restaurant-card';

    // HTML 구조 삽입 (index.html의 기존 양식 활용)
    card.innerHTML = `
        &amp;lt;span class=&quot;category&quot;&amp;gt;${category}&amp;lt;/span&amp;gt;
        &amp;lt;h3&amp;gt;${name}&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt; ${address || '주소가 없습니다.'}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt; ${call || '번호가 없습니다.'}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt; ${rating || '점수가 없습니다.'}&amp;lt;/p&amp;gt;
    `;

    // 목록의 맨 뒤에 추가 (서버 데이터 순서대로)
    list.appendChild(card);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 받아온 데이터를 넣어 HTML에 새로운 구조를 삽입하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;받아온 데이터가 제대로 나오는지는 밑에 확인 포인트에서 확인해보았습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;확인 포인트:&lt;/span&gt; 1단계에서 등록한 데이터가 목록에 나오는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mockapiget.png&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNim2/dJMcag5NeVm/fwTE9izK2kl5sM5320LVb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNim2/dJMcag5NeVm/fwTE9izK2kl5sM5320LVb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNim2/dJMcag5NeVm/fwTE9izK2kl5sM5320LVb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNim2%2FdJMcag5NeVm%2FfwTE9izK2kl5sM5320LVb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1475&quot; height=&quot;986&quot; data-filename=&quot;mockapiget.png&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같이 CREATE에서 만들었던 데이터가 잘 불러와졌습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;d. 삭제(DELETE)&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 카드에 삭제 버튼을 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773210023155&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    card.innerHTML = `
        &amp;lt;div class=&quot;card-buttons&quot;&amp;gt;
            &amp;lt;button class=&quot;delete-btn&quot; onclick=&quot;deleteRestaurants()&quot;&amp;gt;삭제️&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;span class=&quot;category&quot;&amp;gt;${category}&amp;lt;/span&amp;gt;
        &amp;lt;h3&amp;gt;${name}&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt; ${address || '주소가 없습니다.'}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt; ${call || '번호가 없습니다.'}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt; ${rating || '점수가 없습니다.'}&amp;lt;/p&amp;gt;
    `;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 카드에 삭제 버튼을 추가하기 위해서 renderCard 함수 구현에서 버튼을 새로 추가하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 태그 안에 있는 onclick=&quot;deleteRestaurants()&quot;는 삭제 버튼을 눌렀을때 DELETE 요청을 보내는 함수를 실행한다는 뜻입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773210093581&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.restaurant-card{				// 원래 있던 코드에서 부분 추가
    position: relative;
    padding-top: 30px;
    ...
}

.delete-btn{
    position: absolute;
    top: 10px;
    right: 10px;
    background-color: #ff4d4d;
    color: white;
    border: none;
    border-radius: 4px;
    padding: 4px 8px;
    cursor: pointer;
    font-size: 12px;
    transition: background 0.2s;
}

.delete-btn:hover{
    background-color: #ff1a1a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS를 통해서 삭제 버튼의 위치를 카드의 오른쪽 위로 바꾸어 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbLEEa/dJMcac95RxC/0feX3MofD3isL3077tAQz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbLEEa/dJMcac95RxC/0feX3MofD3isL3077tAQz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbLEEa/dJMcac95RxC/0feX3MofD3isL3077tAQz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbLEEa%2FdJMcac95RxC%2F0feX3MofD3isL3077tAQz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;216&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DELETE /places/:id 요청을 보냅니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773210363447&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function deleteRestaurant(id){
    if(!confirm(&quot;정말 삭제하시겠습니까?&quot;)) return;
    try{
        const response = await fetch(`${API_URL}/${id}`, {
            method : 'DELETE'
        });

        if (response.ok){
            alert(&quot;삭제되었습니다.&quot;);
            fetchRestaurants(); // 목록 새로고침
        }
    } catch(error){
        console.error('데이터 삭제 중 오류 발생:', error);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;confirm을 이용하여 확인 메시지를 띄워 확인을 받았을 경우에만 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE는 삭제할 아이템의 ID가 필요하여 URL과 같이 적어 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;headers와 body는 필요없으니 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 삭제가 완료되었으면 전체 조회 GET을 이용하여서 삭제된 데이터를 제외한 카드들을 다시 표시해주었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;확인 포인트:&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;삭제 후 목록을 다시 불러왔을 때 해당 항목이 사라졌는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btkIo1/dJMcabi75Dn/19IWBYlzbWy3hlEeb6DeR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btkIo1/dJMcabi75Dn/19IWBYlzbWy3hlEeb6DeR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btkIo1/dJMcabi75Dn/19IWBYlzbWy3hlEeb6DeR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtkIo1%2FdJMcabi75Dn%2F19IWBYlzbWy3hlEeb6DeR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;215&quot; height=&quot;73&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 mockapi.io에서 더미 데이터를 25개 만들어주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1465&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfo0fZ/dJMcaiidH7N/pH2SNZ1fm7mALPptb8ItvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfo0fZ/dJMcaiidH7N/pH2SNZ1fm7mALPptb8ItvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfo0fZ/dJMcaiidH7N/pH2SNZ1fm7mALPptb8ItvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfo0fZ%2FdJMcaiidH7N%2FpH2SNZ1fm7mALPptb8ItvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1465&quot; height=&quot;990&quot; data-origin-width=&quot;1465&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;name 2 가게 카드를 삭제 해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjlHf/dJMcadVtImh/3zkr4UxQ2MNpDuLo2hsjh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjlHf/dJMcadVtImh/3zkr4UxQ2MNpDuLo2hsjh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjlHf/dJMcadVtImh/3zkr4UxQ2MNpDuLo2hsjh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjlHf%2FdJMcadVtImh%2F3zkr4UxQ2MNpDuLo2hsjh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;151&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mockapidelete.png&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZIxxV/dJMcaiidIkf/aLZ6Ptwre2YfoJBCkzGOkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZIxxV/dJMcaiidIkf/aLZ6Ptwre2YfoJBCkzGOkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZIxxV/dJMcaiidIkf/aLZ6Ptwre2YfoJBCkzGOkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZIxxV%2FdJMcaiidIkf%2FaLZ6Ptwre2YfoJBCkzGOkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1477&quot; height=&quot;958&quot; data-filename=&quot;mockapidelete.png&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;name 2 가게가 정상적으로 삭제 되었고, 200 OK 상태 코드도 받았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;187&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUKDN/dJMcaduoqRR/NxPQEkFPUTcCGUdrMSMOs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUKDN/dJMcaduoqRR/NxPQEkFPUTcCGUdrMSMOs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUKDN/dJMcaduoqRR/NxPQEkFPUTcCGUdrMSMOs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUKDN%2FdJMcaduoqRR%2FNxPQEkFPUTcCGUdrMSMOs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;187&quot; height=&quot;68&quot; data-origin-width=&quot;187&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mockapi.io 에서도 places에 저장된 데이터가 하나 줄어든걸 확인하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyVjZ2/dJMcaf6RIyS/XNgMY5JFCYR6Mzy7NN8nq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyVjZ2/dJMcaf6RIyS/XNgMY5JFCYR6Mzy7NN8nq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyVjZ2/dJMcaf6RIyS/XNgMY5JFCYR6Mzy7NN8nq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyVjZ2%2FdJMcaf6RIyS%2FXNgMY5JFCYR6Mzy7NN8nq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;30&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교자 맛집 다음으로 name 3의 정보가 오는 것을 볼 수 있었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;e. 수정 (UPDATE)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 버튼 클릭 시 기존 데이터를 폼에 불러옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773210985206&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        &amp;lt;div class=&quot;card-buttons&quot;&amp;gt;
            &amp;lt;button class=&quot;update-btn&quot; onclick=&quot;prepareEdit(
                '${item.id}', '${item.name}', '${item.category}',
                 '${item.address}', '${item.call}', ${item.rating})&quot;&amp;gt;수정&amp;lt;/button&amp;gt;
            &amp;lt;button class=&quot;delete-btn&quot; onclick=&quot;deleteRestaurant(${item.id})&quot;&amp;gt;삭제️&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 버튼을 클릭하면 onclick=&quot;prepareEdit&quot; 함수에 클릭한 카드에 있는 맛집 정보들을 전달 하도록 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773211066897&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        .update-btn{
            position: absolute;
            top: 10px;
            right: 55px;
            background-color: #83f19b;
            color: white;
            border: none;
            border-radius: 4px;
            padding: 4px 8px;
            cursor: pointer;
            font-size: 12px;
            transition: background 0.2s;
        }

        .update-btn:hover{
            background-color: #0dd43a;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 버튼과 동일하게 수정 버튼을 만들어주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b81fnn/dJMcafMBlIz/0RsKujsKg0rsZUtjKUgP21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b81fnn/dJMcafMBlIz/0RsKujsKg0rsZUtjKUgP21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b81fnn/dJMcafMBlIz/0RsKujsKg0rsZUtjKUgP21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb81fnn%2FdJMcafMBlIz%2F0RsKujsKg0rsZUtjKUgP21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;222&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 수정 버튼을 누르면 실행되는 prepareEdit 함수 부분입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773211522225&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let editId = null;	 // 수정 모드 여부를 판단하는 변수
.....
function prepareEdit(id, name, category, address, call, rating){
    resetForm();

    // 입력창에 기존 값 채우기
    document.getElementById('resName').value = name;
    document.getElementById('resCategory').value = category;
    document.getElementById('resAddress').value = address;
    document.getElementById('resCall').value = call;
    document.getElementById('resRating').value = rating;

    editId = id;

    const submitBtn = document.querySelector('.form-section button');
    submitBtn.innerText = '수정 완료';
    submitBtn.style.backgroundColor = &quot;#ff9800&quot;;

    // 화면 상단 폼으로 스크롤 이동
    window.scrollTo({ top: 0, behavior: 'smooth'});
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 버튼 클릭으로 받은 정보들을 HTML내의 ID를 가져와 해당하는 입력 구간에 넣어 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mx1lq/dJMcaa5zsRX/HZxYDpk1h2KqNX23RZdH91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mx1lq/dJMcaa5zsRX/HZxYDpk1h2KqNX23RZdH91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mx1lq/dJMcaa5zsRX/HZxYDpk1h2KqNX23RZdH91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMx1lq%2FdJMcaa5zsRX%2FHZxYDpk1h2KqNX23RZdH91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;817&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교자 맛집의 수정버튼을 클릭하였을때 이런식으로 맛집 등록 버튼이 수정 완료 버튼으로 바뀌며 내용이 폼으로 불러와집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경한 내용을 PUT /places/:id 로 전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773211910650&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function addRestaurant() {
    if(editId) return updateRestaurant();
    ....
}
.....
async function updateRestaurant(){
    const name = document.getElementById('resName').value;
    const category = document.getElementById('resCategory').value;
    const address = document.getElementById('resAddress').value;
    const call = document.getElementById('resCall').value;
    const rating = document.getElementById('resRating').value;

    if (!name || !category) {
        return alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
    }

    const placeData = {
        name,
        category,
        address,
        call,
        rating: Number(rating)
    };

    try{
        let response;
        response = await fetch(`${API_URL}/${editId}`, {
            method: 'PUT',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(placeData)
        });

        if (response.ok) {
            alert(&quot;수정되었습니다.&quot;);
            resetForm();
            fetchRestaurants();
        }
    }catch(error) {
        console.error('데이터 수정 중 오류 발생:', error);
        alert('수정에 실패했습니다.');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;editId 는 null로 초기화하여 만들어두었고 수정 버튼을 눌렀을때 해당 아이템의 id를 받아서 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;editId가 null이 아니라면 addRestaurant 함수가 아닌 updateRestaurant를 실행하게 하였습니다. 이렇게 한 이유는 html에서 버튼에 onclick=&quot;addRestaurant&quot;를 넣어 놓아서 하였습니다. 따로 버튼의 속성을 건드리는 방법도 생각해보았지만 일단 이런 식으로 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name, category, address, call, rating의 데이터들을 서버에 JSON.stringfy를 이용하여 json 형식으로 변경하여 수정 요청을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정이 addRestaurant 함수에서도 동일하게 존재하는데 따로 함수를 구현하여 깔끔하게 처리하는 것도 좋겠다고 생각하여서 함수로 객체를 반환하게 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773216555517&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getDatas(){
    const name = document.getElementById('resName').value;
    const category = document.getElementById('resCategory').value;
    const address = document.getElementById('resAddress').value;
    const call = document.getElementById('resCall').value;
    const rating = document.getElementById('resRating').value;

    if (!name || !category) {
        return alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
    }

    return {
        name,
        category,
        address,
        call,
        rating: Number(rating)
    };
}
....
async function addRestaurant() {
    if(editId) return updateRestaurant();

    const placeData = getDatas();
    ...
}
....
async function updateRestaurant() {
	const placeData = getDatas();
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 수정 완료를 눌렀다면 resetForm 함수를 실행하여 폼에 채웠던 수정 내용을 지우고 fetchRestaurants 함수로 변경된 내용을 웹사이트에 있는 카드에 적용되도록 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773212789403&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function resetForm() {
    document.getElementById('resName').value = '';
    document.getElementById('resCategory').value = '';
    document.getElementById('resAddress').value = '';
    document.getElementById('resCall').value = '';
    document.getElementById('resRating').value = '';

    editId = null;

    const submitBtn = document.querySelector('.form-section button');
    submitBtn.innerText = &quot;등록하기&quot;;
    submitBtn.style.backgroundColor = &quot;&quot;; // 원래 색상으로
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;editId를 null로 초기화 해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 폼을 빈칸으로 초기화 해주고 버튼을 다시 등록하기 버튼으로 변경해주는 코드입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;확인 포인트:&lt;/span&gt; 수정된 내용이 목록에 즉시 반영되는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btfgTe/dJMcagSf9l9/KVqSskMam8IkIb2wP8kKQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btfgTe/dJMcagSf9l9/KVqSskMam8IkIb2wP8kKQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btfgTe/dJMcagSf9l9/KVqSskMam8IkIb2wP8kKQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtfgTe%2FdJMcagSf9l9%2FKVqSskMam8IkIb2wP8kKQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;795&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이와 같이 수정을 하여 완료 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yHKHd/dJMcacI6syA/YGjc5yJzRTngUFRxmP84E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yHKHd/dJMcacI6syA/YGjc5yJzRTngUFRxmP84E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yHKHd/dJMcacI6syA/YGjc5yJzRTngUFRxmP84E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHKHd%2FdJMcacI6syA%2FYGjc5yJzRTngUFRxmP84E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;170&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;수정완료 알림이 나왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mockapiput.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;955&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTVsS1/dJMcagkoGPf/oNYZOW6fBAqyfsEXtb3tKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTVsS1/dJMcagkoGPf/oNYZOW6fBAqyfsEXtb3tKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTVsS1/dJMcagkoGPf/oNYZOW6fBAqyfsEXtb3tKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTVsS1%2FdJMcagkoGPf%2FoNYZOW6fBAqyfsEXtb3tKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1470&quot; height=&quot;955&quot; data-filename=&quot;mockapiput.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;955&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;카드에 변경한 내용이 잘 적용되었으며, 200 OK 상태 코드도 받았습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;백엔드 서버가 왜 필요한가?&lt;/p&gt;
&lt;pre id=&quot;code_1773207457802&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; 클라이언트에게 들어온 요청에 대한 응답을 반환하기 위해서 필요하다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>스파르타코딩클럽 Spring4기 내일배움캠프</category>
      <author>양들의 훈</author>
      <guid isPermaLink="true">https://sheepscastle.tistory.com/3</guid>
      <comments>https://sheepscastle.tistory.com/3#entry3comment</comments>
      <pubDate>Wed, 11 Mar 2026 16:00:15 +0900</pubDate>
    </item>
    <item>
      <title>(내일배움캠프)260310 TIL</title>
      <link>https://sheepscastle.tistory.com/2</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 오늘은 과제를 푸는 시간을 가졌습니다. &lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단계 1-1. 카카오맵에서 요청 사항 분석하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번 단계의 목적&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP / API 개념 복습&lt;/li&gt;
&lt;li&gt;브로우저 개발자 도구(F12)를 사용하여 실제 현업에서 사용하는 API 요청 / 응답 구조를 이해하고 식별해 보기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YVHhU/dJMcahDAsxk/uXJCLyXCsKy4r5HyCqBBSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YVHhU/dJMcahDAsxk/uXJCLyXCsKy4r5HyCqBBSK/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;973&quot; data-is-animation=&quot;false&quot; width=&quot;400&quot; style=&quot;width: 40.5164%; margin-right: 10px;&quot; data-widthpercent=&quot;40.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YVHhU/dJMcahDAsxk/uXJCLyXCsKy4r5HyCqBBSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYVHhU%2FdJMcahDAsxk%2FuXJCLyXCsKy4r5HyCqBBSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;973&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sh5vQ/dJMcafFNCXE/fgq6rFaKjwzXs83BhdHrfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sh5vQ/dJMcafFNCXE/fgq6rFaKjwzXs83BhdHrfk/img.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;806&quot; data-is-animation=&quot;false&quot; width=&quot;400&quot; style=&quot;width: 58.3209%;&quot; data-widthpercent=&quot;59.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sh5vQ/dJMcafFNCXE/fgq6rFaKjwzXs83BhdHrfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSh5vQ%2FdJMcafFNCXE%2Ffgq6rFaKjwzXs83BhdHrfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;실습용으로 고른 카카오맵 가게&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fetch 부분에서 Headers에 있는 내용을 분석해 보았습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 60.4651%; height: 62px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7466%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 93.9227%;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7466%;&quot;&gt;URL&lt;/td&gt;
&lt;td style=&quot;width: 93.9227%;&quot;&gt;&lt;a href=&quot;https://place-api.map.kakao.com/places/panel3/10332413&quot;&gt;https://place-api.map.kakao.com/places/panel3/10332413&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7466%;&quot;&gt;Method&lt;/td&gt;
&lt;td style=&quot;width: 93.9227%;&quot;&gt;GET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7466%;&quot;&gt;Status Code&lt;/td&gt;
&lt;td style=&quot;width: 93.9227%;&quot;&gt;200 OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7466%;&quot;&gt;Content-Type&lt;/td&gt;
&lt;td style=&quot;width: 93.9227%;&quot;&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773127576431&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;이 API는 어떤 요청을 받아 어떤 응답을 주는가?

-&amp;gt; 클라이언트가 panel3에 있는 10332413번의 json 데이터 조회 요청을 보내면
   , 서버는 200 OK와 함께 json 타입의 응답을 반환한다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단계 1-2. &lt;span data-token-index=&quot;0&quot;&gt;프론트 구현해 보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 단계의 목적&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML / CSS 각각의 역할을 이해해 보기&lt;/li&gt;
&lt;li&gt;AI 활용방법 익히기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773127625059&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// HTML 의 역할이 무엇일까요?
-&amp;gt; 웹 페이지의 구조(뼈대)를 만들어주는 역할

// CSS 의 역할이 무엇일까요?
-&amp;gt; HTML로 구현된 구조(뼈대)에 디자인과 배치를 해주는 역할&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. HTML로 화면 구조 잡기&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI에게 아래 프롬프트로 요청해 보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773127176474&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;맛집 목록을 보여주는 HTML 페이지를 만들어줘.
맛집 카드 목록 영역과 맛집을 등록하는 입력 폼이 있어야 해.
외부 라이브러리 없이 순수 HTML 사용해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw3Zr9/dJMcacvyM5M/imbLXKdjEjchg2bEG6IfO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw3Zr9/dJMcacvyM5M/imbLXKdjEjchg2bEG6IfO1/img.png&quot; data-alt=&quot;실행하면 나오는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw3Zr9/dJMcacvyM5M/imbLXKdjEjchg2bEG6IfO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw3Zr9%2FdJMcacvyM5M%2FimbLXKdjEjchg2bEG6IfO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;419&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행하면 나오는 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;HTML 코드 전문&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773127383377&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;나만의 맛집 지도&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;h1&amp;gt; 나만의 맛집 리스트&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;기억하고 싶은 맛집을 기록해보세요!&amp;lt;/p&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;section class=&quot;form-section&quot;&amp;gt;
        &amp;lt;h3&amp;gt;새로운 맛집 등록&amp;lt;/h3&amp;gt;
        &amp;lt;div class=&quot;form-group&quot;&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;resName&quot; placeholder=&quot;식당 이름 (예: 중앙 식당)&quot;&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;resCategory&quot; placeholder=&quot;카테고리 (예: 한식, 일식)&quot;&amp;gt;
            &amp;lt;textarea id=&quot;resReview&quot; rows=&quot;3&quot; placeholder=&quot;한 줄 평이나 추천 메뉴를 적어주세요.&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
            &amp;lt;button onclick=&quot;addRestaurant()&quot;&amp;gt;등록하기&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;

    &amp;lt;section class=&quot;list-section&quot; id=&quot;restaurantList&quot;&amp;gt;
        &amp;lt;div class=&quot;restaurant-card&quot;&amp;gt;
            &amp;lt;span class=&quot;category&quot;&amp;gt;한식&amp;lt;/span&amp;gt;
            &amp;lt;h3&amp;gt;맛있는 김치찜&amp;lt;/h3&amp;gt;
            &amp;lt;p&amp;gt; 서울특별시 어딘가&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt; 묵은지가 정말 제대로예요. 밥 두 공기 순삭!&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
// *Gemini Pro를 이용하여 구현하였습니다.*&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. CSS로 꾸미기&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI에게 아래 프롬프트로 요청해 보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773127644219&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;위 HTML에 CSS를 추가해줘.
맛집 목록은 카드 형태로 보이고, 전체적으로 깔끔한 스타일이면 좋겠어.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0JvNx/dJMcajajwjp/XKpc3tWVTPwKOAar4INjq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0JvNx/dJMcajajwjp/XKpc3tWVTPwKOAar4INjq0/img.png&quot; data-alt=&quot;HTML에 CSS를 적용하여 실행하면 나오는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0JvNx/dJMcajajwjp/XKpc3tWVTPwKOAar4INjq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0JvNx%2FdJMcajajwjp%2FXKpc3tWVTPwKOAar4INjq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;632&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HTML에 CSS를 적용하여 실행하면 나오는 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;CSS 코드 전문&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773127803733&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:root {
  --primary-color: #ff6b6b;
  --bg-color: #f8f9fa;
  --card-bg: #ffffff;
}

body{
    font-family: 'Pretendard', sans-serif;
    background: var(--bg-color);
    margin: 0;
    padding: 20px;
    color: #333;
}

.container {
    max-width: 800px;
    margin: 0 auto;
}

header {
    text-align: center;
    margin-bottom: 30px;
}

.form-section{
    background: var(--card-bg);
    padding: 20px;
    border-radius: 12px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.1);
    margin-bottom: 30px;
}

.form-group{
    display: flex;
    flex-direction: column;
    gap: 10px;
}

input, textarea{
    padding: 12px;
    border: 1px solid #ddd;
    border-radius: 6px;
    font-size: 16px;
}

button{
    background-color: #ff6b6b;
    color: white;
    border: none;
    padding: 12px;
    border-radius: 6px;
    cursor: pointer;
    font-weight: bold;
    transition: background 0.3s;
}

button:hover{
    background-color: #fa5252;
}

.list-section{
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    gap: 20px;
}

.restaurant-card{
    background: var(--card-bg);
    border-radius: 12px;
    padding: 20px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.05);
    border-left: 5px solid var(--primary-color);
}

.restaurant-card h3{
    margin: 0 0 10px 0;
    color: var(--primary-color);
}

.restaurant-card p{
    margin: 5px 0;
    font-size: 14px;
    color: #666;
}

.category{
    display: inline-block;
    background: #eee;
    padding: 2px 8px;
    border-radius: 4px;
    font-size: 12px;
    margin-bottom: 10px;
}
// *Gemini Pro를 이용해서 구현하였습니다.*&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1773136373604&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;나만의 맛집 지도&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt; // 외부의 CSS 연결 부분
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML에서 외부의 CSS 연결을 하여 사용하였습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;단계 1-3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;API 호출해보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;이번 단계의 목적&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내가 만든 화면에서 실제로 서버에 요청을 보내고 응답을 받아보는 경험 해보기&lt;/li&gt;
&lt;li&gt;프론트를 구성하는 JS의 역할 이해하기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773128005578&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JS의 역할이 무엇일까요?
-&amp;gt; 사용자의 상호작용을 감지하여 함수를 실행하고, 그 결과로 화면(DOM Control)을 바꾸거나 서버와
   통신하게 해주는 역할
   (HTML의 구조를 동적으로 변경하는 역할)

// API 란 무엇일까요?
-&amp;gt; 프로그램이 다른 프로그램의 기능/데이터를 이용하기 위해 제공되는 인터페이스이자
   , 요청/응답 규약(규칙)이다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1. Postman Mock 서버 만들기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Postman에서 새 Collection을 생성하기&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 Postman을 사용하기 위해서 Mock 서버를 먼저 만들어서 URL을 복사하였습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxoYb/dJMcabwB2Wb/Pd3qrK92fzGYhxkoCaka21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxoYb/dJMcabwB2Wb/Pd3qrK92fzGYhxkoCaka21/img.png&quot; data-alt=&quot;맛집 목록용 Mock Server 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxoYb/dJMcabwB2Wb/Pd3qrK92fzGYhxkoCaka21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxoYb%2FdJMcabwB2Wb%2FPd3qrK92fzGYhxkoCaka21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;377&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;맛집 목록용 Mock Server 생성&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이후 생성한 콜렉션에 baseURL이라는 변수를 만들어 Mock Server 주소를 넣어줬습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;포스트맨 콜렉션생성.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQMxrr/dJMcagdEfOp/hnfTsqwvcUThRCCwWqhCu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQMxrr/dJMcagdEfOp/hnfTsqwvcUThRCCwWqhCu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQMxrr/dJMcagdEfOp/hnfTsqwvcUThRCCwWqhCu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQMxrr%2FdJMcagdEfOp%2FhnfTsqwvcUThRCCwWqhCu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;407&quot; data-filename=&quot;포스트맨 콜렉션생성.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 맛집 [전체 조회] API를 아래와 같이 추가하기&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 39.8533%; height: 53px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Method&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;GET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;URL&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;/places&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2C7KZ/dJMcaioZMPB/TcW9YhMYoJ4grIO6pfikhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2C7KZ/dJMcaioZMPB/TcW9YhMYoJ4grIO6pfikhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2C7KZ/dJMcaioZMPB/TcW9YhMYoJ4grIO6pfikhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2C7KZ%2FdJMcaioZMPB%2FTcW9YhMYoJ4grIO6pfikhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;164&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;위에서 만든 콜렉션에 Request를 새로 만들어서 GET Method를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;baseURL(MockServerURL)/places에게 요청할 준비를 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. Example 응답 작성&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bosynS/dJMcabQUSkG/WkAjtubuB3M9VqVdB9Ua8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bosynS/dJMcabQUSkG/WkAjtubuB3M9VqVdB9Ua8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bosynS/dJMcabQUSkG/WkAjtubuB3M9VqVdB9Ua8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbosynS%2FdJMcabQUSkG%2FWkAjtubuB3M9VqVdB9Ua8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;33&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;받은 Request를&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3aEGM/dJMcafTkSpF/quRRuthk3PKYIfZOXdazKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3aEGM/dJMcafTkSpF/quRRuthk3PKYIfZOXdazKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3aEGM/dJMcafTkSpF/quRRuthk3PKYIfZOXdazKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3aEGM%2FdJMcafTkSpF%2FquRRuthk3PKYIfZOXdazKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;516&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;미리 받은 Example용 json을 넣어서 Status Code에 200 OK를 넣어줍니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4daHd/dJMcahQ8Gv7/TAYbm9A1IHzklF2Nkdw020/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4daHd/dJMcahQ8Gv7/TAYbm9A1IHzklF2Nkdw020/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4daHd/dJMcahQ8Gv7/TAYbm9A1IHzklF2Nkdw020/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4daHd%2FdJMcahQ8Gv7%2FTAYbm9A1IHzklF2Nkdw020%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;77&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;이후 Requset에서 Send를 클릭해 주면 아래와 같이 나온다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QwRi8/dJMcacbeBsu/n7oXakMV7yZueJHaG6d130/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QwRi8/dJMcacbeBsu/n7oXakMV7yZueJHaG6d130/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QwRi8/dJMcacbeBsu/n7oXakMV7yZueJHaG6d130/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQwRi8%2FdJMcacbeBsu%2Fn7oXakMV7yZueJHaG6d130%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;597&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;id와 함께 데이터들을 모두 가져오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것으로 Postman에서 직접 요청을 보내 Example대로 응답을 받았습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3-2. 구현한 프론트와 연동하기&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. index.html 에 JavaScript를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773136602769&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
...
&amp;lt;/div&amp;gt;
	&amp;lt;script src=&quot;app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;	// 외부의 JS 연결 부분
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 폴더 내에 app.js 파일을 만들고 외부에서 연결하는 방식으로 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. AI에게 아래 프롬프트로 요청해보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1773136649993&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;아래 Mock 서버 URL로 GET 요청을 보내서
응답받은 맛집 목록을 HTML 카드로 화면에 렌더링하는 JS 코드를 짜줘.

Mock 서버 URL: [복사한 URL 붙여넣기]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773139381006&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 서버 URL (엔드포인트가 있다면 뒤에 추가하세요)
const API_URL = '목 서버 주소/places';

// 페이지가 로드되면 데이터를 가져옵니다.
document.addEventListener('DOMContentLoaded', () =&amp;gt; {
    fetchRestaurants();
});

// 2. 서버에서 데이터 가져오기
async function fetchRestaurants() {
    try {
        const response = await fetch(API_URL, {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });
        const data = await response.json();

        // 만약 데이터가 객체 안에 감싸져 있다면 (예: data.stores) 구조에 맞춰 수정하세요.
        // 여기서는 data 자체가 배열인 경우를 가정합니다.
        data.forEach(item =&amp;gt; {
            renderCard(item.name, item.address, item.call, item.category, item.rating);
        });
    } catch (error) {
        console.error('데이터 렌더링 중 오류 발생:', error);
    }
}

// 3. 데이터를 받아 카드를 생성하고 화면에 붙이는 함수
function renderCard(name, address, call, category, rating) {
    const list = document.getElementById('restaurantList');

    // 새로운 카드 엘리먼트 생성
    const card = document.createElement('div');
    card.className = 'restaurant-card';

    // HTML 구조 삽입 (index.html의 기존 양식 활용)
    card.innerHTML = `
        &amp;lt;span class=&quot;category&quot;&amp;gt;${category}&amp;lt;/span&amp;gt;
        &amp;lt;h3&amp;gt;${name}&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt; ${address || '주소가 없습니다.'}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt; ${call || '번호가 없습니다.'}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt; ${rating || '점수가 없습니다.'}&amp;lt;/p&amp;gt;
    `;

    // 목록의 맨 뒤에 추가 (서버 데이터 순서대로)
    list.appendChild(card);
}

// 4. (기존 유지) 직접 등록 기능
function addRestaurant() {
    const name = document.getElementById('resName').value;
    const category = document.getElementById('resCategory').value;
    const address = document.getElementById('resAddress').value;
    const call = document.getElementById('resCall').value;
    const rating = document.getElementById('resRating').value;

    if (!name || !category) {
        alert(&quot;식당 이름과 카테고리를 입력해주세요!&quot;);
        return;
    }

    // 직접 등록은 맨 위에 보이도록 prepend 사용
    renderCard(name, address, call, category, rating);

    // 입력창 초기화
    document.getElementById('resName').value = '';
    document.getElementById('resCategory').value = '';
    document.getElementById('resAddress').value = '';
    document.getElementById('resCall').value = '';
    document.getElementById('resRating').value = '';
}
// *Gemini Pro를 이용해서 구현하였습니다.*&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;서버 URL 작성해줘야 하는데 이때 엔드포인트를 까먹지 않고 작성해야합니다. 저 같은 경우에는 places로 해주었기때문에 places를 붙여주었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;서버에서 데이터를 조회하는 GET을 이용할 것입니다. 원래 코드에서 GET이 안보여서 AI에게 물어본 결과 밑의 두 코드는 같은것으로 fetch를 사용할때 아무 매개변수를 적지않으면 기본적으로 GET 메서드를 사용하도록 설계되어 있다고 합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1773139554636&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const response = await fetch(API_URL, {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1773139587280&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const response = await fetch(API_URL);	// 위 코드와 같다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 브라우저에서 Mock Server에 있는 예제를 잘 가져오는지 보겠습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;957&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWRQhG/dJMcabKb33A/PTy59Y85oJPkwxqshNNFBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWRQhG/dJMcabKb33A/PTy59Y85oJPkwxqshNNFBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWRQhG/dJMcabKb33A/PTy59Y85oJPkwxqshNNFBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWRQhG%2FdJMcabKb33A%2FPTy59Y85oJPkwxqshNNFBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;534&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;957&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위에 Postman에서 Example의 Body에 넣어놓은 데이터가 잘 불러와지는 것을 볼 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKYl8M/dJMcahp5qla/VxQNwkx9rYoWiO259SA3vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKYl8M/dJMcahp5qla/VxQNwkx9rYoWiO259SA3vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKYl8M/dJMcahp5qla/VxQNwkx9rYoWiO259SA3vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKYl8M%2FdJMcahp5qla%2FVxQNwkx9rYoWiO259SA3vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1257&quot; height=&quot;840&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;상태 코드 200 OK를 받는 것도 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의 TIL은 이상이며 내일은 API 명세서 만들기와 CRUD 직접 구현해 보기를 통해서 가상의 백엔드 서버와 연결까지&amp;nbsp;해보는 걸 해보겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스파르타코딩클럽 Spring4기 내일배움캠프</category>
      <author>양들의 훈</author>
      <guid isPermaLink="true">https://sheepscastle.tistory.com/2</guid>
      <comments>https://sheepscastle.tistory.com/2#entry2comment</comments>
      <pubDate>Tue, 10 Mar 2026 20:59:32 +0900</pubDate>
    </item>
  </channel>
</rss>