<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>짱구의 삽질 블로그</title>
    <link>https://may9noy.tistory.com/</link>
    <description>Do my best Everyday, Enjoy every moment.</description>
    <language>ko</language>
    <pubDate>Mon, 8 Jun 2026 18:46:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>짱구네</managingEditor>
    <image>
      <title>짱구의 삽질 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/4331033/attach/ddff45efbcee42a9b95523156ae8bfca</url>
      <link>https://may9noy.tistory.com</link>
    </image>
    <item>
      <title>CloudStorage에 Application 파일 저장</title>
      <link>https://may9noy.tistory.com/2490</link>
      <description>&lt;h1 data-path-to-node=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;☁️ Google Cloud Storage (GCS) 활용 가이드&lt;/span&gt;&lt;/h1&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;효율적인 파일 관리를 위해 실제 파일은 GCS에 저장하고, 데이터베이스(DB)에는 해당 파일의 **경로(URL)**만 기록하는 방식을 권장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1. GCS 선택 이유&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;무제한 용량 &amp;amp; 저렴한 비용&lt;/b&gt;: 대용량 파일 저장에 최적화되어 있으며 확장성이 뛰어납니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;Cloud Run 통합&lt;/b&gt;: Google Cloud 생태계 내에서 인증 및 접근 관리가 용이합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;정적 파일 서빙&lt;/b&gt;: 업로드된 파일을 사용자가 즉시 확인할 수 있도록 고유 URL 제공이 편리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2. 권장 저장소 구조 (Directory Structure)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;기능(Domain)별로 최상위 폴더를 나누고 하위에 식별자(ID)를 두어 관리하는 것이 효율적입니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;9&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;최상위 폴더&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;하위 구조&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,1,0,0&quot;&gt;users/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;{user_id}/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,1,2,0&quot;&gt;사용자 프로필, 개인 사진첩&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,2,0,0&quot;&gt;community/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,2,1,0&quot;&gt;{post_id}/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,2,2,0&quot;&gt;커뮤니티 게시글 이미지 및 첨부 파일&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,3,0,0&quot;&gt;chat/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,3,1,0&quot;&gt;{room_id}/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot; data-path-to-node=&quot;9,3,2,0&quot;&gt;채팅방 공유 파일&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;10,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0&quot;&gt;  Tip:&lt;/b&gt; 파일명은 중복 및 충돌 방지를 위해 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;10,0&quot;&gt;UUID&lt;/b&gt;를 사용하여 저장하는 것을 권장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3. 구현을 위한 필수 준비물&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;GCS 연동을 위해 다음 세 가지 정보가 미리 준비되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;GCP Project ID&lt;/b&gt;: 구글 클라우드 프로젝트 고유 ID&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;GCS Bucket Name&lt;/b&gt;: 파일을 저장할 버킷 이름 (GCP 콘솔에서 사전 생성 필요)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;Service Account Key (JSON)&lt;/b&gt;: GCS 접근 권한이 부여된 서비스 계정의 인증 키 파일&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;4. 개발 환경 설정 (Java/Spring 기준)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;정보가 준비되면 pom.xml에 아래 의존성을 추가하여 업로드 로직 구현을 시작할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjwhcfXgNWRAxUAAAAAHQAAAAAQggE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.cloud&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;google-cloud-storage&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  GCP 서비스 계정 키 관리 가이드&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;보안과 운영 효율성을 위해 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;3&quot;&gt;개발 환경&lt;/b&gt;과 **운영 환경(Cloud Run)**을 분리하여 관리하는 것이 핵심입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1. 로컬 개발 환경 (Local Development)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;저장 위치&lt;/b&gt;: src/main/resources/ 폴더 내부&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;주의 사항&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0,0&quot;&gt;.gitignore에 반드시 추가&lt;/b&gt;: 키 파일이 GitHub 등 공용 저장소에 업로드되지 않도록 설정해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;파일명 예시: gcp-key.json&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2. 배포 및 운영 환경 (Cloud Run)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;저장 위치&lt;/b&gt;: &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;7,0,0&quot;&gt;GCP Secret Manager&lt;/b&gt; (권장)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;관리 방식&lt;/b&gt;:&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Secret Manager에 JSON 키 내용을 값(Value)으로 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Cloud Run 설정에서 해당 시크릿을 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;7,1,1,1,0&quot;&gt;환경 변수&lt;/b&gt;나 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;7,1,1,1,0&quot;&gt;볼륨 마운트&lt;/b&gt; 방식으로 주입합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;파일 자체를 빌드 아티팩트(Docker 이미지 등)에 포함하는 것은 보안상 절대 금지됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3. 유연한 설정을 위한 application.yml 활용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;환경에 따라 경로를 다르게 인식할 수 있도록 설정 파일에 변수를 사용하세요.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiwm6PWhNWRAxUAAAAAHQAAAAAQLg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;YAML&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;spring:
  cloud:
    gcp:
      storage:
        credentials:
          location: ${GCP_KEY_PATH:classpath:gcp-key.json}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;로컬&lt;/b&gt;: 기본값인 classpath:gcp-key.json을 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;운영&lt;/b&gt;: 환경 변수 GCP_KEY_PATH를 통해 Secret Manager가 마운트된 경로를 주입합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>GCP Build (Firebasse, Cloudrun, SQL)</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2490</guid>
      <comments>https://may9noy.tistory.com/2490#entry2490comment</comments>
      <pubDate>Wed, 24 Dec 2025 23:57:33 +0900</pubDate>
    </item>
    <item>
      <title>FireBase 호스팅 방법</title>
      <link>https://may9noy.tistory.com/2489</link>
      <description>&lt;h1 data-path-to-node=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  Vue 프로젝트 Firebase Hosting 배포 가이드&lt;/span&gt;&lt;/h1&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Vue 프로젝트(Vite 기반)를 Firebase에 배포하기 위한 4단계 요약 가이드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  전제 조건&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://console.firebase.google.com/&quot; data-ved=&quot;0CAAQ_4QMahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQSQ&quot; data-hveid=&quot;0&quot;&gt;Firebase 콘솔&lt;/a&gt;에서 새 프로젝트가 생성되어 있어야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;터미널의 경로는 반드시 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;5,1,0&quot;&gt;Vue 프로젝트 루트 폴더&lt;/b&gt;여야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1단계: 도구 설치 및 로그인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Firebase CLI를 설치하고 본인의 계정으로 로그인합니다. (이미 완료했다면 생략 가능)&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQSg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# Firebase 도구 설치
