<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hello_seung.log</title>
        <link>https://velog.io/</link>
        <description>Blog: https://dseung001.github.io/</description>
        <lastBuildDate>Thu, 11 Jun 2026 08:15:15 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hello_seung.log</title>
            <url>https://velog.velcdn.com/images/hello_seung/profile/6a42b48e-34a5-45df-aa3b-ac74a0ecb92e/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hello_seung.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hello_seung" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Class Project 1차 회고]]></title>
            <link>https://velog.io/@hello_seung/Class-Project-1%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@hello_seung/Class-Project-1%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Thu, 11 Jun 2026 08:15:15 GMT</pubDate>
            <description><![CDATA[<div class="post-content"><h1 id="개요">개요<a hidden="" class="anchor" aria-hidden="true" href="#개요">#</a></h1><p>1차 MVP는 현재 학원 내에서 배포 중이며, 도메인 연결 후 공유할 예정입니다.</p><p>슬슬 머릿속에는 있지만 말로는 정리가 안 되는 단계에 닿은 것 같아 글로 정리합니다.</p><h2 id="anime-search에서의-한계">Anime Search에서의 한계<a hidden="" class="anchor" aria-hidden="true" href="#anime-search에서의-한계">#</a></h2><p>지난번에 진행했던 <a href="https://dseung001.github.io/posts/2026/05/10/anime-search-project/">Anime Search Project</a>에서 장면 검색 RAG까지 구현하며 결과적으로 마음에 들지 않았던 점은, 어디까지나 기술적 호기심 해결로 끝났다는 점이었습니다.</p><p>해당 글에서도 마지막에 다음과 같이 정리했죠.</p><blockquote><p>위 파이프라인까지 구현해 6장 초반 화면처럼 자연어 검색이 동작합니다.
다만 아직 부족한 점도 있고, 실용성이 떨어지는 부분도 몇 군데 보였습니다.</p><ol><li>애니메이션의 경우 자막을 쓰는 편이 더 효율적으로 보임</li><li>스포일러 방지, 사용자가 조건을 넣지 않으면 원치 않는 화나 장면이 노출될 수 있음</li><li>프레임 샘플링 한계, 성능을 올리면 리소스 사용량이 커져 실용성이 떨어짐</li></ol></blockquote><h2 id="class-project-목적성">Class Project 목적성<a hidden="" class="anchor" aria-hidden="true" href="#class-project-목적성">#</a></h2><p>실제로 사용자 풀을 다루는 서비스를 배포하는 게 가장 이상적이지만, 사용자들에게 직접적인 서비스를 배포하면서 동영상 관련 기술을 공부하고 싶다는 목적도 같이 이루는 프로젝트 방향이 잘 떠오르지 않았습니다.</p><p>다행히 공부 환경을 만들기 위해 온 학원에서 강사 선생님께서 강의 영상 녹화본을 올려줄 수 있다고 하셔서 프로젝트 방향을 정할 수 있었습니다. 실제 사용자 풀을 가진 서비스를 운영하면서 동영상에 관한 기술 경험도 쌓을 수 있게 된 거죠.</p><h1 id="프로젝트">프로젝트<a hidden="" class="anchor" aria-hidden="true" href="#프로젝트">#</a></h1><h2 id="목표">목표<a hidden="" class="anchor" aria-hidden="true" href="#목표">#</a></h2><p>위에서 언급했듯이 기본 컨셉은 강의 녹화본을 업로드할 수 있어야 합니다.
스트리밍이나 OTT 분야에 대한 지식이 전무했기 때문에 관련 지식을 공부했었죠.(<a href="https://dseung001.github.io/posts/2026/05/26/rfc8216-http-live-streaming/">RFC 8216 — HTTP Live Streaming</a>)</p><p>비교적 사이즈가 작은 규모에서는 <code>HLS + S3 + CF</code> 구조면 충분해 보였지만 욕심이 생겨서 처음 배포할 때부터 멀티파트 업로드로 바이트 단위 청크를 나누는 넷플릭스 방식으로 인코딩 서버까지 만들고 백엔드 서버와 통신하는 구조를 구상했지만 이에 대해서 실제 서비스의 생명주기를 간접 체험하는 걸 위해 배포 후 고도화하는 방식으로 하는 게 어떻냐는 피드백을 받았습니다.</p><p>제가 보았을 때도 그러는 편이 Before/After를 비교하기 더 쉬울 것 같아 일단은 <code>HLS + S3 + CF</code> 구조를 채택했습니다.
현재 빠른 피드백을 받을 수 있는 환경이니 이점을 살려서 빠르게 서비스를 배포하는 걸 목표로 정했습니다.</p><h2 id="진행-방법">진행 방법<a hidden="" class="anchor" aria-hidden="true" href="#진행-방법">#</a></h2><p>와이어프레임 같은 프로세스 흐름을 따로 정하진 않고 프론트 부분은 제가 편한 대로 구상했습니다.
실 서비스를 배포하는 게 목표지만 결국엔 진짜 목적은 동영상을 다루는 서비스를 경험하는 부분이라서 다음처럼 스프린트 달력으로 당일 할 수 있는 영역을 정해서 진행하며 뒤처지지 않도록 했죠.
<img alt="sprint" loading="lazy" src="https://dseung001.github.io/posts/2026/06/09/class-project-retrospective-1/sprint.webp"></p><h2 id="기능">기능<a hidden="" class="anchor" aria-hidden="true" href="#기능">#</a></h2><p>이 프로젝트의 부모가 되는 프로젝트는 OTT 사이트 클론 코딩이었습니다.<br>그때 클론 대상으로 삼았던 사이트의 기술 스택이 <code>Django</code>, <code>Next.js</code>, <code>React</code>였기에 그대로 채택하는 방식을 정하였고, 해당 서비스에서 이 스택을 채택한 이유는 이들의 장점인 빠른 생산성과 안전성일 것으로 추측됩니다. 아니면 대부분의 프로젝트가 그렇듯이 시작했던 스택이 그거였을 수도 있고요.</p><p>전체 플로우는 회원가입 → 업로드 → 시청 세 구간으로 나눕니다.</p><p>회원가입은 아래 흐름으로 진행됩니다.</p><ol><li>이메일 입력</li><li>OTP 발송·인증 (5분 유효)</li><li>비밀번호 설정·회원가입</li><li>내 정보 수정에서 선생님(업로더) 권한 요청</li><li>Django Admin 승인</li><li>헤더에 「강의 업로드」 메뉴 노출</li></ol><hr><p>그 후 아래 과정을 통해 업로드가 가능하죠</p><ul><li>Step 1: 커리큘럼 생성 또는 선택</li><li>Step 2: 강좌 정보, 비디오 파일, 타임라인</li><li>Step 3: 썸네일 (이미지 업로드 또는 영상 프레임)</li></ul><p>처음 업로드할 때 API는 동기적으로 아래 플로우를 포함합니다.</p><ul><li>S3 staging 업로드<ul><li><code>staging/{job_id}/videos/...</code> (원본)</li><li><code>staging/{job_id}/thumbnails/...</code> (선택: 썸네일을 별도로 업로드한 경우)</li><li><code>staging/{job_id}/manifest.json</code> (데이터 저장용 메타데이터)</li></ul></li><li><code>PublishJob</code> 생성 (<code>queued</code>)</li><li>Celery <code>encode</code> 큐에 task 등록</li><li>프론트: <code>202</code> + <code>job_id</code> 수신 → 업로드 현황에서 진행률 폴링</li></ul><hr><p>이제 백엔드에서 비동기 워커가 task를 잡고 동작합니다.</p><ul><li>워커가 S3 staging에 있는 파일을 로컬 <code>tmp</code> 폴더로 다운로드</li><li>영상마다:<ul><li>FFmpeg HLS 인코딩 (백엔드 서버의 <code>tmp</code>에 저장)</li><li>썸네일 처리 (업로드 이미지 사용 또는 프레임 추출 → S3)</li><li>HLS 완성본 S3 업로드 (<code>hls/{asset_id}/index.m3u8</code>, <code>seg_*.ts</code>)</li><li>DB 생성 (<code>Course</code>, <code>Video</code>, <code>VideoTimeline</code>)</li><li><code>video_url</code> / <code>thumbnail_url</code> 저장 (prod: CloudFront 도메인 URL)</li></ul></li><li>영상 처리가 모두 끝나면 S3 staging과 워커 <code>tmp</code> 삭제</li><li>DB의 <code>PublishJob</code> 상태를 <code>completed</code>로 변경</li></ul><hr><p>다이어그램으로 보면 직관적이니 아래 구조를 참고합시다. 아래는 업로드와 관련된 다이어그램입니다.</p>


<p><img src="https://velog.velcdn.com/images/hello_seung/post/565e947c-7c59-4f8e-a907-e51accc97436/image.png" alt=""></p>
<p>아래는 시청에 대한 다이어그램입니다. CF를 사용해 캐싱으로 트래픽 비용을 절감하도록 구상했습니다.</p>

<p>  <img src="https://velog.velcdn.com/images/hello_seung/post/2d6c458d-1f2b-41e4-b677-9ec22aa5232d/image.png" alt="업로드"></p>
  <p>기능을 구현할 때는 주로 인프라와 관련된 고민이 많이 생겼습니다. 용량이 작은 파일이면 문제가 없지만 강좌 영상의 경우 수 시간이 넘어갈 수 있다 보니 서버 운영 측면에서 비용에 신경이 많이 쓰이더군요.</p><p>현재 프로젝트는 다음 특징을 지닙니다.</p><ul><li>잡이 많이 쌓여 원본 영상이 많이 대기 중인 경우를 대비하기 위해 원본도 S3에 업로드해서 디스크 부족이 발생할 가능성을 줄입니다.</li><li>인코딩에 많은 시간이 소요되므로 비동기 잡으로 인코딩 작업을 진행해서 사용자 경험 개선을 했습니다.</li><li>인코딩 실패 시 잡 상태로도 남고 로그로도 남게 처리되며 비동기 작업에 대한 결과는 UI로 선생님이 바로 판단이 가능하게 메뉴화했으며 여기서 실패한 강좌를 지우면 관련 고아 파일도 삭제되게 구성했습니다.</li><li>HLS 단일 화질로 인코딩함으로써, 사용자가 영상 시청 시 전체 영상이 아닌 세그먼트 단위로 요청을 보내 초기 재생 준비가 빨라지고, 전체를 보지 않고 일부만 봤을 때 적은 트래픽으로 서비스할 수 있게 했습니다.</li><li>사용자 경험을 고려해서 ABR은 고민했지만 저장 용량이 너무 늘어나기 때문에 단일 화질로 가로 1920px, CRF 22로 인코딩했습니다.<ul><li>CRF 22는 강좌 영상에 코드가 나왔을 때 잘 보이게 하기 위한 적당한 기본값입니다.</li><li>트래픽을 아끼기 위해 <code>-maxrate</code>로 5Mbps 상한을 두었습니다.</li></ul></li></ul><h2 id="배포">배포<a hidden="" class="anchor" aria-hidden="true" href="#배포">#</a></h2><p>위에서 언급한 대로 <code>HLS + S3 + CloudFront</code> 구조를 유지하고, 프록시 서버, 프론트 서버, API 서버, Celery 워커, PostgreSQL은 EC2 한 대에서 같이 띄웠고 인프라로 S3, CF 등의 서비스를 추가로 이용했죠.</p><p>콘솔에서 선택한 스펙은 아래와 같습니다.</p><table><thead><tr><th>항목</th><th>값</th></tr></thead><tbody><tr><td>인스턴스 유형</td><td><code>m7i-flex.large</code></td></tr><tr><td>vCPU</td><td>2</td></tr><tr><td>아키텍처</td><td>x86_64</td></tr><tr><td>메모리</td><td>8 GiB</td></tr><tr><td>네트워크</td><td>최대 12.5 Gbps</td></tr><tr><td>Linux 온디맨드 요금</td><td>$0.11771 / 시간</td></tr><tr><td>EBS (루트 볼륨)</td><td>8 GB (업로드·인코딩 <code>tmp</code> 여유를 고려한 용량)</td></tr></tbody></table><p>이를 토대로 (AWS는 730시간 기준) 아래 테이블처럼 나오게 되네요.</p><table><thead><tr><th>항목</th><th>계산</th><th>월 예상 (USD)</th></tr></thead><tbody><tr><td>EC2 <code>m7i-flex.large</code> (Linux)</td><td>$0.11771 × 730시간</td><td>약 $85.9</td></tr><tr><td>EBS 8 GB (<code>gp3</code>, 서울 리전 대략)</td><td>$0.096/GB × 8</td><td>약 $0.8</td></tr><tr><td>S3 저장</td><td>30 GB 가정 × ~$0.025/GB</td><td>약 $0.8</td></tr><tr><td>S3 요청·EC2↔S3 전송</td><td>학원 규모 소량 업로드·인코딩</td><td>약 $2 ~ $5</td></tr><tr><td>CloudFront 전송</td><td>월 30 GB 재생 egress 가정</td><td>약 $3 ~ $6</td></tr><tr><td>합계 (대략)</td><td></td><td>약 $93 ~ $99 / 월</td></tr></tbody></table><p>$140를 프리 티어로 받았는데, 이거 두 달이면 다 소진하겠네요.</p><h1 id="화면">화면<a hidden="" class="anchor" aria-hidden="true" href="#화면">#</a></h1><p>사용자는 로그인 여부와 상관없이 강좌를 볼 수 있지만, 업로드는 선생님 권한을 인가받은 사람만 가능합니다.
<img alt="main" loading="lazy" src="https://dseung001.github.io/posts/2026/06/09/class-project-retrospective-1/main.webp">
기존 커리큘럼을 사용하거나 새로 등록할 수 있죠.
<img alt="step1" loading="lazy" src="https://dseung001.github.io/posts/2026/06/09/class-project-retrospective-1/step1.webp">
강좌에는 설명과 영상을 추가할 수 있는데, 영상은 여러 개 올릴 수 있으며 영상 안에 타임라인을 지정할 수 있습니다.<br>또 영상마다 md로 설명을 추가할 수 있죠.
<img alt="step2" loading="lazy" src="https://dseung001.github.io/posts/2026/06/09/class-project-retrospective-1/step2.webp">
썸네일은 별도로 업로드하거나 영상 내에서 프레임 단위로 지정할 수 있습니다.
<img alt="step3" loading="lazy" src="https://dseung001.github.io/posts/2026/06/09/class-project-retrospective-1/step3.webp">
선생님 권한이 있을 경우 본인이 업로드한 강좌들의 업로드 상태나 업로드 진행률을 체크할 수 있습니다.
<img alt="job" loading="lazy" src="https://dseung001.github.io/posts/2026/06/09/class-project-retrospective-1/job.webp"></p><h1 id="확장">확장<a hidden="" class="anchor" aria-hidden="true" href="#확장">#</a></h1><p>개발 예정인 기능이 아직 많습니다.<br>실질적으로 사용자에게 가장 큰 변화를 주는 기능을 먼저 구현할 예정입니다.</p><ul><li>업로드가 아닌 유튜브 링크를 통한 공유</li><li>자유 게시판</li></ul><p>그 후에는 테스트와 고도화를 병행할 생각이지만, 무엇보다 비용 절감에 초점을 둘 예정이죠.<br>고도화에서는 아래 영역에 대해서 작업이 필요하죠.</p><ul><li>HLS 세그먼트 다수 업로드: <code>.ts</code>마다 S3 PutObject가 늘어 요청 비용이 오르는 문제 해결</li><li>인코딩 서버 구현: ffmpeg를 쓰지 않고 직접 인코딩 구현해서 최적화</li><li>멀티파트 업로드로 바이트 단위 청크 전송을 최적화</li><li>디스크 문제: 로컬에 원본 파일과 인코딩 파일이 동시에 존재할 때도 괜찮은지 체크</li><li>배포 비용 절감의 필요</li></ul><p>테스트 및 분석 영역</p><ul><li>과부하 테스트</li><li>큰 파일이 들어왔을 때(GB 단위)</li><li>보안 이슈 체크</li></ul></div>]]></description>
        </item>
        <item>
            <title><![CDATA[[2024 SQLD] 오답 노트 및 시험 준비]]></title>
            <link>https://velog.io/@hello_seung/2024-SQLD-%EC%98%A4%EB%8B%B5-%EB%85%B8%ED%8A%B8-%EB%B0%8F-%EC%8B%9C%ED%97%98-%EC%A4%80%EB%B9%84</link>
            <guid>https://velog.io/@hello_seung/2024-SQLD-%EC%98%A4%EB%8B%B5-%EB%85%B8%ED%8A%B8-%EB%B0%8F-%EC%8B%9C%ED%97%98-%EC%A4%80%EB%B9%84</guid>
            <pubDate>Fri, 24 May 2024 12:21:59 GMT</pubDate>
            <description><![CDATA[<p>이번에 SQLD 준비하며 글을 몇개 봤는데
내가 제일 잘 정리한 듯</p>
<p><a href="https://seung.tistory.com/entry/2024-SQLD-%EC%98%A4%EB%8B%B5-%EB%85%B8%ED%8A%B8-%EB%B0%8F-%EC%8B%9C%ED%97%98-%EC%A4%80%EB%B9%84">https://seung.tistory.com/entry/2024-SQLD-%EC%98%A4%EB%8B%B5-%EB%85%B8%ED%8A%B8-%EB%B0%8F-%EC%8B%9C%ED%97%98-%EC%A4%80%EB%B9%84</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 12 Delete Dummy]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-12-Delete-Dummy</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-12-Delete-Dummy</guid>
            <pubDate>Wed, 17 Jan 2024 07:15:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/c33cfb19-677e-4dad-b07f-407c5e37dcc7/image.gif" alt=""></p>
<p>자 이제 마지막입니다.
Delete Dummy란 간단하게 글을 지웠을 때 남은 더미 데이터를 지우는 코드를 추가했다는 의미입니다.</p>
<p>이걸 따라오셨다면</p>
<p>정말 대단합니다..
열심히 적었지만 아무도 안할 것 같았거든요..</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-12-Delete-Dummy">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 11 SubReply]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-11-SubReply</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-11-SubReply</guid>
            <pubDate>Wed, 17 Jan 2024 07:13:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/d6643b41-8d84-4138-be28-3cc152a1aa80/image.gif" alt=""></p>
<p>답글의 답글 기능인 대댓글 기능을 추가했습니다.</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-11-SubReply">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 10부 Reply(Update & Delete)]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-10%EB%B6%80-ReplyUpdate-Delete</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-10%EB%B6%80-ReplyUpdate-Delete</guid>
            <pubDate>Wed, 17 Jan 2024 07:11:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/36034308-f601-44d0-b9cf-0c071c0d3302/image.gif" alt=""></p>
<p>답글의 수정 기능과 삭제 기능을 추가했습니다</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-10%EB%B6%80-ReplyUpdate-Delete">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 9부 Reply(List & Create)]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-9%EB%B6%80-ReplyList-Create</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-9%EB%B6%80-ReplyList-Create</guid>
            <pubDate>Wed, 17 Jan 2024 07:10:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/f5678e26-d8dd-4baf-b057-22a078a80236/image.gif" alt=""></p>
<p>글에 답글 기능을 달 수 있는 기능을 추가했습니다!</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-9%EB%B6%80-ReplyList-Create">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 8부 Lock]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-8%EB%B6%80-Lock</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-8%EB%B6%80-Lock</guid>
            <pubDate>Wed, 17 Jan 2024 07:10:01 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/ec03bcb7-f22d-46c5-9c59-2095826aa018/image.gif" alt=""></p>
<p>이제 게시판에서 Lock 기능을 추가했습니다.
글 잠금 기능입니다.</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-8%EB%B6%80-Lock">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 7부 Update & Delete]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-7%EB%B6%80-Update-Delete</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-7%EB%B6%80-Update-Delete</guid>
            <pubDate>Wed, 17 Jan 2024 07:07:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/832c17c0-ceaa-494f-b209-17f0c3d2a9ad/image.gif" alt=""></p>
<p>이제 PHP MVC의 Update &amp; Delete 기능을 추가했습니다.</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-7%EB%B6%80-Update-Delete">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 6부 Read]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-6%EB%B6%80-Read</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-6%EB%B6%80-Read</guid>
            <pubDate>Wed, 17 Jan 2024 07:05:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/a7e2f971-deb0-4d16-af81-235705f581e4/image.gif" alt=""></p>
<p>Read 기능을 만들었습니다.
이제 글을 볼 수 있습니다!</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-6%EB%B6%80-Read">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 5부 Pagination]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-5%EB%B6%80-Pagination</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-5%EB%B6%80-Pagination</guid>
            <pubDate>Wed, 17 Jan 2024 07:00:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/17e51071-d792-4d19-83c9-cda1e55b0a53/image.gif" alt=""></p>
<p>페이지네이션 기능을 추가했습니다.
고등학생때 페이지네이션 만들며 머리 아팠던 기억이 나네요</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-5%EB%B6%80-Pagination">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 4부 Controller]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-4%EB%B6%80-Controller-wvqm7rjo</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-4%EB%B6%80-Controller-wvqm7rjo</guid>
            <pubDate>Wed, 17 Jan 2024 06:59:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/4f479de3-07b1-4142-8e3e-edddb238550c/image.gif" alt=""></p>
<p>php로 controller로 기능을 추가했습니다.
컨트롤러로 웹 사이트 백엔드 기능을 담당합니다.</p>
<p>Model과는 통신하며 데이터를 저장, 수정, 삭제를 하며
View에 데이터를 전달하는 역할을 합니다.</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-4%EB%B6%80-Controller?category=1104755">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 3부 View(List & Create)]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-3%EB%B6%80-ViewList-Create</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-3%EB%B6%80-ViewList-Create</guid>
            <pubDate>Wed, 17 Jan 2024 06:58:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/a1a19102-fe50-4ab8-8e4c-08603673a804/image.gif" alt=""></p>
<p>View 기능을 추가했습니다.
라라벨에서는 Blade로 별도 파일 확장자를 만드는 이유가 있습니다.
코드는 보기 좋아야합니다 </p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-3%EB%B6%80-ViewList-Create">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 2부 Routing]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-2%EB%B6%80-Routing-xms6191k</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-2%EB%B6%80-Routing-xms6191k</guid>
            <pubDate>Wed, 17 Jan 2024 06:52:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/7ba5cacf-626d-4d77-b30e-c781230db4a0/image.gif" alt=""></p>
<p>저번에 만든 야무진 글의 2강 포스트입니다.
라우팅 설정을 담아두었습니다.
.php로 파일 확장자가 나오면 안되죠 ㅎㅎ</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-2%EB%B6%80-Routing?category=1104755">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 게시판 만들기 with MVC - 1부 Migration]]></title>
            <link>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-1%EB%B6%80-Migration</link>
            <guid>https://velog.io/@hello_seung/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-1%EB%B6%80-Migration</guid>
            <pubDate>Wed, 17 Jan 2024 06:47:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hello_seung/post/46fe176c-e631-47ec-a340-988eb77de162/image.gif" alt=""></p>
<p>야무진 PHP 게시판 포스팅을 작성했습니다.
이것은 저만 볼 수 없습니다.</p>
<p>그것은 아래 링크로 볼 수 있습니다.</p>
<p>마이그레이션 파일을 만들어서 바로 데이터베이스+테이블 설정을 할 수 있게 했습니다.</p>
<p><a href="https://seung.tistory.com/entry/PHP-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-MVC-1%EB%B6%80-Migration">보러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GoLang으로 느낌 있게 채팅 방 만들어보자]]></title>
            <link>https://velog.io/@hello_seung/GoLang%EC%9C%BC%EB%A1%9C-%EB%8A%90%EB%82%8C-%EC%9E%88%EA%B2%8C-%EC%B1%84%ED%8C%85-%EB%B0%A9-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@hello_seung/GoLang%EC%9C%BC%EB%A1%9C-%EB%8A%90%EB%82%8C-%EC%9E%88%EA%B2%8C-%EC%B1%84%ED%8C%85-%EB%B0%A9-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Sun, 27 Aug 2023 11:05:33 GMT</pubDate>
            <description><![CDATA[<h1 id="golang으로-느낌-있게-채팅-방-만들어보자">GoLang으로 느낌 있게 채팅 방 만들어보자</h1>
<p>Golang을 이용해 여려명이서 채팅할 수 있는 웹 페이지를 만들었습니다.</p>
<p>아래 주소에서 확인하실 수 있어요</p>
<p><a href="https://seung.tistory.com/entry/GoLang%EC%9C%BC%EB%A1%9C-%EB%8A%90%EB%82%8C-%EC%9E%88%EA%B2%8C-%EC%B1%84%ED%8C%85-%EB%B0%A9-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90">https://seung.tistory.com/entry/GoLang%EC%9C%BC%EB%A1%9C-%EB%8A%90%EB%82%8C-%EC%9E%88%EA%B2%8C-%EC%B1%84%ED%8C%85-%EB%B0%A9-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GO로 REST API 만들기 (3) - Bolt DB 연결]]></title>
            <link>https://velog.io/@hello_seung/GO%EB%A1%9C-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-3-Bolt-DB-%EC%97%B0%EA%B2%B0</link>
            <guid>https://velog.io/@hello_seung/GO%EB%A1%9C-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-3-Bolt-DB-%EC%97%B0%EA%B2%B0</guid>
            <pubDate>Mon, 10 Jul 2023 08:16:03 GMT</pubDate>
            <description><![CDATA[<h1 id="go-lang으로-간단하게-crud-rest-api-만들기-3편---bolt-db-연결">Go Lang으로 간단하게 CRUD REST API 만들기 3편 - Bolt DB 연결<img src="https://velog.velcdn.com/images/hello_seung/post/165ee620-e8de-4171-97c7-e7817b038404/image.gif" alt=""></h1>
<p>지난 시리즈에서는 메모리에만 저장해서 데이터가 사라졌지만 Bolt DB를 연결해 사라지지 않게 수정했습니다.</p>
<p><a href="https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-3-Bolt-DB-%EC%97%B0%EA%B2%B0">https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-3-Bolt-DB-%EC%97%B0%EA%B2%B0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GO로 REST API 만들기 (2)]]></title>
            <link>https://velog.io/@hello_seung/GO%EB%A1%9C-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</link>
            <guid>https://velog.io/@hello_seung/GO%EB%A1%9C-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</guid>
            <pubDate>Thu, 06 Jul 2023 04:36:01 GMT</pubDate>
            <description><![CDATA[<h1 id="go-lang으로-간단하게-crud-rest-api-만들기-2편">Go Lang으로 간단하게 CRUD REST API 만들기 2편</h1>
<p>POST, PATH, DELETE 메소드들을 핸들링하는 법을 정리했습니다.</p>
<p><a href="https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-2">https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GO로 REST API 만들기 (1)]]></title>
            <link>https://velog.io/@hello_seung/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</link>
            <guid>https://velog.io/@hello_seung/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</guid>
            <pubDate>Wed, 05 Jul 2023 07:20:45 GMT</pubDate>
            <description><![CDATA[<h1 id="go-lang으로-간단하게-crud--rest-api-만들기--1편">Go Lang으로 간단하게 CRUD  REST API 만들기  1편</h1>
<p>최근 공부 중인 Go로 REST API를 만들고 있습니다.
2편까지 나오며 내일 중으로 포스팅 될 예정입니다.</p>
<p>티스토리 블로그로 정리해두었습니다, 관심있으면 봐주시길바랍니다.</p>
<p><a href="https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-1#Go%20Lang%EC%9C%BC%EB%A1%9C%20%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C%20CRUD%C2%A0%20REST%20API%20%EB%A7%8C%EB%93%A4%EA%B8%B0%C2%A0%201%ED%8E%B8-1!%5B%5D(https://velog.velcdn.com/images/hello_seung/post/3350f392-4f4f-4a03-96e3-0f214008893d/image.png)">https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-1#Go%20Lang%EC%9C%BC%EB%A1%9C%20%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C%20CRUD%C2%A0%20REST%20API%20%EB%A7%8C%EB%93%A4%EA%B8%B0%C2%A0%201%ED%8E%B8-1![](https://velog.velcdn.com/images/hello_seung/post/3350f392-4f4f-4a03-96e3-0f214008893d/image.png)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Laravel9] 쉽게 라라벨 DI, IOC 이해하기]]></title>
            <link>https://velog.io/@hello_seung/Laravel9-%EC%89%BD%EA%B2%8C-%EB%9D%BC%EB%9D%BC%EB%B2%A8-DI-IOC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hello_seung/Laravel9-%EC%89%BD%EA%B2%8C-%EB%9D%BC%EB%9D%BC%EB%B2%A8-DI-IOC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 17 Feb 2023 13:34:18 GMT</pubDate>
            <description><![CDATA[<p>라라벨로 자동 백업 기능을 만들어 스케줄링하는 방법입니다.
velog로 티스토리 글을 마이그레이션하기 귀찮기에 이렇게나마 링크로 공유해드립니다.</p>
<p><a href="https://seung.tistory.com/entry/Laravel9-%EC%89%BD%EA%B2%8C-%EB%9D%BC%EB%9D%BC%EB%B2%A8-DI-IOC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0">바로가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Laravel 9] 라라벨 DB 백업 명령어 만들기 및 자동화 with Artisan console]]></title>
            <link>https://velog.io/@hello_seung/Laravel9-%EB%9D%BC%EB%9D%BC%EB%B2%A8-DB-%EB%B0%B1%EC%97%85-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B0%8F-%EC%9E%90%EB%8F%99%ED%99%94-with-Artisan-console</link>
            <guid>https://velog.io/@hello_seung/Laravel9-%EB%9D%BC%EB%9D%BC%EB%B2%A8-DB-%EB%B0%B1%EC%97%85-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B0%8F-%EC%9E%90%EB%8F%99%ED%99%94-with-Artisan-console</guid>
            <pubDate>Tue, 01 Nov 2022 04:22:16 GMT</pubDate>
            <description><![CDATA[<p>라라벨로 자동 백업 기능을 만들어 스케줄링하는 방법입니다.
velog로 티스토리 글을 마이그레이션할 자신이 없어.. 이렇게나마 링크로 공유해드립니다.</p>
<p><a href="https://seung.tistory.com/entry/Laravel9-%EB%9D%BC%EB%9D%BC%EB%B2%A8-DB-%EB%B0%B1%EC%97%85-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B0%8F-%EC%9E%90%EB%8F%99%ED%99%94-with-Artisan-console?category=955330">바로가기</a></p>
]]></description>
        </item>
    </channel>
</rss>