<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Seokyung Kim - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/korean/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Seokyung Kim - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/korean/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 26 May 2026 04:20:48 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/korean/news/author/seokyung/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ REST API 모범 사례 – REST 엔드포인트 설계 예시 ]]>
                </title>
                <description>
                    <![CDATA[  웹 개발에서 REST API는 클라이언트와 서버 간 통신을 원활하게 하는 중요한 역할을 합니다. 여기서 클라이언트는 프론트엔드, 서버는 백엔드라고 생각할 수 있습니다. 클라이언트(프론트엔드)와 서버(백엔드)는 서로 직접적으로 호출하기보다는, Application Programming Interface (API)라 불리는 중간자 역할의 인터페이스를 사용합니다. API는 클라이언트-서버 통신 간 중요한 역할을 하므로, 항상 잘 생각해서 모범사례의 API를 설계해야 합니다. ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/rest-api-mobeom-sarye-rest-endeupointeu-seolgye-yesi/</link>
                <guid isPermaLink="false">6330ddf85128c00512f56323</guid>
                
                    <category>
                        <![CDATA[ REST API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Seokyung Kim ]]>
                </dc:creator>
                <pubDate>Mon, 26 Sep 2022 07:15:03 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/09/api.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/rest-api-best-practices-rest-endpoint-design-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">REST API Best Practices – REST Endpoint Design Examples</a>
      </p><h4></h4><h2 id="-rest-api-">웹 개발에서 REST API는 클라이언트와 서버 간 통신을 원활하게 하는 중요한 역할을 합니다.</h2><p>여기서 클라이언트는 프론트엔드, 서버는 백엔드라고 생각할 수 있습니다.</p><p>클라이언트(프론트엔드)와 서버(백엔드)는 서로 직접적으로 호출하기보다는, Application Programming Interface (API)라 불리는 중간자 역할의 인터페이스를 사용합니다.</p><p>API는 클라이언트-서버 통신 간 중요한 역할을 하므로, 항상 잘 생각해서 모범사례의 API를 설계해야 합니다. 그래야만 개발자들이 유지보수하기 쉽고, 사용하기 좋을 뿐만이 아니라, 사용하는 동안 문제를 일으키지 않습니다.</p><p>이 자료에서는 REST API를 만들기 위한 9가지 모범사례들을 소개할 예정입니다. 잘 따라온다면 여러분들은 사용자들이 사용하기 쉽고, 강력한 API들을 만들 수 있을 것입니다.</p><p>그 전에 앞서, REST API란 무엇일까요? REST는 Representational State Transfer의 약자로 해석하면 원하는 리소스를 현재 상태에 걸맞은 형태로 전송하는 것입니다. REST는 2000년에 Roy Fielding이 웹을 위해 디자인한 소프트웨어 아키텍처 형식입니다.</p><p>API(Application Programming Interface)는 Restful이라는 REST 디자인 원칙을 따릅니다.</p><p>간단히 말하자면, REST API는 두 컴퓨터가 HTTP(Hypertext Transfer Protocol)를 통해 통신할 때, 같은 형식에 맞춰 통신하도록 합니다.</p><h2 id="rest-api-">REST API 디자인을 위한 모범사례</h2><h2 id="1-json-">1. 데이터를 보내거나 받을 때 JSON 포맷을 사용하세요</h2><p>예전에는 API 요청을 보내거나 받을 때 XML이나 HTML을 사용했었지만, 최근에는 JSON(JavaScript Object Notation)을 사용하는 것이 추세입니다.</p><p>XML은 사용할 때 데이터를 인코딩/디코딩하는 게 번거로울 때가 많아 여러 프레임워크에서 지원하지 않는 경우가 많습니다.</p><p>JavaScript는 API를 받아올 때 JSON을 사용하도록 만들어져 있기 때문에 JSON으로 파싱하는 내장 메소드를 가지고 있습니다. Python이나 PHP 같은 다른 프로그래밍 언어들도 요즘은 JSON으로 파싱하거나 데이터를 다룰 수 있는 메소드들을 지원합니다. (예를 들어, Python의 <code>json.loads()</code>나 <code>json.dumps()</code>가 있습니다.)</p><p>클라이언트 단(Client-side)에서 JSON 데이터를 정확하게 해석하도록 보장하기 위해서는 요청하는 동안 응답 헤더(Response header)에서 <code>Content-Type</code> 타입을 <code>application/json</code>으로 지정해야 합니다.</p><p>반대로 다수의 서버 단(Server-side) 프레임워크들에서는 <code>Content-Type</code>을 자동으로 할당합니다. (예를 들어, Express는 <code>express.json()</code>가 그 기능을 합니다. <code>body-parser</code> 라는 NPM의 패키지도 같은 기능을 합니다.)</p><h2 id="2-">2. 엔드포인트에서는 동사 대신 명사를 사용하세요</h2><p>REST API를 설계할 때는 엔드포인트 주소에 동사를 사용하지 마세요. 이때는 명사를 사용해서 각 엔드포인트들이 무슨 일을 하는지 명시해야 합니다.</p><p>HTTP 메소드들이 이미 <code>GET</code>, <code>PUT</code>, <code>PATCH</code>, <code>DELETE</code>라는 동작을 (Create, Read, Update, Delete) 동사의 형태로 나타내기 때문입니다.</p><p><code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code>, <code>DELETE</code>는 가장 주로 쓰이는 HTTP 동사들이고, <code>COPY</code>, <code>PURGE</code>, <code>LINK</code>, <code>UNLINK</code> 등과 같은 다른 것들도 있습니다.</p><p>따라서 엔드포인트 주소는 다음과 같아서는 안 됩니다. <code>https://mysite.com/getPosts</code> 혹은 <code>https://mysite.com/createPost</code> 대신에 이런 모습이면 더 좋겠지요: <code>https://mysite.com/posts</code></p><p>요약하자면, HTTP 메소드로 엔드포인트가 무슨 일을 할지 정하도록 하세요. <code>GET</code>은 데이터를 얻어오고, <code>POST</code>는 데이터를 생성하며, <code>PUT</code>은 데이터를 갱신하고, <code>DELETE</code>는 그 데이터를 삭제하도록 합시다.</p><h2 id="3-">3. 복수 명사를 사용하세요</h2><p>API 데이터는 사용자로부터 얻어온 리소스라고도 볼 수 있습니다.</p><p><code>https://mysite.com/post/123</code>와 같은 엔드포인트가 있다면, POST 요청으로 게시물을 지우거나, <code>PUT</code> 혹은 <code>PATCH</code> 요청을 통해 갱신하는 게 가능할 겁니다. 그러나 사용자는 다른 게시물들이 있음을 알아채기 힘들 수 있기 때문에 복수 명사를 사용해야 합니다.</p><p>따라서 <code>https://mysite.com/post/123</code> 보다는, <code>https://mysite.com/posts/123</code>이 되어야 합니다.</p><h2 id="4-">4. 에러 핸들링을 위해 상태 코드를 사용하세요</h2><p>API 요청에 대해 응답할 때는 항상 HTTP 상태 코드를 포함해야 합니다. 그래야만 사용자가 요청이 성공했는지, 실패했는지 등 어떻게 돌아가는지 알 수 있습니다.</p><p>다음은 HTTP 상태 코드들과 의미를 담은 표입니다.</p><!--kg-card-begin: html--><table style="tab-size: var(--tab-size)  !important; box-sizing: border-box; border-spacing: 0px; border-collapse: collapse; margin-top: 0px; margin-bottom: 16px; display: block; width: max-content; max-width: 100%; overflow: auto; color: rgb(173, 186, 199); font-family: -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(34, 39, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="tab-size: var(--tab-size)  !important; box-sizing: border-box;"><tr style="tab-size: var(--tab-size)  !important; box-sizing: border-box; background-color: var(--color-canvas-default); border-top: 1px solid var(--color-border-muted);"><th style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; font-weight: 600; border: 1px solid var(--color-border-default);">상태 코드 범위</th><th style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; font-weight: 600; border: 1px solid var(--color-border-default);">의미</th></tr></thead><tbody style="tab-size: var(--tab-size)  !important; box-sizing: border-box;"><tr style="tab-size: var(--tab-size)  !important; box-sizing: border-box; background-color: var(--color-canvas-default); border-top: 1px solid var(--color-border-muted);"><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">100 - 199</td><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">정보 제공용<br style="tab-size: var(--tab-size)  !important; box-sizing: border-box;">예를 들어, 102는 자원이 가공 중인 걸 나타냅니다.</td></tr><tr style="tab-size: var(--tab-size)  !important; box-sizing: border-box; background-color: var(--color-canvas-subtle); border-top: 1px solid var(--color-border-muted);"><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">300 - 309</td><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">리다이렉트<br style="tab-size: var(--tab-size)  !important; box-sizing: border-box;">예를 들어, 301은 영구적으로 이동한 걸 나타냅니다.</td></tr><tr style="tab-size: var(--tab-size)  !important; box-sizing: border-box; background-color: var(--color-canvas-default); border-top: 1px solid var(--color-border-muted);"><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">400 - 409</td><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">클라이언트 단 에러<br style="tab-size: var(--tab-size)  !important; box-sizing: border-box;">예를 들어, 400은 클라이언트 측에서 잘못 요청한 것을, 404는 요청한 자원을 찾을 수 없다는 것을 나타냅니다.</td></tr><tr style="tab-size: var(--tab-size)  !important; box-sizing: border-box; background-color: var(--color-canvas-subtle); border-top: 1px solid var(--color-border-muted);"><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">500 - 509</td><td style="tab-size: var(--tab-size)  !important; box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--color-border-default);">서버 단 에러<br style="tab-size: var(--tab-size)  !important; box-sizing: border-box;">예를 들어, 500은 서버 내부의 에러를 나타냅니다.</td></tr></tbody></table><!--kg-card-end: html--><h2 id="5-">5. 관계를 보여주기 위해 엔드포인트를 중첩해 사용하세요</h2><p>종종 다른 엔드포인트들은 연결되곤 합니다. 따라서 이해하기 쉽도록 중첩해 사용하세요</p><p>멀티 유저 블로그 플랫폼의 경우를 예로 들자면, 여러 게시물이 각기 다른 사용자들에 의해 작성됩니다. 따라서 엔드포인트를 <a href="https://mysite.com/posts/author" rel="nofollow">https://mysite.com/posts/author</a> 만들면 됩니다.</p><p>같은 식으로, 게시물들은 각자의 댓글들을 가지고 있기 때문에 댓글을 받아오는 엔드포인트는 <a href="https://mysite.com/posts/postId/comments" rel="nofollow">https://mysite.com/posts/postId/comments</a> 정도면 될 것 같습니다.</p><p>그렇다고 3단계 이상을 중첩하면 가독성이 떨어지기 때문에 너무 많이 중첩하지 않는 것이 좋습니다.</p><h2 id="6-">6. 데이터를 받을 때 필터링, 정렬, 페이지를 나누세요</h2><p>API의 데이터베이스가 엄청나게 클 때가 있습니다. 그럴 때는 데이터베이스에서 데이터를 받아올 때 느려질 수가 있습니다.</p><p>필터링, 정렬, 페이지 나누기를 통해 필요한 데이터만 걸러내어 요청에 대한 부담을 줄일 수 있습니다.</p><p>필터링된 엔드포인트를 예시로 들자면 다음과 같습니다. <code>https://mysite.com/posts?tags=javascript</code> 이 엔드포인트는 JavaScript 태그를 가진 게시물들을 받아옵니다.</p><h2 id="7-ssl-">7. 보안을 위해 SSL을 적용하세요</h2><p>SSL은 전송 계층 보안(Secure Socket Layer)을 나타내며, REST API 설계의 취약점을 줄이고 의심스러운 공격을 예방하는 보안에서 중요한 요소입니다.</p><p>서버와 클라이언트 사이를 비공개하고 요청한 것만큼의 데이터만 보내주는 것도 고려해야 합니다.</p><p>SSL 인증서는 등록하기 어렵지 않고, 대부분 첫 일 년은 무료입니다. 유료인 경우에도 비싼 편은 아닙니다.</p><p>REST API에서 SSL을 적용한 것과 적용하지 않은 URL에서 차이는 HTTP에 "s"의 유무입니다. <code>https://mysite.com/posts</code>는 SSL을 적용한 것이고, <code>http://mysite.com/posts</code>는 SSL을 적용하지 않은 것입니다.</p><h2 id="8-">8. 버전을 명시하세요</h2><p>REST API는 여러 버전을 지원해서 사용자들이 최신 버전이 아니더라도 사용할 수 있게 해야 합니다. 최신 버전만 지원하게 되면, 부주의하게 버전을 올릴 시 애플리케이션에 영향을 미칠 수 있습니다.</p><p>웹 개발에서 가장 흔한 버전 관리 방법은 Semantic Versioning입니다.</p><p>Semantic versioning의 한 예는 1.0.0, 2.1.2, 3.3.4 등이 있습니다. 첫 번째 숫자는 주 버전을 의미하며, 두 번째 숫자는 부 버전을 의미하고, 세 번째 숫자는 패치 버전을 의미합니다.</p><p>큰 기업부터 개인 서비스까지 RESTful API들은 다음과 같이 제공됩니다. 버전 1 : <code>https://mysite.com/v1/</code> 버전 2 : <code>https://mysite.com/v2/</code></p><p>페이스북은 자사 API를 다음과 같이 버전 관리합니다.</p><figure class="kg-card kg-image-card"><img src="https://camo.githubusercontent.com/3801c32226aefc73a504c170d86892c528af92f06c54b62d8437c38435955f79/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032312f30392f66616365626f6f6b2d76657273696f6e696e672e6a7067" class="kg-image" alt="Facebook" width="600" height="400" loading="lazy"></figure><p>스포티파이는 다음과 같이 제공합니다.</p><figure class="kg-card kg-image-card"><img src="https://camo.githubusercontent.com/607e2ec05f575e39099c4acb7c2c23f7652082d9936240b5f3c90f7bac7bd8e2/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032312f30392f73706f746966792d76657273696f6e696e672e6a7067" class="kg-image" alt="Spotify" width="600" height="400" loading="lazy"></figure><p>버전 관리에 있어 모든 API들이 위와 같이 하는 건 아닙니다. 메일침프는 좀 다르게 표기합니다.</p><figure class="kg-card kg-image-card"><img src="https://camo.githubusercontent.com/b5aee0f2ebd7aba0c978d0de132749a88febe09922a07b42e627e799ad66e904/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032312f30392f6d61696c6368696d702d657273696f6e696e672e6a7067" class="kg-image" alt="Mailchimp" width="600" height="400" loading="lazy"></figure><p>이런 방식으로 REST API를 설계하면 사용자들이 자신의 선택에 따라 버전을 사용할 수 있습니다.</p><h2 id="9-api-">9. 정확한 API 문서를 제공하세요</h2><p>REST API를 제작할 때, 사용자들이 쉽게 배울 수 있고 정확하게 사용할 수 있게 해야 합니다. 가장 좋은 방법은 API에 대한 좋은 문서를 제공하는 것입니다.</p><p>문서는 다음 내용들을 포함해야 합니다.</p><ul><li>해당 API에 대한 엔드포인트</li><li>해당 엔드포인트에 대한 요청 예시</li><li>다양한 언어 지원</li><li>각 상태 코드에 대한 다른 에러 메시지 리스트</li></ul><p>가장 흔히 사용하는 API 문서 툴은 Swagger입니다. API 테스트의 경우 Postman을 자주 사용합니다.</p><h2 id="-">결론</h2><p>이 문서에서 독자는 REST API를 설계할 때 명심해야 할 모범 사례들을 배웠습니다.</p><p>이 모범 사례들과 규칙들을 잘 실천해야 잘 작동하고 안전하며 API 사용자들이 손쉽게 사용할 수 있는 애플리케이션을 구축할 수 있습니다.</p><p>읽어주셔서 감사하며 앞으로는 API들을 해당 모범사례들을 적용해 만들어주시기를 바랍니다.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
