<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꿀 떨어지는 코딩 양봉장</title>
    <link>https://nayoon030303.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 21 Aug 2026 17:51:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>nayoon030303</managingEditor>
    <item>
      <title>NestJS Lifecycle Events</title>
      <link>https://nayoon030303.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 1년정도 블로그를 쉬었던 것 같네요.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- lifecycle events가 무엇인지 3줄 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- lifecycle 순서 설명 - 각 단계에 대해서 1줄 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- event 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내가 kafka 연결하면서 사용했던 예시 적기&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Lifecycle Events&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NestJS에 생명주기 이벤트들 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션은 실행될 때, 종료 될 때 등등 어플리케이션 수명과 관련된 이벤트를 발생시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 NestJS에서 이벤트가 발생했을 때 실행할 동작들을 정의할 수 있습니다.&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;onModuleInit이라는 이벤트가 발생될 때 'Hello UserService'를 출력하겠다고 정의했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692460093455&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Injectable, OnModuleInit } from '@nestjs/common';

@Injectable()
export class UsersService implements OnModuleInit {
  onModuleInit() {
    console.log('Hello UserService');
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Lifecycle sequence&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lifecycle 공부를 하다보면 많이 보셨을 그림입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생명주기는 크게 시작, 실행, 종료 부분으로 나눌 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wejwv/btsrCoNTgni/LV8TTQJlkALB7nkQq1Cdy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wejwv/btsrCoNTgni/LV8TTQJlkALB7nkQq1Cdy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wejwv/btsrCoNTgni/LV8TTQJlkALB7nkQq1Cdy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwejwv%2FbtsrCoNTgni%2FLV8TTQJlkALB7nkQq1Cdy0%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;970&quot; height=&quot;820&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Lifecycle events&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 95.9302%; height: 104px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 39.5758%; height: 19px;&quot;&gt;&lt;b&gt;생명주기 hook 메서드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.4242%; height: 19px;&quot;&gt;&lt;b&gt;hook 메서드를 트러기하는 생명주기 이벤트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 39.5758%; height: 17px;&quot;&gt;&lt;i&gt;onModuleInit()&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.4242%; height: 17px;&quot;&gt;host 모듈의 종속성이 해결되면 호출 됩니다. (어플리케이션에 있어서 1회 호출)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 39.5758%; height: 17px;&quot;&gt;&lt;i&gt;onApplicationBootstrap()&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.4242%; height: 17px;&quot;&gt;모든 모듈이 초기화 된 다음 connection을 수신 대기 할 때 호출됩니다.(어플리케이션에 있어서 1회 호출)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 39.5758%; height: 17px;&quot;&gt;&lt;i&gt;onModuleDestroy()*&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.4242%; height: 17px;&quot;&gt;종료 신호(ex. SIGTERM) 가 호출되고 나서 실행됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 39.5758%; height: 17px;&quot;&gt;&lt;i&gt;beforeApplicationShutdown()&lt;i&gt;*&lt;/i&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.4242%; height: 17px;&quot;&gt;&lt;i&gt;onModuleDestroy()&lt;/i&gt;가 완료되고 나서 호출됩니다.&lt;br /&gt;기존 모든 연결이 닫힙니다. (&lt;i&gt;app.close()&lt;/i&gt; 호출)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 39.5758%; height: 17px;&quot;&gt;&lt;i&gt;onApplicationShutdown()&lt;i&gt;*&lt;/i&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.4242%; height: 17px;&quot;&gt;연결이 종료된 후 호출됩니다.&lt;i&gt; app.close()&lt;/i&gt;가 해결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 표시가 있는 hook 메소드들은 사용을 위해서는 아래와 같이 작성해 줘야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shutdown hook listner는 시스템 리소스를 사용하므로 기본적으로 비활성화 되어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1692461708994&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // Starts listening for shutdown hooks
  app.enableShutdownHooks();

  await app.listen(3000);
}
bootstrap();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WARNING&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NestJS에서 shutdown hook을 제한적으로 지원합니다.&lt;br /&gt;더 자세한것을 알고싶으면 &lt;a href=&quot;https://nodejs.org/api/process.html#process_signal_events&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/api/process.html#process_signal_events&lt;/a&gt;&amp;nbsp;링크를 통해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 사용 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 NestJS microservice 모듈을 이용해 kafka를 연결했을 때 사용한 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;onModuleInit() &lt;/i&gt;메서드를 오버라이딩하여 모듈의 종석성이 해결될 때 ClientKafka와 연결시켰습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 &lt;i&gt;onModuleDestroy()&amp;nbsp;&lt;/i&gt;메서드를 이용해 어플리케이션에 종료 신호가 수신되었을 때 kafka connection을 닫도록 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1692468573531&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {Controller, Get, Inject, OnModuleDestroy, OnModuleInit} from '@nestjs/common';
import { AppService } from './app.service';
import { ClientKafka } from '@nestjs/microservices';

@Controller()
export class AppController implements OnModuleInit, OnModuleDestroy{
  constructor(
    private readonly appService: AppService,
    @Inject('any_name_i_want') private readonly client: ClientKafka,
  ) {}