npm install -g firebase-tools

# Firebase 계정 로그인
firebase login
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2단계: 프로젝트 초기 설정 (최초 1회)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;프로젝트와 Firebase를 연결하고 호스팅 설정을 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQSw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;firebase init hosting
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;  설정 질문 답변 가이드:&lt;/b&gt; | 질문 내용 | 답변 / 선택 | | :--- | :--- | | &lt;b data-index-in-node=&quot;55&quot; data-path-to-node=&quot;13&quot;&gt;Please select an option&lt;/b&gt; | Use an existing project 선택 후 생성한 프로젝트 선택 | | &lt;b data-index-in-node=&quot;126&quot; data-path-to-node=&quot;13&quot;&gt;What do you want to use as your public directory?&lt;/b&gt; | dist 입력 (Vite 기본 빌드 폴더) | | &lt;b data-index-in-node=&quot;206&quot; data-path-to-node=&quot;13&quot;&gt;Configure as a single-page app (SPA)?&lt;/b&gt; | y (라우팅 처리를 위해 필수) | | &lt;b data-index-in-node=&quot;268&quot; data-path-to-node=&quot;13&quot;&gt;Set up automatic builds and deploys with GitHub?&lt;/b&gt; | n (수동 배포 설정) |&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3단계: 프로젝트 빌드&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;작성한 코드를 배포용 파일로 변환합니다. 실행 후 dist 폴더가 생성되었는지 확인하세요.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQTA&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;4단계: 배포 실행&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;빌드된 파일을 Firebase 서버로 업로드합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQTQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;firebase deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;✅ 배포 완료&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;배포가 성공적으로 끝나면 터미널에 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;22&quot;&gt;Hosting URL&lt;/b&gt;이 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;23&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;23,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0&quot;&gt;Hosting URL:&lt;/b&gt; &lt;a style=&quot;color: #000000;&quot; href=&quot;https://your-project-id.web.app&quot;&gt;https://your-project-id.web.app&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;해당 주소로 접속하여 결과물을 확인하세요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  Firebase 계정 전환 및 재로그인&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;기존 계정에서 로그아웃하고 새로운 계정으로 접속해야 하거나, 인증 세션이 만료되었을 때 아래 단계를 수행하세요.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1. 로그아웃 (Logout)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;현재 로그인된 Firebase 계정 세션을 종료합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQZw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;firebase logout
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2. 다시 로그인 (Login)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;새로운 계정 또는 기존 계정으로 다시 인증을 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwjwhcfXgNWRAxUAAAAAHQAAAAAQaA&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;firebase login
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;  로그인 진행 방법:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;위 명령어를 입력하면 자동으로 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;11,0,0&quot;&gt;웹 브라우저&lt;/b&gt;가 열립니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;사용하고자 하는 &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Google 계정을 선택&lt;/b&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Firebase CLI의 접근 권한 요청 화면에서 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;11,2,0&quot;&gt;[허용]&lt;/b&gt; 버튼을 클릭합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;터미널에 Success! Logged in as [이메일주소] 문구가 나오면 완료됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;12&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;추가 팁:&lt;/b&gt; 현재 어떤 계정으로 로그인되어 있는지 확인하고 싶다면 firebase login:list 명령어를 사용해 보세요.&lt;/span&gt;&lt;/p&gt;</description>
      <category>GCP Build (Firebasse, Cloudrun, SQL)</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2489</guid>
      <comments>https://may9noy.tistory.com/2489#entry2489comment</comments>
      <pubDate>Wed, 24 Dec 2025 23:51:23 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 (self)</title>
      <link>https://may9noy.tistory.com/2450</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;개별 메시지&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;생성 시간:&lt;/b&gt; 01:12:35&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  AI 어시스턴트&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Python에서 &lt;code&gt;self&lt;/code&gt;는 주로 클래스 내의 메소드에서 인스턴스(객체) 자신을 참조하기 위해 사용됩니다. 특히, 클래스 메서드나 인스턴스 메소드에서 첫 번째 매개변수로 일반적으로 지정되며, 이 매개변수를 통해 해당 메소드가 어떤 객체에 대한 것인지 알 수 있습니다. 예를 들어:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class Person:
    def __init__(self, name):
        self.name = name  # 인스턴스 생성 시 name 속성을 설정

    def greet(self):
        print(f&quot;Hello, {self.name}!&quot;)  # self는 현재 인스턴스(Person 객체)를 가리킴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;여기서 &lt;code&gt;self&lt;/code&gt;는 각 &lt;code&gt;Person&lt;/code&gt; 객체의 인스턴스를 나타내며, 메소드 호출 시마다 해당 객체의 상태에 따라 동작합니다. 예를 들어, &lt;code&gt;person = Person(&quot;Alice&quot;)&lt;/code&gt;로 객체를 생성한 후 &lt;code&gt;person.greet()&lt;/code&gt;를 호출하면 &lt;code&gt;&quot;Hello, Alice!&quot;&lt;/code&gt;가 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;AI 모델 정보&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;모델: exaone3.5:2.4b-instruct-q4_K_M&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;모델 타입: fast&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;설명: ⚡ 초고속 응답 (1.6GB, Q4_K_M)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;답변 방식: RAG 기반&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;RAG 모드: LangChain RAG&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;i&gt;이 답변이 도움이 되었나요? 추가로 궁금한 점이 있으시면 언제든지 말씀해 주세요!&lt;/i&gt;&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;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;i&gt;자체개발한 private slm의 출력 결과물 입니다.&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&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;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 끝 -&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 기초문법</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2450</guid>
      <comments>https://may9noy.tistory.com/2450#entry2450comment</comments>
      <pubDate>Wed, 8 Oct 2025 01:16:19 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 self</title>
      <link>https://may9noy.tistory.com/2449</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;# 파이썬 self에 대해서 알아보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;코드 요소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;파이썬 코드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;역할&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;클래스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;class Car:&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;자동차의 &lt;b&gt;설계도&lt;/b&gt;를 정의합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;인스턴스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;my_car = Car('Red')&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;빨간색&lt;/b&gt; 자동차라는 &lt;b&gt;실체&lt;/b&gt;를 메모리에 만듭니다. (데이터)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;메서드 (함수)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;def start(self): ...&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;자동차가 &lt;b&gt;시동을 거는&lt;/b&gt; &lt;b&gt;행동&lt;/b&gt;을 정의합니다. (기능/로직)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;메서드 호출&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;my_car.start()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;**빨간색 자동차(인스턴스)**에게 &lt;b&gt;시동을 걸도록&lt;/b&gt; 명령합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;예시)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;class Dog:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;# 생성자 메서드: 인스턴스가 생성될 때 호출되며, self를 통해 이름 속성을 초기화&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;def&amp;nbsp;&lt;b&gt;init&lt;/b&gt;(self, name):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;self.name = name # self.name: 이 인스턴스의 고유한 속성(변수)&lt;/span&gt;&lt;/p&gt;
