<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩개발</title>
    <link>https://dortmoot.tistory.com/</link>
    <description>Data Engineer를 꿈꾸는 개발자입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 9 Jun 2026 23:57:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Dortmoot</managingEditor>
    <item>
      <title>MWAA 설치</title>
      <link>https://dortmoot.tistory.com/213</link>
      <description>&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 AWS내 Airflow인 MWAA를 구축하며 정리한 내용입니다.&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;1. AWS CLI 자격 얻기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) AWS CLI 설치 - &lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions&quot;&gt;링크&lt;/a&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Command로 작업하도록 도와주는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ curl &quot;https://awscli.amazonaws.com/AWSCLIV2.pkg&quot; -o &quot;AWSCLIV2.pkg&quot;
$ sudo softwareupdate --install-rosetta
$ sudo installer -pkg AWSCLIV2.pkg -target /

# 제대로 동작하는지 체크
$ which aws
$ aws --version
&amp;gt; aws-cli/2.8.5 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) Certification 설정 - &lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-files.html&quot;&gt;링크&lt;/a&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;aws 사용자 계정에서 본인의 계정의 Certification ( access_key_id , access_key ) 다운로드&lt;/li&gt;
&lt;li&gt;CLI 아래와 같이 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680008685143&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ aws configure 

AWS Access Key ID [None]: id 
AWS Secret Access Key [None]: key Default 
region name [None]: ap-northeast-2 Default 
output format [None]: json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-26 오후 3.38.35.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl0TbI/btr6C0GplfS/dunZ74KzyWnbJTbmkJWRZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl0TbI/btr6C0GplfS/dunZ74KzyWnbJTbmkJWRZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl0TbI/btr6C0GplfS/dunZ74KzyWnbJTbmkJWRZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl0TbI%2Fbtr6C0GplfS%2FdunZ74KzyWnbJTbmkJWRZ0%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;1901&quot; height=&quot;810&quot; data-filename=&quot;스크린샷 2022-10-26 오후 3.38.35.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&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;2. MWAA 설치&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) download or save mwaa-environment-public-network.yml - &lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/mwaa/latest/userguide/quick-start.html#quick-start-createstack&quot;&gt;링크&lt;/a&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Create Enviornment MWAA
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;${AWS::Region}
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;aws/config region&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;${AWS::AccountId}
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Aws 계정 ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;${AWS::StackName}
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;command 시 stack-name 값&lt;/li&gt;
&lt;li&gt;알파벳으로 시작하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;필요에 따라 VPC,CIDR,Subnet,Gateway 값을 변경하여 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680008912275&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AWSTemplateFormatVersion: &quot;2010-09-09&quot;

Parameters:

  EnvironmentName:
    # 모든 이름 앞에 붙여서 사용할 값
    Description: An environment name that is prefixed to resource names
    Type: String
    Default: MWAAEnvironment
    # Network Setting
  VpcCIDR:
    Description: The IP range (CIDR notation) for this VPC
    Type: String
    Default: 10.192.0.0/16

  PublicSubnet1CIDR:
    Description: The IP range (CIDR notation) for the public subnet in the first Availability Zone
    Type: String
    Default: 10.192.10.0/24

  PublicSubnet2CIDR:
    Description: The IP range (CIDR notation) for the public subnet in the second Availability Zone
    Type: String
    Default: 10.192.11.0/24

  PrivateSubnet1CIDR:
    Description: The IP range (CIDR notation) for the private subnet in the first Availability Zone
    Type: String
    Default: 10.192.20.0/24
  PrivateSubnet2CIDR:
    Description: The IP range (CIDR notation) for the private subnet in the second Availability Zone
    Type: String
    Default: 10.192.21.0/24
  # 최대 worker 수
  MaxWorkerNodes:
    Description: The maximum number of workers that can run in the environment
    Type: Number
    Default: 2
  # Log 구성
  DagProcessingLogs:
    Description: Log level for DagProcessing
    Type: String
    Default: INFO
  SchedulerLogsLevel:
    Description: Log level for SchedulerLogs
    Type: String
    Default: INFO
  TaskLogsLevel:
    Description: Log level for TaskLogs
    Type: String
    Default: INFO
  WorkerLogsLevel:
    Description: Log level for WorkerLogs
    Type: String
    Default: INFO
  WebserverLogsLevel:
    Description: Log level for WebserverLogs
    Type: String
    Default: INFO