  async onModuleInit() {
    ['medium.rocks'].forEach((key) =&amp;gt; this.client.subscribeToResponseOf(`${key}`));
    await this.client.connect(); // message가 비동기적으로 생성되면 connect하기 전 subscribeToResponseOf()함수를 호출해야합니다.
  }

  async onModuleDestroy() {
    await this.client.close();
  }

  @Get('kafka-test')
  testKafka(){
    const a =  this.client.emit('medium.rocks', {foo:'bar', data: new Date().toString()})
  }


  @Get('kafka-test-with-response')
  testKafkaWithResponse(){
    return this.client.send('medium.rocks', {foo:'bar', data: new Date().toString()})
  }


}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Language/NestJS</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/54</guid>
      <comments>https://nayoon030303.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 20 Aug 2023 03:14:09 +0900</pubDate>
    </item>
    <item>
      <title>SSR, CSR, SPA, SEO</title>
      <link>https://nayoon030303.tistory.com/53</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSR이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Server Side Rendering&lt;/li&gt;
&lt;li&gt;서버에서 사용자에게 보일 페이지(html, css, js)를 구성한 다음에 클라이언트에게 내려준다&lt;/li&gt;
&lt;li&gt;페이지를 계속 렌더링 받아서 보여줘야하기 때문에 초반 로딩은 빠르지만 그 후로는 느리다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CSR이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client Side Rendering&lt;/li&gt;
&lt;li&gt;최초요청시 html, css, js 파일을 받고 그다음부터는 서버에서는 필요한 데이터만 받아 자바스크립트단에서 View를 컨트롤한다.&lt;/li&gt;
&lt;li&gt;초반 로딩은 느리지만 두번째 로딩부터는 서버에서 필요한 데이터만 내려받기 때문에 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SPA이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Single Page Application&lt;/li&gt;
&lt;li&gt;한 개의 페이지를 가진 애플리케이션&lt;/li&gt;
&lt;li&gt;초기 렌더링 후 데이터만 받아오면 되기 때문에 개발에 용이하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;기본적으로 SPA는 CSR이지만 SPA === CSR은 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SEO이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Search Engine Optimization&lt;/li&gt;
&lt;li&gt;검색 엔진 최적화&amp;nbsp;&lt;/li&gt;
&lt;li&gt;검색할 때 검색 순위, 내용 등을 최적화하는 엔진&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SPA의 SEO문제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SPA 초반에 렌더링이에서는 html, css, js를 받을 때는 아무런 내용이 들어가지 않는다. 그래서 검색엔진이 빈 페이지로 인식해 검색이 안될 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;하지만 SPA의 문제라기보다는 SEO(검색엔진)의 문제이다. 구글은 js를 인식할 수 있어서 크게 문제 되지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;네이버, 다음 검색 엔진 등은 자바스크립트를 인식하지 못해서 빈 페이지로 인식한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/53</guid>
      <comments>https://nayoon030303.tistory.com/53#entry53comment</comments>
      <pubDate>Sun, 24 Jul 2022 23:15:02 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 헤더1 - 일반 헤더</title>
      <link>https://nayoon030303.tistory.com/52</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 헤더 게요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 헤더 형식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;header-field = field-name &quot;:' OWS field-value OWS (OWS: 띄어쓰기 혀용)&lt;/li&gt;
&lt;li&gt;field-name은 대소문자 구분이 없다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 헤더 용도&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 전송에 필요한 모든 부가정보가 들어있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 헤더 (과거: RFC2616)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 HTTP 헤더를 총 4가지로 분류했다. 하지만 2014년 RFC7230 ~7235 가 등장하면서 그전 RFC2616는 폐기되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그전까지는 Entity라는 용어를 사용했지만 2014년 버전이 나오면서 Entity =&amp;gt; Representation(표현)이라는 용어로 변경되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Representatin = representation Metadata + representation Data&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;표현 = 표현 메타데이터 + 표현 데이터&lt;/i&gt;&lt;/b&gt; 를 뜻한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 표현 헤더&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현 헤더는 전송과 응답에 둘 다 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Content - Type&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표현 데이터의 형식을 설명한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Content-body에 들어가는 표현 데이터 형식을 설명한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;예) text/html: charset = utf-8, image/png...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Content - Encoding&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표현 데이터를 압축하기 위해서 사용된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;보내는 쪽에서 데이터를 압축 한 다음 인코딩하고 인코딩 헤더를 추가한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;받는 쪽에서 인코딩 헤더를 보고 압축을 해제한다.&lt;/li&gt;
&lt;li&gt;예) gzip, deflate...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Content - Language&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표현 언어의 자연 언어를 표현한다. body에 들어있는 언어가 영어인지, 한국어인지, 중국어인지를 알려준다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;예) ko, en, en-US&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Content - Length&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표현 데이터의 길이이고 바이트 단위이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Transfer-Encoding을 사용하면 Content-Length를 상용하면 안 된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 협상 헤더 (콘텐츠 네고시에이션)&lt;/h2&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;Accept&lt;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;Accept - Charset&lt;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;Accept - Encoding&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 선호하는 압축 인코 등을 주세요 하고 전달&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Accept -&amp;nbsp; Language&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 선호하는 자연언어를 주세요 하고 전달&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 전송 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순 전송: 메시지 바디에 대한 Content-Length를 지정하고 길이 값을 알 수 있을 때 사용&lt;/li&gt;
&lt;li&gt;압축 전송: 서버에서 메시지 바디를 압축해서 전송&lt;/li&gt;
&lt;li&gt;분할 전송: 분할해서 전송한다.&amp;nbsp; 분할 전송을 사용할 때는 content-length를 사용하면 안 된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;범위 전송: 범위를 지정해서 요청한다. 그러면 그만큼의 범위를 서버에서 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP&amp;nbsp; 일반 정보&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Form: 유저의 이메일 정보&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Refer: 이전 웹 페이지 주소, 유입 경로 분서 가능&lt;/li&gt;
&lt;li&gt;User-Agent: 유저 에이전트 애플리케이션 정보, 클라이언트의 애플리케이션 정보(웹 브라우저 정보 등등)&lt;/li&gt;
&lt;li&gt;Server: 요청을 처리하는 오리진 서버의 소프트웨어 정보&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Date: 메시지가 생성된 날짜&lt;/li&gt;
&lt;/ul&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;아직 인증과 쿠키 관련 헤더들이 남았지만 다음 포스팅에서 설명하겠습니다.&lt;/p&gt;</description>
      <category>Computer Science/HTTP</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/52</guid>
      <comments>https://nayoon030303.tistory.com/52#entry52comment</comments>
      <pubDate>Sun, 22 May 2022 00:29:29 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 상태 코드</title>
      <link>https://nayoon030303.tistory.com/51</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 상태 코드&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 상태 코드란 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 1xx ~ 5xx 번대를 사용한다.&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;만약 모르는 상태 코드가 나타나도 상위 상태 코드로 해석해서 처리하면 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1xx: 요청이 수신되어 처리 중&amp;nbsp;&lt;/li&gt;