&lt;pre style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;# 인스턴스 메서드 1
def bark(self):
    print(f&quot;{self.name}이(가) 멍멍!&quot;) # self를 통해 인스턴스 변수 name에 접근

# 인스턴스 메서드 2
def greeting(self):
    print(&quot;안녕!&quot;)
    self.bark() # self를 통해 같은 클래스 내의 다른 메서드(bark)에 접근&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;인스턴스 생성&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;my_dog = Dog(&quot;바둑이&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;메서드 호출&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;my_dog.greeting()&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;출력:&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;안녕!&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;바둑이이(가) 멍멍!&lt;/span&gt;&lt;/h4&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;즉, 예시 코드에서 볼 수 있듯이, $\mathbf{self}$를 사용하면 해당 인스턴스에 속한 다른 메서드(함수)들을 자유자재로 호출할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;self.메서드명()&lt;/span&gt; 형태로 다른 메서드를 호출하는 것은 객체 지향 프로그래밍에서 핵심적인 패턴입니다.&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 기초문법</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2449</guid>
      <comments>https://may9noy.tistory.com/2449#entry2449comment</comments>
      <pubDate>Mon, 6 Oct 2025 01:24:25 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 문법 (return type) -&amp;gt; str</title>
      <link>https://may9noy.tistory.com/2448</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;# 파이썬 문법 -&amp;gt; str&lt;/b&gt;&lt;/span&gt;&lt;/h4&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;code&gt;-&amp;gt; str&lt;/code&gt;은 함수의 반환값 타입을 나타내는 타입 힌트(annotaion)입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;파이썬에서는 실행 시 강제되지는 않으며, IDE, 정적 검사기(mypy/pyright)나 코드 가독성을 위해 사용됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;매개변수의 &lt;code&gt;text: str&lt;/code&gt;도 같은 원리로 파라미터 타입을 표기한 예입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;python
def greet(name: str) -&amp;gt; str:
    return f&quot;Hello, {name}&quot;&lt;/code&gt;&lt;/pre&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 기초문법</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2448</guid>
      <comments>https://may9noy.tistory.com/2448#entry2448comment</comments>
      <pubDate>Sun, 5 Oct 2025 23:52:50 +0900</pubDate>
    </item>
    <item>
      <title>golang 기본 예시 코드</title>
      <link>https://may9noy.tistory.com/2437</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;개별 메시지&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;생성 시간:&lt;/b&gt; 22:58:50&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  AI 어시스턴트&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Golang 기본 코드 예시&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Golang의 기본적인 코드 예시들을 한국어로 설명해 드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1. 변수 선언 및 출력&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;// 프로그램 시작 부분에 패키지 이름 지정 (main 패키지)