Resources:
  #####################################################################################################################
  # CREATE VPC
  #####################################################################################################################

  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          # vpc에서 보이는 이름 설정 값
          Value: MWAAEnvironment

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          # 인터넷 게이트웨이에 보이는 이름 설정 값
          Value: MWAAEnvironment

  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: !Ref PublicSubnet1CIDR
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          # Subnet 이름
          Value: !Sub ${EnvironmentName} Public Subnet (AZ1)

  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 1, !GetAZs  '' ]
      CidrBlock: !Ref PublicSubnet2CIDR
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          # Subnet 이름
          Value: !Sub ${EnvironmentName} Public Subnet (AZ2)

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs  '' ]
      CidrBlock: !Ref PrivateSubnet1CIDR
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          # Subnet 이름
          Value: !Sub ${EnvironmentName} Private Subnet (AZ1)

  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 1, !GetAZs  '' ]
      CidrBlock: !Ref PrivateSubnet2CIDR
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          # Subnet 이름
          Value: !Sub ${EnvironmentName} Private Subnet (AZ2)

  NatGateway1EIP:
    Type: AWS::EC2::EIP
    DependsOn: InternetGatewayAttachment
    Properties:
      Domain: vpc

  NatGateway2EIP:
    Type: AWS::EC2::EIP
    DependsOn: InternetGatewayAttachment
    Properties:
      Domain: vpc

  NatGateway1:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGateway1EIP.AllocationId
      SubnetId: !Ref PublicSubnet1

  NatGateway2:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGateway2EIP.AllocationId
      SubnetId: !Ref PublicSubnet2

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          # Route Table Name
          Value: !Sub ${EnvironmentName} Public Routes

  DefaultPublicRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet1

  PublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet2


  PrivateRouteTable1:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          # Route Table Name
          Value: !Sub ${EnvironmentName} Private Routes (AZ1)

  DefaultPrivateRoute1:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable1
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway1

  PrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable1
      SubnetId: !Ref PrivateSubnet1

  PrivateRouteTable2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          # Route Table Name
          Value: !Sub ${EnvironmentName} Private Routes (AZ2)

  DefaultPrivateRoute2:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable2
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway2

  PrivateSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable2
      SubnetId: !Ref PrivateSubnet2

  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: &quot;mwaa-security-group&quot;
      GroupDescription: &quot;Security group with a self-referencing inbound rule.&quot;
      VpcId: !Ref VPC

  SecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref SecurityGroup
      IpProtocol: &quot;-1&quot;
      SourceSecurityGroupId: !Ref SecurityGroup

  EnvironmentBucket:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

  #####################################################################################################################
  # CREATE MWAA
  #####################################################################################################################

  MwaaEnvironment:
    Type: AWS::MWAA::Environment
    DependsOn: MwaaExecutionPolicy
    Properties:
      # ${AWS::Region} = aws/config region
      # ${AWS::AccountId} = ??
      # {AWS::StackName} = command 시 stack-name 값
      # 알파벳으로 시작하여야 한다.
      Name: !Sub &quot;${AWS::StackName}-MwaaEnvironment&quot;
      SourceBucketArn: !GetAtt EnvironmentBucket.Arn
      ExecutionRoleArn: !GetAtt MwaaExecutionRole.Arn
      DagS3Path: dags
      NetworkConfiguration:
        SecurityGroupIds:
          - !GetAtt SecurityGroup.GroupId
        SubnetIds:
          - !Ref PrivateSubnet1
          - !Ref PrivateSubnet2
      WebserverAccessMode: PUBLIC_ONLY
      MaxWorkers: !Ref MaxWorkerNodes
      LoggingConfiguration:
        DagProcessingLogs:
          LogLevel: !Ref DagProcessingLogs
          Enabled: true
        SchedulerLogs:
          LogLevel: !Ref SchedulerLogsLevel
          Enabled: true
        TaskLogs:
          LogLevel: !Ref TaskLogsLevel
          Enabled: true
        WorkerLogs:
          LogLevel: !Ref WorkerLogsLevel
          Enabled: true
        WebserverLogs:
          LogLevel: !Ref WebserverLogsLevel
          Enabled: true
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC
      GroupDescription: !Sub &quot;Security Group for Amazon MWAA Environment ${AWS::StackName}-MwaaEnvironment&quot;
      GroupName: !Sub &quot;airflow-security-group-${AWS::StackName}-MwaaEnvironment&quot;
  
  SecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref SecurityGroup
      IpProtocol: &quot;-1&quot;
      SourceSecurityGroupId: !Ref SecurityGroup

  SecurityGroupEgress:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      GroupId: !Ref SecurityGroup
      IpProtocol: &quot;-1&quot;
      CidrIp: &quot;0.0.0.0/0&quot;

  MwaaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - airflow-env.amazonaws.com
                - airflow.amazonaws.com
            Action:
             - &quot;sts:AssumeRole&quot;
      Path: &quot;/service-role/&quot;

  MwaaExecutionPolicy:
    DependsOn: EnvironmentBucket
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Roles:
        - !Ref MwaaExecutionRole
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: airflow:PublishMetrics
            Resource:
              - !Sub &quot;arn:aws:airflow:${AWS::Region}:${AWS::AccountId}:environment/${EnvironmentName}&quot;
          - Effect: Deny
            Action: s3:ListAllMyBuckets
            Resource:
              - !Sub &quot;${EnvironmentBucket.Arn}&quot;
              - !Sub &quot;${EnvironmentBucket.Arn}/*&quot;

          - Effect: Allow
            Action:
              - &quot;s3:GetObject*&quot;
              - &quot;s3:GetBucket*&quot;
              - &quot;s3:List*&quot;
            Resource:
              - !Sub &quot;${EnvironmentBucket.Arn}&quot;
              - !Sub &quot;${EnvironmentBucket.Arn}/*&quot;
          - Effect: Allow
            Action:
              - logs:DescribeLogGroups
            Resource: &quot;*&quot;

          - Effect: Allow
            Action:
              - logs:CreateLogStream
              - logs:CreateLogGroup
              - logs:PutLogEvents
              - logs:GetLogEvents
              - logs:GetLogRecord
              - logs:GetLogGroupFields
              - logs:GetQueryResults
              - logs:DescribeLogGroups
            Resource:
              - !Sub &quot;arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:airflow-${AWS::StackName}*&quot;
          - Effect: Allow
            Action: cloudwatch:PutMetricData
            Resource: &quot;*&quot;
          - Effect: Allow
            Action:
              - sqs:ChangeMessageVisibility
              - sqs:DeleteMessage
              - sqs:GetQueueAttributes
              - sqs:GetQueueUrl
              - sqs:ReceiveMessage
              - sqs:SendMessage
            Resource:
              - !Sub &quot;arn:aws:sqs:${AWS::Region}:*:airflow-celery-*&quot;
          - Effect: Allow
            Action:
              - kms:Decrypt
              - kms:DescribeKey
              - &quot;kms:GenerateDataKey*&quot;
              - kms:Encrypt
            NotResource: !Sub &quot;arn:aws:kms:*:${AWS::AccountId}:key/*&quot;
            Condition:
              StringLike:
                &quot;kms:ViaService&quot;:
                  - !Sub &quot;sqs.${AWS::Region}.amazonaws.com&quot;
Outputs:
  VPC:
    Description: A reference to the created VPC
    Value: !Ref VPC

  PublicSubnets:
    Description: A list of the public subnets
    Value: !Join [ &quot;,&quot;, [ !Ref PublicSubnet1, !Ref PublicSubnet2 ]]

  PrivateSubnets:
    Description: A list of the private subnets
    Value: !Join [ &quot;,&quot;, [ !Ref PrivateSubnet1, !Ref PrivateSubnet2 ]]

  PublicSubnet1:
    Description: A reference to the public subnet in the 1st Availability Zone
    Value: !Ref PublicSubnet1

  PublicSubnet2:
    Description: A reference to the public subnet in the 2nd Availability Zone
    Value: !Ref PublicSubnet2

  PrivateSubnet1:
    Description: A reference to the private subnet in the 1st Availability Zone
    Value: !Ref PrivateSubnet1

  PrivateSubnet2:
    Description: A reference to the private subnet in the 2nd Availability Zone
    Value: !Ref PrivateSubnet2

  SecurityGroupIngress:
    Description: Security group with self-referencing inbound rule
    Value: !Ref SecurityGroupIngress

  MwaaApacheAirflowUI:
    Description: MWAA Environment
    Value: !Sub  &quot;https://${MwaaEnvironment.WebserverUrl}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) Create Stack with AWS CLI&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;file:// 은 필수 값&lt;/li&gt;
&lt;li&gt;download file split data = &lt;code&gt;-&lt;/code&gt; 이지만 코드 명령어는 &lt;code&gt;_&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ cd file # move yml file
$ aws cloudformation create-stack --stack-name mwaa-environment --template-body file://mwaa_public_network.yml --capabilities CAPABILITY_IAM&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3) 결과&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;p&gt;&lt;img src=&quot;https://ifh.cc/g/RF070R.png&quot; alt=&quot;https://ifh.cc/g/RF070R.png&quot; /&gt;&lt;/p&gt;</description>
      <category>AWS/Airflow(AWS)</category>
      <category>Airflow</category>
      <category>AWS</category>
      <category>cli</category>
      <category>MWAA</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/213</guid>
      <comments>https://dortmoot.tistory.com/213#entry213comment</comments>
      <pubDate>Tue, 28 Mar 2023 22:02:16 +0900</pubDate>
    </item>
    <item>
      <title>[Database] - Hash index / B-Tree index</title>
      <link>https://dortmoot.tistory.com/211</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Hash index&lt;/span&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B-tree 만큼 일반적/범용적으로 사용되지는 않지만 고유의 기능과 특성을 가지고 있는 인덱스 오브젝트 입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 키 값과 관계없이 인덱스 크기가 작고 검색이 빠르다는 것 입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원래의 값을 저장하는 것이 아닌 해시 함수의 결과만을 저장하게 됨에 따라 키 컬럼 값은 4~8바이트 정도로 작은 길이로 줄어듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; font-family: 'Noto Serif KR';&quot;&gt;Hash된 데이터 값에 따라 저장될 버킷 위치를 정하기 때문에 빠른 속도로 검색 영역을 제한할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;버킷의 범위가 작다면 Collision이 발생하게 되어 효율이 떨어지게 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해시 인덱스는 정렬되어 있다고 볼 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; font-family: 'Noto Serif KR';&quot;&gt;메모리기반의 테이블에 주로 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;b&gt;자주&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 사용되는 데이터를 옵티마이저가 판단하여 해시 키로 만들기 때문에 제어가 어렵다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; font-family: 'Noto Serif KR';&quot;&gt;E.g) &lt;a href=&quot;https://tech.kakao.com/2016/04/07/innodb-adaptive-hash-index/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Adaptive&amp;nbsp;Hash&amp;nbsp;Index&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; font-family: 'Noto Serif KR';&quot;&gt;생각을 하여 보면 B-Tree를 사용하여 매번 검색을 한다고 할 때 N개의 Data가 들어온다면 O(NLogN)의 시간 복잡도가 걸립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; font-family: 'Noto Serif KR';&quot;&gt;자주 사용하는 데이터가 존재할 것이고 이를 매번 검색할 때마다 O(LogN) 걸리게 된다면 비효율적이지 않을까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; font-family: 'Noto Serif KR';&quot;&gt;자주 사용하는 데이터에 대해 O(1)로 처리한다라는 개념이 Hash index입니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;B-Tree index&lt;/span&gt;&lt;/span&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B-Tree 인덱스는 항상 정렬된 상태를 유지한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;항상 정렬된 상태를 유지하기 위해서는 삽입,삭제,업데이트 시 Page를 다시 설정하기 위해 시간이 소요된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;대부분의 RDBMS에서 기본적으로 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다중 Column Index를 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/DB</category>
      <category>Adaptive Hash Index</category>
      <category>b-tree index</category>
      <category>Hash index</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/211</guid>
      <comments>https://dortmoot.tistory.com/211#entry211comment</comments>
      <pubDate>Thu, 6 Oct 2022 00:42:20 +0900</pubDate>
    </item>
    <item>
      <title>[PostgresSql] - 사용하는 이유</title>
      <link>https://dortmoot.tistory.com/210</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;RDBMS라고 불리는 Database는 Oracle, Mysql, Mssql, 등등 많은 모델이 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 이유로 PostgreSql을 쓰는지 알아봅시다.&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;PostgresSql&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세계에서 가장 진보된 &lt;b&gt;OpenSource&lt;/b&gt; RDBMS 입니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;확장성, 호환성&lt;/b&gt;&lt;/span&gt;이 뛰어나다. ( 동적 로드 , 카탈로그 기반 작업 )&lt;/li&gt;
&lt;li&gt;많은 SQL 표준을 준수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Object-Relational&lt;/b&gt; Database로 객체 DB와 연관되는 기능이 존재합니다. ( 상속, 오버로딩 )&lt;/li&gt;
&lt;li&gt;Concurrency + ACID(Atomicity + Consistencty , Isolation , Durability )&lt;/li&gt;
&lt;li&gt;ACID를 유지하기 위해 MVCC ( Multiversion Concurreny Control )&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 Data Type&lt;/b&gt; ( Geometric , Network Address ,Bit String , Text Search , Json , xml .. )&lt;/li&gt;
&lt;/ul&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;&lt;b&gt;Memory 성능&lt;/b&gt;이 떨어진다.&lt;/li&gt;
&lt;li&gt;Connection에 대해 새로운 Process를 Fork하기 -&amp;gt; Memory 할당(10MB)&lt;/li&gt;
&lt;li&gt;간단한 읽기가 많은 경우에는 Mysql과 같은 RDBMS가 성능이 좋다.&lt;/li&gt;
&lt;li&gt;속도에 민감한 경우 적합 X ( 호환성 , 확장성을 목표 )&lt;/li&gt;
&lt;li&gt;간단한 설정이 필요한 경우 적합 X&lt;/li&gt;
&lt;li&gt;Replica 작업을 원하는 경우 적합 X ( Mysql 이 더 성능이 좋다 )&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>개발/Postgres</category>
      <category>PostgresSQL</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/210</guid>
      <comments>https://dortmoot.tistory.com/210#entry210comment</comments>
      <pubDate>Thu, 6 Oct 2022 00:24:44 +0900</pubDate>
    </item>
    <item>
      <title>[Database] - Cardinality / Cluster Index</title>
      <link>https://dortmoot.tistory.com/208</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Index를 설정할 때 주로 사용하는 Where 조건이나, FK를 Index를 효율적인라는 것은 알 수 있다.&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;'Student' 라는 Table에 'ID' , 'Name' , 'Phone' 이라는 Column이 존재한다고 가정해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Index는 'ID' , 'Phone'으로 2개의 Column이 복합적으로 잡혀있다고 하여 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 2개를 사용하여 Select하는 것이 제일 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음에는 둘 중 하나라도 Index를 타게 하는것이 좋습니다.&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;하지만, 그렇다고 하여서 Index 많이 설정하면 좋을까요?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Index는 DB Memory를 사용하여 Table형태로 별도로 저장됨으로 Index가 많아지면 결국 저장공간과 개수도 비례하여 증가합니다.&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;Index를 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 Column Index를 설정하는게 좋을까요?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Cardinality&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Column이 가지고 있는 중복 정도&lt;/li&gt;
&lt;li&gt;'ID'는 학생 마다 부여 받은 Unique한 값임으로 Cardinality가 좋다&lt;/li&gt;
&lt;li&gt;'Name' 은 동명이인이 있을 수 있음으로 'ID'보다는 Cardinality가 낮다고 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Selectivily&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 Data를 얼마나 잘 선택 할 수 있는지 지표&lt;/li&gt;
&lt;li&gt;'Student' Table에서 'ID' , 'Name' , 'Sex' 라는 Column이 있다라고 합니다.&lt;/li&gt;
&lt;li&gt;'ID'는 학생마다 Unique 하며 Name은 동명이인이 2명씩 있고, 성별은 남자5명 여성5명으로 나뉜다고 하여 봅시다.&lt;/li&gt;
&lt;li&gt;특정 값 Row / 테이블의 총 Row * 100&lt;/li&gt;
&lt;li&gt;값들의 평균 Row / 테이블의 총 Row * 100
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;'ID' = 1/10*100 = 10%&lt;/li&gt;
&lt;li&gt;'Name' = 2/10*100 = 20%&lt;/li&gt;
&lt;li&gt;'Name' = 5/10*100 = 50%&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;h4 data-ke-size=&quot;size20&quot;&gt;3. 활용도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Column이 실제 작업에서 얼마나 자주 활용되는지 대한 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 Select , Procedure , Service에서 자주 사용되는 Column&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;4. 중복도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복이 낮을 수록 Index 설정에 좋은 Column 입니다.&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;Index&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 Column에 &lt;b&gt;Primary key&lt;/b&gt;를 지정하면 자동으로 &lt;b&gt;Clustered Index&lt;/b&gt;가 생성된다.&lt;/li&gt;
&lt;li&gt;Clustered Index가 없다면, &lt;b&gt;Unique&lt;/b&gt; 제약 조건이 있는 Table을 만들면 DB engine은 자동으로 Non-Clustered Index를 만든다.&lt;/li&gt;
&lt;li&gt;PK를 지정하는 Column에 강제로 non-Cluster index 지정이 가능하다.&lt;/li&gt;
&lt;li&gt;기존 Table에 이미 PK가 있다면, non-Cluster index 지정&lt;/li&gt;
&lt;li&gt;제약 조건 없이 테이블 생성시에&amp;nbsp;Index를 만들 수 없으며,&amp;nbsp;Index가 자동 생성되기 위한 열의 제약 조건은&amp;nbsp;Primary Key또는&amp;nbsp;Unique&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;Clustered Index&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Clustered Index는&amp;nbsp;테이블의 데이터를 지정된 컬럼에 대해 물리적으로 데이터를 재배열한다.&lt;br /&gt;Index를 생성할 때는 데이터 페이지 전체를 다시 정렬&lt;/li&gt;
&lt;li&gt;데이터가 테이블에 삽입되는 순서에 상관없이&amp;nbsp;Index로 생성되어 있는 컬럼을 기준으로 정렬되어&amp;nbsp;삽입된다.&lt;/li&gt;
&lt;li&gt;Index Page를&amp;nbsp;키값과&amp;nbsp;데이터 페이지 번호로 구성하고, 검색하고자하는&amp;nbsp;데이터의&amp;nbsp;키 값으로&amp;nbsp;페이지 번호를 검색하여 데이터를 찾는다.&lt;/li&gt;
&lt;li&gt;Clustered Index는&amp;nbsp;테이블 당 한개씩만 존재 가능하다.&lt;/li&gt;
&lt;li&gt;테이블에&amp;nbsp;데이터가 많이 저장된 상태에서&amp;nbsp;ALTER를 통해&amp;nbsp;Clustered Index를 추가한다면,&amp;nbsp;많은 데이터를 정렬해야 해서 많은 리소스를 차지하게 된다. -&amp;gt; 사용자의 이용시간이 많을 때 변경하면 안된다.&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;Cluster.jpg&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NpVAE/btrNzJKMXES/LCHjQgJYy7gRmhyIhe7Wx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NpVAE/btrNzJKMXES/LCHjQgJYy7gRmhyIhe7Wx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NpVAE/btrNzJKMXES/LCHjQgJYy7gRmhyIhe7Wx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpVAE%2FbtrNzJKMXES%2FLCHjQgJYy7gRmhyIhe7Wx1%2Fimg.jpg&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;959&quot; height=&quot;358&quot; data-filename=&quot;Cluster.jpg&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작 원리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Clustered Index는 Root Page + Leaf Page 로 구성된다.&lt;/li&gt;
&lt;li&gt;Leaf Page = Data 값이다.&lt;/li&gt;
&lt;li&gt;Physical 적으로도 정렬되어 있어 Non-clustered index보다 더 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Cluster2.jpg&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8hci/btrNCg2qwII/l4sBfZpOE8pSAnvKIPSXA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8hci/btrNCg2qwII/l4sBfZpOE8pSAnvKIPSXA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8hci/btrNCg2qwII/l4sBfZpOE8pSAnvKIPSXA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8hci%2FbtrNCg2qwII%2Fl4sBfZpOE8pSAnvKIPSXA1%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;551&quot; height=&quot;231&quot; data-filename=&quot;Cluster2.jpg&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Non-Clustered Index&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Physical적으로 물리적 Data를 정렬하지 않고 Data Page를 구성하여 Mapping한다.&lt;/li&gt;
&lt;li&gt;Table Data는 그대로 두고 지정된 Column에 대해 정렬된 Index를 만든다.&lt;/li&gt;
&lt;li&gt;Clustered Index에 비해Select 속도는 떨어지지만, DML(Insert,Update,Delete)는 더 빠르다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;NonCluster.jpg&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qPgOr/btrNEw4ZGK4/qh7w7NbpmOHwCJH4sw9F81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qPgOr/btrNEw4ZGK4/qh7w7NbpmOHwCJH4sw9F81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qPgOr/btrNEw4ZGK4/qh7w7NbpmOHwCJH4sw9F81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqPgOr%2FbtrNEw4ZGK4%2Fqh7w7NbpmOHwCJH4sw9F81%2Fimg.jpg&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;678&quot; height=&quot;350&quot; data-filename=&quot;NonCluster.jpg&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작원리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Page를 건드리지 않고, 별도의 장소에 Index Page를 Create&lt;/li&gt;
&lt;li&gt;Index Page는 Key로 Sort하여 RID로 구성된다.&lt;/li&gt;
&lt;li&gt;Leaf Page에 Index로 구성한 뒤 RID를 생성한다.&lt;/li&gt;
&lt;li&gt;RID는 데이터가 위치하는 장소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;NonCluster.2jpg.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMZsrt/btrNAM8ocLl/DmVd8b80OHVOtxJPXv7e2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMZsrt/btrNAM8ocLl/DmVd8b80OHVOtxJPXv7e2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMZsrt/btrNAM8ocLl/DmVd8b80OHVOtxJPXv7e2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMZsrt%2FbtrNAM8ocLl%2FDmVd8b80OHVOtxJPXv7e2k%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;641&quot; height=&quot;429&quot; data-filename=&quot;NonCluster.2jpg.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림은 Nonclustered Index + Clustered Index 그림이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2개다 합친거.jpg&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byZych/btrNB5s812M/l5WkZ47wolXnQ4ahOUlIuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byZych/btrNB5s812M/l5WkZ47wolXnQ4ahOUlIuk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byZych/btrNB5s812M/l5WkZ47wolXnQ4ahOUlIuk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyZych%2FbtrNB5s812M%2Fl5WkZ47wolXnQ4ahOUlIuk%2Fimg.jpg&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;686&quot; height=&quot;540&quot; data-filename=&quot;2개다 합친거.jpg&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CS/DB</category>
      <category>Cardinality</category>
      <category>CLUSTERED INDEX</category>
      <category>Non-Clustered Index</category>
      <category>Selectivily</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/208</guid>
      <comments>https://dortmoot.tistory.com/208#entry208comment</comments>
      <pubDate>Tue, 4 Oct 2022 00:29:32 +0900</pubDate>
    </item>
    <item>
      <title>[Network] - HTTP / HTTPS</title>
      <link>https://dortmoot.tistory.com/207</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP ( HyperText Transfer Protocol )&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인터넷 상에서 Client와 Server가 Text를 주고 받을 때 쓰는 통신 규약&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP는 텍스트 교환으로, 누군가 Network signal을 가로채면 내용이 노출된다.&lt;/span&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTPS ( HyperText Transfer Protocol )&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP에서 신호를 가로채도 내용이 노출 안되도록 보안&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTPS는 텍스트를 암호화 ( 공개키 암호화 )&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;CA라는 기업이 공개키를 저장해주는 신뢰성이 검증된 민간기업들의 목록을 가지고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Server는 CA 기업의 개인키로 암호화한 인증서를 가지고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Client -&amp;gt; Server Request&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Server -&amp;gt; Client Response ( CA기업의 Private key로 암호화한 인증서(A server의 공개 키) )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Client 브라우저는 CA의 공개키를 알고 있어 복호화하여 A 서버의 공개키를 얻는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Client는 A server의 공개키를 이용하여 암호화 하여 전송&lt;/span&gt;&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;HTTPS.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4Jf9q/btrNvxQTaxH/LqK5vsmftBkVHIXvZ4YK11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4Jf9q/btrNvxQTaxH/LqK5vsmftBkVHIXvZ4YK11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4Jf9q/btrNvxQTaxH/LqK5vsmftBkVHIXvZ4YK11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4Jf9q%2FbtrNvxQTaxH%2FLqK5vsmftBkVHIXvZ4YK11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;720&quot; data-filename=&quot;HTTPS.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CS/면접준비</category>
      <category>HTTP</category>
      <category>https</category>
      <category>Network</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/207</guid>
      <comments>https://dortmoot.tistory.com/207#entry207comment</comments>
      <pubDate>Mon, 3 Oct 2022 23:10:06 +0900</pubDate>
    </item>
    <item>
      <title>[Database] - Index</title>
      <link>https://dortmoot.tistory.com/206</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Index&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Table Address를 미리 저장하면 Mapping 하여 주는 개념&lt;/blockquote&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;Table Scan(Full scan)을 하게 되면 O(N)이 들게 되는데 이를 더 효율적으로 탐색하기 위한 방법 O(LogN)&lt;/li&gt;
&lt;li&gt;RDBMS에서 검색 속도를 높이기 위함&lt;/li&gt;
&lt;li&gt;Index는 &lt;b&gt;B-Tree(Balance Tree)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Join, Where에서 Index가 주로 사용되어 쿼리의 검색 속도를 빠르게 하는데 목적을 가진다.&lt;/li&gt;
&lt;li&gt;Delete,Insert,Update 쿼리에는 Index 사용시 오히려 느리다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Insert
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Block에 여유가 없다면, 새로운 Block 할당 후 Key 옮기는 작업 수행&lt;/li&gt;
&lt;li&gt;Index Split 작업 동안, 해당 Block Key 값에 대해 DML이 Blocking -&amp;gt; Wait&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Delete
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Index data 삭제 시에는 사용 X 표시&lt;/li&gt;
&lt;li&gt;Table의 Data 수와 Index의 수가 다를 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Update
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Update시 Index Update 불가&lt;/li&gt;
&lt;li&gt;Delete 후 Insert하는 작업으로 2배의 Resource가 든다.&lt;/li&gt;
&lt;/ul&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;h4 data-ke-size=&quot;size20&quot;&gt;B-Tree&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;스스로 균형을 찾는 Tree&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Binary Search Tree와 유사하지만, Level을 자동으로 잡아준다.&lt;/li&gt;
&lt;li&gt;Insert, Delete 시간을 희생하면서 Select의 시간을 높인다.&lt;/li&gt;
&lt;li&gt;Root와 Branch는 하위 Block에 대한 Address값을 가지고 있습니다.&lt;/li&gt;
&lt;li&gt;Leaf Node는 양방향 연결 리스트입니다.&lt;/li&gt;
&lt;li&gt;Leaf Node에 저장된 Record(Message)들은 Key 순으로 Sort +&lt;b&gt; Record들의 주소 값(ROWID)&lt;/b&gt;를 가지고 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ROWID = Data Block Address + Row&lt;/li&gt;
&lt;li&gt;Data Block Address = Data File number + Block number&lt;/li&gt;
&lt;li&gt;Block number = Data file 내에서 부여한 상대 순번&lt;/li&gt;
&lt;li&gt;Row = Block 내에서 순번&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;수직적 탐색 = Index Scan 시작 지점 찾는 과정&lt;/li&gt;
&lt;li&gt;수평적 탐색 = Data를 찾는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Index.png&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZp5T/btrNAM1vVJB/faKK4VonAKyQjRvpz1QnkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZp5T/btrNAM1vVJB/faKK4VonAKyQjRvpz1QnkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZp5T/btrNAM1vVJB/faKK4VonAKyQjRvpz1QnkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZp5T%2FbtrNAM1vVJB%2FfaKK4VonAKyQjRvpz1QnkK%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;1259&quot; height=&quot;692&quot; data-filename=&quot;Index.png&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결합 Index&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성별 - 이름 과 이름 - 성별로 하였을 때 Index의 구조에 대해서 알아보려고 합니다.&lt;/li&gt;
&lt;li&gt;성별 - 이름으로 구성한 방법과, 성별 - 이름으로 구성하여도 읽은 index block 갯수가 동일합니다.&lt;/li&gt;
&lt;li&gt;where조건 절에 =으로 검색하는 경우는 index를 앞,뒤에 두든 Block I/O는 갯수가 동일-&amp;gt; 성능 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;index1.png&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CtKiP/btrNGwRa9On/SPsD0nNjbZ0eOk7N1wjQ80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CtKiP/btrNGwRa9On/SPsD0nNjbZ0eOk7N1wjQ80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CtKiP/btrNGwRa9On/SPsD0nNjbZ0eOk7N1wjQ80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCtKiP%2FbtrNGwRa9On%2FSPsD0nNjbZ0eOk7N1wjQ80%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;1244&quot; height=&quot;687&quot; data-filename=&quot;index1.png&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;index2.png&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCE63W/btrNJAFDK4w/Zn17fQFDXXYIycpjfNBGnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCE63W/btrNJAFDK4w/Zn17fQFDXXYIycpjfNBGnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCE63W/btrNJAFDK4w/Zn17fQFDXXYIycpjfNBGnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCE63W%2FbtrNJAFDK4w%2FZn17fQFDXXYIycpjfNBGnk%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;1251&quot; height=&quot;679&quot; data-filename=&quot;index2.png&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Index 튜닝&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;성능을 좌우하는 역할은 Disk I/O&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Index scan 튜닝&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Index Scan 과정에서 발생하는 비효율을 줄인다.&lt;/li&gt;
&lt;li&gt;학생 - 시력 과 같은 Data가 있는 경우를 예를 들겠습니다.&lt;/li&gt;
&lt;li&gt;시력 - 이름 순으로 되었다면 학생 - 시력 으로 검색하였을 때보다 많은 양의 데이터를 스캔해야 합니다.&lt;/li&gt;
&lt;li&gt;Mssql에서는 내부 동작 시 이를 예측하여 더 빠른 방식으로 동작하게 도와준다고 합니다.&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;2. Access 최소화 튜닝&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블에 Access하는 횟수를 줄이는 방식&lt;/li&gt;
&lt;li&gt;Record에 Access 시 랜덤&amp;nbsp; I/O가 사용되어 Resource를 잡아먹는다.&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>CS/DB</category>
      <category>db</category>
      <category>index</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/206</guid>
      <comments>https://dortmoot.tistory.com/206#entry206comment</comments>
      <pubDate>Mon, 3 Oct 2022 23:09:41 +0900</pubDate>
    </item>
    <item>
      <title>[후기] - 2022 하반기 Line 코딩 테스트 , 필기 테스트</title>
      <link>https://dortmoot.tistory.com/205</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코딩테스트&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2022 신입 개발자 채용 Line 코딩테스트 및 필기 테스트 후기에 대해 적어봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;10:00 ~ 12:30 시간 동안 5문제를 푸는 문제였습니다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1~4번 문제까지는 아이디어가 생각났으나, 3번까지 구현 완료.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4번 문제는 아이디어를 가지고 구현 중에 시간이 부족하여 풀지 못하였습니다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;생각보다 풀지 못하여 코딩테스트에 대해 기대를 하지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다행히도 코딩테스트를 합격을 했습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Line.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWH8Fl/btrNCfWIt9N/JUDahb9OK4rMC9PBZiPmFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWH8Fl/btrNCfWIt9N/JUDahb9OK4rMC9PBZiPmFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWH8Fl/btrNCfWIt9N/JUDahb9OK4rMC9PBZiPmFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWH8Fl%2FbtrNCfWIt9N%2FJUDahb9OK4rMC9PBZiPmFk%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;977&quot; height=&quot;482&quot; data-filename=&quot;Line.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필기테스트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이후에 진행된 필기테스트..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;CS지식을 위주로 물어보았으나 알고 있는 내용이더라도 확신히 없어서 풀면서 불안하였습니다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;34문제는 주로 OS, Network, SQL, 코드, 에러를 주고 올바른 내용 혹은 틀린 내용을 구별하는 문제 위주로 나왔습니다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다음번에는 Network를 조금 더 상세히 살펴봐야 할 것 같습니다 ㅜㅜ&lt;/span&gt;&lt;/p&gt;</description>
      <category>코팅테스트/후기</category>
      <category>2022 하반기</category>
      <category>line</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/205</guid>
      <comments>https://dortmoot.tistory.com/205#entry205comment</comments>
      <pubDate>Mon, 3 Oct 2022 22:07:10 +0900</pubDate>
    </item>
    <item>
      <title>[Network] - 대칭 키 / 공개 키</title>
      <link>https://dortmoot.tistory.com/204</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;대칭 키 ( symmetric key )&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공개 키 ( public / asymmetric key )&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;암호화, 복호화 시 사용되는 Key를 분리&lt;/blockquote&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;자신만 가지고 있는 private key로만 복호화 할 수 있는 public key를 공개&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;진행 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. A-&amp;gt;B&amp;nbsp; data를 B의 공개키로 Encrypt해서 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. B는 자신의 Private key로 평문 확인 B -&amp;gt; A A의 공개키로 Encrypt 해서 Response&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. A는 자신의 Private Key로 평문 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기밀만 유지해줄 뿐, 신뢰성을 주지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 전자서명,MAC로 해결&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;SSL&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;대칭키와 공개키 암호화 방식을 혼합&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. A-&amp;gt;B B의 Public Key로 대칭키를 암호화 하여 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. B는 Private Key로 복호화 하여 대칭키를 얻어낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. B는 대칭키를 이용하여 평문을 암호화 하여 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. A는 대칭키를 이용하여 복호화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 이후 부터는 대칭키로 통신&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;대칭키를 주고 받는 경우에만 공개 키를 사용한다.&lt;/li&gt;
&lt;li&gt;이후에는 대칭키로 통신&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/면접준비</category>
      <category>Network</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/204</guid>
      <comments>https://dortmoot.tistory.com/204#entry204comment</comments>
      <pubDate>Fri, 30 Sep 2022 22:08:56 +0900</pubDate>
    </item>
    <item>
      <title>[Network] - UDP</title>
      <link>https://dortmoot.tistory.com/203</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;UDP ( User Datagram Protocol )&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP와 다르게 신뢰, 연결을 중시 하지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Datagram 단위로 쪼개어서 전송한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP가 제공하는 정도 수준만을 제공하는 간단한 IP 상위 계층 프로토콜&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;에러가 발생할 수 있고, 재전송, 순서가 보장되지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터의 처리 속도가 매우 빠르다. -&amp;gt; 방송 / 게임&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;UDP.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKmwR/btrNviTWkOd/xyzxKr39Nrlke9HCIJ5Hp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKmwR/btrNviTWkOd/xyzxKr39Nrlke9HCIJ5Hp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKmwR/btrNviTWkOd/xyzxKr39Nrlke9HCIJ5Hp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKmwR%2FbtrNviTWkOd%2FxyzxKr39Nrlke9HCIJ5Hp0%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;820&quot; height=&quot;312&quot; data-filename=&quot;UDP.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Port번호&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP로는 Host-to-Host만 연결이 된다. 하나의 장비에서 수많은 프로그램이 통신한다면? &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP만으로는 한계가 발생한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;UDP가 나오게 된 이유&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP에서 오류가 발생하면, ICMP ( 인터넷 제어 메시지 프로토콜 ) 에서 알려주지만 처리가 불가능하기 때문에 이보다 상위 프로토콜인 UDP가 필요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DNS는 UDP를 사용할까?&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DNS는 Request의 양이 적다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Connection이 필요가 없다. ( 3 way handshake는 Overhead )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Port : 53번&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;*TCP를 사용하는 경우는 Zone transfer ( DNS 서버 간의 요청을 주고 받을 때 사용하는 transfer ) 로 크기가 512보다 큰 경우&lt;/span&gt;&lt;/p&gt;</description>
      <category>CS/면접준비</category>
      <category>udp</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/203</guid>
      <comments>https://dortmoot.tistory.com/203#entry203comment</comments>
      <pubDate>Fri, 30 Sep 2022 21:57:43 +0900</pubDate>
    </item>
    <item>
      <title>[Network] - TCP Flow Control / Congestion Control</title>
      <link>https://dortmoot.tistory.com/202</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TCP&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 통신에서 신뢰적인 연결 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신뢰성을 보장하는 Protocol&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;Reliable Network 보장 조건&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Loss = Packet이 도중에 유실&lt;/li&gt;
&lt;li&gt;Ordering = Packet의 순서&lt;/li&gt;
&lt;li&gt;Congestion = Network가 혼잡&lt;/li&gt;
&lt;li&gt;Overload = Receiver의 역량&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Data 전송 과정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;TCP Message 전송.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DWh5E/btrNvMfP9eq/KmHWZVdjxpIShDkyDkaYu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DWh5E/btrNvMfP9eq/KmHWZVdjxpIShDkyDkaYu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DWh5E/btrNvMfP9eq/KmHWZVdjxpIShDkyDkaYu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDWh5E%2FbtrNvMfP9eq%2FKmHWZVdjxpIShDkyDkaYu1%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;1280&quot; height=&quot;696&quot; data-filename=&quot;TCP Message 전송.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;TCP Header.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vSbhP/btrNvhUVRMx/bLKLkhgrX6rIyFWGxdn5LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vSbhP/btrNvhUVRMx/bLKLkhgrX6rIyFWGxdn5LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vSbhP/btrNvhUVRMx/bLKLkhgrX6rIyFWGxdn5LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvSbhP%2FbtrNvhUVRMx%2FbLKLkhgrX6rIyFWGxdn5LK%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;1280&quot; height=&quot;740&quot; data-filename=&quot;TCP Header.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Flow Control&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sender 와 Receiver의&lt;b&gt; 데이터 처리 속도가 차이&lt;/b&gt;나는 경우 ( Sender가 느리게 보내줄 때는 상관 X )&lt;/li&gt;
&lt;li&gt;Receiver는 제한된 Buffer 크기로 용량이 초과되면 Data를 받지 못하고 유실&lt;/li&gt;
&lt;li&gt;손실된다면, Sender,Receiver에게 불필요한 전송이 또 발생&lt;/li&gt;
&lt;li&gt;Receiver에 맞추어 데이터 전송량을 줄여야한다.&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;1. Stop and Wait&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 전송한 Packet에 대해 응답을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Batch처리와 마찬가지로 더 큰 단위로 처리하는 것이 유리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;Sliding Window&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Receiver에서 설정한 Window 크기 만큼 Sender측에서 확인 응답 없이 Segment 전송하여 동적으로 조절&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. sender buffer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Sender_buffer.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ntGGr/btrNuSA817g/04KuX7tcLGrL5Y6C2nBFnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ntGGr/btrNuSA817g/04KuX7tcLGrL5Y6C2nBFnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ntGGr/btrNuSA817g/04KuX7tcLGrL5Y6C2nBFnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FntGGr%2FbtrNuSA817g%2F04KuX7tcLGrL5Y6C2nBFnk%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;518&quot; height=&quot;164&quot; data-filename=&quot;Sender_buffer.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. receiver window&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;receiver_window.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDiqzN/btrNxdwMPGz/nPhN7nRaNJWX5Aq1sANzl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDiqzN/btrNxdwMPGz/nPhN7nRaNJWX5Aq1sANzl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDiqzN/btrNxdwMPGz/nPhN7nRaNJWX5Aq1sANzl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDiqzN%2FbtrNxdwMPGz%2FnPhN7nRaNJWX5Aq1sANzl0%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;529&quot; height=&quot;108&quot; data-filename=&quot;receiver_window.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. sender window&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;send_buffer.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FErsP/btrNvNFP35x/4HFVxJ12Qgn1HgjQcEzOA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FErsP/btrNvNFP35x/4HFVxJ12Qgn1HgjQcEzOA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FErsP/btrNvNFP35x/4HFVxJ12Qgn1HgjQcEzOA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFErsP%2FbtrNvNFP35x%2F4HFVxJ12Qgn1HgjQcEzOA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;132&quot; data-filename=&quot;send_buffer.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이때 receiver가 sender에게 ACK 203을 Response하였다면,&lt;/li&gt;
&lt;li&gt;Sender는 이를 보고 Window의 범위를 203부터 203+7-1 = 209 까지 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;after_sender_window.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QBFIa/btrNuDj0VJ6/oKcIM2543Xn4AyuwW6DjK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QBFIa/btrNuDj0VJ6/oKcIM2543Xn4AyuwW6DjK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QBFIa/btrNuDj0VJ6/oKcIM2543Xn4AyuwW6DjK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQBFIa%2FbtrNuDj0VJ6%2FoKcIM2543Xn4AyuwW6DjK0%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;529&quot; height=&quot;280&quot; data-filename=&quot;after_sender_window.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Congetsion Control&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sender가 전달한 Packet들은 대형 네트워크를 통해 전달된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;만약 라우터에 Packet이 몰리는 경우, 모든 Packet을 처리하는 것이 불가능하다.&lt;/li&gt;
&lt;li&gt;이 때, 전송을 못 받은 줄 알고 재전송하게 되면 혼잡만 가중시킬 것이다.&lt;/li&gt;
&lt;li&gt;이러한 혼잡을 줄이기 위해 Sender에서 보내는 데이터의 전송속도를 강제로 줄인다.&lt;/li&gt;
&lt;li&gt;Flow control은 Sender-Receiver 사이의 전송속도 문제이지만, Congestion Contorl은 Router를 포함한 더 넓은 관점에서 봐야한다.&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;1. AIMD&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음에는 Packet을 하나씩 보내고, 문제 없이 도착하면 Packet의 갯수를 증가시킨다.&lt;/li&gt;
&lt;li&gt;Linear 하게 증가시킨다는 의미&lt;/li&gt;
&lt;li&gt;실패하는 경우(time out,전송 실패)에는 Packet을 절반으로 감소&amp;nbsp;&lt;/li&gt;
&lt;li&gt;초기에 높은 대역폭을 사용하지 못하기 때문에 오랜 시간이 걸리며, Congest한 상황을 미리 아는 것이 아닌 이후에 대처&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;2. Slow Start&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AIMD와 동일하지만, Packet이 이상없이 도착하면 window size를 2배씩 증가&lt;/li&gt;
&lt;li&gt;전송 속도를 &lt;b&gt;지수 함수와 동일&lt;/b&gt;하게 증가&lt;/li&gt;
&lt;li&gt;Congest가 발생하면 1씩 떨어뜨린다. ( 어느정도 수용량 예측 )&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;3. Fast Retransmit&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Receiver가 받아야할 Packet이 오지 않고 다음것이 오게 되면, Ack Packet을 보내게 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특정 Ack가 3번 반복&lt;/b&gt;되면 없다고 인지하고 다시 재전송한다.&lt;/li&gt;
&lt;li&gt;이 때 혼잡한 상황이 있다고 가정하여 window size를 줄여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fast Retransmit.jpg&quot; data-origin-width=&quot;191&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSp9hy/btrNv9u86Es/a5hBekl2BRQL2kyphoMEo0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSp9hy/btrNv9u86Es/a5hBekl2BRQL2kyphoMEo0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSp9hy/btrNv9u86Es/a5hBekl2BRQL2kyphoMEo0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSp9hy%2FbtrNv9u86Es%2Fa5hBekl2BRQL2kyphoMEo0%2Fimg.jpg&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;191&quot; height=&quot;263&quot; data-filename=&quot;Fast Retransmit.jpg&quot; data-origin-width=&quot;191&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Fast Recovery&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;혼잡한 상태가 되면 window size를 반으로 줄이고 선형증가 시킨다.&lt;/li&gt;
&lt;li&gt;AICD와 동일하게 선형으로 증가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방안&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Congestion.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4QqTA/btrNuUeDHoT/xkeVGTjaP0bW6u3YMkhO3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4QqTA/btrNuUeDHoT/xkeVGTjaP0bW6u3YMkhO3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4QqTA/btrNuUeDHoT/xkeVGTjaP0bW6u3YMkhO3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4QqTA%2FbtrNuUeDHoT%2FxkeVGTjaP0bW6u3YMkhO3K%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;594&quot; height=&quot;246&quot; data-filename=&quot;Congestion.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CS/면접준비</category>
      <category>Congestion Control</category>
      <category>Flow Control</category>
      <author>Dortmoot</author>
      <guid isPermaLink="true">https://dortmoot.tistory.com/202</guid>
      <comments>https://dortmoot.tistory.com/202#entry202comment</comments>
      <pubDate>Fri, 30 Sep 2022 21:33:35 +0900</pubDate>
    </item>
  </channel>
</rss>