&lt;li&gt;2xx: 요청 정상 처리&amp;nbsp;&lt;/li&gt;
&lt;li&gt;3xx: 요청을 완료하려면 추가 행동이 필요&lt;/li&gt;
&lt;li&gt;4xx: 클라이언트 오류&amp;nbsp;&lt;/li&gt;
&lt;li&gt;5xx: 서버 오류&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1xx (Informational)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청이 수신되어 처리 중 (거의 사용되지 않는다.)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2xx (Successful)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;200: 요청 성공&lt;/li&gt;
&lt;li&gt;201: 요청이 성공되어 새로운 리소스가 생성&lt;/li&gt;
&lt;li&gt;202: 요청이 접수되었지만 처리가 완료되지 않았다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;즉 요청은 들어왔지만 처리는 나중에 배치 프로 스세가 처리함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;204: 요청은 성공했지만, 응답 페이로드 본문에 보낼 데이터가 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 200과 201만 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 개발할 때 API요청을 보내 성공했을 때 200 Response를 본 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3xx (Redirection)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 완료하기 위해 유저 에이전트(웹 브라우저)의 추가 조치가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;300은 사용하지 않고 301~308이 중요하다.&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;웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동으로 이동한다. (이것을 리다이렉트)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리다이렉션 종류&lt;/h3&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;일시 리다이렉션&lt;/li&gt;
&lt;li&gt;특수 리다이렉션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 3가지 종류가 있다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;영구 리다이렉션 (301, 308)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 URI가 완전히 변경되었다.&lt;/li&gt;
&lt;li&gt;원래의 URI를 사용할 수 없다. 검색 엔진에서 기존 URI로 들어오면 변경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;301&lt;/b&gt;&lt;br /&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;/li&gt;
&lt;li&gt;&lt;b&gt;308&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;301과 기능이 똑같다&lt;/li&gt;
&lt;li&gt;하지만 요청 메서드와 본문을 유지한다. (POST를 보내면 리다이렉트도 POST 유지, PATCH를 보내면 리다이렉트도 PATCH 유지)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 대체로 URI가 바뀌면 전송해야 하는 데이터도 달라져서 301을 사용한다고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일시적인 리다이렉션(302, 307, 303)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 URI가 일시적으로 변경됨&lt;/li&gt;
&lt;li&gt;검색 엔진에서 URI를 변경하면 안 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;302&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;307&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;302와 기능이 같다.&lt;/li&gt;
&lt;li&gt;리다이렉트 요청 시 메서드와 본문 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;303&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;302와 기능이 같다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;리다이렉트 요청 시 메서드가 GET으로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PRG ( Post/ Redirect/ Get )&lt;/h3&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;POST로 주문 요청을 하고 다시 웹 브라우저를 새로고침 한다면?&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;POST로 주문 후에 주문 결과 화면을 리다이렉트&amp;nbsp;&lt;/li&gt;
&lt;li&gt;새로고침을 해도 리다이렉트 된 URI&lt;/li&gt;
&lt;li&gt;중복 주문 대신 결과 화면만 GET으로 다시 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;302, 307, 303 정리&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 많은 애플리케이션들이 302를 기본값으로 상용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 리다이렉션이 GET으로 변해도 되면 그냥 302를 사용해도 큰 문제는 없다.&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;기타 리다이렉션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;300&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용되지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;304&lt;/b&gt;&lt;b&gt;&lt;/b&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;리소스가 수정되지 않았으므로 캐시 데이터를 사용하라고 지시&amp;nbsp;&lt;/li&gt;
&lt;li&gt;메시지 바디를 포함하면 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4xx ( Client Error)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 요청을 보내다 보면 가장 많이 만나는 상태 코드들 중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오류의 원인은 클라이언트에 있으므로 아무리 같은 요청을 보내도 해결되지 않는다.&lt;/b&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;b&gt;400 Bad Request&lt;/b&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;예) 요청 파라미터가 잘못, API 스펙이 맞지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;401 Unauthorized&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인증(Authentication) 되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;403 Forbidden&lt;/b&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;인증은 되었지만 접근 권한이 불충분하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;404&lt;/b&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;URL이 잘못되었거나, 권한이 부족한 리소스에 접할 때 해당 리소스를 숨기고 싶을 때&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5xx ( Server Error)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 개발을 하다 보면 굉장히 많이 만나는 상태 코드들 중 하나이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서버 내부의 문제로 같은 요청을 계속 보낸다면 서버 문제가 해결될 때 처리가 될 것이다.&lt;/b&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;b&gt;500 Internal Server Error&lt;/b&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;애매하면 500 에러를 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;503 Service Unavailable&lt;/b&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;하지만 주로 이런 현상은 예측 불가능이기 때문에 주로 500 에러를 보게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science/HTTP</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/51</guid>
      <comments>https://nayoon030303.tistory.com/51#entry51comment</comments>
      <pubDate>Sun, 1 May 2022 21:51:11 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 메서드 활용</title>
      <link>https://nayoon030303.tistory.com/50</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;클라이언트에서 서버로 데이터 전송 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 서버로 데이터를 전송하는 방법은 크게 2가지이다.&amp;nbsp;&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;li&gt;메시지 바디를 통한 데이터 전송 (POST, PUT, PATCH)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 서버로 데이터를 전송하는 상황은 크게 총 4가지이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;HTML Form을 통한 데이터 전송
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET, POST만 지원한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컨트롤 URI:&lt;/b&gt; 이런 제약을 해결하기 위해 동사로 된 리소스 경로를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTTP API를 통한 데이터 전송&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML에서 FORM전송 대신 자바스크립트를 통한 통신에 사용된다.&lt;/li&gt;
&lt;li&gt;API를 호출할 때 메시지 바디에 데이터를 넣어서 전송&lt;/li&gt;
&lt;li&gt;클라이언트 -&amp;gt; 서버뿐만 아니라&lt;/li&gt;
&lt;li&gt;서버 -&amp;gt; 서버&lt;/li&gt;
&lt;li&gt;앱 클라이언트 등에서도 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP API 설계 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 관리 시스템을 만든다고 한다면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- 회원 목록 /members -&amp;gt; GET&lt;br /&gt;- 회원 등록/members -&amp;gt; POST&lt;br /&gt;- 회원 조회/members/{id} -&amp;gt; GET&lt;br /&gt;- 회원 수정/members/{id} -&amp;gt; POST, PATCH, PUT&lt;br /&gt;- 회원 삭제/memvers/{id} -&amp;gt; DELETE&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 만들 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 것들은 어떤 HTTP 메서드를 써야 할지 명확하지만 회원 수정에서 어떤 메서드를 사용해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PUT: 기존의 리소스를 삭제하고 덮어버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PATCH: 부분적으로 수정한다.&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;회원 수정을 할 때면 대체로 PATCH를 사용하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판에 게시글을 수정할 때는 PUT을 사용한다. 게시판을 수정하는 것은 안에 내용들을 덮어쓰는 것이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이런 의문이 든다. 회원 등록을 할 때도 PUT을 사용할 수 있는 게 아닐까?&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;어떤 상황에서 POST를 사용하고 어떤 상황에서 PUT을 사용해야 하는 것 일까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PUT과 POST의 차이점&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;POST&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트는 등록될 리소스 URI를 모른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;POST/members&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;서버가 등록된 리소스 URI를 생성해준다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/members/100&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이러한 형식을 컬렉션이라고 한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/members&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PUT&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 리소스 URI를 알고 있어야 한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PUT/files/cat.jpg&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이러한 형식을 스토어라고 한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/files&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PUT과 POST의 차이점은 클라이언트가 리소스 URI를 알고 있나 모르고 있나에 차이점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 회원 등록을 한다고 하면 그 회원이 몇 번째 회원인지는 서버에서 확인할 수 있다. 즉 클라이언트는 리소스 URI를 알 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고하면 좋은 URI 설계 개념&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서(document)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 개념(파일 하나, 인스턴스, 데이터베이스 row)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컬렉션(collection)
&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;/li&gt;
&lt;li&gt;스토어(store)
&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;/li&gt;
&lt;li&gt;컨트롤러(controller), 컨트롤러 URI
&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;동사를 직접 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;</description>
      <category>Computer Science/HTTP</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/50</guid>
      <comments>https://nayoon030303.tistory.com/50#entry50comment</comments>
      <pubDate>Sat, 9 Apr 2022 23:39:47 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 메서드</title>
      <link>https://nayoon030303.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백앤드 개발을 하다 보면 API를 설계할 경우가 있다. 나도 과거에 API URI를 설계했던 적이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 당시 나는 URI 설계 방법에 대해서 하나도 몰랐다. 그래서 강의 처음에 나온 예시처럼&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;회원 목록 조회 /read-member-list&lt;br /&gt;회원 조회 /read-member-by-id&lt;br /&gt;회원 등록 /create-member&lt;br /&gt;회원 수정 /update-membe&lt;br /&gt;회원 삭제 /delete-member&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 URI를 설계했던 적이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 좋은 URI를 설계하는 방법은 무엇일까?&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;API URI 설계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URI를 설계할 때 가장 중요한 것은 &lt;b&gt;리소스 식별&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;조회하고, 저장하고.. 는 HTTP 메서드를 이용해서 판별할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리소스와 행위를 분리!&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI는 리소스만 식별한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;리소스는 명사, 행위는 동사&lt;/li&gt;