package main

// fmt 라이브러리 사용 (출력 함수)
import &quot;fmt&quot;

func main() { // main 함수는 프로그램 실행의 시작점입니다.
    // 문자열 변수 'name'과 정수 변수 'age' 선언 및 값 할당
    name := &quot;알렉스&quot; // 이름은 문자열로 저장됩니다.
    age := 25         // 나이는 정수로 저장됩니다.

    // fmt 라이브러리를 이용해 출력문 실행
    fmt.Printf(&quot;안녕하세요, 제 이름은 %s이고 나이는 %d세입니다.\n&quot;, name, age)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 위 코드는 간단한 프로그램으로, 사용자 이름과 나이를 입력받아 &quot;안녕하세요&quot;와 함께 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2. 함수 정의 및 호출&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package main

import &quot;fmt&quot; // 출력을 위한 fmt 라이브러리 사용

// greet 함수 정의: 이름을 인자로 받아 인사 출력
func greet(name string) {
    fmt.Printf(&quot;안녕하세요, %s!\n&quot;, name)
}

func main() { // 프로그램 실행 시작점
    // greet 함수 호출: &quot;밥&quot;이라는 이름으로 호출
    greet(&quot;밥&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 이 코드는 &lt;code&gt;greet&lt;/code&gt;라는 이름의 함수를 정의하고, 이를 &lt;code&gt;main&lt;/code&gt; 함수에서 호출하여 &quot;안녕하세요, 밥!&quot;을 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3. 반복문 (for 루프)&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package main

import &quot;fmt&quot; // 출력을 위한 fmt 라이브러리 사용

func main() {
    // 숫자 0부터 시작해서 4까지 증가하며 반복
    for i := 0; i &amp;lt;= 4; i++ {
        fmt.Println(i) // 각 숫자를 출력합니다.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 이 코드는 &lt;code&gt;for&lt;/code&gt; 루프를 사용하여 숫자 0부터 4까지 순차적으로 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;4. 조건문 (if 문)&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package main

import &quot;fmt&quot; // 출력을 위한 fmt 라이브러리 사용

func main() {
    // 나이 변수에 값 할당
    age := 20

    // 나이가 18 이상이면 성인으로 판단하고 메시지 출력
    if age &amp;gt;= 18 {
        fmt.Println(&quot;성인입니다.&quot;) // 조건 참일 때 실행됩니다.
    } else {
        fmt.Println(&quot;미성년자입니다.&quot;) // 조건 거짓일 때 실행됩니다.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 이 코드는 사용자의 나이를 확인하고, 나이가 18세 이상이면 성인으로, 그렇지 않으면 미성년자로 판단하여 메시지를 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;5. 배열 및 슬라이스 사용&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package main

import &quot;fmt&quot; // 출력을 위한 fmt 라이브러리 사용

func main() {
    // 정수 배열 선언 및 초기화 (numbers)
    numbers := []int{1, 2, 3, 4, 5}

    // 배열 요소 출력
    fmt.Println(&quot;배열 요소:&quot;)
    for _, num := range numbers { // 각 요소에 대해 반복문 실행
        fmt.Printf(&quot;%d &quot;, num) // 숫자를 공백과 함께 출력합니다.
    }
    fmt.Println() // 줄바꿈

    // 슬라이스 선언 및 초기화 (slice)
    slice := numbers[:3] // 첫 3개 요소만 가져옴
    fmt.Println(&quot;슬라이싱된 요소:&quot;)
    for _, num := range slice { // 슬라이스의 요소에 대해 반복문 실행
        fmt.Printf(&quot;%d &quot;, num) // 숫자를 공백과 함께 출력합니다.
    }
    fmt.Println() // 줄바꿈
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 이 코드는 정수 배열을 선언하고 출력하며, 그 중 일부 요소만 포함하는 슬라이스를 생성하여 출력하는 방법을 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;6. 구조체와 포인터 사용&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package main

import &quot;fmt&quot; // 출력을 위한 fmt 라이브러리 사용

// Person 구조체 정의: 이름과 나이를 저장할 수 있는 타입
type Person struct {
    Name string
    Age  int
}

func main() {
    // Person 구조체 변수 선언 및 초기화
    person := Person{Name: &quot;찰리&quot;, Age: 28}

    // 구조체 정보 출력
    fmt.Printf(&quot;이름: %s, 나이: %d\n&quot;, person.Name, person.Age)

    // 포인터 생성 및 사용 예시
    var ptr *Person = &amp;amp;person // 포인터로 person의 주소 저장
    fmt.Printf(&quot;이름 포인터: %s, 나이 포인터: %d\n&quot;, ptr.Name, ptr.Age)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 이 코드는 구조체를 이용해 사람 정보를 저장하고, 포인터를 사용하여 해당 구조체의 데이터에 접근하는 방법을 보여줍니다.&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;color: #ee2323; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&quot;이 내용은 자체 개발한 private slm 에서 추출한 내용 입니다.&quot;&lt;/b&gt;&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>Golang/ExampleCode</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2437</guid>
      <comments>https://may9noy.tistory.com/2437#entry2437comment</comments>
      <pubDate>Thu, 18 Sep 2025 23:14:33 +0900</pubDate>
    </item>
    <item>
      <title>Rust의 장점과 단점</title>
      <link>https://may9noy.tistory.com/2436</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;개별 메시지&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;생성 시간:&lt;/b&gt; 22:10:38&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  AI 어시스턴트&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust는 현대 시스템 프로그래밍 언어로, 특히 안전성과 성능 측면에서 독특한 장점을 가지고 있습니다. 그러나 동시에 몇 가지 제약 사항도 존재합니다. 다음은 Rust의 주요 장점과 단점입니다:&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;장점&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;컴파일 타임 메모리 안전성&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust은 메모리 오류(예: 널 포인터 사용, 이중 해제 등)를 컴파일 시점에 잡아냅니다. 이는 런타임 오류로 이어지지 않게 설계되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;성능&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust은 C나 C++과 같은 고성능 언어와 경쟁할 수 있는 성능을 제공합니다. 특히 시스템 프로그래밍이나 성능 집약적인 애플리케이션에서 강점을 보입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;멀티패러다임&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;함수형 프로그래밍 스타일과 객체 지향 프로그래밍 스타일을 모두 지원하여 개발자가 다양한 프로그래밍 패러다임을 자유롭게 선택하고 조합할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;강력한 타입 시스템&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;강력한 정적 타입 시스템은 컴파일 시점에 많은 오류를 잡아낼 수 있어 코드의 안정성을 크게 향상시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;커뮤니티와 생태계&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;활발한 커뮤니티와 다양한 라이브러리 및 프레임워크가 존재하여 개발 과정에서 많은 지원을 받을 수 있습니다. 특히 시스템 프로그래밍과 웹 애플리케이션 분야에서 풍부한 자원이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;단점&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;학습 곡선&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust의 강력한 타입 시스템과 새로운 개념들(예: 소유권 모델, 라이프타임 등) 때문에 초보자에게는 학습 곡선이 가파르게 느껴질 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;문서화와 자료 부족&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust의 문서화 수준은 C나 Java에 비해 상대적으로 낮을 수 있으며, 특히 초보자에게 필요한 기본적인 정보가 부족할 수 있습니다. 그러나 최근에는 이 부분이 점차 개선되고 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;라이브러리와 생태계의 미성숙&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust의 생태계는 빠르게 성장하고 있지만, 아직 C나 Java와 같은 언어의 광범위한 라이브러리와 비교하면 다소 제한적일 수 있습니다. 특히 특정 분야에서는 더 많은 노력이 필요할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;컴파일 시간&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust 코드의 컴파일 시간이 상대적으로 길 수 있습니다. 이는 대규모 프로젝트에서는 부담이 될 수 있으나, 최적화 기법을 사용하면 개선 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;요약&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust은 안전성과 성능 측면에서 뛰어난 언어로, 특히 시스템 프로그래밍이나 고성능 애플리케이션 개발에 적합합니다. 그러나 초보자에게는 학습 곡선이 가파르고 문서화가 미흡할 수 있다는 점을 고려해야 합니다. 그럼에도 불구하고 Rust의 잠재력과 커뮤니티 지원 덕분에 많은 개발자들이 이 언어를 선택하고 있습니다.&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #ee2323;&quot;&gt;&quot;자체 개발한 private slm으로 추출한 내용입니다.&quot;&lt;/span&gt;&lt;/b&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>Rust/ExampleCode</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2436</guid>
      <comments>https://may9noy.tistory.com/2436#entry2436comment</comments>
      <pubDate>Thu, 18 Sep 2025 22:13:41 +0900</pubDate>
    </item>
    <item>
      <title>Layered Architecture &amp;amp; MVC Pattern 기반의 채팅 애플리케이션 (서버&amp;amp;클라이언트)</title>
      <link>https://may9noy.tistory.com/2435</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;개별 메시지&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;생성 시간:&lt;/b&gt; 22:03:14&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  AI 어시스턴트&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;채팅 애플리케이션 구조 제안 (Layered Architecture &amp;amp; MVC 기반)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Layered 아키텍처와 MVC 패턴을 활용하여 서버 클라이언트 구조의 채팅 애플리케이션을 만드는 방법을 한국어로 설명드리겠습니다. 기본적인 구조와 코드 예시를 포함하여 이해하기 쉽게 안내하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;아키텍처 개요&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;모델 레이어 (Model Layer)&lt;/b&gt;: 데이터 관리와 비즈니스 로직을 담당합니다. 주로 사용자 메시지의 저장 및 처리를 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;뷰 레이어 (View Layer)&lt;/b&gt;: 사용자 인터페이스를 구현합니다. 여기서는 콘솔 기반 UI를 예시로 사용하겠습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;컨트롤러 레이어 (Controller Layer)&lt;/b&gt;: 사용자 입력을 받아 모델과 뷰 사이에서 중개 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;코드 예시 구조&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1. 모델 레이어 (&lt;code&gt;models/chat_model.rs&lt;/code&gt;)&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;// models/chat_model.rs
pub struct ChatRoom {
    messages: Vec&amp;lt;String&amp;gt;, // 메시지 저장 공간
}

impl ChatRoom {
    pub fn new() -&amp;gt; Self {
        ChatRoom { messages: Vec::new() } // 초기화 함수
    }

    pub fn send_message(&amp;amp;mut self, message: String) {
        self.messages.push(message); // 메시지 추가 및 출력
        println!(&quot;Message sent: {}&quot;, message);
    }

    pub fn get_messages(&amp;amp;self) -&amp;gt; &amp;amp;Vec&amp;lt;String&amp;gt; { // 메시지 목록 반환
        &amp;amp;self.messages
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2. 뷰 레이어 (&lt;code&gt;views/console_view.rs&lt;/code&gt;)&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;// views/console_view.rs
use crate::models::ChatRoom;

pub struct ConsoleView {
    chat_room: ChatRoom, // 모델 참조
}

impl ConsoleView {
    pub fn new() -&amp;gt; Self {
        ConsoleView { chat_room: ChatRoom::new() } // 초기화 함수 호출
    }

    pub fn display_messages(&amp;amp;self) {
        println!(&quot;현재 메시지 목록:&quot;);
        for msg in self.chat_room.get_messages() { // 메시지 표시
            println!(&quot;{}&quot;, msg);
        }
    }

    pub fn receive_input(&amp;amp;mut self) -&amp;gt; String { // 사용자 입력 받기
        print!(&quot;메시지를 입력하세요: &quot;);
        std::io::stdout().flush(); // 입력 대기
        let mut input = String::new();
        std::io::stdin().read_line(&amp;amp;mut input).expect(&quot;입력 실패&quot;); // 입력 받기 및 공백 제거
        input.trim().to_string() // 공백 제거 후 반환
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3. 컨트롤러 레이어 (&lt;code&gt;controllers/chat_controller.rs&lt;/code&gt;)&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;// controllers/chat_controller.rs
use crate::models::ChatRoom;
use crate::views::ConsoleView;

pub struct ChatController {
    view: ConsoleView, // 뷰 참조
}

impl ChatController {
    pub fn new() -&amp;gt; Self {
        ChatController { view: ConsoleView::new() } // 초기화 함수 호출
    }

    pub fn handle_input(&amp;amp;mut self) {
        loop {
            self.view.display_messages(); // 메시지 표시
            let message = self.view.receive_input(); // 사용자 입력 받기
            self.view.chat_room.send_message(message); // 메시지 전송
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;실행 예시 (&lt;code&gt;main.rs&lt;/code&gt;)&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;// main.rs
mod models;
mod views;
mod controllers;

use models::ChatRoom;
use views::ConsoleView;
use controllers::ChatController;

fn main() {
    let controller = ChatController::new(); // 컨트롤러 생성
    controller.handle_input(); // 입력 처리 시작
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;설명&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;모델 레이어&lt;/b&gt;: &lt;code&gt;ChatRoom&lt;/code&gt;은 메시지를 저장하고 전송하는 기능을 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;뷰 레이어&lt;/b&gt;: &lt;code&gt;ConsoleView&lt;/code&gt;는 콘솔 기반 인터페이스를 통해 메시지를 표시하고 사용자 입력을 받습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;컨트롤러 레이어&lt;/b&gt;: &lt;code&gt;ChatController&lt;/code&gt;는 사용자 입력을 처리하고 모델과 뷰 사이에서 메시지 전송을 중개합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이 구조는 간단한 채팅 애플리케이션의 기본 틀을 제공하며, 실제 구현 시에는 더 많은 기능 추가 (예: 사용자 인증, 메시지 필터링 등)와 함께 오류 처리 및 보안 고려사항이 필요할 것입니다. Rust의 타입 안전성과 강력한 기능 덕분에 이러한 복잡성을 효과적으로 관리할 수 있습니다.&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;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;자체 개발한 private slm으로 추출한 내용입니다.&quot;&lt;/span&gt;&lt;/b&gt;&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>Rust/ExampleCode</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2435</guid>
      <comments>https://may9noy.tistory.com/2435#entry2435comment</comments>
      <pubDate>Thu, 18 Sep 2025 22:07:55 +0900</pubDate>
    </item>
    <item>
      <title>Rust 채팅 예제 코드 (서버/클라이언트)</title>
      <link>https://may9noy.tistory.com/2434</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;개별 메시지&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;생성 시간:&lt;/b&gt; 21:56:36&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;  AI 어시스턴트&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Rust 채팅 프로그램 서버 및 클라이언트 구현 안내&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;목표&lt;/b&gt;: 서버와 클라이언트 간의 간단한 텍스트 채팅 프로그램을 Rust로 구축합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이 구현은 TCP 소켓 프로그래밍을 기반으로 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;서버 구현 (Server)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;서버는 특정 주소에서 클라이언트 연결을 수락하고, 수신된 메시지를 모든 연결된 클라이언트에게 전송하는 역할을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;코드 예시:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
use std::sync::mpsc::{self, Receiver}; // 메시지 브로드캐스트 채널 사용
use std::thread; // 비동기 처리를 위한 스레드 활용
use std::collections::HashMap; // 클라이언트 관리용 해시맵

fn main() {
    // 서버 주소 설정 (예: localhost:8080)
    let addr = SocketAddr::from(IpAddr::V4(&quot;127.0.0.1&quot;.parse().unwrap(), 8080));

    println!(&quot;서버가 {}에서 시작합니다&quot;, addr);

    // 메시지 전송 채널 생성
    let (tx, rx) = mpsc::channel(); // 메시지 브로드캐스트 채널

    // 클라이언트 연결 수락 스레드 시작
    let handle = thread::spawn(move || {
        let mut listeners = Vec::new(); // 연결된 클라이언트 저장용 벡터
        loop {
            match std::net::TcpListener::bind(addr).unwrap() { // 클라이언트 연결 수락
                Ok((sock, _)) =&amp;gt; {
                    listeners.push(sock); // 연결된 소켓 추가
                    handle_client(sock, tx); // 각 클라이언트 처리 함수 호출
                }
                Err(e) =&amp;gt; {
                    eprintln!(&quot;클라이언트 연결 실패: {}&quot;, e);
                    drop(tx); // 채널 드롭하여 스레드 종료 시도
                    return;
                }
            }
        }
    });

    // 메시지 브로드캐스트 로직
    let mut clients = HashMap::new(); // 클라이언트 주소와 트랜잭션 매핑
    loop {
        match rx.recv() { // 메시지 수신
            Ok(msg) =&amp;gt; {
                println!(&quot;전송된 메시지: {}&quot;, msg);
                broadcast_message(&amp;amp;clients, msg); // 모든 클라이언트에게 브로드캐스트
            }
            Err(_) =&amp;gt; break, // 수신 채널 종료 시 루프 종료
        }
    }

    // 클라이언트 연결 종료 대기 (실제로는 무한 루프 내에서 처리됨)
    handle.join().expect(&quot;스레드 종료 실패&quot;);
}

fn handle_client(socket: std::net::TcpStream, tx: mpsc::Sender&amp;lt;String&amp;gt;) {
    let mut buffer = [0; 1024]; // 메시지 수신 버퍼
    loop {
        match socket.read(&amp;amp;mut buffer) {
            Ok(n) if n == 0 =&amp;gt; println!(&quot;클라이언트 연결 종료&quot;), break; // 연결 종료 시 루프 종료
            Ok(n) =&amp;gt; {
                let msg = String::from_utf8_lossy(&amp;amp;buffer[..n]).into_owned(); // 메시지 추출
                println!(&quot;받은 메시지: {}&quot;, msg); // 수신 메시지 출력
                tx.send(msg).expect(&quot;메시지 전송 실패&quot;); // 서버로 브로드캐스트 요청 전송
            }
            Err(e) =&amp;gt; println!(&quot;연결 오류: {}&quot;, e), break; // 오류 처리 및 종료
        }
    }
}

fn broadcast_message(clients: &amp;amp;HashMap&amp;lt;SocketAddr, mpsc::Receiver&amp;lt;String&amp;gt;&amp;gt;, msg: String) {
    for (_, rx) in clients.iter() {
        if let Err(_) = rx.send(msg).await { // 클라이언트에게 메시지 전송 시도
            println!(&quot;클라이언트 연결 종료&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;클라이언트 구현 (Client)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;클라이언트는 서버와 연결하여 메시지를 주고받습니다. 서버로부터 메시지를 수신하고, 필요할 때 서버에 브로드캐스트 요청을 보냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;코드 예시:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
use std::thread; // 비동기 처리를 위한 스레드 활용
use std::time::Duration;
use std::io::{self, Read}; // 입출력 처리
use std::sync::mpsc::Receiver; // 메시지 수신 채널 사용

fn main() {
    // 서버 주소 설정 (예: localhost:8080)
    let addr = &quot;127.0.0.1:8080&quot;.parse().unwrap();

    println!(&quot;서버 {}에 연결 중입니다&quot;, addr);

    // 소켓 생성 및 연결 시도
    let mut sock = match std::net::TcpStream::connect(addr) {
        Ok(sock) =&amp;gt; sock,
        Err(e) =&amp;gt; {
            eprintln!(&quot;연결 실패: {}&quot;, e);
            return;
        }
    };

    // 메시지 수신 및 전송 루프
    loop {
        let mut buffer = [0; 1024]; // 메시지 수신 버퍼
        match sock.read(&amp;amp;mut buffer) {
            Ok(n) if n == 0 =&amp;gt; println!(&quot;서버 연결 종료&quot;), break; // 연결 종료 시 루프 종료
            Ok(n) =&amp;gt; {
                let msg = String::from_utf8_lossy(&amp;amp;buffer[..n]).into_owned(); // 메시지 추출
                println!(&quot;받은 메시지: {}&quot;, msg); // 수신 메시지 출력
                if let Err(e) = sock.send_all(b&quot;BroadcastMessage\n&quot;) { // 서버에 브로드캐스트 요청 전송
                    eprintln!(&quot;메시지 전송 실패: {}&quot;, e);
                }
            }
            Err(e) =&amp;gt; println!(&quot;읽기 오류: {}&quot;, e), break; // 오류 처리 및 종료
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;설명 요약&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;서버&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;code&gt;SocketAddr&lt;/code&gt;를 통해 서버 주소를 설정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;code&gt;TcpListener&lt;/code&gt;을 사용해 클라이언트 연결을 수락하고, 각 클라이언트와의 통신은 별도 스레드에서 처리됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;code&gt;mpsc::channel&lt;/code&gt;을 이용해 메시지 브로드캐스트 채널을 생성하여 모든 연결된 클라이언트에게 메시지를 전송합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;클라이언트&lt;/b&gt;:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;서버 주소로 연결을 시도하고, 성공 시 메시지 수신 및 전송 루프를 실행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;수신한 메시지는 콘솔에 출력되며, 필요하면 서버에 브로드캐스트 요청을 보냅니다 (서버 구현에서 처리됨).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;주의사항&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;실제 환경에서는 보안 강화 (예: TLS 사용), 더 정교한 에러 핸들링, 그리고 성능 최적화를 고려해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;위 코드는 간단한 예시이므로 실제 사용 시에는 추가적인 기능과 안정성 향상이 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;자체 개발한 Private slm으로 추출한 내용입니다.&quot;&lt;/span&gt;&lt;/b&gt;&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>Rust/ExampleCode</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2434</guid>
      <comments>https://may9noy.tistory.com/2434#entry2434comment</comments>
      <pubDate>Thu, 18 Sep 2025 22:00:59 +0900</pubDate>
    </item>
    <item>
      <title>Key Management Project를 활용한 작업 정리</title>
      <link>https://may9noy.tistory.com/2414</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;# Key 관리 프로젝트를 활용한 키 관리 프로세스 만들기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;1. Key 관리 프로젝트 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Google Cloud Console&lt;/b&gt; 접속 &amp;rarr; &lt;code&gt;console.cloud.google.com&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;상단의 &lt;b&gt;프로젝트 선택기&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;새 프로젝트&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;프로젝트 정보 입력&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;프로젝트 이름: &lt;code&gt;key-management-project&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;조직: 해당 조직 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;위치: 적절한 폴더 선택&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;만들기&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;2. Secret Manager API 활성화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;생성된 키 관리 프로젝트로 전환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;탐색 메뉴&lt;/b&gt; &amp;rarr; &lt;b&gt;API 및 서비스&lt;/b&gt; &amp;rarr; &lt;b&gt;라이브러리&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&quot;Secret Manager API&quot; 검색&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Secret Manager API&lt;/b&gt; 선택 &amp;rarr; &lt;b&gt;사용&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3. Gemini API 키 발급&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;새 탭&lt;/b&gt;에서 &lt;code&gt;aistudio.google.com&lt;/code&gt; 접속&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;API 키 가져오기&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;새 API 키 만들기&lt;/b&gt; 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;키 관리 프로젝트 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;API 키 복사 (잘 보관)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;4. Secret Manager에 API 키 등록&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Cloud Console &amp;rarr; 보안 &amp;rarr; Secret Manager&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;시크릿 만들기&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;시크릿 설정&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이름: &lt;code&gt;gemini-api-key&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;시크릿 값: 복사한 Gemini API 키 붙여넣기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;리전: 필요시 선택&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;시크릿 만들기&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;5. 애플리케이션 프로젝트로 전환&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;프로젝트 선택기로 애플리케이션 프로젝트 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;IAM 및 관리&lt;/b&gt; &amp;rarr; &lt;b&gt;서비스 계정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;서비스 계정 만들기&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;서비스 계정 정보:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이름: &lt;code&gt;gemini-api-client&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;설명: &quot;Gemini API 액세스용&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;만들기 및 계속&lt;/b&gt; &amp;rarr; &lt;b&gt;완료&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;6. Cross-project IAM 권한 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;키 관리 프로젝트&lt;/b&gt;로 다시 전환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;IAM 및 관리&lt;/b&gt; &amp;rarr; &lt;b&gt;IAM&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;액세스 권한 부여&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;SecretManager에서 생성한 Secret Key 선택 후 권한 탭에서 애플리케이션 프로젝트에서 생성한 서비스 어카운트 등록&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;권한은 &quot;보안 비밀 관리자 보안 비밀 접근자&quot; 권한 부여&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;새 주 구성원 추가:&lt;/span&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;주 구성원: &lt;code&gt;gemini-api-client@[애플리케이션-프로젝트-ID].iam.gserviceaccount.com&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;역할: &lt;b&gt;Secret Manager Secret Accessor&lt;/b&gt; (&lt;code&gt;roles/secretmanager.secretAccessor&lt;/code&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;저장&lt;/b&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 끝.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 나머지는 추가적으로 해야할 내용들...&lt;/p&gt;
&lt;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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;7. 서비스 계정 키 파일 생성 (필요시)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;애플리케이션 프로젝트 &amp;rarr; &lt;b&gt;서비스 계정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;생성한 서비스 계정 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;키&lt;/b&gt; 탭 &amp;rarr; &lt;b&gt;키 추가&lt;/b&gt; &amp;rarr; &lt;b&gt;새 키 만들기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;JSON&lt;/b&gt; 선택 &amp;rarr; &lt;b&gt;만들기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;다운로드된 JSON 파일 안전하게 보관&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;8. 설정 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Secret Manager에서 권한 확인&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;키 관리 프로젝트 &amp;rarr; &lt;b&gt;Secret Manager&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;code&gt;gemini-api-key&lt;/code&gt; 시크릿 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;권한&lt;/b&gt; 탭에서 서비스 계정이 올바르게 추가되었는지 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이제 애플리케이션에서 서비스 계정을 사용해 Secret Manager의 Gemini API 키에 안전하게 액세스할 수 있다.&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 Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;- 끝 -&lt;/span&gt;&lt;/p&gt;</description>
      <category>최근 작업 정리</category>
      <author>짱구네</author>
      <guid isPermaLink="true">https://may9noy.tistory.com/2414</guid>
      <comments>https://may9noy.tistory.com/2414#entry2414comment</comments>
      <pubDate>Mon, 25 Aug 2025 23:17:05 +0900</pubDate>
    </item>
  </channel>
</rss>