[{"data":1,"prerenderedAt":943},["ShallowReactive",2],{"post-document:\u002Fproject\u002F깃허브_프로젝트\u002F2026\u002F08\u002F17\u002Fgithub_project\u002F":3},{"id":4,"title":5,"body":6,"categories":929,"date":932,"description":120,"extension":933,"image":934,"key_concepts":934,"last_modified_at":934,"legacyPath":935,"meta":936,"navigation":293,"part":934,"path":938,"published":293,"robots":934,"seo":939,"series":934,"stem":940,"strengths":934,"summary":934,"tags":941,"tradeoffs":934,"__hash__":942},"posts\u002Fposts\u002Fproject\u002F깃허브_프로젝트\u002Fgithub_project.md","1. GitHub Project 만들기",{"type":7,"value":8,"toc":926},"minimark",[9,88,92,117,121,132,135,140,143,160,164,181,184,188,191,202,205,219,222,225,242,245,249,263,268,271,387,390,404,407,410,413,417,431,434,438,441,480,483,486,530,533,551,554,572,575,600,603,623,626,630,641,644,652,655,658,663,666,746,749,754,757,761,764,778,781,792,795,799,813,816,819,827,830,834,837,876,879,890,893,899,902,922],[10,11,12,25],"table",{},[13,14,15],"thead",{},[16,17,18,22],"tr",{},[19,20,21],"th",{},"기능",[19,23,24],{},"의미",[26,27,28,37,45,57,65,77],"tbody",{},[16,29,30,34],{},[31,32,33],"td",{},"Issue",[31,35,36],{},"해야 할 작업을 기록하는 티켓",[16,38,39,42],{},[31,40,41],{},"Project",[31,43,44],{},"Issue들을 모아 관리하는 칸반 보드",[16,46,47,50],{},[31,48,49],{},"Milestone",[31,51,52,56],{},[53,54,55],"code",{},"백엔드 MVP"," 같은 개발 단계",[16,58,59,62],{},[31,60,61],{},"Branch",[31,63,64],{},"기존 코드를 보호하며 작업하는 별도 공간",[16,66,67,70],{},[31,68,69],{},"Pull Request",[31,71,72,73,76],{},"작업 내용을 ",[53,74,75],{},"main","에 합쳐달라는 요청",[16,78,79,82],{},[31,80,81],{},"Merge",[31,83,84,85,87],{},"Pull Request 내용을 실제로 ",[53,86,75],{},"에 합치는 것",[89,90,5],"h1",{"id":91},"_1-github-project-만들기",[93,94,95,99,102,105,108,111,114],"ul",{},[96,97,98],"li",{},"GitHub 오른쪽 위의 프로필 사진을 누른다.",[96,100,101],{},"Your profile을 누른다.",[96,103,104],{},"프로필 화면에서 Projects 탭을 누른다.",[96,106,107],{},"초록색 New project 버튼을 누른다.",[96,109,110],{},"Start from scratch 아래에서 Board를 선택한다.",[96,112,113],{},"프로젝트 이름에 다음을 입력한다.",[96,115,116],{},"Create project 버튼을 누른다.",[118,119,120],"p",{},"그러면 기본적으로 다음 칸이 있는 보드가 만들어진다.",[93,122,123,126,129],{},[96,124,125],{},"Todo: 아직 시작하지 않은 작업",[96,127,128],{},"In Progress: 진행 중인 작업",[96,130,131],{},"Done: 완료된 작업",[118,133,134],{},"작업 카드를 마우스로 끌어서 다른 칸으로 옮기면 상태가 변경",[136,137,139],"h2",{"id":138},"project를-공개로-설정하기","Project를 공개로 설정하기",[118,141,142],{},"포트폴리오이므로 Project도 공개하는 것이 좋다.",[93,144,145,148,151,154,157],{},[96,146,147],{},"Project 화면 오른쪽 위의 ⋯ 버튼을 누른다.",[96,149,150],{},"Settings를 누른다.",[96,152,153],{},"화면 아래 Danger zone으로 내려간다.",[96,155,156],{},"Visibility에서 Public을 선택한다.",[96,158,159],{},"변경 확인 버튼을 누른다.",[89,161,163],{"id":162},"_2-project와-저장소-연결하기","2. Project와 저장소 연결하기",[93,165,166,169,172,175,178],{},[96,167,168],{},"pi-monitor 저장소로 이동한다.",[96,170,171],{},"저장소 위쪽의 Projects 탭을 누른다.",[96,173,174],{},"Link a project 버튼을 누른다.",[96,176,177],{},"방금 만든 Pi Monitor Roadmap을 검색한다.",[96,179,180],{},"검색 결과를 클릭한다.",[118,182,183],{},"이제 저장소의 Projects 탭에서 개발 계획을 바로 확인할 수 있다",[89,185,187],{"id":186},"_3-첫-번째-milestone-만들기","3. 첫 번째 Milestone 만들기",[118,189,190],{},"Milestone은 하나의 개발 단계를 의미한다. 현재 작업은 백엔드 MVP 단계로 묶으면 된다.",[93,192,193,196,199],{},[96,194,195],{},"저장소 위쪽의 Issues를 누른다.",[96,197,198],{},"화면 오른쪽 부근의 Milestones를 누른다.",[96,200,201],{},"New milestone을 누른다.",[118,203,204],{},"다음과 같이 입력한다.",[93,206,207,213],{},[96,208,209,210],{},"제목: ",[53,211,212],{},"v0.1 Backend MVP",[96,214,215,216],{},"설명: ",[53,217,218],{},"센서 데이터를 PostgreSQL에 저장하고 조회하는 기본 백엔드 완성",[118,220,221],{},"Due date는 마감일이다. 아직 정하지 않았다면 비워둬도 된다.",[118,223,224],{},"중에는 다음 Milestone을 추가하면 된다.",[93,226,227,232,237],{},[96,228,229],{},[53,230,231],{},"v0.2 Raspberry Integration",[96,233,234],{},[53,235,236],{},"v0.3 Realtime Dashboard",[96,238,239],{},[53,240,241],{},"v1.0 Portfolio Release",[118,243,244],{},"지금은 v0.1 Backend MVP 하나만 만들어도 충분하다.",[89,246,248],{"id":247},"_4-첫-번째-issue-만들기","4. 첫 번째 Issue 만들기",[93,250,251,254,257,260],{},[96,252,253],{},"저장소의 Issues 탭을 누른다.",[96,255,256],{},"초록색 New issue 버튼을 누른다.",[96,258,259],{},"템플릿 선택 화면이 나오면 Open a blank issue를 누른다.",[96,261,262],{},"제목에 다음을 입력한다.",[118,264,265],{},[53,266,267],{},"센서 데이터 저장 및 조회 API 구현",[118,269,270],{},"본문에 다음 내용을 붙여 넣는다.",[272,273,278],"pre",{"className":274,"code":275,"language":276,"meta":277,"style":277},"language-markdown shiki shiki-themes github-light github-dark","## 목표\n\n센서 데이터를 PostgreSQL에 저장하고 조회할 수 있다.\n\n## 작업\n\n- [x] SensorData Entity 작성\n- [x] Repository 작성\n- [x] POST API 구현\n- [x] 전체 조회 API 구현\n- [x] 최신 조회 API 구현\n- [x] PostgreSQL 저장 확인\n\n## 완료 조건\n\n- [x] POST 요청이 HTTP 201을 반환한다.\n- [x] PostgreSQL에 데이터가 저장된다.\n- [x] GET \u002Fapi\u002Fsensors\u002Flatest가 최신 데이터를 반환한다.\n","markdown","",[53,279,280,288,295,301,306,312,317,323,329,335,341,347,353,358,364,369,375,381],{"__ignoreMap":277},[281,282,285],"span",{"class":283,"line":284},"line",1,[281,286,287],{},"## 목표\n",[281,289,291],{"class":283,"line":290},2,[281,292,294],{"emptyLinePlaceholder":293},true,"\n",[281,296,298],{"class":283,"line":297},3,[281,299,300],{},"센서 데이터를 PostgreSQL에 저장하고 조회할 수 있다.\n",[281,302,304],{"class":283,"line":303},4,[281,305,294],{"emptyLinePlaceholder":293},[281,307,309],{"class":283,"line":308},5,[281,310,311],{},"## 작업\n",[281,313,315],{"class":283,"line":314},6,[281,316,294],{"emptyLinePlaceholder":293},[281,318,320],{"class":283,"line":319},7,[281,321,322],{},"- [x] SensorData Entity 작성\n",[281,324,326],{"class":283,"line":325},8,[281,327,328],{},"- [x] Repository 작성\n",[281,330,332],{"class":283,"line":331},9,[281,333,334],{},"- [x] POST API 구현\n",[281,336,338],{"class":283,"line":337},10,[281,339,340],{},"- [x] 전체 조회 API 구현\n",[281,342,344],{"class":283,"line":343},11,[281,345,346],{},"- [x] 최신 조회 API 구현\n",[281,348,350],{"class":283,"line":349},12,[281,351,352],{},"- [x] PostgreSQL 저장 확인\n",[281,354,356],{"class":283,"line":355},13,[281,357,294],{"emptyLinePlaceholder":293},[281,359,361],{"class":283,"line":360},14,[281,362,363],{},"## 완료 조건\n",[281,365,367],{"class":283,"line":366},15,[281,368,294],{"emptyLinePlaceholder":293},[281,370,372],{"class":283,"line":371},16,[281,373,374],{},"- [x] POST 요청이 HTTP 201을 반환한다.\n",[281,376,378],{"class":283,"line":377},17,[281,379,380],{},"- [x] PostgreSQL에 데이터가 저장된다.\n",[281,382,384],{"class":283,"line":383},18,[281,385,386],{},"- [x] GET \u002Fapi\u002Fsensors\u002Flatest가 최신 데이터를 반환한다.\n",[118,388,389],{},"화면 오른쪽 설정은 다음과 같이 지정한다.",[93,391,392,395,398,401],{},[96,393,394],{},"Assignees → 자기 GitHub 계정 선택",[96,396,397],{},"Labels → enhancement가 있으면 선택",[96,399,400],{},"Projects → Pi Monitor Roadmap 선택",[96,402,403],{},"Milestone → v0.1 Backend MVP 선택",[118,405,406],{},"마지막으로 Submit new issue를 누른다.",[118,408,409],{},"Issue가 생성되면 제목 옆에 #1 같은 번호가 생긴다. 이 번호를 기억한다. 반드시 #1일 필요는 없고, 화면에 나온 번호를 사용하면 된다.",[118,411,412],{},"GitHub 공식 Issue 생성 안내",[89,414,416],{"id":415},"_5-issue-상태를-진행-중으로-변경하기","5. Issue 상태를 진행 중으로 변경하기",[93,418,419,422,425,428],{},[96,420,421],{},"Pi Monitor Roadmap Project로 이동한다.",[96,423,424],{},"방금 만든 Issue 카드가 Todo에 있는지 확인한다.",[96,426,427],{},"카드를 마우스로 잡는다.",[96,429,430],{},"In Progress 칸으로 끌어 놓는다.",[118,432,433],{},"현재 코드는 완성됐지만 아직 main 브랜치에 합치기 전이므로, Pull Request가 끝날 때까지는 In Progress가 적당하다.",[89,435,437],{"id":436},"_6-현재-코드를-별도-branch에-커밋하기","6. 현재 코드를 별도 Branch에 커밋하기",[118,439,440],{},"터미널에서 다음 명령을 순서대로 실행한다.",[272,442,446],{"className":443,"code":444,"language":445,"meta":277,"style":277},"language-bash shiki shiki-themes github-light github-dark","cd ~\u002Fpi-monitor\ngit switch -c feat\u002Fsensor-api\ngit status\n","bash",[53,447,448,458,473],{"__ignoreMap":277},[281,449,450,454],{"class":283,"line":284},[281,451,453],{"class":452},"sj4cs","cd",[281,455,457],{"class":456},"sZZnC"," ~\u002Fpi-monitor\n",[281,459,460,464,467,470],{"class":283,"line":290},[281,461,463],{"class":462},"sScJk","git",[281,465,466],{"class":456}," switch",[281,468,469],{"class":452}," -c",[281,471,472],{"class":456}," feat\u002Fsensor-api\n",[281,474,475,477],{"class":283,"line":297},[281,476,463],{"class":462},[281,478,479],{"class":456}," status\n",[118,481,482],{},"현재 작업 내용을 안전하게 feat\u002Fsensor-api 브랜치로 옮긴 것이다.",[118,484,485],{},"센서 API 파일만 추가한다.",[272,487,489],{"className":443,"code":488,"language":445,"meta":277,"style":277},"git add backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fdomain\u002FSensorData.java \\\n        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fdto\u002FSensorDataRequest.java \\\n        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Frepository\u002FSensorDataRepository.java \\\n        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fservice\u002FSensorDataService.java \\\n        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fcontroller\u002FSensorDataController.java\n",[53,490,491,504,511,518,525],{"__ignoreMap":277},[281,492,493,495,498,501],{"class":283,"line":284},[281,494,463],{"class":462},[281,496,497],{"class":456}," add",[281,499,500],{"class":456}," backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fdomain\u002FSensorData.java",[281,502,503],{"class":452}," \\\n",[281,505,506,509],{"class":283,"line":290},[281,507,508],{"class":456},"        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fdto\u002FSensorDataRequest.java",[281,510,503],{"class":452},[281,512,513,516],{"class":283,"line":297},[281,514,515],{"class":456},"        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Frepository\u002FSensorDataRepository.java",[281,517,503],{"class":452},[281,519,520,523],{"class":283,"line":303},[281,521,522],{"class":456},"        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fservice\u002FSensorDataService.java",[281,524,503],{"class":452},[281,526,527],{"class":283,"line":308},[281,528,529],{"class":456},"        backend\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fraspmonitor\u002Frasp_monitor\u002Fcontroller\u002FSensorDataController.java\n",[118,531,532],{},"커밋 전 문제가 없는지 검사한다.",[272,534,536],{"className":443,"code":535,"language":445,"meta":277,"style":277},"git diff --cached --check\n",[53,537,538],{"__ignoreMap":277},[281,539,540,542,545,548],{"class":283,"line":284},[281,541,463],{"class":462},[281,543,544],{"class":456}," diff",[281,546,547],{"class":452}," --cached",[281,549,550],{"class":452}," --check\n",[118,552,553],{},"아무것도 출력되지 않으면 정상이다. 이제 커밋한다.",[272,555,557],{"className":443,"code":556,"language":445,"meta":277,"style":277},"git commit -m \"feat(backend): add sensor data API\"\n",[53,558,559],{"__ignoreMap":277},[281,560,561,563,566,569],{"class":283,"line":284},[281,562,463],{"class":462},[281,564,565],{"class":456}," commit",[281,567,568],{"class":452}," -m",[281,570,571],{"class":456}," \"feat(backend): add sensor data API\"\n",[118,573,574],{},"개발노트는 별도 커밋으로 남긴다.",[272,576,578],{"className":443,"code":577,"language":445,"meta":277,"style":277},"git add backend_개발노트.md\ngit commit -m \"docs: update backend development notes\"\n",[53,579,580,589],{"__ignoreMap":277},[281,581,582,584,586],{"class":283,"line":284},[281,583,463],{"class":462},[281,585,497],{"class":456},[281,587,588],{"class":456}," backend_개발노트.md\n",[281,590,591,593,595,597],{"class":283,"line":290},[281,592,463],{"class":462},[281,594,565],{"class":456},[281,596,568],{"class":452},[281,598,599],{"class":456}," \"docs: update backend development notes\"\n",[118,601,602],{},"GitHub에 브랜치를 올린다.",[272,604,606],{"className":443,"code":605,"language":445,"meta":277,"style":277},"git push -u origin feat\u002Fsensor-api\n",[53,607,608],{"__ignoreMap":277},[281,609,610,612,615,618,621],{"class":283,"line":284},[281,611,463],{"class":462},[281,613,614],{"class":456}," push",[281,616,617],{"class":452}," -u",[281,619,620],{"class":456}," origin",[281,622,472],{"class":456},[118,624,625],{},"git add . 대신 파일을 직접 지정한 이유는 비밀번호나 불필요한 파일이 실수로 올라가는 것을 방지하기 위해서다.",[89,627,629],{"id":628},"_7-pull-request-만들기","7. Pull Request 만들기",[93,631,632,635,638],{},[96,633,634],{},"git push가 성공하면 GitHub 저장소 페이지를 새로고침한다.",[96,636,637],{},"화면 위에 노란색 안내창이 나타나는지 확인한다.",[96,639,640],{},"Compare & pull request 버튼을 누른다.",[118,642,643],{},"위쪽 브랜치 설정을 확인한다.",[272,645,650],{"className":646,"code":648,"language":649,"meta":277},[647],"language-text","base: main\ncompare: feat\u002Fsensor-api\n","text",[53,651,648],{"__ignoreMap":277},[118,653,654],{},"base는 작업을 합칠 목적지이고, compare는 방금 만든 작업 브랜치다.",[118,656,657],{},"Pull Request 제목을 입력한다.",[118,659,660],{},[53,661,662],{},"feat(backend): 센서 데이터 API 구현",[118,664,665],{},"본문에 다음을 붙여 넣는다.",[272,667,669],{"className":274,"code":668,"language":276,"meta":277,"style":277},"## 구현 내용\n\n- SensorData Entity, DTO 구현\n- Repository, Service, Controller 구현\n- POST \u002Fapi\u002Fsensors 구현\n- GET \u002Fapi\u002Fsensors 구현\n- GET \u002Fapi\u002Fsensors\u002Flatest 구현\n\n## 테스트\n\n- [x] PostgreSQL 저장 확인\n- [x] POST 요청 HTTP 201 확인\n- [x] 전체 센서 데이터 조회 확인\n- [x] 최신 센서 데이터 조회 확인\n\nCloses #1\n",[53,670,671,676,680,685,690,695,700,705,709,714,718,722,727,732,737,741],{"__ignoreMap":277},[281,672,673],{"class":283,"line":284},[281,674,675],{},"## 구현 내용\n",[281,677,678],{"class":283,"line":290},[281,679,294],{"emptyLinePlaceholder":293},[281,681,682],{"class":283,"line":297},[281,683,684],{},"- SensorData Entity, DTO 구현\n",[281,686,687],{"class":283,"line":303},[281,688,689],{},"- Repository, Service, Controller 구현\n",[281,691,692],{"class":283,"line":308},[281,693,694],{},"- POST \u002Fapi\u002Fsensors 구현\n",[281,696,697],{"class":283,"line":314},[281,698,699],{},"- GET \u002Fapi\u002Fsensors 구현\n",[281,701,702],{"class":283,"line":319},[281,703,704],{},"- GET \u002Fapi\u002Fsensors\u002Flatest 구현\n",[281,706,707],{"class":283,"line":325},[281,708,294],{"emptyLinePlaceholder":293},[281,710,711],{"class":283,"line":331},[281,712,713],{},"## 테스트\n",[281,715,716],{"class":283,"line":337},[281,717,294],{"emptyLinePlaceholder":293},[281,719,720],{"class":283,"line":343},[281,721,352],{},[281,723,724],{"class":283,"line":349},[281,725,726],{},"- [x] POST 요청 HTTP 201 확인\n",[281,728,729],{"class":283,"line":355},[281,730,731],{},"- [x] 전체 센서 데이터 조회 확인\n",[281,733,734],{"class":283,"line":360},[281,735,736],{},"- [x] 최신 센서 데이터 조회 확인\n",[281,738,739],{"class":283,"line":366},[281,740,294],{"emptyLinePlaceholder":293},[281,742,743],{"class":283,"line":371},[281,744,745],{},"Closes #1\n",[118,747,748],{},"여기서 #1은 앞에서 만든 실제 Issue 번호로 바꿔야 한다.\nCloses #1을 작성하면 Pull Request가 합쳐질 때 해당 Issue도 자동으로 닫힌다.",[93,750,751],{},[96,752,753],{},"초록색 Create pull request 버튼을 누른다.",[118,755,756],{},"GitHub 공식 Pull Request 생성 안내",[89,758,760],{"id":759},"_8-변경된-코드-확인하기","8. 변경된 코드 확인하기",[118,762,763],{},"Pull Request 화면에는 다음 탭이 있다.",[93,765,766,769,772,775],{},[96,767,768],{},"Conversation: 설명, 대화, 커밋 상태",[96,770,771],{},"Commits: 포함된 커밋 목록",[96,773,774],{},"Checks: 자동 테스트 결과",[96,776,777],{},"Files changed: 실제 변경된 코드",[118,779,780],{},"Files changed를 눌러 다음을 확인한다.",[93,782,783,786,789],{},[96,784,785],{},"비밀번호가 포함되지 않았는지",[96,787,788],{},".env 같은 환경설정 파일이 올라가지 않았는지",[96,790,791],{},"센서 API와 개발노트만 변경됐는지",[118,793,794],{},"문제가 없다면 다시 Conversation 탭으로 돌아간다.",[89,796,798],{"id":797},"_9-pull-request-합치기","9. Pull Request 합치기",[93,800,801,804,807,810],{},[96,802,803],{},"Conversation 화면 아래로 내려간다.",[96,805,806],{},"초록색 Merge pull request 버튼을 누른다.",[96,808,809],{},"Confirm merge를 누른다.",[96,811,812],{},"합쳐진 후 Delete branch 버튼이 나타나면 누른다.",[118,814,815],{},"Delete branch는 GitHub에 있는 작업 브랜치만 제거한다. main 브랜치와 합쳐진 코드는 삭제되지 않는다.",[118,817,818],{},"Closes #번호가 제대로 작성됐다면:",[93,820,821,824],{},[96,822,823],{},"Issue가 자동으로 Closed 처리된다.",[96,825,826],{},"Project 카드도 자동으로 Done이 될 수 있다.",[118,828,829],{},"자동으로 이동하지 않으면 Project에서 직접 Done으로 끌어 놓으면 된다.",[89,831,833],{"id":832},"_10-로컬-컴퓨터-정리하기","10. 로컬 컴퓨터 정리하기",[118,835,836],{},"Pull Request를 합친 뒤 터미널에서 실행한다.",[272,838,840],{"className":443,"code":839,"language":445,"meta":277,"style":277},"cd ~\u002Fpi-monitor\ngit switch main\ngit pull\ngit branch -d feat\u002Fsensor-api\n",[53,841,842,848,857,864],{"__ignoreMap":277},[281,843,844,846],{"class":283,"line":284},[281,845,453],{"class":452},[281,847,457],{"class":456},[281,849,850,852,854],{"class":283,"line":290},[281,851,463],{"class":462},[281,853,466],{"class":456},[281,855,856],{"class":456}," main\n",[281,858,859,861],{"class":283,"line":297},[281,860,463],{"class":462},[281,862,863],{"class":456}," pull\n",[281,865,866,868,871,874],{"class":283,"line":303},[281,867,463],{"class":462},[281,869,870],{"class":456}," branch",[281,872,873],{"class":452}," -d",[281,875,472],{"class":456},[118,877,878],{},"마지막 상태를 확인한다.",[272,880,882],{"className":443,"code":881,"language":445,"meta":277,"style":277},"git status\n",[53,883,884],{"__ignoreMap":277},[281,885,886,888],{"class":283,"line":284},[281,887,463],{"class":462},[281,889,479],{"class":456},[118,891,892],{},"다음과 비슷하게 나오면 완료다.",[272,894,897],{"className":895,"code":896,"language":649,"meta":277},[647],"On branch main\nYour branch is up to date with 'origin\u002Fmain'.\nnothing to commit, working tree clean\n",[53,898,896],{"__ignoreMap":277},[118,900,901],{},"이 과정을 마치면 포트폴리오에서 단순히 “코드를 작성했다”가 아니라 다음 기록이 모두 남는다.",[93,903,904,907,910,913,916,919],{},[96,905,906],{},"개발 계획 Project",[96,908,909],{},"백엔드 목표 Milestone",[96,911,912],{},"작업 요구사항 Issue",[96,914,915],{},"기능별 커밋",[96,917,918],{},"코드 검토 기록 Pull Request",[96,920,921],{},"PostgreSQL 연동 테스트 내용",[923,924,925],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":277,"searchDepth":290,"depth":290,"links":927},[928],{"id":138,"depth":290,"text":139},[930,931],"project","깃허브_프로젝트","2026-08-17 01:05:35 +0900","md",null,"\u002Fproject\u002F깃허브_프로젝트\u002F2026\u002F08\u002F17\u002Fgithub_project\u002F",{"layout":937},"post","\u002Fposts\u002Fproject\u002F_\u002Fgithub_project",{"title":5,"description":120},"posts\u002Fproject\u002F깃허브_프로젝트\u002Fgithub_project",[],"KW9GsoAFWsBMX3EXLYMM7PplqQrh-BDzfFsK_Xkw1dI",1788744790017]