&lt;li&gt;행위는 HTTP 메서드를 이용해서 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 메서드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP에 주요 메서드들만 설명하겠다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GET&lt;/h3&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;서버에 전달하고 싶은 데이터는 query를 통해 전달&lt;/li&gt;
&lt;li&gt;message body를 사용할 수 있지만 지원하지 않는 서버가 있어서 권장하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;POST&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청 데이터를 처리&amp;nbsp;&lt;/li&gt;
&lt;li&gt;애매하면 다 POST&lt;/li&gt;
&lt;li&gt;message body를 사용해서 서버에 데이터 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PUT&lt;/h3&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;클라이언트가 리소스를 알고 URI를 지정한다. (POST와의 차이점)&lt;/li&gt;
&lt;li&gt;리소스를 완전히 대체한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PATCH&lt;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;DELETE&lt;/h3&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 메서드의 속성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안전&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호출해도 리소스를 변경하지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멱등(Idempotent)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같다.&lt;/li&gt;
&lt;li&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;li&gt;PUT&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자동 복구 메커니즘에 활용된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐시 가능&lt;/h3&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;GET, HEAD, POST, PATCH 캐시 가능&lt;/li&gt;
&lt;li&gt;실제로는 GET, HEAD 정도만 캐시로 사용한다.&amp;nbsp;&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;httpmethod.png&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcgW9c/btryifXVI6W/K4CnrmHIoueGOvoXo8dna1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcgW9c/btryifXVI6W/K4CnrmHIoueGOvoXo8dna1/img.png&quot; data-alt=&quot;출처:&amp;amp;nbsp;HTTP - 위키백과, 우리 모두의 백과사전 (wikipedia.org)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcgW9c/btryifXVI6W/K4CnrmHIoueGOvoXo8dna1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcgW9c%2FbtryifXVI6W%2FK4CnrmHIoueGOvoXo8dna1%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;699&quot; height=&quot;248&quot; data-filename=&quot;httpmethod.png&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;nbsp;HTTP - 위키백과, 우리 모두의 백과사전 (wikipedia.org)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/HTTP</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/49</guid>
      <comments>https://nayoon030303.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 4 Apr 2022 00:47:47 +0900</pubDate>
    </item>
    <item>
      <title>HTTP의 기본</title>
      <link>https://nayoon030303.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP는 HyperText Transfer Protocol의 약자로 개발자가 아니어도 많이 들어보았을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP는 HTML을 전송하는 프로토콜로 시작했지만 지금은 모든 것을 HTTP로 전송한다.(사진, JSON, 텍스트..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP에는 많은 버전들이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 현재로 가장 표준 스펙이 되는 것은 1999년에 출시된 HTTP1.1이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 2.0과 HTTP3.0도 나왔지만 둘 다 성능을 개선시킨 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP3.0은 UDP 기반으로 만들어졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 지금 공부하는 HTTP는 1.1을 기준으로 설명하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 특징으로 크게 무상태 프로토콜(Stateless)과 비연결성이 있다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무상태 프로토콜(Stateless)&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;/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;b&gt;상태 유지 - Stateful&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;고객: 자동차 얼마예요?&lt;br /&gt;점원: 100만 원입니다. (자동차 상태 유지)&lt;br /&gt;&lt;br /&gt;고객: 2개 주세요&lt;br /&gt;점원: 200만 원입니다. 카드 또는 현금중 어떤 걸로 구매하시나요? (자동차, 2개 상태 유지)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;고객: 현금으로 결제하겠습니다.&amp;nbsp;&lt;br /&gt;점원: 200만 원 결제 완료되었습니다.&amp;nbsp; (자동차, 2개, 현금 상태 유지)&lt;/blockquote&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;b&gt;무상태 - Stateless&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;고객: 자동차 얼마예요?&lt;br /&gt;점원: 100만 원입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;고객: 자동차 2개 주세요&lt;br /&gt;점원: 200만 원입니다. 카드 또는 현금중 어떤 걸로 구매하시나요?&lt;br /&gt;&lt;br /&gt;고객: 자동차 2개를 현금으로 결제하겠습니다.&amp;nbsp;&lt;br /&gt;점원: 200만 원 결제 완료되었습니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stateless는 만약 중간에 점원이 다른 사람으로 바뀌어도 고객이 어떤 것을 원하는지 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Stateful은 점원이 다른 사람으로 바뀌면 고객이 말한 정보를 미리 알려주지 않는 이상 알 수 없다.&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;그래서 Stateless는 고객이 갑자기 증가해도 점원을 대거 투입할 수 있다.&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;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;h3 data-ke-size=&quot;size23&quot;&gt;비연결성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP는 기본적으로 연결을 유지하지 않는 모델이다.&amp;nbsp; 클라이언트와 서버가 계속 연결되어 있지 않는다.&lt;/li&gt;
