<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hybrid App Developer</title>
    <link>https://sitos-dev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 17:12:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>es6.kr</managingEditor>
    <image>
      <title>Hybrid App Developer</title>
      <url>https://tistory1.daumcdn.net/tistory/651103/attach/6549665eb4904a4cbcab8b6e5cc0f9e8</url>
      <link>https://sitos-dev.tistory.com</link>
    </image>
    <item>
      <title>fatal: repository '{http(s) git url}' not found</title>
      <link>https://sitos-dev.tistory.com/27</link>
      <description>&lt;h1&gt;macOS에서 Git fetch 인증 오류 해결: 키체인 캐시 문제&lt;/h1&gt;
&lt;p&gt;Git을 HTTP(S) 방식으로 사용할 때 아래와 같은 오류가 발생할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fetch                         
remote: The project you were looking for could not be found or you don&amp;#39;t have permission to view it.
fatal: repository &amp;#39;http://server/group/repo.git/&amp;#39; not found&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;윈도우 OS를 사용하는 경우 참고:&lt;br&gt;&lt;a href=&quot;https://velog.io/@lionloopy/git-repository-not-found-%EC%98%A4%EB%A5%98&quot;&gt;https://velog.io/@lionloopy/git-repository-not-found-오류&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;macOS를 사용하면서 다음 사항들이 모두 맞는 상황이라면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;저장소 주소(URL)는 정확하고,&lt;/li&gt;
&lt;li&gt;사용자 이름과 Personal Access Token(PAT)도 올바르게 입력했음에도 불구하고,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;macOS의 키체인(Keychain)&lt;/strong&gt; 에 저장된 이전 인증 정보가 문제를 일으키고 있을 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;  해결 방법: macOS 키체인에서 저장된 Git 자격 증명 삭제&lt;/h2&gt;
&lt;p&gt;macOS는 Git 자격 증명을 &lt;strong&gt;키체인 접근 (Keychain Access)&lt;/strong&gt; 앱에 저장합니다. 아래 순서대로 캐시된 정보를 삭제해보세요.&lt;/p&gt;
&lt;h3&gt;1. 키체인 접근 앱 열기&lt;/h3&gt;
&lt;p&gt;Spotlight 검색에 &amp;quot;키체인 접근&amp;quot;을 입력합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;⌘ + Space → &amp;quot;키체인 접근&amp;quot; 입력&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;2. Git 관련 항목 검색&lt;/h3&gt;
&lt;p&gt;우측 상단 검색창에 &lt;code&gt;git&lt;/code&gt; 검색어를 입력하면 다음과 같은 항목을 찾을 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;인터넷 암호&lt;/code&gt; 형식의 항목 중 Git 서버 주소가 포함된 것 (예: &lt;code&gt;gitlab.com&lt;/code&gt;, &lt;code&gt;github.com&lt;/code&gt; 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 인증 정보 삭제&lt;/h3&gt;
&lt;p&gt;해당 항목을 우클릭 후:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;&amp;lt;host&amp;gt; Access Key for git&amp;#39; 삭제&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;선택해서 제거하세요. 중복되거나 오래된 항목도 모두 삭제합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 자격 증명 다시 입력하기&lt;/h2&gt;
&lt;p&gt;다음에 &lt;code&gt;git fetch&lt;/code&gt;, &lt;code&gt;git push&lt;/code&gt; 등을 실행하면 Git이 인증 정보를 다시 물어봅니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username&lt;/strong&gt;: GitLab 또는 GitHub 사용자 이름&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;: Personal Access Token (PAT)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;추가 설정&lt;/h3&gt;
&lt;p&gt;기본적으로 macOS는 &lt;code&gt;osxkeychain&lt;/code&gt;을 사용하지만&lt;br&gt;저장 설정이 변경되었거나 제대로 작동하지 않는 경우 추가로 설정해줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global credential.helper osxkeychain&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;  추가 팁&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;현재 사용 중인 credential helper 확인:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;git config --global credential.helper&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;자격 증명 저장 없이 임시로 인증 시도:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;GIT_ASKPASS=echo git fetch&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DevOps</category>
      <category>Git</category>
      <category>MacOS</category>
      <category>맥</category>
      <category>맥북</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/27</guid>
      <comments>https://sitos-dev.tistory.com/27#entry27comment</comments>
      <pubDate>Tue, 13 May 2025 16:57:12 +0900</pubDate>
    </item>
    <item>
      <title>Terraform + asdf를 활용한 여러 버전의 개발 환경 구성</title>
      <link>https://sitos-dev.tistory.com/26</link>
      <description>&lt;p&gt;Terraform과 asdf를 조합하면 &lt;strong&gt;여러 버전의 하이브리드 앱 개발 환경을 쉽게 구성&lt;/strong&gt;하고, 인프라 및 개발 환경을 통합적으로 관리할 수 있다.&lt;/p&gt;
&lt;h2&gt;1. 인프라 및 개발 환경을 코드로 관리 가능&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terraform&lt;/strong&gt; → 클라우드 및 시스템 환경 관리 (AWS, GCP, Kubernetes 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;asdf&lt;/strong&gt; → 언어 및 도구 버전 관리 (Node.js, Dart, Flutter 등)&lt;/li&gt;
&lt;li&gt;여러 버전의 SDK 및 도구를 유지하면서도 일관된 환경 제공 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 재현 가능한 개발 환경 구축&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.tool-versions&lt;/code&gt; + Terraform을 사용하면, &lt;strong&gt;여러 버전의 하이브리드 앱 개발 환경을 손쉽게 구성 가능&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Terraform의 provisioner 기능을 활용하면 초기 개발 환경 자동화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Homebrew 설치 및 Terraform 설치&lt;/h2&gt;
&lt;h3&gt;macOS에서 Homebrew 설치&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;/bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Homebrew로 Terraform 설치&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;brew install terraform&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;Terraform 코드 예제&lt;/h2&gt;
&lt;h3&gt;main.tf 설정&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;provider &amp;quot;installer&amp;quot; {}

resource &amp;quot;installer_brew&amp;quot; &amp;quot;this&amp;quot; {
  for_each = toset(var.brew_packages)
  name     = each.key
}

resource &amp;quot;installer_asdf_plugin&amp;quot; &amp;quot;this&amp;quot; {
  for_each = var.asdf_packages
  name     = each.key
  git_url  = each.value.git_url
}

resource &amp;quot;installer_asdf&amp;quot; &amp;quot;this&amp;quot; {
  depends_on = [installer_asdf_plugin.this]
  for_each = merge([
    for package, value in var.asdf_packages : {
      for version in value.versions : &amp;quot;${package}@${version}&amp;quot; =&amp;gt; { name = package, version = version }
    }
  ]...)
  name    = each.value.name
  version = each.value.version
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;provider.tf 설정&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;terraform {
  required_providers {
    installer = {
      source = &amp;quot;es6kr/installer&amp;quot;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;terraform.tfvars 변수 정의&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;brew_packages = [
  &amp;quot;asdf&amp;quot;,
  &amp;quot;git&amp;quot;,
]

asdf_packages = {
  dart = {
    git_url  = &amp;quot;https://github.com/PatOConnor43/asdf-dart.git&amp;quot;
    versions = [&amp;quot;2.19.6&amp;quot;, &amp;quot;3.4.3&amp;quot;]
  }
  flutter = {
    git_url  = &amp;quot;https://github.com/oae/asdf-flutter.git&amp;quot;
    versions = [&amp;quot;3.7.12&amp;quot;, &amp;quot;3.22.2&amp;quot;]
  }
  nodejs = {
    git_url  = &amp;quot;https://github.com/asdf-vm/asdf-nodejs&amp;quot;
    versions = [&amp;quot;22.11.0&amp;quot;]
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;Terraform과 &lt;code&gt;asdf&lt;/code&gt;를 활용하면 &lt;strong&gt;여러 버전의 하이브리드 앱 개발 환경을 코드로 관리&lt;/strong&gt;할 수 있다.&lt;br&gt;특히 &lt;code&gt;.tool-versions&lt;/code&gt; 파일과 함께 사용하면 &lt;strong&gt;팀원 간 일관된 개발 환경을 보장&lt;/strong&gt;하면서도,&lt;br&gt;각 프로젝트에 맞는 SDK 및 도구 버전을 쉽게 전환할 수 있다.&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>asdf</category>
      <category>terraform</category>
      <category>앱</category>
      <category>크로스플랫폼</category>
      <category>하이브리드</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/26</guid>
      <comments>https://sitos-dev.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 16 Feb 2025 17:06:28 +0900</pubDate>
    </item>
    <item>
      <title>Terraform에서 OCI 인스턴스 생성 시 `400-CannotParseRequest` 오류 해결</title>
      <link>https://sitos-dev.tistory.com/25</link>
      <description>&lt;p&gt;Terraform을 사용하여 Oracle Cloud Infrastructure(OCI)에서 VM 인스턴스를 생성하려고 할 때 다음과 같은 오류가 발생했다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error: 400-CannotParseRequest, Incorrectly formatted request. Please refer to our documentation for help.
Request Target: POST https://iaas.ap-chuncheon-1.oraclecloud.com/20160918/instances&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Terraform 코드에서 &lt;code&gt;compartment_id&lt;/code&gt;와 &lt;code&gt;availability_domain&lt;/code&gt; 값을 직접 변수에서 가져와 사용하고 있었다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;resource &amp;quot;oci_core_instance&amp;quot; &amp;quot;instance1&amp;quot; {
  availability_domain = var.availability_domain
  compartment_id = var.compartment_id
  shape = &amp;quot;VM.Standard.E2.1.Micro&amp;quot;

  create_vnic_details {
    subnet_id = var.subnet_id
    assign_public_ip = true
  }

  source_details {
    source_type = &amp;quot;image&amp;quot;
    source_id = var.image_id
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;OCI에서 &lt;code&gt;availability_domain&lt;/code&gt;과 &lt;code&gt;compartment_id&lt;/code&gt;를 올바르게 가져오지 못해 요청이 잘못된 형식(&lt;code&gt;400-CannotParseRequest&lt;/code&gt;)으로 전달된 것이 원인이었다.&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;Terraform의 &lt;code&gt;data&lt;/code&gt; 블록을 활용하여 &lt;code&gt;compartment_id&lt;/code&gt;와 &lt;code&gt;availability_domain&lt;/code&gt; 값을 동적으로 가져오도록 수정했다.&lt;/p&gt;
&lt;h3&gt;수정된 코드&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;data &amp;quot;oci_identity_compartment&amp;quot; &amp;quot;compartment1&amp;quot; {
  id = var.compartment_id
}

data &amp;quot;oci_identity_availability_domain&amp;quot; &amp;quot;availability_domain1&amp;quot; {
  compartment_id = var.tenancy_ocid
  ad_number = 1
}

resource &amp;quot;oci_core_instance&amp;quot; &amp;quot;instance1&amp;quot; {
  availability_domain = data.oci_identity_availability_domain.availability_domain1.name
  compartment_id = data.oci_identity_compartment.compartment1.id
  shape = &amp;quot;VM.Standard.E2.1.Micro&amp;quot;

  create_vnic_details {
    subnet_id = var.subnet_id
    assign_public_ip = true
  }

  source_details {
    source_type = &amp;quot;image&amp;quot;
    source_id = var.image_id
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;Terraform에서 OCI 인스턴스를 생성할 때 &lt;code&gt;availability_domain&lt;/code&gt;과 &lt;code&gt;compartment_id&lt;/code&gt;를 직접 변수로 할당하는 대신, &lt;code&gt;data&lt;/code&gt; 블록을 사용하여 동적으로 조회해야 한다. 이를 통해 잘못된 요청 형식 오류(&lt;code&gt;400-CannotParseRequest&lt;/code&gt;)를 방지할 수 있다.&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>OCI</category>
      <category>terraform</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/25</guid>
      <comments>https://sitos-dev.tistory.com/25#entry25comment</comments>
      <pubDate>Sat, 8 Feb 2025 13:47:41 +0900</pubDate>
    </item>
    <item>
      <title>[k8s] 프라이빗 클라우드 구축을 위한 K3s 추천 가이드</title>
      <link>https://sitos-dev.tistory.com/24</link>
      <description>&lt;p&gt;클라우드 환경을 직접 운영하려는 기업이나 개인 개발자는 경량화된 쿠버네티스(Kubernetes) 솔루션을 고려해야 한다. &lt;strong&gt;K3s&lt;/strong&gt;는 CNCF(Cloud Native Computing Foundation)에서 공식 인증한 경량 쿠버네티스로, 저사양 환경에서도 원활하게 동작하며 프라이빗 클라우드 구축에 적합하다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. K3s가 프라이빗 클라우드에 적합한 이유&lt;/h2&gt;
&lt;h3&gt;1.1. 가벼운 설치 및 운영&lt;/h3&gt;
&lt;p&gt;기존 쿠버네티스(Kubernetes)는 설정이 복잡하고 운영 비용이 높다. 반면 K3s는 단일 바이너리(약 100MB)로 제공되며, 설치 과정이 간단하다. 불필요한 기능을 제거하고 최소한의 리소스로 동작하도록 설계되어 있어 저사양 서버에서도 실행할 수 있다.&lt;/p&gt;
&lt;h3&gt;1.2. 낮은 리소스 사용량&lt;/h3&gt;
&lt;p&gt;K3s는 불필요한 기능(예: 레거시 스토리지 드라이버, 자체 DNS 등)을 제거하여 리소스 사용량을 최소화했다. 또한 SQLite를 기본 데이터베이스로 사용하며, 필요 시 외부 MySQL이나 PostgreSQL과 연동할 수도 있다.&lt;/p&gt;
&lt;h3&gt;1.3. 단순한 멀티 노드 클러스터 구성&lt;/h3&gt;
&lt;p&gt;K3s는 단일 서버(master) 노드에 여러 개의 워커(agent) 노드를 연결하거나, 여러 개의 서버를 구성하는 방식으로 클러스터를 확장할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. K3s 설치 및 구성&lt;/h2&gt;
&lt;p&gt;K3s 클러스터는 다음과 같은 방식으로 구성할 수 있다.&lt;/p&gt;
&lt;h3&gt;2.1. 단일 서버에 여러 에이전트 연결&lt;/h3&gt;
&lt;p&gt;하나의 서버(master)에서 컨트롤 플레인을 운영하고, 여러 개의 에이전트를 추가하여 클러스터를 확장하는 방법이다.&lt;/p&gt;
&lt;h4&gt;1) 서버 노드 설치&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;curl -sfL https://get.k3s.io | sh -s - server&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;설치 후, 클러스터의 상태를 확인할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kubectl get nodes&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;토큰을 확인하여 에이전트 노드에 연결할 수 있도록 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cat /var/lib/rancher/k3s/server/node-token&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;2) 에이전트 노드 추가&lt;/h4&gt;
&lt;p&gt;에이전트 노드에서 다음 명령어를 실행하여 클러스터에 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sfL https://get.k3s.io | K3S_URL=&amp;quot;https://&amp;lt;서버 노드 IP&amp;gt;:6443&amp;quot; K3S_TOKEN=&amp;quot;&amp;lt;토큰값&amp;gt;&amp;quot; sh -&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3&gt;2.2. 서버 다중 구성&lt;/h3&gt;
&lt;p&gt;여러 개의 서버를 구성하여 고가용성(HA) 클러스터를 운영할 수 있다.&lt;/p&gt;
&lt;h4&gt;1) 첫 번째 서버 노드 설치 (etcd 클러스터 초기화)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;curl -sfL https://get.k3s.io | sh -s - server --cluster-init&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;토큰 값을 확인하여 이후 추가되는 서버 및 에이전트 노드가 클러스터에 연결될 수 있도록 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cat /var/lib/rancher/k3s/server/node-token&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;2) 추가 서버 노드 연결&lt;/h4&gt;
&lt;p&gt;추가 서버 노드를 클러스터에 포함하려면 다음 명령어를 실행한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sfL https://get.k3s.io | K3S_URL=&amp;quot;https://&amp;lt;첫 번째 서버 IP&amp;gt;:6443&amp;quot; K3S_TOKEN=&amp;quot;&amp;lt;토큰값&amp;gt;&amp;quot; sh -s - server&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;3) 에이전트 노드 추가&lt;/h4&gt;
&lt;p&gt;위 방식과 동일하게 &lt;code&gt;K3S_URL&lt;/code&gt;과 &lt;code&gt;K3S_TOKEN&lt;/code&gt;을 이용하여 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sfL https://get.k3s.io | K3S_URL=&amp;quot;https://&amp;lt;첫 번째 서버 IP&amp;gt;:6443&amp;quot; K3S_TOKEN=&amp;quot;&amp;lt;토큰값&amp;gt;&amp;quot; sh - # agent is assumed because of K3S_URL&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;3. K3s 활용 방안&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;온프레미스 프라이빗 클라우드&lt;/strong&gt;: 내부 서비스 및 애플리케이션을 컨테이너화하여 관리 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IoT 및 엣지 컴퓨팅&lt;/strong&gt;: 저사양 하드웨어에서도 쿠버네티스 운영 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD 파이프라인 구성&lt;/strong&gt;: 가벼운 클러스터로 개발 및 테스트 환경 구축&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;4. 결론&lt;/h2&gt;
&lt;p&gt;K3s는 저사양 환경에서도 원활히 동작하는 경량 쿠버네티스로, 프라이빗 클라우드 구축 시 운영 부담을 줄이고 관리 효율성을 높일 수 있다. 특히 리소스가 제한적인 환경에서 컨테이너 오케스트레이션을 활용하려면 K3s가 강력한 대안이 될 수 있다.&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>컨테이너</category>
      <category>쿠버네티스</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/24</guid>
      <comments>https://sitos-dev.tistory.com/24#entry24comment</comments>
      <pubDate>Sat, 1 Feb 2025 15:27:24 +0900</pubDate>
    </item>
    <item>
      <title>[Redux] Cannot read properties of null (reading 'useContext')</title>
      <link>https://sitos-dev.tistory.com/23</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Redux 설정 시 &lt;code&gt;store.js&lt;/code&gt;에서 리듀서 추가 누락 오류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 프로젝트에서 Redux를 설정할 때, &lt;code&gt;store.js&lt;/code&gt; 파일에 &lt;code&gt;combineReducers&lt;/code&gt;로 리듀서를 추가하지 않으면 다음과 같은 오류가 발생한다. 이 오류는 React의 &lt;code&gt;useContext&lt;/code&gt; 훅을 사용하는 과정에서 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오류 메시지:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;Cannot read properties of null (reading 'useContext') &amp;amp;&amp;amp; react.development.js:209 Warning: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:

1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류는 Redux 설정 시 리듀서를 &lt;code&gt;combineReducers&lt;/code&gt;로 제대로 합치지 않았을 때 발생한다. 리듀서가 제대로 등록되지 않으면 &lt;code&gt;useContext&lt;/code&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;이 문제를 해결하려면 &lt;code&gt;store.js&lt;/code&gt;에서 리듀서를 &lt;code&gt;combineReducers&lt;/code&gt;로 정확하게 추가해야 한다. 리듀서를 올바르게 설정하면 오류가 해결된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// store.js

import { createStore, combineReducers } from 'redux';
import { providerReducer } from './reducers';

const rootReducer = combineReducers({
  provider: providerReducer,
  // 다른 리듀서들도 여기에 추가할 수 있다.
});

const store = createStore(rootReducer);

export default store;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;combineReducers&lt;/code&gt;에 리듀서를 추가하지 않으면 Redux가 상태를 제대로 관리할 수 없게 되고, 이로 인해 위와 같은 오류가 발생한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고 자료&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 해결 방법은 StackOverflow에서 확인할 수 있다:&lt;br /&gt;&lt;a href=&quot;https://stackoverflow.com/questions/74322410/how-to-fix-cannot-read-properties-of-null-reading-usecontext&quot;&gt;How to fix cannot read properties of null (reading 'useContext')?&lt;/a&gt;&lt;/p&gt;</description>
      <category>Software Development/Front-end</category>
      <category>React</category>
      <category>Redux</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/23</guid>
      <comments>https://sitos-dev.tistory.com/23#entry23comment</comments>
      <pubDate>Wed, 31 Jan 2024 16:03:53 +0900</pubDate>
    </item>
    <item>
      <title>WSL을 활용한 윈도우 개발 환경 설정 가이드</title>
      <link>https://sitos-dev.tistory.com/22</link>
      <description>&lt;h3&gt;WSL을 활용한 윈도우 개발 환경 설정 가이드&lt;/h3&gt;
&lt;p&gt;윈도우에서 WSL(Windows Subsystem for Linux)을 사용하면 리눅스 기반 개발 환경을 간편하게 구축할 수 있다. 이 가이드는 WSL 설치부터 Ubuntu에 nvm(Node Version Manager)을 활용해 Node.js LTS 버전을 설치하는 과정을 다룬다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;WSL 설치&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Powershell을 실행&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관리자 권한으로 Powershell을 실행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WSL 설치 명령어 실행&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;아래 명령어를 실행하여 WSL과 기본 배포판(Ubuntu)을 설치한다.&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  wsl --install&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;설치 완료 후 Ubuntu 설정&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;설치가 완료되면 Ubuntu가 자동으로 실행되고 초기 설정을 진행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;Ubuntu에 nvm을 사용해 Node.js LTS 설치&lt;/h2&gt;
&lt;p&gt;Node.js는 JavaScript 런타임으로, 리눅스 환경에서도 널리 사용된다. nvm(Node Version Manager)은 Node.js의 다양한 버전을 쉽게 관리할 수 있는 도구이다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;nvm 설치&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;nvm을 설치하기 위해 다음 명령어를 실행한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;설치가 완료되면 다음 명령어로 nvm이 정상적으로 설치되었는지 확인한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  command -v nvm&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node.js LTS 설치&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;최신 LTS(Long-Term Support) 버전의 Node.js를 설치하려면 아래 명령어를 실행한다.&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  nvm install --lts&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node.js 및 npm 버전 확인&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;설치가 완료된 후, 다음 명령어로 Node.js와 npm 버전을 확인한다.&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  node --version
  npm --version&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;nvm을 사용하면 필요에 따라 다양한 버전의 Node.js를 설치하고 전환할 수 있으므로 개발 환경 관리가 편리해진다.&lt;/p&gt;</description>
      <category>Software Development</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/22</guid>
      <comments>https://sitos-dev.tistory.com/22#entry22comment</comments>
      <pubDate>Wed, 13 Sep 2023 10:38:10 +0900</pubDate>
    </item>
    <item>
      <title>Git  version 2.35.2 - 'git status' 에러 코드 128</title>
      <link>https://sitos-dev.tistory.com/21</link>
      <description>&lt;h4&gt;GIT 2.35.2 업데이트&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;WSL&lt;/strong&gt;(Windows Subsystem for Linux) 환경의 폴더를 &lt;strong&gt;SourceTree&lt;/strong&gt;로 열 때 발생하는 오류 메시지에 대해 다룬다. 이 오류는 윈도우에서 로그인 중인 유저와 WSL에서 해당 파일/폴더의 소유자가 다를 때 발생한다. &lt;code&gt;Git v2.35.2&lt;/code&gt; 이후에는 이를 보안상의 이유로 기본적으로 차단하며, 예외를 설정하여 폴더 접근을 허용해야 한다.&lt;/p&gt;
&lt;p&gt;이 문제를 해결하는 몇 가지 방법은 다음과 같다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;특정 WSL 폴더를 안전한 디렉토리로 설정&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL 폴더를 등록할 때, &lt;code&gt;//wsl$/Ubuntu-...&lt;/code&gt; 앞에 &lt;code&gt;%(prefix)/&lt;/code&gt;를 추가해야 한다.&lt;/li&gt;
&lt;li&gt;예시 명령어:&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  git config --global --add safe.directory &amp;#39;%(prefix)///wsl$/Ubuntu-20.04/home/ubuntu/airflow&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;모든 폴더를 안전한 디렉토리로 설정&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 폴더에 대해 &lt;code&gt;*&lt;/code&gt; 경로를 추가하여 설정할 수 있다.&lt;/li&gt;
&lt;li&gt;예시 명령어:&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  git config --global --add safe.directory &amp;#39;*&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;참고사항&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SourceTree는 WSL의 Git이 아니라 윈도우의 Git을 사용하기 때문에, 해당 명령어는 윈도우 터미널에서 입력해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;safe.directory&lt;/code&gt; 경로에 &lt;code&gt;/home/ubuntu/*&lt;/code&gt;, &lt;code&gt;/home/ubuntu/**&lt;/code&gt;과 같은 와일드카드 경로는 현재 지원되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위 방법을 적용하면, WSL에서 Git을 사용할 때 발생하는 &lt;code&gt;error: failed to get owner&lt;/code&gt;와 같은 오류를 해결할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRctOJ/btrzqyWYorb/HeW0dT9zzNKKx3ISKscjcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRctOJ/btrzqyWYorb/HeW0dT9zzNKKx3ISKscjcK/img.png&quot; data-alt=&quot;Git - 'git status' 에러 코드 128로 실패함: error: failed to get owner for '//wsl$/Ubuntu-...' fatal: unsafe repository&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRctOJ/btrzqyWYorb/HeW0dT9zzNKKx3ISKscjcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRctOJ%2FbtrzqyWYorb%2FHeW0dT9zzNKKx3ISKscjcK%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;410&quot; height=&quot;250&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Git - 'git status' 에러 코드 128로 실패함: error: failed to get owner for '//wsl$/Ubuntu-...' fatal: unsafe repository&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Software Development</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/21</guid>
      <comments>https://sitos-dev.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 15 Apr 2022 13:01:01 +0900</pubDate>
    </item>
    <item>
      <title>장고 서버에 https 적용하기 (Django + Gunicorn + Nginx + Let's Encrypt)</title>
      <link>https://sitos-dev.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;장고 프로젝트를 배포하여 http 서버에 연결하려면 중간 역할을 하는 WSGI(웹 서버 게이트웨이 인터페이스)가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 WSGI로는 Gunicorn과 uWSGI가 있는데 그 중에 Gunicorn을 사용해 보았습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Gunicorn 연동을 위한 장고 프로젝트 세팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;먼저 장고 프로젝트의 &lt;a href=&quot;http://settings.py&quot;&gt;settings.py&lt;/a&gt;에 STATIC_ROOT를 설정합니다.&lt;br /&gt;&lt;code&gt;STATIC_ROOT = os.path.join(BASE_DIR, 'static/')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;STATIC_ROOT에 모든 정적 파일을 모아놓습니다. 그래야 Nginx에서 포워딩을 설정하기 편합니다.&lt;br /&gt;&lt;code&gt;python manage.py collectstatic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;pip로 Gunicorn 설치 (Windows에서 실행은 지원하지 않으므로 Docker에 설치를 추천합니다.)&lt;br /&gt;&lt;code&gt;pip install gunicorn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Gunicorn은 윈도우에서는 실행이 안되지만 Docker로 테스트 가능합니다.&lt;br /&gt;참고 : &lt;a href=&quot;https://github.com/light-and-salt/django-gunicorn-nginx-docker&quot;&gt;https://github.com/light-and-salt/django-gunicorn-nginx-docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;아래 명령어 만으로도 8000 포트 서비스가 가능합니다.하지만 static 파일을 서비스하고 https 설정을 위해 nginx로 포팅해야 합니다&lt;br /&gt;&lt;code&gt;gunicorn --bind 0.0.0.0:8000 프로젝트명.wsgi:application&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;우분투에서 Gunicorn을 서비스 데몬으로 등록&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gunicorn 경로를 모를 경우 다음 명령어로 확인&lt;br /&gt;&lt;code&gt;which gunicorn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;vi /etc/systemd/system/gunicorn.service
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;[Unit]
Description=gunicorn daemon
After=network.target [Service]
User=유저명
Group=그룹명
WorkingDirectory=/프로젝트경로
ExecStart=/path/of/gunicorn \
--workers 3 \
--bind unix:/프로젝트경로/gunicorn.sock \
프로젝트명.wsgi:application
[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;서비스 활성 및 시작
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# service 파일을 처음 생성한 후 다시 수정했을 경우에만 실행
systemctl daemon-reload
# 서비스 활성
systemctl start gunicorn
systemctl enable gunicorn
# 서비스 시작
service gunicorn start&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Nginx를 Gunicorn으로 포워딩&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;vi /etc/nginx/sites-available/default
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;server {
    ...
    location /media {
        alias /프로젝트경로/media;
    }
    location /static {
        alias /프로젝트경로/static;
    }
    location / {
        ...
        proxy_pass http://unix:/프로젝트경로/gunicorn.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginx -t service nginx start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;링크) &lt;a href=&quot;https://twpower.github.io/44-set-free-https-by-using-letsencrypt&quot;&gt;[Nginx] Let's Encrypt를 통해 Nginx에서 무료로 https 설정하기(Ubuntu 14.04)&lt;/a&gt;&lt;/h2&gt;</description>
      <category>Software Development</category>
      <category>Django</category>
      <category>gunicorn</category>
      <category>HTTPS</category>
      <category>Let's encrypt</category>
      <category>nginx</category>
      <category>WSGI</category>
      <category>우분투</category>
      <category>장고</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/19</guid>
      <comments>https://sitos-dev.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 19 Apr 2020 03:46:55 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] MySQL Character Set을 UTF8로 설정하는 방법</title>
      <link>https://sitos-dev.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 기본 Character Set(인코딩)을 &lt;code&gt;UTF8&lt;/code&gt;로 변경하면 다국어 데이터 처리에 적합한 환경을 구성할 수 있다. 이를 위해 MySQL 설정 파일을 수정해야 한다. 아래는 설정 방법에 대한 가이드이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 설정 파일 수정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 설정 디렉토리로 이동&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL 설정 파일을 수정할 디렉토리로 이동한다.
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;  cd /etc/mysql/conf.d/&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;code&gt;charset.cnf&lt;/code&gt; 파일을 사용한다.
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;  sudo vi charset.cnf&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;&lt;code class=&quot;language-ini&quot;&gt;  [client]
  default-character-set = utf8mb4

  [mysql]
  default-character-set = utf8mb4

  [mysqld]
  skip-character-set-client-handshake
  init_connect=&quot;SET collation_connection = utf8mb4_unicode_ci&quot;
  init_connect=&quot;SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci&quot;
  character-set-server = utf8mb4
  collation-server = utf8mb4_unicode_ci

  [mysqldump]
  default-character-set = utf8mb4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 및 확인&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;MySQL 서비스 재시작
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 사항을 적용하려면 MySQL 서비스를 재시작해야 한다. 다음 명령어를 실행한다:
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;  sudo systemctl restart mysql&lt;/code&gt;&lt;/pre&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;MySQL 설정이 제대로 적용되었는지 확인하려면 MySQL 클라이언트에 접속하여 아래 명령어를 실행한다:
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;  SHOW VARIABLES LIKE 'character_set%';
  SHOW VARIABLES LIKE 'collation%';&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 통해 각 Character Set 및 Collation 값이 &lt;code&gt;utf8mb4&lt;/code&gt; 및 &lt;code&gt;utf8mb4_unicode_ci&lt;/code&gt;로 설정되었는지 확인할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 통해 MySQL의 기본 Character Set을 UTF8로 변경하여 다국어 데이터를 안전하게 처리할 수 있다.&lt;/p&gt;</description>
      <category>DevOps/Linux Server</category>
      <category>encoding</category>
      <category>MySQL</category>
      <category>utf8</category>
      <category>우분투</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/18</guid>
      <comments>https://sitos-dev.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 19 Apr 2020 02:55:00 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] APT 추천 패키지 자동 설치 해제하는 방법</title>
      <link>https://sitos-dev.tistory.com/17</link>
      <description>&lt;p&gt;&lt;code&gt;Ubuntu 20.04 LTS&lt;/code&gt; 이전의 우분투에 패키지를 설치할 때 추천 패키지 및 제안 패키지가 자동으로 설치되는 것을 방지하려면 APT의 설정을 변경해야 한다. 이를 통해 설치할 패키지의 의존성만 설치되게 할 수 있다. 아래는 이를 설정하는 방법이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. APT 설정 파일 편집&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;설정 파일 열기&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APT 설정 파일을 열기 위해 &lt;code&gt;vi&lt;/code&gt; 또는 원하는 텍스트 편집기를 사용한다. 여기서는 &lt;code&gt;99no-install-recommends&lt;/code&gt; 파일을 편집한다.&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  sudo vi /etc/apt/apt.conf.d/99no-install-recommends&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;다음 내용 추가&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일에 아래 내용을 추가하여 추천 패키지 및 제안 패키지의 자동 설치를 방지한다:&lt;pre&gt;&lt;code&gt;  APT::Install-Recommends &amp;quot;false&amp;quot;;
  APT::Install-Suggests &amp;quot;false&amp;quot;;
  APT::AutoRemove::RecommendsImportant &amp;quot;false&amp;quot;;
  APT::AutoRemove::SuggestsImportant &amp;quot;false&amp;quot;;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;2. APT 패키지 설치 시 추천 패키지 설치 방지&lt;/h2&gt;
&lt;p&gt;위 설정을 적용하면, 이후 APT를 통해 패키지를 설치할 때 추천 패키지 및 제안 패키지가 자동으로 설치되지 않는다. 기존에 설치된 패키지에서 자동 설치된 추천 패키지를 제거하려면 &lt;code&gt;apt autoremove&lt;/code&gt; 명령어를 사용할 수 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt autoremove&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 설정은 시스템을 더욱 깔끔하게 유지하고, 필요 없는 패키지가 설치되는 것을 방지하는 데 유용하다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;위와 같은 설정을 통해 우분투에서 불필요한 추천 패키지나 제안 패키지의 자동 설치를 차단할 수 있다. &lt;/p&gt;</description>
      <category>DevOps/Linux Server</category>
      <category>Linux</category>
      <category>리눅스</category>
      <category>우분투</category>
      <author>es6.kr</author>
      <guid isPermaLink="true">https://sitos-dev.tistory.com/17</guid>
      <comments>https://sitos-dev.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 19 Apr 2020 02:31:51 +0900</pubDate>
    </item>
  </channel>
</rss>