&lt;li&gt;일반적으로 초 단위의 이하의 빠른 속도로 응답한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;서버 자원을 효율적으로 사용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 TCP/IP 연결을 새로 맺어야 한다. 3 way handshake 시간이 추가된다.&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;지금은 HTTP 지속 연결로 문제를 해결하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP메시지&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 메시지는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 라인(start-line)&lt;/li&gt;
&lt;li&gt;HTTP 헤더(header)&lt;/li&gt;
&lt;li&gt;공백 라인(empty line)&lt;/li&gt;
&lt;li&gt;message body&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 구성되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;httpmessage.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGrsW/btryc7GE82W/IpwMeKuw9k4S8Juq02JM20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGrsW/btryc7GE82W/IpwMeKuw9k4S8Juq02JM20/img.png&quot; data-alt=&quot;출처:&amp;amp;nbsp;https://developer.mozilla.org/ko/docs/Web/HTTP/Messages&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGrsW/btryc7GE82W/IpwMeKuw9k4S8Juq02JM20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGrsW%2Fbtryc7GE82W%2FIpwMeKuw9k4S8Juq02JM20%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;950&quot; height=&quot;276&quot; data-filename=&quot;httpmessage.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;nbsp;https://developer.mozilla.org/ko/docs/Web/HTTP/Messages&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시작 라인 (요청 메시지)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request-line으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;method SP request-target SP HTTP-version CRLF로 되어있다. (SP = 공백, CRLF = 엔터)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 메서드:&amp;nbsp; GET, POST..&amp;nbsp;&lt;/li&gt;
&lt;li&gt;request-target: 요청 대상으로 절대 경로&lt;/li&gt;
&lt;li&gt;HTTP-version: http 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시작 라인 (응답 메시지)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;status-line으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP-version SP status-code SP reason-phrase CRLF로 되어있다. &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(SP = 공백, CRLF = 엔터)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP-version: http 버전&lt;/li&gt;
&lt;li&gt;status-code (HTTP 상태 코드): 요청의 성공, 실패를 나타냄
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;200: 성공&lt;/li&gt;
&lt;li&gt;404: 요청 페이지 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;reason-phrase (이유 문구): 이해할 수 있는 짧은 상태 코드 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 헤더&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 전송에 필요한 모든 부가적인 정보가 들어간다.&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;field-name &quot;:&quot; OWS field-value OWS로 되어있다. (OWS: 띄어쓰기 허용)&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;Message body&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 전송할 데이터가 들어간다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;HTML 문서, 이미지, 동영상, JSON 등등 byte로 표현할 수 있는 모든 데이터가 전송 가능하다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>Computer Science/HTTP</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/48</guid>
      <comments>https://nayoon030303.tistory.com/48#entry48comment</comments>
      <pubDate>Sun, 3 Apr 2022 01:23:14 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 웹 기본 지식 공부하기</title>
      <link>https://nayoon030303.tistory.com/47</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 웹 기본 지식을 공부하기에 앞서서&lt;/h2&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&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;tcp/ip, 프로토콜, url 등 완벽하게 알지는 못하지만 어느 정도 배웠다고 생각했다.&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;&lt;span style=&quot;background-color: #002333; color: #ffffff;&quot;&gt;모든 개발자를 위한 HTTP 웹 기본 지식&lt;/span&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;강의 소개 영상에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 평생 HTTP 기반 위에서 개발해야 하며 항상 고민한다고 말씀하셨다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API URL은 어떻게 설계하는 것이 맞을까?&lt;/li&gt;
&lt;li&gt;POST를 사용할까? PUT?을 사용할까?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 이 질문을 듣는 순가 회사에서 겪었던 상황들이 떠올랐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 API 개발을 하면서 URL을 어떻게 디자인해야 하는지(명명 규칙),&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 회사 연동 문서에 에서 모든 api가 post로 작성되었던 상황들이 생각이 났다.&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;이 강의를 들으면서 http에 대해 내 머릿속에서 정리될 수 있으면 좋겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 9 섹션으로 내가 강의를 들으면서 배우게 된 것들 위주로 블로그에 정리하려고 한다.&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;h2 data-ke-size=&quot;size26&quot;&gt;인터넷 네트워크&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;IP( Internet Protocol)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP란 주소이다. 인터넷에서 패킷을 전송하기 위해서는 간단하게 출발 IP와 도착 IP가 필요하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 편지를 보낼 때 보내는 주소와 도착하는 주소를 적는 것처럼 인터넷에서 메시지를 보낼 때 도 똑같다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IP 프로토콜의 한계&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/li&gt;
&lt;li&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;패킷이 순서대로 안 올 수 있다. (&quot;안녕하세요&quot;라고 보냈는데 &quot;녕안세요하&quot;라고 받을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로그램 구분
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 IP를 사용하는 서버 통신 프로그램이 여러 개일 수 있다. (유튜브 뮤직으로 음악을 들으면서 친구와 카톡 할 수도 있다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TCP/UDP&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 프로토콜 4 계층으로 TCP/UDP는 전송 계층에 속한다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로토콜 4 계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션 계층: HTTP, HTTPS, FTP
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저에서 socket 라이브러리를 통해 message를 생성한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;전송 계층: TCP, UDP
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS에서 생성된 message를 TCP/UDP로 감싼다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터넷 계층: IP
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP/UDP로 감싸지 message를 IP로 감싼다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 인터페이스 계층
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAN 드라이버, 장치 등으로 LAN 카드를 통해 서버로 전송한다.&lt;/li&gt;
&lt;li&gt;LAN 카드에 등록된 MAC 주소 등 물리적인 것이 포함된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TCP&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/UDP는 IP와 다르게 Port가 포함된다. 또 전송 순서, 신뢰성 등이 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 서버가 연결되었는지 확인할 수 있는 방법으로 &lt;span&gt;TCP 3 way handshake라는 것이 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UDP&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP는 IP에 Port만 추가되었다고 생각하면 된다.&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;하지만 TCP보다 단순하고 빠르다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Port&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP를 설명할 때 말한 것처럼 같은 IP를 사용하는 서버와 통신하는 애플리케이션이 여러 개 있을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Port는 같은 IP에서 프로세스를 구분해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP가 아파트라고 생각하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Port는 호수라고 생각하면 된다. 패킷이 101호로 가야 할지, 102호로 가야 할지 Port를 보면 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DNS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 네임 시스템으로 도메인 명을 IP주소로 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP는 기억하기 어렵다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip주소가 200.200.200.123일 수도 있고 변경될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 맨날 그 ip주소를 기억하기 힘들다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 서버에 google.com은 200.200.200.123이라고 등록을 하면 google.com을 입력하면 자동으로 IP주소로 변경해준다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;URI, URL, URN 이란?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URI&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URI는 User Resource Identifier의 약자로 리소스를 식별한다는 의미를 가지고 있다. 우리가 id로 식별하고 사람들을 주민번호로 식별하듯이 리소스(자원)가 어느 위치에 있는지 식별한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스란 모든 자원을 뜻한다. 브라우저의 html뿐만 아니라 음식점 정보, 실시간 교통량 등도 모두 리소스에 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URI안에 URL, URN이 포함된다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL은 Uniform Resource Locator의 약자로 리소스가 있는 위치를 뜻한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.naver.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.naver.com/&lt;/a&gt;&amp;nbsp; &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;URN&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URN은 Uniform Resource Name의 약자로 리소스 이름을 뜻한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URN으로만 실제 리소스를 찾을 수 있는 방법이 보편화되어있지 않다고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 게 있다 정도로만 참고하기&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹 브라우저 요청 흐름&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://www.google.com/search?q=hello&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹브라우저 -&amp;gt; 구글 서버&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DNS 조회를 한다. www.google.com&amp;nbsp;&lt;/li&gt;
&lt;li&gt;https 기본 포트는 443으로 생략&lt;/li&gt;
&lt;li&gt;브라우저에서 HTTP 요청 메시지를 생성한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;SOCKET 라이브러리 르 통해 TCP/IP로 HTTP메시지를 감싼다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;OS에서 TCP/IP 패킷을 생성한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;LAN 카드를 통해 인터넷으로 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷을 전송받은 구글 서버는 HTTP 응답 메시지를 웹브라우저로 다시 전송한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/HTTP</category>
      <category>http</category>
      <category>네트워크</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/47</guid>
      <comments>https://nayoon030303.tistory.com/47#entry47comment</comments>
      <pubDate>Thu, 31 Mar 2022 22:46:31 +0900</pubDate>
    </item>
    <item>
      <title>SQL과 NoSQL의 차이점</title>
      <link>https://nayoon030303.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 새로운 토이 프로젝트를 하게 되면서 DB를 SQL로 가야 할지 NoSQl로 가는 게 좋을지에 대해 고민하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 SQL과 NoSQL이 무엇인지에 대해서 확실한 정의부터 알아보겠습니다.&lt;/p&gt;
&lt;h1&gt;DBMS란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS란 Data Base Management System으로 사용자와 데이터베이스 사이에서 사용의 요구에 따라서 정보를 생성해 주고 데이터 베이스를 관리해주는 소프트웨어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RDBMS&lt;/b&gt;란 Relational Data Base Management System으로 관계형 데이터베이스 시스템입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름과 같이 RDBMS는 RDB를 관리하는 시스템입니다. RDB는 관계형 데이터 모델을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스입니다.&lt;/p&gt;
&lt;h1&gt;SQL 이란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL은 Structure Query Language의 줄임말로 , 관계형 데이터베이스 시스템(RDBMS)에서 자료를 관리 및 처리하기 위해 설계된 언어입니다.&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;li&gt;데이터는 관계를 통해 여러 테이블에 분산되어 저장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 SQL 언어로는 mysql, oracle 등이 있습니다.&lt;/p&gt;
&lt;h1&gt;NoSQL 이란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NoSQL이란 Not only SQL이라는 뜻으로 RDB 형태의 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미합니다. 또 NoSQL은 RDBMS와는 다르게 테이블 간 관계를 정의하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블은 그냥 하나의 테이블이며 테이블 간의 관계를 정의하지 않습니다. 그래서 테이블 간 join도 불가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NoSQL은 다양한 형태의 저장 기술을 지원하고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Key-value Database&lt;/li&gt;
&lt;li&gt;Document Database&lt;/li&gt;
&lt;li&gt;Wide Column Database&lt;/li&gt;
&lt;li&gt;Graph Database&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 형태들에 대해서는 나중에 NoSQL을 정리하면서 다뤄보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NoSQL의 핵심적인 특징으로는&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;테이블 간의 관계가 없다&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;확정성&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL과 NoSQL의 장단점을 비교하기 전에 데이터베이스를 비교할 때 중요한 Scaling이라는 개념에 대해서 알아봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 서버의 확장성은 &amp;lsquo;수직적&amp;rsquo; 확장과 &amp;lsquo;수평적' 확장으로 나누어집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수직적 확장: 데이터베이스 서버의 성능을 향상하는 것을 말합니다.(ex. CPU 업그레이드)&lt;/li&gt;
&lt;li&gt;수평적 확장: 더 많은 서버가 추가되어 데이터베이스가 전체적으로 분산되는 것을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SQL의 장단점&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장점&lt;/h2&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;관계는 각 데이터를 중복 없이 한 번만 저장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 간 관계를 맺고 있어서 join문이 많은 복잡한 쿼리가 만들어질 수 있다.&lt;/li&gt;
&lt;li&gt;유연하지 못한다. 나중에 스키마가 변경되는 경우 복잡해진다.&lt;/li&gt;
&lt;li&gt;대체적으로 수직적 확장만 가능하다. 이로 인해 비용이 기하급수적으로 늘어날 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;NoSQL의 장단점&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장점&lt;/h2&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;데이터 애플리케이션이 원하는 형식으로 데이터를 저장해서 읽는 속도가 빠르다.&lt;/li&gt;
&lt;li&gt;수직적 확장, 수평적 확장 둘 다 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&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;데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 한다.&lt;/li&gt;
&lt;li&gt;명확한 데이터 구조를 보장하지 않으며 데이터 구조 결정이 어려울 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SQL 데이터베이스 사용이 더 좋을 때&lt;/h1&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;데이터 구조가 명확하여 스키마가 변경될 경우가 적은 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;NoSQL 데이터베이스 사용이 더 좋을 때&lt;/h1&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;데이터 중복이 발생할 수 있으며 중복된 데이터가 변경될 시에는 모든 컬렉션을 수정해야 합니다. 그래서 read를 자주 하지만 update는 자주 없는 경우&lt;/li&gt;
&lt;li&gt;막대한 양의 데이터를 다뤄야 하는 경우(수평적 확장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 토이 프로젝트로 ToDo리스트 웹을 만들기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복되는 데이터의 수가 적을 것 같고 데이터의 구조가 변경될 것을 고려해서(Todo리스트에서 부모 단위와 자식 단위의 구조) NoSQL을 사용할 것으로 결정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/Database</category>
      <category>javascript</category>
      <category>node</category>
      <category>NoSQL</category>
      <category>SQL</category>
      <category>typescript</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/46</guid>
      <comments>https://nayoon030303.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 21 Feb 2022 13:18:56 +0900</pubDate>
    </item>
    <item>
      <title>Authentication(인증) &amp;amp; Authorization(허가)가 무엇인가?</title>
      <link>https://nayoon030303.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Authorization(허가), Autentication(인증)은 대부분의 애플리케이션에서 필수적인 부분들입니다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Authentication(인증)&amp;nbsp;&amp;amp;&amp;nbsp;Authorization(허가)가&amp;nbsp;무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Authentication(인증)&lt;/b&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;&lt;b&gt;2. Autorization(허가)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자에 대한 권한을 허락하는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;왜&amp;nbsp; 필요할까?&lt;/b&gt;&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Authentication(인증)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증은 사용자가 누구인지(identifacation)을 확인하는 절차입니다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 비밀번호는 절대로 그대로 DB에 저장하지 않습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;DB를 해킹당하면 사용자의 정보가 그대로 노출되고 개발자가 사용자의 정보를 볼 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Authorization(허가)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허가란 요청한 request를 실행할 수 있는 권한이 있는 사용자인지 확인하는 절차입니다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Authorization 방법&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Authentication(인증) 절차를 통해서 사용자에게 access_token을 발급합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;사용자가 request(요청)을 보낼 때 access_token을 같이 보냅니다.&lt;/li&gt;
&lt;li&gt;서버에서 사용자가 첨부한 access_token을 검사합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;유저가 권한을 가지고 있다면 요청을 처리합니다.&lt;/li&gt;
&lt;/ul&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;</description>
      <category>Language/NestJS</category>
      <category>authentication</category>
      <category>Authorization</category>
      <author>nayoon030303</author>
      <guid isPermaLink="true">https://nayoon030303.tistory.com/45</guid>
      <comments>https://nayoon030303.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 17 Feb 2022 01:43:26 +0900</pubDate>
    </item>
  </channel>
</rss>