<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>smithsolution (윤성웅)</title><link>http://blex.me/@smithsolution</link><description>cs 지식, tool사용(Jira,github,gitlab,bitbucket,Jenkins,Circle CI), 클라우드 관련 블로그</description><atom:link href="http://blex.me/rss/@smithsolution" rel="self"/><language>ko</language><lastBuildDate>Tue, 18 Mar 2025 06:21:51 +0900</lastBuildDate><image><url>/resources/media/images/avatar/e8/smithsolution/aW0k6.png</url><title>smithsolution (윤성웅)</title><link>http://blex.me/@smithsolution</link></image><item><title>Docker를 써서 Jenkins설치하기</title><link>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-jenkins%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link><description>&lt;p&gt;지난 시간까지는 웹앱 서버를 도커 위에서 띄워보는 작업을 진행해보았다. 이번에는 jenkins라는 애플리케이션을 도커 위에 띄워보려고 한다.&lt;/p&gt;
&lt;p&gt;우선, &lt;code&gt;~/workspace&lt;/code&gt; 경로 안에 jenkins_home이라는 폴더를 만들어주자!
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253186_bwibkJlhzxyVekbA65um.png" src="/resources/media/images/content/2025/3/18/20253186_bwibkJlhzxyVekbA65um.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;그러면 해당 폴더가 젠킨스 전용 데이터 저장소가 된다. 따라서 해당 경로를 jenkins가 접근할 수 있도록 UID값을 1000으로 고정시켜 준다.(아래 명령어를 붙여넣어주자!, 사용자이름이 다르면 바꿔주고!)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown -R 1000:1000 /home/admin2/jenkins_workspace
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래 명령어로, 도커 허브에서 이미지를 땡겨와 바로 컨테이너를 띄워보자!
(자세한 내용은 해당 &lt;a href="https://hub.docker.com/r/jenkins/jenkins"&gt;링크&lt;/a&gt;를 참고하자)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -d -p 8080:8080 -p 50000:50000 -v /home/admin2/jenkins_workspace:/var/jenkins_home --name jenkins jenkins/jenkins:lts 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253186_7WRhkDrKOGJsX0rpEzD3.png" src="/resources/media/images/content/2025/3/18/20253186_7WRhkDrKOGJsX0rpEzD3.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 브라우저에서 &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;에 접속하면 Jenkins 설치 앱이 실행된다.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253186_nQc51yNVqnxHz26ypzzF.png" src="/resources/media/images/content/2025/3/18/20253186_nQc51yNVqnxHz26ypzzF.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;그러면 위 그림 하단의 &lt;strong&gt;&lt;em&gt;Administrator password&lt;/em&gt;&lt;/strong&gt; 에다가 키값을 입력해야 하는데, 이 키값을 찾아보자!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;우리가 방금 띄운 jenkins라는 이름의 컨테이너에 vscode로 접속해보자.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_stxsA86wNngCUpN8Yv1Z.png" src="/resources/media/images/content/2025/3/18/20253187_stxsA86wNngCUpN8Yv1Z.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;컨테이너에 접속해서 /var/jenkins_home에 들어가자.(아래와 같이 나오면 된다)
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_iYghc777BdH4odTn6lzE.png" src="/resources/media/images/content/2025/3/18/20253187_iYghc777BdH4odTn6lzE.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이제 initialAdminPassword 파일에 들어가보면 32자 문자열이 있을 건데, 이를 복사해두자.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_dRl7ZuGOwlWLnxHgadoz.png" src="/resources/media/images/content/2025/3/18/20253187_dRl7ZuGOwlWLnxHgadoz.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;그리고 다시 웹서버에 접속해서 키값을 입력한 뒤, 로그인을 해주자.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_RDY0pBVtMXR4XTCX4WQt.png" src="/resources/media/images/content/2025/3/18/20253187_RDY0pBVtMXR4XTCX4WQt.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이후 [Install suggested plugins]을 할건지, [Select plugins to install]을 할건지, 선택하라고 나오면, 왼쪽 버튼을 누른다!
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_WyNt4eChBUUVSxvkNE7N.png" src="/resources/media/images/content/2025/3/18/20253187_WyNt4eChBUUVSxvkNE7N.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;관리자 계정 설정&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;설치 완료 후 관리자 계정정보를 입력합니다.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_qKlbpZ9MbRC3W8EAkjb1.png" src="/resources/media/images/content/2025/3/18/20253187_qKlbpZ9MbRC3W8EAkjb1.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_3p9yi32HY7WHHhbhlhCC.png" src="/resources/media/images/content/2025/3/18/20253187_3p9yi32HY7WHHhbhlhCC.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_tsBE10JpEqBnmL9sgghO.png" src="/resources/media/images/content/2025/3/18/20253187_tsBE10JpEqBnmL9sgghO.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 브라우저에서 &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;에 접속하면 기본 JenKins 앱이 실행된다.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/18/20253187_fSXyL6L3RpCutLXQx6GT.png" src="/resources/media/images/content/2025/3/18/20253187_fSXyL6L3RpCutLXQx6GT.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;다음시간에는 도커 기반으로 jenkins를 쓰는 이유와 관련 예제에 대해 다뤄보려고 한다.&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Tue, 18 Mar 2025 06:21:51 +0900</pubDate><guid>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-jenkins%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid></item><item><title>Docker를 써서 SprintBoot 웹앱 개발하기</title><link>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-sprintboot-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</link><description>&lt;p&gt;Docker를 써서 SprintBoot 웹앱 개발하기&lt;/p&gt;
</description><pubDate>Mon, 17 Mar 2025 01:04:46 +0900</pubDate><guid>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-sprintboot-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</guid></item><item><title>Docker를 써서 Vue 웹앱 개발하기</title><link>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-vue-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</link><description>&lt;blockquote&gt;
&lt;p&gt;이전 단계에서는 프로젝트를 만들어서 그 이후에 도커파일을 하나 추가한 후, 이미지를 빌드하는 방식으로 구현했습니다. Vue 또한 그렇게 구현할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="1-vue-프로젝트-생성"&gt;1️⃣ Vue 프로젝트 생성&lt;/h2&gt;&lt;p&gt;이미지를 빌드하기 전에 기본 Vue프로젝트가 필요하다. 우선 node.js 18버전을 설치해준다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 필요하다면, 기존에 있던 node.js(18버전 이하) 삭제
sudo apt-get remove -y nodejs npm

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 vue프로젝트를 생성해준다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/workspace
mkdir -p my-vue-app
cd my-vue-app
npx @vue/cli create .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;( Vue3과 Vue2중에 선택하라고 나오는데 Vue2를 골라주자. )&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;그러면 아래와 같이  프로젝트 폴더 아래에  node_modules/, public/, src/ 폴더가 생성된다.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/202531718_LsOUCzh1LOrg3v4971X4.png" src="/resources/media/images/content/2025/3/17/202531718_LsOUCzh1LOrg3v4971X4.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2-dockerfile-작성"&gt;2️⃣ Dockerfile 작성&lt;/h2&gt;&lt;p&gt;프로젝트(my-vue-app) 폴더 아래에 도커 파일을 만들고 편집으로 들어가 아래 내용을 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. Node.js 18을 사용
FROM node:18

# 2. 작업 디렉터리 설정
WORKDIR /app

# 3. package.json과 package-lock.json 복사
COPY package*.json ./

# 4. 의존성 설치
RUN npm install

# 5. 소스 코드 복사
COPY . .

# 6. Vue 개발 서버 실행
EXPOSE 8080
CMD [&amp;quot;npm&amp;quot;, &amp;quot;run&amp;quot;, &amp;quot;serve&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;결과는 아래와 같다.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/202531719_igODoof35km8YUsY6KGl.png" src="/resources/media/images/content/2025/3/17/202531719_igODoof35km8YUsY6KGl.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="3-docker-이미지-빌드"&gt;3️⃣ Docker 이미지 빌드&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;docker build -t my-vue-app .
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;결과는 아래와 같다.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/202531719_fdyUZNoty2ELHRAPAGwR.png" src="/resources/media/images/content/2025/3/17/202531719_fdyUZNoty2ELHRAPAGwR.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;이제 my-react-app 이라는 이름의 이미지가 만들어졌는지 확인해보자.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/202531719_0D9kLqnpuZY7NIBUSOJz.png" src="/resources/media/images/content/2025/3/17/202531719_0D9kLqnpuZY7NIBUSOJz.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-컨테이너-실행"&gt;4️⃣ 컨테이너 실행&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;docker run -it --rm -p 3000:8080 -v $(pwd):/app --workdir /app --name  vue_container node:18 bash -c &amp;quot;npm install &amp;amp;&amp;amp; npm run serve -- --host 0.0.0.0&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;위 코드에서 3000포트와 8080포트는 어떤 의미냐면, 아웃바운드, 즉 외부에서는 3000번으로 들어오면,
브릿지를 통해 인바운드, 즉 내부에서는 가상서버의 8080포트로 접속이 된다는 뜻이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/202531719_1XGSgVo8zhfv14xaPf4u.png" src="/resources/media/images/content/2025/3/17/202531719_1XGSgVo8zhfv14xaPf4u.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 브라우저에서 &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;에 접속하면 기본 Vue 앱이 실행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/202531719_obSOx8zRfVQsIhopzrJ6.png" src="/resources/media/images/content/2025/3/17/202531719_obSOx8zRfVQsIhopzrJ6.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
</description><pubDate>Mon, 17 Mar 2025 01:04:33 +0900</pubDate><guid>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-vue-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</guid></item><item><title>Docker를 써서 React 웹앱 개발하기</title><link>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-react-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</link><description>&lt;h2 id="1-react-프로젝트-생성"&gt;1️⃣ React 프로젝트 생성&lt;/h2&gt;&lt;p&gt;이미지를 빌드하기 전에 기본 React프로젝트가 필요하다.
우선 node.js 18버전을 설치해준다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 기존에 있던 node.js(18버전 이하) 삭제
sudo apt-get remove -y nodejs npm

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 react프로젝트를 생성해준다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/workspace
mkdir -p my-react-app
cd my-react-app
npx create-react-app .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/20253171_27iI5EKLA6EYum7o3pyJ.png" src="/resources/media/images/content/2025/3/17/20253171_27iI5EKLA6EYum7o3pyJ.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="2-dockerfile-작성"&gt;2️⃣ Dockerfile 작성&lt;/h2&gt;&lt;p&gt;도커 파일을 만들고 편집으로 들어가 아래 내용을 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. Node.js 18 사용
FROM node:18

# 2. 작업 디렉터리 설정
WORKDIR /app

# 3. package.json 복사
COPY package*.json ./

# 4. 의존성 설치
RUN npm install

# 5. 소스 코드 복사
COPY . .

# 6. 개발 서버 실행
EXPOSE 3000
CMD [&amp;quot;npm&amp;quot;, &amp;quot;start&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/20253171_jdIvPdQlk1cVThghfAZZ.png" src="/resources/media/images/content/2025/3/17/20253171_jdIvPdQlk1cVThghfAZZ.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="3-docker-이미지-빌드"&gt;3️⃣ Docker 이미지 빌드&lt;/h2&gt;&lt;p&gt;이제 react프로젝트를 도커 이미지로 빌드해보자.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker build -t my-react-app .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/20253171_zwyv1bP3h77jLQmMxZMM.png" src="/resources/media/images/content/2025/3/17/20253171_zwyv1bP3h77jLQmMxZMM.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 my-react-app 이라는 이름의 이미지가 만들어졌는지 확인해보자.
&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/20253171_oVMEw9gYu762lZl2tN5E.png" src="/resources/media/images/content/2025/3/17/20253171_oVMEw9gYu762lZl2tN5E.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-컨테이너-실행"&gt;4️⃣ 컨테이너 실행&lt;/h2&gt;&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/20253171_IN5vjcdzahpB2ACXUDgU.png" src="/resources/media/images/content/2025/3/17/20253171_IN5vjcdzahpB2ACXUDgU.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;웹브라우저에서도 url( &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; )을 통해 웹앱에서 값을 불러올 수 있는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/17/20253171_CCJ6VWSGGD0sy63XDWIa.png" src="/resources/media/images/content/2025/3/17/20253171_CCJ6VWSGGD0sy63XDWIa.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;지금까지 Docker를 써서 React 웹앱을 개발해보았습니다! 다음 스테이지로 넘어가보겠습니다!&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Mon, 17 Mar 2025 01:04:02 +0900</pubDate><guid>http://blex.me/@smithsolution/docker%EB%A5%BC-%EC%8D%A8%EC%84%9C-react-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</guid></item><item><title>Docker를 써서 Express 웹앱 개발하기</title><link>http://blex.me/@smithsolution/docke%EB%A5%BC-%EC%8D%A8%EC%84%9C-express-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</link><description>&lt;p&gt;Express.js는 Node.js 기반의 경량 웹 프레임워크로, 서버 및 API를 쉽게 구축할 수 있도록 도와줍니다.
미들웨어와 라우팅 기능을 제공하여 요청을 처리하고, 다양한 플러그인과 함께 확장할 수 있죠.
RESTful API 및 SSR을 지원하며, 빠르게 웹 애플리케이션을 개발할 수 있는 구조를 제공하여 nodeJS 런타임의 등장이후, 스타트업 뿐만 아니라, 다양한 SI업체에서도 흔하게 사용하는 프레임워크입니다.&lt;/p&gt;
&lt;p&gt;그래서 이번 포스팅에서는 해당 프레임워크를 사용하여 웹앱을 개발해보도록 하겠습니다.&lt;/p&gt;
&lt;h2 id="이미지파일을-만들자"&gt;이미지파일을 만들자!&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Express 웹앱 실행할 수 있는 전용 컨테이너를 만들어 배포하기 위해서는 전용 이미지를 만들어야 합니다.&lt;/li&gt;
&lt;li&gt;일단 vsocde를 실행해줍니다. 그리고 아래와 같이 5번째 아이콘을 눌러 탭을 새롭게 엽니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_xiOHNKbE3rlvj7iaHDpo.png" src="/resources/media/images/content/2025/3/16/202531618_xiOHNKbE3rlvj7iaHDpo.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;그리고 REMOTE EXPLORER 옵션에서 &lt;strong&gt;&lt;em&gt;WSL Targets&lt;/em&gt;&lt;/strong&gt;를 선택해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_10R9QOu6Ywn9PmE0MXlq.png" src="/resources/media/images/content/2025/3/16/202531618_10R9QOu6Ywn9PmE0MXlq.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;그리고 워크스페이스 디렉토리( &lt;code&gt;/workspace&lt;/code&gt; )로 들어가줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_nwKYCIscvGbCGkP61SjQ.png" src="/resources/media/images/content/2025/3/16/202531618_nwKYCIscvGbCGkP61SjQ.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;그리고 아래와 같이 세개의 파일을 만들어줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_PsPqMkmeyWfSWrFaq0GT.png" src="/resources/media/images/content/2025/3/16/202531618_PsPqMkmeyWfSWrFaq0GT.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;각 파일에 아래 코드를 넣어주도록 하겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="1dockerfile"&gt;1.Dockerfile&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;# 1. 베이스 이미지
FROM node:18

# 2. 작업 디렉터리 설정
WORKDIR /app

# 3. package.json, package-lock.json 복사 (없으면 실패)
COPY package*.json ./

# 5. npm 패키지 설치
RUN npm install

# 6. 전체 프로젝트 복사
COPY . .

# 7. 포트 설정
#EXPOSE 3000

# 8. 실행 명령어
CMD [&amp;quot;node&amp;quot;, &amp;quot;server.js&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_rRYSMLMO8rXjqRtIe3EA.png" src="/resources/media/images/content/2025/3/16/202531618_rRYSMLMO8rXjqRtIe3EA.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h4 id="2packagejson"&gt;2.package.json&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;{
    &amp;quot;name&amp;quot;: &amp;quot;node-web-server&amp;quot;,
    &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,
    &amp;quot;description&amp;quot;: &amp;quot;A simple Node.js web server using Express&amp;quot;,
    &amp;quot;main&amp;quot;: &amp;quot;server.js&amp;quot;,
    &amp;quot;scripts&amp;quot;: {
      &amp;quot;start&amp;quot;: &amp;quot;node server.js&amp;quot;,
      &amp;quot;dev&amp;quot;: &amp;quot;nodemon server.js&amp;quot;
    },
    &amp;quot;dependencies&amp;quot;: {
      &amp;quot;express&amp;quot;: &amp;quot;^4.18.2&amp;quot;
    },
    &amp;quot;devDependencies&amp;quot;: {
      &amp;quot;nodemon&amp;quot;: &amp;quot;^3.0.1&amp;quot;
    },
    &amp;quot;engines&amp;quot;: {
      &amp;quot;node&amp;quot;: &amp;quot;&amp;gt;=14.0.0&amp;quot;
    },
    &amp;quot;license&amp;quot;: &amp;quot;MIT&amp;quot;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_5r6ocTe4uZwVytbU7Ysd.png" src="/resources/media/images/content/2025/3/16/202531618_5r6ocTe4uZwVytbU7Ysd.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h4 id="3serverjs"&gt;3.server.js&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;const express = require(&amp;quot;express&amp;quot;);
const app = express();
const PORT = 3000;

app.get(&amp;quot;/&amp;quot;, (req, res) =&amp;gt; {
    res.send(&amp;quot;Hello, World! 🚀&amp;quot;);
});

app.listen(PORT, () =&amp;gt; {
    console.log(`Server is running at http://localhost:${PORT}`);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_nfUi3d0mikJPX08xVpMJ.png" src="/resources/media/images/content/2025/3/16/202531618_nfUi3d0mikJPX08xVpMJ.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이렇게 만들어진 세개의 파일을 가지고 이미지를 만들어보겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker build -t my-node-app .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_C7NLd3gRdBNYnmBt7Ki5.png" src="/resources/media/images/content/2025/3/16/202531618_C7NLd3gRdBNYnmBt7Ki5.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 &lt;strong&gt;&lt;em&gt;my-node-app&lt;/em&gt;&lt;/strong&gt; 이라는 이름의 이미지가 만들어졌는지 확인해보겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_8CvNByFailwG1FAB5Etl.png" src="/resources/media/images/content/2025/3/16/202531618_8CvNByFailwG1FAB5Etl.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;(이미지 크기가 1.59GM이네요! 아무래도 런타임도 같이 패키징되다 보니 용량이 많이 먹는 것 같습니다)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 만들어진 이미지로 새 컨테이너를 만들고 배포해봅시다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker run -d -p 3000:3000 --name node_container my-node-app
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;터미널 상에서 실행하는 방법은 다음과 같고,&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker ps
curl http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_jDGuPHJW0ghEOM8JQt8e.png" src="/resources/media/images/content/2025/3/16/202531618_jDGuPHJW0ghEOM8JQt8e.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;웹브라우저에서도 url( &lt;strong&gt;&lt;em&gt;&lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; )을 통해 웹앱에서 값을 불러올 수 있는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div style="text-align: center;"&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531618_qJ53Pia2DaTfEGhyRQ72.png" src="/resources/media/images/content/2025/3/16/202531618_qJ53Pia2DaTfEGhyRQ72.png.preview.jpg" alt=""&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;지금까지 Docker를 써서 Express 웹앱을 개발해보았습니다! 다음 스테이지로 넘어가보겠습니다!&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Sun, 16 Mar 2025 17:05:09 +0900</pubDate><guid>http://blex.me/@smithsolution/docke%EB%A5%BC-%EC%8D%A8%EC%84%9C-express-%EC%9B%B9%EC%95%B1-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0</guid></item><item><title>Vscode를 Docker와 연동하기</title><link>http://blex.me/@smithsolution/vscode%EB%A5%BC-docker%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</link><description>&lt;h2 id="우선-vscode에서-플러그인부터-설치하자"&gt;🚀우선 Vscode에서 플러그인부터 설치하자.&lt;/h2&gt;&lt;h4 id="1docker-plugin"&gt;1.Docker Plugin&lt;/h4&gt;&lt;p&gt;Vscode에서 도커개발을 용이하게 해주는 플러그인을 설치해주자.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_gxhuo6JlFfhPalQrMGCP.png" src="/resources/media/images/content/2025/3/16/202531615_gxhuo6JlFfhPalQrMGCP.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;h4 id="2cc-plugin"&gt;2.C/C++ Plugin&lt;/h4&gt;&lt;p&gt;가장 우선적으로 도커 컨테이너 위에 C/C++개발환경을 구축해보는 것을 하려고 한다.
따라서 C/C++개발을 용이하게 해주는 플러그인을 설치해주자.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_LZykFzI2KUk4pSBoapl2.png" src="/resources/media/images/content/2025/3/16/202531615_LZykFzI2KUk4pSBoapl2.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;h4 id="3remote-development-plugi"&gt;3.Remote Development Plugin&lt;/h4&gt;&lt;p&gt;그 다음, [Vscode]와 [localhost의 도커 컨테이너]와 연동해주는 확장플러그인을 설치해주자.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_uLOeQCQJHZkPbLiXH2pG.png" src="/resources/media/images/content/2025/3/16/202531615_uLOeQCQJHZkPbLiXH2pG.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="이제-vscode를-docker와-연동해주자"&gt;🚀이제, Vscode를 Docker와 연동해주자.&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;플러그인 설치가 완료되었으면, vscode에서 [ctrl]+[shift]+[p]를 입력하고,  &lt;br/&gt;
&lt;strong&gt;&lt;em&gt;Dev Containers: Attach to Running Container&lt;/em&gt;&lt;/strong&gt; 를 클릭!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_1Q3Sc08S0jeSdjldzILx.png" src="/resources/media/images/content/2025/3/16/202531615_1Q3Sc08S0jeSdjldzILx.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;이후 아래 그림과 같이, [Open Folder]를 클릭후, OK버튼을 눌러주면, 가상 컨테이너에 있는 디렉토리를 불러올 수 있다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_o4eu5UPTGw0PrMH7qnAj.png" src="/resources/media/images/content/2025/3/16/202531615_o4eu5UPTGw0PrMH7qnAj.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이렇게 /root/ 경로로 들어왔다면, 아까 전에 연동된(Mounted) &lt;code&gt;/workspace&lt;/code&gt;디렉토리로 이동해준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_fqBLcUQYYILbWQZ2R5QX.png" src="/resources/media/images/content/2025/3/16/202531615_fqBLcUQYYILbWQZ2R5QX.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="c-lang기반-테스트용-코드를-실행해보자"&gt;C-lang기반 테스트용 코드를 실행해보자&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;정상적으로 &lt;code&gt;/workspace&lt;/code&gt;경로에 들어왔으면 test용 코딩을 해본다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_0RaWXxcHpLEugn3O3yF0.png" src="/resources/media/images/content/2025/3/16/202531615_0RaWXxcHpLEugn3O3yF0.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;위와 같이 코딩을 하고 나서 현재상태에서 &lt;strong&gt;&lt;em&gt;[Ctrl]+[Shift]+[b]&lt;/em&gt;&lt;/strong&gt; 를 누른다. 그리고 첫번째 옵션 클릭! (만든 c코드를 빌드하는 작업이다)
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_Cn4AJMf3YFVy0Ue6UEdI.png" src="/resources/media/images/content/2025/3/16/202531615_Cn4AJMf3YFVy0Ue6UEdI.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;그러면 아래와 같이 hello라는 실행파일이 만들어진것을 확인할 수 있다. &lt;br/&gt;
(또는 터미널에 &lt;code&gt;gcc –m64 –o hello hello.c&lt;/code&gt;라고 적어도 실행파일이 만들어진다.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이후 터미널에서 저 파일이 있는 곳으로 가서 &lt;code&gt;./hello.c&lt;/code&gt;를 입력하면, &lt;br/&gt;
정상적으로 실행파일이 실행되는 것을 확인할 수 있다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_vNAfWP071DB4mPNtE6AJ.png" src="/resources/media/images/content/2025/3/16/202531615_vNAfWP071DB4mPNtE6AJ.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;h4 id="cpp-lang기반-테스트용-코드를-실행해보자"&gt;Cpp-lang기반 테스트용 코드를 실행해보자&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;추가적으로 hello.cpp파일도 만들어서 테스트해보자.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531615_AvYNfuhyx3YXF1WSKHOp.png" src="/resources/media/images/content/2025/3/16/202531615_AvYNfuhyx3YXF1WSKHOp.png.preview.jpg" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;지금까지 wsl위에 올린 도커 가상머신을 올리고, 그 위에 컨테이너를 띄운다음, C/C++환경에서 예제코드를 작성해보았다. 다음시간에는 더욱 다양한 컨테이너를 띄워보고 컨테이너간의 연동, 클라우드로의 확장 및 마이크로서비스까지 구현해보려고 한다.&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Sun, 16 Mar 2025 15:05:35 +0900</pubDate><guid>http://blex.me/@smithsolution/vscode%EB%A5%BC-docker%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</guid></item><item><title>컨테이너 이름 변경하기</title><link>http://blex.me/@smithsolution/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</link><description>&lt;p&gt;기존에 컨테이너를 만들떄, 이름을 별도로 옵션(--name)을 주어 설정해주지 않으면, 랜덤한 이름을 갖고 컨테이너가 만들어진다.&lt;/p&gt;
&lt;p&gt;이때 이름을 간단하게 바꾸는 방법에 대해 알아본다.&lt;/p&gt;
&lt;h2 id="우선-컨테이너를-임의로-배포해보자"&gt;🌍우선 컨테이너를 임의로 배포해보자&lt;/h2&gt;&lt;p&gt;아래 명령어로 hello-world 기본 이미지를 다운로드 받아 컨테이너를 배포해보자.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531613_h36oDkh948eBz8oHyJJy.png" src="/resources/media/images/content/2025/3/16/202531613_h36oDkh948eBz8oHyJJy.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;그리고 아래 명령어로 현재 활성/비활성화된 컨테이너들을 조회해보자.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker ps -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531613_IsNLSJxavqDtTQyGqhE5.png" src="/resources/media/images/content/2025/3/16/202531613_IsNLSJxavqDtTQyGqhE5.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;지금 보면 &lt;code&gt;xenodochial_mcclintock&lt;/code&gt;이라는 임의의 이름이 컨테이너에 붙여진 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;이제 아래 명령어로 바꾸보자.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="docker-rename-old-new"&gt;🌍docker rename [old] [new]&lt;/h2&gt;&lt;p&gt;형식은 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker rename [old] [new]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;나는 &lt;code&gt;hello-container&lt;/code&gt;로 개명하려고 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker rename xenodochial_mcclintock hello-container
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래와 같이 바뀐 것을 알수가 있다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531613_ACk9ignGo4vbSvYmGDkf.png" src="/resources/media/images/content/2025/3/16/202531613_ACk9ignGo4vbSvYmGDkf.png.preview.jpg" alt=""&gt;&lt;/p&gt;
</description><pubDate>Sun, 16 Mar 2025 13:42:54 +0900</pubDate><guid>http://blex.me/@smithsolution/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</guid></item><item><title>이미지 빌드하고 컨테이너 배포해보기</title><link>http://blex.me/@smithsolution/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B3%A0-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link><description>&lt;p&gt;sd&lt;/p&gt;
&lt;h2 id="도커-이미지를-빌드하자"&gt;✨도커 이미지를 빌드하자.&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;생성 및 편집&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 0.작업용 디렉터리[ workspace ]를 만들어준다.
mkdir -p workspace

# 1.도커파일을 생성한다.
touch Dockerfile

# 2.도커파일을 편집한다.
sudo nano Dockerfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531614_Xz5Lros0YLLL1wD8SAAr.png" src="/resources/media/images/content/2025/3/16/202531614_Xz5Lros0YLLL1wD8SAAr.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;아래 내용 붙여주기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;FROM ubuntu:latest                       # Docker에 배포할 OS선택
RUN apt-get -qq update \                       # OS로 빌드 후, 실행할 명령어
&amp;amp;&amp;amp; apt-get -qq install -y g++ cmake \
&amp;amp;&amp;amp; apt-get clean                       

EXPOSE 8000                        # 호스트와 연결할 포트번호
ENTRYPOINT [&amp;quot;/bin/bash&amp;quot;]                       # 빌드 후, 이미지 실행 시, 실행될 명령어 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531614_J95Mkn0AX2tCb7UGTB9y.png" src="/resources/media/images/content/2025/3/16/202531614_J95Mkn0AX2tCb7UGTB9y.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이제 이미지를 만들 준비작업은 끝났다. 이를 기반으로 이미지를 생성해보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker build --rm -t cpp-builder .
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;(꼭 마지막에 점(.)을 붙여주어야 한다. 점(.)은 현재위치에 있는 Dockerfile을 빌드하겠다는 뜻이다.
우리가 python에서 &lt;code&gt;pip install -e .&lt;/code&gt;를 할때, 현재위치에 있는 setup.py파일을 실행하겠다는 말과 유사하다.)
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531614_nKev1nXbstq3T1rUF3Gc.png" src="/resources/media/images/content/2025/3/16/202531614_nKev1nXbstq3T1rUF3Gc.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;빌드가 다 되었다면, 이제 &lt;code&gt;docker images&lt;/code&gt;를 통해 이미지가 존재하는지 확인해보자.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/20253160_kFBTmQFbLaQNvZ8v3a2G.png" src="/resources/media/images/content/2025/3/16/20253160_kFBTmQFbLaQNvZ8v3a2G.png.preview.jpg" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="만든-이미지로-컨테이너-배포를-하자"&gt;✨만든 이미지로 컨테이너 배포를 하자.&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;컨테이너를 배포하기 전에 Docker와 VsCode를 같이 사용하려면, 저장공간을 공유(Mount)해야 한다.
그래서 사용자가 로컬저장소(OSX)에서 원하는 위치에 폴더를 생성해야 한다.
그리고 다음 형태로 명령어를 입력한다. 예시는 아래와 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker run \
  --name &amp;quot;cpp_container&amp;quot; \
   -d \
   -it \
   -v /home/admin2/cpp_workspace:/workspace \
   cpp-builder
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;컨테이너가 정상적으로 배포되었는지 확인하기 위해 아래 명령어를 쳐서, cpp_container라는 컨테이너가 있는지 확인히자.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531614_4RVMMK5WLjrmwI9y33nq.png" src="/resources/media/images/content/2025/3/16/202531614_4RVMMK5WLjrmwI9y33nq.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;위와 같이 확인했으면, 컨테이너를 한번 stop했다가 다시 start해준다. 안그러면 나중에 터미널을 닫으면, 컨테이너도 같이 죽어버리는 현상이 생긴다. 그래서 refresh를 해주는게 좋다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 컨테이너 refresh해주기
docker stop cpp_container
docker start cpp_container
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/16/202531614_X6pZOgpmIkSt1R0x72lL.png" src="/resources/media/images/content/2025/3/16/202531614_X6pZOgpmIkSt1R0x72lL.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이후에는 해당 컨테이너를 유동적으로 사용할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Sat, 15 Mar 2025 20:34:06 +0900</pubDate><guid>http://blex.me/@smithsolution/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B3%A0-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</guid></item><item><title>Docker 주요 옵션들</title><link>http://blex.me/@smithsolution/docker-%EC%A3%BC%EC%9A%94-%EC%98%B5%EC%85%98%EB%93%A4</link><description>&lt;p&gt;이번 포스팅에서는 도커의 주요 옵션들에 대해서 다룬다. 옵션들이 각 명령어에 따라 세부적으로 무수히 많지만, 그중에서 컨테이너 실행 및 관리 명령어(&lt;code&gt;docker run&lt;/code&gt;)에서 추가하는 옵션들에 대해서 다룬다.&lt;/p&gt;
&lt;h2 id="옵션1-rm"&gt;💻옵션(1): --rm&lt;/h2&gt;&lt;p&gt;--rm : 컨테이너 실행이 종료된 후 자동으로 해당 컨테이너를 삭제하도록 설정하는 옵션
이 옵션을 사용하면 컨테이너가 종료되면서 불필요한 파일 시스템이나 리소스를 남기지 않게 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;format&amp;gt;
docker run --rm &amp;lt;image-name&amp;gt;

&amp;lt;example&amp;gt;
docker run --rm ghcr.io/autowarefoundation/autoware:universe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;컨테이너에 접속 후, 일을 끝마쳐서 exit를 누르면 컨테이너도 자동으로 사라진다.&lt;/p&gt;
&lt;h2 id="옵션2-d-detach"&gt;💻옵션(2): -d, -detach&lt;/h2&gt;&lt;p&gt;-d, -detach: 백그라운드에서 컨테이너를 실행하는 옵션&lt;/p&gt;
&lt;h2 id="옵션3-name-이름"&gt;💻옵션(3): --name &amp;lt;이름&amp;gt;&lt;/h2&gt;&lt;p&gt;--name &amp;lt;이름&amp;gt;: 컨테이너 이름을 지정하는 옵션&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;example&amp;gt;
docker run \
  --name=&amp;quot;ros2_container&amp;quot; \
  osrf/ros:humble-desktop-full
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="옵션4-it-privileged"&gt;💻옵션(4): -it, --privileged&lt;/h2&gt;&lt;p&gt;-it: 인터렉티브 모드(-i)와 TTY(-t)를 활성화하는 옵션
--privileged: 컨테이너에 거의 모든 권한을 부여하는 옵션
(보통 두 옵션을 같이 묶어서 쓴다)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;example&amp;gt;
docker run \
  -it \
  --privileged \
  osrf/ros:humble-desktop-full
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="옵션5-p-호스트포트컨테이너포트"&gt;💻옵션(5): -p &amp;lt;호스트포트&amp;gt;:&amp;lt;컨테이너포트&amp;gt;&lt;/h2&gt;&lt;p&gt;-p &amp;lt;호스트포트&amp;gt;:&amp;lt;컨테이너포트&amp;gt;: 포트 매핑&lt;/p&gt;
&lt;h2 id="옵션6-v-호스트디렉터리컨테이너디렉터리"&gt;💻옵션(6): -v &amp;lt;호스트디렉터리&amp;gt;:&amp;lt;컨테이너디렉터리&amp;gt;&lt;/h2&gt;&lt;p&gt;-v &amp;lt;호스트디렉터리&amp;gt;:&amp;lt;컨테이너디렉터리&amp;gt;: 볼륨 마운트
보통 ros를 컨테이너에 올릴 경우 그래픽 공유가 빌표한데, 이때 그래픽 전용 볼륨을 마운트 하는 경우가 흔하다.
***-&amp;gt; -v=/tmp/.X11-unix:/tmp/.X11-unix:ro  ***&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;example&amp;gt;
docker run \
  -v=/tmp/.X11-unix:/tmp/.X11-unix:ro \
  -v=/dev:/dev \
  -v=/home/admin2/ros2_ws:/workspace \
  -w=/workspace \
  osrf/ros:humble-desktop-full
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="옵션7-w"&gt;💻옵션(7): -w&lt;/h2&gt;&lt;p&gt;-w: 컨테이너 접속시 기본적으로 내가 시작하는 디렉터리 위치
보통 (작업을 시작하는 디렉터리 위치)를 -w옵션의 값으로 두고, 이는 위에서 언급한 볼륨 마운트를 위한 컨테이너 디렉터리 위치와 같은 값으로 세팅하는 것이 일반적이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;example&amp;gt;
docker run \
  -v=/home/admin2/ros2_ws:/workspace \
  -w=/workspace \
  -it \
  osrf/ros:humble-desktop-full
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="옵션8-env-e-keyvalue"&gt;💻옵션(8): --env, -e &amp;lt;KEY=VALUE&amp;gt;&lt;/h2&gt;&lt;p&gt;--env, -e &amp;lt;KEY=VALUE&amp;gt;: 환경변수를 설정하는 옵션&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;example&amp;gt;
docker run \
  -e &amp;quot;MY_ENV=hello&amp;quot;
    ubuntu
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 04 Mar 2025 17:52:47 +0900</pubDate><guid>http://blex.me/@smithsolution/docker-%EC%A3%BC%EC%9A%94-%EC%98%B5%EC%85%98%EB%93%A4</guid></item><item><title>Docker 설치하기(우분투편)</title><link>http://blex.me/@smithsolution/docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0%EC%9A%B0%EB%B6%84%ED%88%AC%ED%8E%B8</link><description>&lt;h2 id="1docker-설치하기"&gt;📟1.Docker 설치하기&lt;/h2&gt;&lt;h4 id="1패키지-설치"&gt;1)패키지 설치&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;만약 이전에 도커가 잘못 설치되어 캐시등의 파일이 남아있다면 아래 명령어로 기존 도커를 제거해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get remove docker docker-engine docker.io containerd runc
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이후 필수패키지를 우선적으로 설치해줍니다(GPG키를 받아오기 위함)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="2gpg키-추가"&gt;2)GPG키 추가&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;도커 패키지를 신뢰할 수 있도록 하기 위해 서명을 필요로 합니다.
(보통 시스템 패키지를 설치할때는 시스템을 건드리게 되기에 매우 민감한 사항이 됩니다. 따라서 악성코드가 담긴 패키지를 깔아서는 안됩니다. 이를 위해 서명을 받아오는 공개키 암호화 방식을 채택하여 안전하게 패키지를 설치하게 됩니다)&lt;/li&gt;
&lt;li&gt;위 명령어를 통해 로컬에 도커 공식 레포지토리(폴더)가 생성됩니다.
(아래에서 이와 관련된 설정을 해줍니다)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.gpg &amp;gt; /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="3도커-저장소-추가"&gt;3)도커 저장소 추가&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;우분투의 apt로 하여금, 도커 공식 레포지토리에 패키지를 가져올 수 있도록 설정해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;echo \
  &amp;quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&amp;quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="4도커-설치"&gt;4)도커 설치&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;패키지 목록을 업데이트해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;도커를 본격적으로 설치해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;부팅시, 자동으로 시작되도록 설정해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start docker
sudo systemctl enable docker
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;실행되는지 확인해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="2nvidia-container-toolkit"&gt;📟2.NVIDIA Container Toolkit 설치하기&lt;/h2&gt;&lt;h4 id="1nvidia-패키지-저장소-추가"&gt;1)NVIDIA 패키지 저장소 추가&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;GPG키를 받아줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;패키지 목록이 깔려 있는 리스트 파일을 가져옵니다.&lt;/li&gt;
&lt;li&gt;참고로,sed명령어는 위에서 다운로드 받은 GPG키로 서명처리를 해줍니다.&lt;/li&gt;
&lt;li&gt;GPG키로 서명된 패키지들을 nvidia-container-toolkit.list 파일에 넣어줍니다.
(위 .list파일은 /etc/apt/sources.list.d/경로에 있다)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="2패키지-목록-업데이트-및-nvidia-con"&gt;2)패키지 목록 업데이트 및 NVIDIA Container Toolkit설치&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;툴킷 컨테이너를 설치하여 NVIDIA GPU를 사용할 수 있도록 설정해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="3nvidia-컨테이너-런타임-설정"&gt;3)NVIDIA 컨테이너 런타임 설정&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;이번에는 로컬에서 사용가능한 NVIDIA GPU를 Docker안에서도 사용할 수 있도록 설정해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo nvidia-ctk runtime configure --runtime=docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="4docker-재시작"&gt;4)Docker 재시작&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;도커 데몬을 재시작하여 변경된 NVIDIA 런타임 설정을 반영한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="3sudo-없이-도커-명령어-실행하기"&gt;📟3.sudo 없이 도커 명령어 실행하기&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;아래 명령어 입력후 재부팅해준다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo usermod -aG docker ${USER}
sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="4도커-위에서-ros환경구축하기ros1ros2"&gt;📟4.도커 위에서 ROS환경구축하기(ROS1,ROS2)&lt;/h2&gt;&lt;p&gt;Docker 설치를 마쳤다면, 아래 링크에 들어가 docker 위에 ROS를 구축해보는 것을 학습해보시는걸 추천드립니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://velog.io/@2170004487z/%EB%8F%84%EC%BB%A4%EB%A1%9C-%ED%99%98%EA%B2%BD%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0"&gt;[ROS1] 도커로 ROS1 환경구축하기&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://velog.io/@2170004487z/ROS2%EB%8F%84%EC%BB%A4%EB%A1%9C-%ED%99%98%EA%B2%BD%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0"&gt;[ROS2] 도커로 ROS2 환경구축하기&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 04 Mar 2025 17:51:13 +0900</pubDate><guid>http://blex.me/@smithsolution/docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0%EC%9A%B0%EB%B6%84%ED%88%AC%ED%8E%B8</guid></item><item><title>Docker 설치하기(윈도우편)</title><link>http://blex.me/@smithsolution/docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0%EC%9C%88%EB%8F%84%EC%9A%B0%ED%8E%B8</link><description>&lt;p&gt;이번 포스트에서는 Windows10을 기준으로 Docker를 설치해보려고 한다.&lt;/p&gt;
&lt;h2 id="wsl부터-설치하자"&gt;🪟WSL부터 설치하자.&lt;/h2&gt;&lt;p&gt;일단 Docker는 리눅스를 기반으로 하기 때문에 Docker를 효율적으로 사용하기 위해서는 WSL을 설치해야 한다. &lt;strong&gt;&lt;em&gt;파워셸을 관리자 권한으로 실행후, 아래 명령어 실행!&lt;/em&gt;&lt;/strong&gt;
(WSL을 설치한 후 그 위에 도커를 올리고 거기다가 Dockerfile을ㄹ 통해 리눅스를 탑재한 후 C/C++을 개발할 수 있는 환경을 구축해보려고 한다.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# WSL을 활성화 시키는 명령어, 이를 통해 VirtualMachinePlatform 기능을 사용할 수 있다.
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_pcuqTvTsGmGMXI1Hwx2u.png" src="/resources/media/images/content/2025/3/15/202531520_pcuqTvTsGmGMXI1Hwx2u.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;WSL툴을 설치했으면 재부팅을 해본다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;재부팅 후에 파워셸에 WSL을 입력하면 아래와 같이 배포판을 MS Store에서 설치하라는 문구가 뜬다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_3M5DkN5rZTbKbSxKGp8w.png" src="/resources/media/images/content/2025/3/15/202531520_3M5DkN5rZTbKbSxKGp8w.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;일단, &lt;code&gt;우분투 배포판&lt;/code&gt;을 설치하기 전에 배치파일을 만들어 아래 코드를 작성해준다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pushd &amp;quot;%~dp0&amp;quot;
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum &amp;gt; hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^&amp;gt;nul') do dism /online /norestart /add-package:&amp;quot;%SystemRoot%\servicing\Packages\%%i&amp;quot; 
del hyper-v.txt 
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL 
pause
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;결과
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/22/202532215_9qFNlV9rOaESTbv7JeyQ.png" src="/resources/media/images/content/2025/3/22/202532215_9qFNlV9rOaESTbv7JeyQ.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;그리고 배치파일을 권리자권한으로 실행
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/22/202532215_pDTYpwbanJeWrmI2vcpb.png" src="/resources/media/images/content/2025/3/22/202532215_pDTYpwbanJeWrmI2vcpb.png.preview.jpg" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;윈도우의 기능 켜기/끄기&lt;/code&gt;에 들어가서 Hyper-V 항목 아래, &lt;code&gt;Linux용 Windows 하위 시스템&lt;/code&gt;을 활성화해준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_QBamsg0SLiNjd9QkAgXI.png" src="/resources/media/images/content/2025/3/15/202531520_QBamsg0SLiNjd9QkAgXI.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;그 다음, 리눅스 커널을 업데이트 해주어야 한다.
Linux 커널 업데이트 패키지 다운로드 &lt;a href="https://learn.microsoft.com/ko-kr/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package"&gt;(Click)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_Gv68evz1E9Sk7OtcpE53.png" src="/resources/media/images/content/2025/3/15/202531520_Gv68evz1E9Sk7OtcpE53.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;wsl_update를 실행해주면, 다음과 같은 실행창이 뜬다. 설치해준다!
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_Lek1SVL9KOQAtvpgoENZ.png" src="/resources/media/images/content/2025/3/15/202531520_Lek1SVL9KOQAtvpgoENZ.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이후, WSL2를 기본 버전으로 설정해준다.&lt;strong&gt;&lt;em&gt;파워셸을 관리자 권한으로 실행후, 아래 명령어 실행!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;wsl --set-default-version 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_2IHGl9pJZLa7bLLMP0go.png" src="/resources/media/images/content/2025/3/15/202531520_2IHGl9pJZLa7bLLMP0go.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;이제 본격적으로 MS Store에 들어가서 Ubuntu 20.04 LTS버전을 설치해준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_9uTvwpMbcLlKXFdJPL3I.png" src="/resources/media/images/content/2025/3/15/202531520_9uTvwpMbcLlKXFdJPL3I.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;좀 기다리면 아래 그림과 같이 버튼명이 [열기]로 바뀐다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;제대로 설치가 된 것이다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_uUHcn41kb27knm7x2d8g.png" src="/resources/media/images/content/2025/3/15/202531520_uUHcn41kb27knm7x2d8g.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이후 실행을 누르면, 아래와 같이 새롭게 유저를 등록하라는 코멘트가 뜬다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Username과 password를 등록해준다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Username은 &lt;code&gt;admin2&lt;/code&gt;로, password는 &lt;code&gt;acelab&lt;/code&gt;으로 해준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_Blmd627U2Wb83xjj2xvd.png" src="/resources/media/images/content/2025/3/15/202531520_Blmd627U2Wb83xjj2xvd.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="이제-docker를-설치하자"&gt;🪟이제 Docker를 설치하자.&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;이제 본격적으로 Docker를 설치하자. 해당 링크&lt;a href="https://docs.docker.com/desktop/install/windows-install/"&gt;(Click)&lt;/a&gt;로 들어가서 설치할 수 있다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;아래 설치파일은 Docker Hub에서 제공하는 &lt;strong&gt;&lt;em&gt;Docker Desktop for Windows&lt;/em&gt;&lt;/strong&gt;이다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_sOT83nVuTwUSl11FiA5b.png" src="/resources/media/images/content/2025/3/15/202531520_sOT83nVuTwUSl11FiA5b.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;아래와 같이 Docker(셋업파일)를 찾아 실행해준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_TojllscWLrlDlnD9PhdQ.png" src="/resources/media/images/content/2025/3/15/202531520_TojllscWLrlDlnD9PhdQ.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;아래와 같이 설치중인 화면이 뜨고 나서, &lt;strong&gt;&lt;em&gt;Installation succeeded&lt;/em&gt;&lt;/strong&gt;가 뜨는 것을 볼 수 있다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_GGdRaHFZH3NnwxqdEI5a.png" src="/resources/media/images/content/2025/3/15/202531520_GGdRaHFZH3NnwxqdEI5a.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;그러면 바탕화면에 도커 아이콘이 뜰텐데 실행!, 수락하면 된다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_GAatk75R78BTuMUCBrWp.png" src="/resources/media/images/content/2025/3/15/202531520_GAatk75R78BTuMUCBrWp.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;아래 화면이 뜨면 성공한 것이다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_5VFuZLICE176oMx1zhcL.png" src="/resources/media/images/content/2025/3/15/202531520_5VFuZLICE176oMx1zhcL.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이제 도커가 제대로 설치되었는지 확인하기 위해 터미널을 열고 &lt;code&gt;docker -v&lt;/code&gt;를 쳐준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_94Bdx6FzCBTSWfaJiI5b.png" src="/resources/media/images/content/2025/3/15/202531520_94Bdx6FzCBTSWfaJiI5b.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;제대로 설치되었다면, 버전정보가 뜰것이다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이후 실행이 제대로 되는지 테스트를 해본다. &lt;code&gt;docker run hello-world&lt;/code&gt;를 쳐준다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/15/202531520_18TPtS1T6QKLk0U4vLn8.png" src="/resources/media/images/content/2025/3/15/202531520_18TPtS1T6QKLk0U4vLn8.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;다음시간에는 도커 이미지를 빌드해보고, 만든 이미지로 컨테이너를 실행해보려고 한다.&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Tue, 04 Mar 2025 17:50:11 +0900</pubDate><guid>http://blex.me/@smithsolution/docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0%EC%9C%88%EB%8F%84%EC%9A%B0%ED%8E%B8</guid></item><item><title>Docker 개요</title><link>http://blex.me/@smithsolution/docker-%EA%B0%9C%EC%9A%94</link><description>&lt;h2 id="도커란"&gt;🐋도커란?&lt;/h2&gt;&lt;p&gt;Docker는 애플리케이션을 개발, 배포 및 실행하기 위한 오픈 소스 플랫폼입니다. 이 플랫폼은 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하여, 개발 환경과 운영 환경 간의 일관성을 제공합니다&lt;/p&gt;
&lt;h2 id="주요-특징"&gt;🐋주요 특징&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;컨테이너 기술: Docker는 컨테이너를 사용하여 애플리케이션과 그 종속성을 격리된 환경에서 실행합니다.&lt;/li&gt;
&lt;li&gt;이식성: 컨테이너화된 애플리케이션은 다양한 환경에서 일관되게 실행될 수 있어 이식성이 뛰어납니다.&lt;/li&gt;
&lt;li&gt;리소스 효율성: 컨테이너는 호스트 운영 체제의 리소스를 공유하며, 별도의 게스트 OS를 필요로 하지 않아 가볍고 빠릅니다.&lt;/li&gt;
&lt;li&gt;빠른 배포: Docker를 사용하면 애플리케이션의 개발, 테스트, 배포 과정을 간소화하고 가속화할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="docker-아키텍처"&gt;🐋Docker 아키텍처&lt;/h2&gt;&lt;p&gt;Docker는 클라이언트-서버 아키텍처를 사용한다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/6/20253611_EUP7ceD7MGvKwyA1NJQr.png" src="/resources/media/images/content/2025/3/6/20253611_EUP7ceD7MGvKwyA1NJQr.png.preview.jpg" alt=""&gt;
주요 구성요소는 위와 같이 세가지로 나뉜다.
(위 사진은 도커 공식 사이트에서 아키텍처를 시각적으료 표현한 것인데, 항상 도커 컨테이너를 머리속으로 추상화하면서 위 그림을 떠올리곤 하는데 곱씹을수록? 유용한 자료로가 생각된다)
도커는 Client-Server 아키텍처를 사용하는데,
클라이언트는 &amp;quot;&amp;quot;도커 컨테이너를 구축, 실행 및 배포하는 무거운 작업을 수행하는&amp;quot;&amp;quot; 도커 데몬과 통신한다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/6/20253611_2i7UeKF7rLXA2p1hXsNF.png" src="/resources/media/images/content/2025/3/6/20253611_2i7UeKF7rLXA2p1hXsNF.png.preview.jpg" alt=""&gt;
도커 클라이언트와 데몬은 동일한 시스템 내에서 실행될 수 있고, 또는 도커 클라이언트를 원격 도커 데몬에 연결할 수도 있다.
&lt;img class="lazy" data-src="/resources/media/images/content/2025/3/6/20253611_k6C1eITj3gBN5qxwDLng.png" src="/resources/media/images/content/2025/3/6/20253611_k6C1eITj3gBN5qxwDLng.png.preview.jpg" alt=""&gt;
도커 클라이언트와 데몬은 &lt;strong&gt;UNIX 소켓&lt;/strong&gt; 또는 &lt;strong&gt;네트워크 인터페이스&lt;/strong&gt;를 통해 REST API를 사용하여 통신한다. 그리고 도커 클라이언트는 &amp;quot;&amp;quot;도커 컴포즈&amp;quot;&amp;quot;로 이를 통해 컨테이너 세트로 구성된 애플리케이션으로 작업할 수 있다.&lt;/p&gt;
&lt;p&gt;이쯤에서 도커관련 용어들을 정리하자.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Docker Daemon: Docker API요청을 처리하고 이미지, 컨테이너, 네트워크, 볼륨 등을 관리한다.&lt;/li&gt;
&lt;li&gt;Docker Client: 사용자가 Docker 명령어를 실행할 수 있는 인터페이스를 제공한다.&lt;/li&gt;
&lt;li&gt;Docker 엔진: 호스트 시스템에서 실행되는 핵심 소프트웨어로, 컨테이너 생성 및 관리를 담당한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;현재로서는 추상화/가상화 관련된 다양한 용어들이 나와서 초심자 입장에서는 어렵게 느껴질 거이다.
하지만 이를 통해 아래와 같은 분야에서 요긴하게 써먹을 수 있다.&lt;/p&gt;
&lt;h2 id="사용사례"&gt;🐋사용사례&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;마이크로서비스 아키텍처(MS Architecture): 분산 애플리케이션 구축 및 확장에 사용된다.&lt;/li&gt;
&lt;li&gt;지속적 통합 및 배포(CI/CD): 표준화된 환경을 제공하여 개발 및 베포 프로세스를 개선한다.&lt;/li&gt;
&lt;li&gt;데이터 처리: 빅데이터 처리 시스템 구축에 활용된다.&lt;/li&gt;
&lt;/ol&gt;
</description><pubDate>Thu, 27 Feb 2025 15:56:15 +0900</pubDate><guid>http://blex.me/@smithsolution/docker-%EA%B0%9C%EC%9A%94</guid></item><item><title> &lt;컴퓨터망&gt; 연습문제 풀이(3)</title><link>http://blex.me/@smithsolution/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%A7%9D-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B43</link><description>&lt;blockquote&gt;
&lt;p&gt;5.5. 전통적인 케이블 TV 시스템은 종단-대-종단을 연결하기 위해  ___  케이블을 사용한다.&lt;br/&gt;
→ 동축(coxial)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;케이블로는 다양한 소재를 사용할 수 있다. 알루미늄 뿐만 아니라 금,은 등을 사용할수도 있고, 또는 다양한 합금을 가지고 케이블을 만들수도 있다. 일단 금은 전기 전도성도 뛰어나고 부식도 안되지만 그만큼 생산단가가 비싸다는 단점이 있다. 그래서 교체가 어려운 항공우주산업쪽에서만 특수 케이블을 제작할때 제한적으로 사용이 된다. 알루미늄은 과거에 많이 쓰이기는 했으나, 전기전도성이 상대적으로 많이 떨어져서 일반 전력선으로만 일부 사용이 된다. 비교적 동(구리)이 전기전도성이 뛰어나 신호의 손실을 최소화하고 뿐만 아니라 전기적 간섭에 뛰어나기 때문에 TV와 같은 가전제품 시스템에 널리 쓰인다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;5.6. 2세대 케이블망을  ___ 네트워크라 불린다.&lt;br/&gt;
→HFC(Hybrid Fiber Coax)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;HFC는 우리말로 광동축 혼합망이라 하는데, 쉽게 말해서 광케이블과 동축케이블을 함께 혼합해서 사용하는 통신망이라 볼 수 있다. 마치 전기모터와 내연기관을 같이 쓰는, 두개의 구동계를 함께 활용하는 하이브리드 자동차와 유사하다. 이로써 다양한 통신 서비스를 제공할 수 있지만 FTTH처럼 가정까지 광케이블을 직접 연결하는 방식에 비해 속도나 품질 면에서 약간의 제한이 있을 수 있다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;7.23. DHCP는   ___  서비스를 사용한다.&lt;br/&gt;
→ UDP(User Datagram Protocol)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;UDP는 연결이 필요없는 프로토콜로, 속도와 간편한 데이터 전송에 중점을 두고 있다.&lt;br/&gt;
실무에서 UDP를 사용하는 직접적인 이유는 단순하다. 바로 빠르게 네트워크 설정요청을 처리할 수 있기 때문이다. 클라이언트가 서버로 요청을 보내고, 서버가 응답하는 방식으로 IP주소를 할당하게 되는데, 이 과정에서 UDP를 사용하여 연결상태를 유지하게 된다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
</description><pubDate>Sat, 14 Sep 2024 01:30:00 +0900</pubDate><guid>http://blex.me/@smithsolution/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%A7%9D-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B43</guid></item><item><title>&lt;컴퓨터망&gt; 연습문제 풀이(2)</title><link>http://blex.me/@smithsolution/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%A7%9D-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B41</link><description>&lt;blockquote&gt;
&lt;p&gt;4.2. 만약 이더넷 목적지 주소가 07:01:02:03:04:05이면, 이것은  ___  주소이다.&lt;br/&gt;
→  멀티캐스트 또는 브로드캐스트&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이더넷에서 MAC주소의 첫 바이트중 가장 낮은 비트(LSB)가 1이면 멀티캐스트 또는 브로드캐스트 주소를 나타낸다(1대다 통신). 첫 바이트는 &lt;code&gt;07&lt;/code&gt;은 이진수로 &lt;code&gt;0000 0111&lt;/code&gt;이며, 가장 낮은 비트(LSB)가 1비트이므로, 멀티 캐스트 또는 브로드캐스트 임을 알 수 있다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.3. 만약 이더넷 주소 목적지가 08:07:06:05:44:33이면, 이것은  ___  주소이다.&lt;br/&gt;
→ 유니캐스트&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;같은 원리로 첫번째 바이트의 가장 낮은 비트(LSB)가 0이면, 유니캐스트이다.(1대1 통신)
&lt;code&gt;08&lt;/code&gt;은 이진수로 &lt;code&gt;0000 1000&lt;/code&gt;이며, LSB가 0이라 유니캐스트 주소를 나타낸다.
(※ WireShark로 Destination IP Address를 뜯어보았을 때, 첫바이트의 마지막 비트를 통해 유니캐스트 (주소)전송인지 멀티 또는 브로드캐스트 (주소)전송인지 유추할 수 있을 것이다)&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.4 다음중 어느 것이 이더넷의 멀티캐스트의 목적지 주소로 사용될 수 없는가?&lt;br/&gt;
(a)43:7B:6C:DE:10:00            (b)44:AA:C1:23:45:32&lt;br/&gt;
(c)47:56:21:1A:DE:F4        (d)48:32:21:21:4D:34&lt;br/&gt;
→ (d)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(d)의 첫번째 바이트를 이진수로 나타내면 다음과 같다.&lt;br/&gt;
&lt;code&gt;0100 1000&lt;/code&gt;이므로 첫번째 바이트가 0이며, 이는 유니캐스트 주소임을 유추해볼 수 있다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.5. 다음중 어느 것이 이더넷의 유니캐스트 목적지 주소로 사용될 수 있는가?&lt;br/&gt;
(a)B7:7B:6C:DE:10:00            (b)7B:AA:C1:23:45:32&lt;br/&gt;
(c)7C:56:21:1A:DE:F4        (d)83:32:21:21:4D:34&lt;br/&gt;
→ (c)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(c)의 첫번째 바이트를 이진수로 나타내면 다음과 같다.&lt;br/&gt;
&lt;code&gt;0111 1100&lt;/code&gt;이므로 첫번째 바이트가 0이며, 이는 유니캐스트 주소임을 유추해볼 수 있다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.7. ___ 부계층은 CSMA/CD 접근 방식과 프레임 짜기의 동작을 담당하고 있다.&lt;br/&gt;
→ MAC&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;프레임 짜기, 즉 Framing은 MAC계층에서 담당한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLC 부계층은 상위계층과의 인터페이스를 담당하며, 논리적인 링크제어와 흐름제어, 오류제어 등의 기능을 수행&lt;/li&gt;
&lt;li&gt;MAC 부계층은 데이터의 물리적 전송을 담당하며, CSMA/CD 접근 방식과 프레임 짜기를 다룬다. 또한 MAC주소를 사용하여 네트워크 내의 장치 간 통신을 제어한다.&amp;lt;
(또한 이 CSMA/CD 접근방식의 이더넷의 핵심으로, 유선망에서 많이 쓰이는 무작위 접근 프로토콜이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;4.10. 고속 이더넷은  ___  Mbps의 데이터율을 가진다.&lt;br/&gt;
(a)10           (b)100       (c)1000        (d)10,000
→ (b)100&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/12/202491221_1UuWrv4RHuyXxLcm5Xu4.png" src="/resources/media/images/content/2024/9/12/202491221_1UuWrv4RHuyXxLcm5Xu4.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.11.  ___  에서 자동협상은 두 장치가 동작 모드 또는 데이터율을 협상하도록 허용한다.&lt;br/&gt;
a)표준    b)고속 이더넷    c)기가비트 이더넷   d)10기가비트 이더넷&lt;br/&gt;
→ (c)기가비트 이더넷&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;자동협상(Autonegotiation)은 이더넷에서 두 장치가 서로의 속도와 동작모드를 협상하는 기능, 기가비트 이더넷에서 제공됨.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.15. 이더넷 주소에서, 만약 모든 비트가 1이면, 이 주소는  ___  이다.&lt;br/&gt;
→ 브로드캐스트&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;첫번째 바이트의 LSB가 1이면, 멀티캐스트 또는 브로드캐스트이다. 여기서 더 나아가 나머지 비트도 모두 1일경우에 이 주소를 브로드캐스트 주소이고, 그 이외의 경우에는 모두 멀티캐스트주소라 볼 수 있다.
&lt;br/&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/12/202491222_fMdZm1i7pELdtO6Zjkub.png" src="/resources/media/images/content/2024/9/12/202491222_fMdZm1i7pELdtO6Zjkub.png.preview.jpg" alt=""&gt;
&lt;br/&gt;
위 사진은 와이어샤크에서 요청패킷을 캡처한 것인데, 이처럼 &lt;code&gt;Destination: Broadcast(ff:ff:ff:ff:ff:ff)&lt;/code&gt; 으로 나와있으면 무조건 브로드캐스트 주소라 보면 된다.
&lt;br/&gt;
한가지 주의할 점은 이더넷 프레임에 헤더부분은 destination mac address는 요청신호일때 저렇게 &lt;code&gt;ff:ff:ff:ff:ff:ff:ff:ff&lt;/code&gt; 가 맞지만, 상위계층에서 내려온 데이터 부분은 &lt;code&gt;00:00:00:00:00:00:00:00&lt;/code&gt; 으로 되어있다는 것을 잊지 말자.
&lt;br/&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/12/202491222_81x1oRVR4DhC0dWwL3q8.png" src="/resources/media/images/content/2024/9/12/202491222_81x1oRVR4DhC0dWwL3q8.png.preview.jpg" alt=""&gt;
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.16. 이더넷에서,  ___ 필드는 실질적으로 물리층에 추가되고 이것은 프레임의 한 부분이 아니다.&lt;br/&gt;
→프리앰블&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이더넷 프레임에는 다양한 필드가 있는데, 그중에 중요한 필드가 바로 SFD(구분자)필드 앞에 있는 프리앰블 필드다. 쉽게 보면 맨 앞에 있는 거니까 (데이터에서 멀리있으니까) 맥계층보다는 물리계층이랑 더 가깝다. 그래서 이거는 물리계층에 추가되고, 이더넷 프레임의 한 부분이라고 보지는 않는 것 같다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.17. 이더넷 프레임에서,  ___  필드는 오류검출정보를 포함한다.&lt;br/&gt;
→ CRC&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CRC(순환중복검사, 또는 순환중복코드)는 아래그림과 같다.
&lt;br/&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/12/202491222_le8sa2KQJnzkLpjhVgJ3.png" src="/resources/media/images/content/2024/9/12/202491222_le8sa2KQJnzkLpjhVgJ3.png.preview.jpg" alt=""&gt;
&lt;br/&gt;
상위계층에서 내려온 데이터가 있어 여기다가 뒤에 보통 6개 정도의 제로비트를 채운다.&lt;br/&gt;
그리고 이를 Divisor라는 단말기에 넣고 돌린다. 그러면 이때 CRC값(나머지값)이 반환된다.&lt;br/&gt;
이 제로비트를 채우기 전의 데이터와 CRC값을 붙여서 전송한다. 그러면 이것이 Destination에 도착하니까, 수신자 호스트가 받게된다. &lt;br/&gt;
수신측에서는 이거를 또 Divisor라는 단말기에 넣고 돌린다. 그러면 기존에 원본 데이터에 append했던 6개의 제로비트가 나오게 된다. &lt;br/&gt;
&lt;strong&gt;만약 안나오면?&lt;/strong&gt; &lt;br/&gt;
보내진 데이터가 손상되었다는 의미로 받아들이고 해당 데이터를 폐기하고 재전송 요청을 보내게 된다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.18. 다음 유선과 무선 LAN의 설명 중 옳은 것은?  &lt;br/&gt;
a)둘 다 TCP/IP 프로토콜 그룹의 하위 두 계층에서 동작한다.&lt;br/&gt;
b)유선 LAN은 TCP/IP 프로토콜 그룹의 하위 두 계층에서 동작하고, 무선 LAN은 하위 세 계층에서 동작한다.&lt;br/&gt;
c)유선 LAN은 TCP/IP 프로토콜 그룹의 하위 세 계층에서 동작하고, 무선 LAN은 하위 두 계층에서 동작한다.&lt;br/&gt;
d)둘 다 TCP/IP 프로토콜 그룹의 하위 세 계층에서 동작한다.&lt;br/&gt;
→ (a)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;유/무선 랜 둘다, 네트워크 인터페이스 계층, 즉 물리계층과 데이터링크계층에서 작동하고 이 두 계층의 역할을 포함한다고 한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.19. IEEE는  ___  으로 불리는 물리층과 데이터 링크층을 포함하는 무선 LAN의 세부사항을 규정하였다.&lt;br/&gt;
a)IEEE 802.3&lt;br/&gt;
b)IEEE 802.5&lt;br/&gt;
c)IEEE 802.11&lt;br/&gt;
d)IEEE 802.2&lt;br/&gt;
→(c)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;무선 LAN은 와이파이라 추정할 수 있고, 이는 IEEE 802.11 표준을 사용한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.20. CSMA/CD 알고리즘은 무선 LAN에서 사용되지 않는데 그 이유는?&lt;br/&gt;
a)무선 호스트가 전이중 모드(duplex mode)로 작동하기 위한 충분한 전력을 가지고 있지 않아서&lt;br/&gt;
b)숨겨진 지국 문제 때문에&lt;br/&gt;
c)신호 감쇠로 한 지국(station)이 반대편에서 발생한 충돌을 감지할 수 없어서 &lt;br/&gt;
d)모두정답&lt;br/&gt;
→(d)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CSMA/CD는 충돌을 감지하는 알고리즘으로, 아래와 같은 이유로 802.11(WIFI) 같은 무선망에서는 사용되지 않고 무조건 802.3(이더넷) 같은 유선망에서만 사용된다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;첫번째 이유로 전력문제가 있다. 무선환경에서 전이중모드로 작동하기 위해서는 상당히 많은 전력이 소모되기 때문에, 이걸 쓰기에 전력공급에 부담이 간다.&lt;/li&gt;
&lt;li&gt;두번째 이유로 숨겨진 지국, 즉 예상치 못하게 탐지하지 못한 지국이 있을 수도 있기 때문인데, 이로 인해 A(station)과 B(station)사이에 통신중에 사전에 파악하지 못한 지국(station)으로 인해 두 호스트 간의 전송을 감지하지 못하게끔 방해가 일어날 수 있다.&lt;/li&gt;
&lt;li&gt;세번째 이유로 무선신호의 감쇠로 인해 충돌이 발생해도 이를 감지하지 못하는 문제가 발생할 수 있다.
&lt;br/&gt;
이러한 이유로 굳이 막대한 비용을 부담해 가면서 무선망에서까지 충돌을 감지할 필요가 없다는 것이다.
그러기 보다는 차라리 사전에 충돌을 예방하는 방향으로 솔루션을 마련하는 것이 더 중요하기 때문에 CSMA/CA방식으로 무선망에서 주로 쓰인다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;4.21. IEEE 802.11에서  ___  은 정지 혹은 이동 무선국과 선택적으로 접속점(AP)으로 알려진 중앙 기지국을 포함한다.&lt;br/&gt;
→BSS(Basic Service Set)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BSS는 하나의 지국(AP)과 그 아래 여러개의 지국을 묶어놓은 형태의 네트워크 세트이다.&lt;br/&gt;
BSS에는 &lt;code&gt;1)AP를 제외한 BSS&lt;/code&gt; 와 &lt;code&gt;2)AP를 포함한 BSS&lt;/code&gt;가 있다.&lt;br/&gt;
1)AP를 제외한 BSS: 애드혹 구조를 가지고 있음&lt;br/&gt;
2)AP를 포함한 BSS: 기반구조를 가지고 있음&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.24. IEEE 802.11에서 2개의 다른 BSS의 두 지국 간의 통신은 종종 2개의  ___ 을 통해 이루어진다.&lt;br/&gt;
→BSS전이&lt;br/&gt;
4.25. IEEE 802.11에서  ___ 이동이 가능한 지국은 정적이거나 BSS내에서만 움직인다.&lt;br/&gt;
→무전이&lt;br/&gt;
4.26. IEEE 802.11에서  ___ 이동이 가능한 지국은 하나의 BSS에서 다른 곳을 이동이 가능하지만 이동은 하나의 ESS내에서만 국한된다.&lt;br/&gt;
→BSS전이&lt;br/&gt;
4.27. IEEE 802.11에서  ___ 이동이 가능한 ESS간의 이동이 가능하다&lt;br/&gt;
→ESS전이&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/20249130_lxHIxTwFsPDQcAjB5C4c.png" src="/resources/media/images/content/2024/9/13/20249130_lxHIxTwFsPDQcAjB5C4c.png.preview.jpg" alt=""&gt;
&lt;br/&gt;
두 지국간의 통신을 그림으론 나타내어 본 것이다.&lt;br/&gt;
이렇게 비유해서 보면 쉬울 것 같다.&lt;br/&gt;
ESS(국가단위), BSS(지역단위)&lt;br/&gt;
한국과 일본이 통신을 한다면? ESS와 ESS간의 통신이기에 'ESS전이'이다.&lt;br/&gt;
(한국 안에서) 대구와 부산이 통신을 한다면? BSS와 BSS간의 통신이기에 'BSS전이'이다.&lt;br/&gt;
(대구 안에서) 복현동과 대현동이 통신을 한다면? BSS내에서만 국한된 통신이기에 '무전이'이다.&lt;br/&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.28. IEEE 802.11에서 분산 조정  함수(DCF)는 접속기법으로  ___  을 사용한다.&lt;br/&gt;
→ CSMA/CA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CSMA/CA는 충돌을 피하기 위해 신호를 감지하는 무선 LAN의 기본 프로토콜이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.29. IEEE 802.11에서 한 BSS의 지국에서 다른 BSS의 지국으로 프레임이 전달될 때, 주소 플래그는  ___  이다.&lt;br/&gt;
→ 10&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 경우 프레임이 전달될 때 두번째 주소 플래그는 1이고, 첫번째 주소 플래그는 0이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.30. IEEE 802.11에서 프레임이 AP에서 지국으로 이동할 때 주소 플래그는  ___  이다.
→ 01&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;프레임이 AP에서 지국으로 전달될 떄 두번쨰 주소 플래그는 1이고 첫번쨰 주소 플래그는 0이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.31. IEEE 802.11에서 프레임이 지국에서 AP로 이동할 떄 주소 플래그는  ___  이다.
→ 00&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;프레임이 지국에서 AP로 전달될 때 두번째 주소 플래그는 0이고, 첫번째 주소 플래그는 0이다.
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491311_KavaIW80EYCyDWuub8Hz.png" src="/resources/media/images/content/2024/9/13/202491311_KavaIW80EYCyDWuub8Hz.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.32. IEEE 802.11에서 프레임이 무선 분산 시스템의 한 AP에서 다른 AP로 이동할 때 주소 플래그는  ___  이다.
→ 11&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;29번과 32번에서 프레임의 전달시, 플래그 비트의 값은 다음과 같다.
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491311_U0EodeqzMlLKG4tF027a.png" src="/resources/media/images/content/2024/9/13/202491311_U0EodeqzMlLKG4tF027a.png.preview.jpg" alt=""&gt;&lt;/p&gt;
</description><pubDate>Fri, 13 Sep 2024 00:02:58 +0900</pubDate><guid>http://blex.me/@smithsolution/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%A7%9D-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B41</guid></item><item><title>&lt;컴퓨터망&gt; 연습문제 풀이(1)</title><link>http://blex.me/@smithsolution/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%A7%9D-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</link><description>&lt;blockquote&gt;
&lt;p&gt;3.2.  ___  는 지역주소이다. 그 범위는 지역 네트워크 내에 있다.&lt;br/&gt;
→ 링크층 주소&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;링크층 주소는 지역 네트워크에서 물리적인 네트워크 인터페이스에 할당된 고유한 주소로, 일반적으로 MAC주소를 나타낸다.&lt;br/&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491311_UztPnFD8JEgpUMAxrucL.png" src="/resources/media/images/content/2024/9/13/202491311_UztPnFD8JEgpUMAxrucL.png.preview.jpg" alt=""&gt;
링크층 주소(일명 맥주소)는 로컬 네트워크 내의 통신에 사용되며, 네트워크 간 통신에 사용되는 IP주소와 구분된다.&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;참고로, 논리주소는 IP주소처럼 네트워크 계층에서 사용되는 주소라고 한다. 둘다 네트워크 계층에서 호스트나 장치를 식별하는데 쓰이기 때문에 거의 구분하지 않고 같은 걸로 보기도 한다고 한다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3.3. 만약 송신자가 호스트이고, 같은 네트워크에 있는 다른 호스트로 패킷을 전송하고자 하면, 물리주소와 매핑되는 논리주소는  ___  이다.&lt;br/&gt;
a) 데이터그램 헤더 안에 있는 목적지 IP주소&lt;br/&gt;
b) 라우팅 테이블에서 찾을 수 있는 라우터의 IP주소&lt;br/&gt;
c)발신지 IP주소&lt;br/&gt;
d)정답 없음&lt;br/&gt;
→ (c)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;데이터그램 헤더안에는 패킷이 전달될 최종목적지의 IP주소가 포함되는데 이 주소는 맥주소와 달리, 패킷이 어느 호스트로 전달되어야 하는지를 결정한다.
&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491311_raEwHzgk4UCUGumCj6Bz.png" src="/resources/media/images/content/2024/9/13/202491311_raEwHzgk4UCUGumCj6Bz.png.preview.jpg" alt=""&gt;
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3.4. 만약 송신자가 호스트이고 다른 네트워크에 있는 다른 호스트로 패킷을 전송하고자 할 때, 물리 주소와 매핑되는 논리 주소는  ___  이다.&lt;br/&gt;
a) 데이터그램 헤더 안에 있는 목적지 IP주소&lt;br/&gt;
b) 라우팅 테이블에서 찾을 수 있는 라우터의 IP주소&lt;br/&gt;
c) 발신지 IP주소&lt;br/&gt;
d) 정답없음&lt;br/&gt;
→  (b)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491314_SR2tSMHOdD7YJGmHR8zs.png" src="/resources/media/images/content/2024/9/13/202491314_SR2tSMHOdD7YJGmHR8zs.png.preview.jpg" alt=""&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;패킷이 다른 네트워크로 전달되려면 라우터를 거쳐야 한다. 이때 패킷의 최종 목적지는 목적지 IP주소이지만!! 다른 네트워크로 전달되기 위해서는 일단 중간에 거쳐야 하는 라우터의 IP주소를 알아야 한다. 우리가 미국으로 가려면 비행기를 필수적으로 타야하고, 그러면 일단 공항의 위치가 어디인지 알아야 하는 것처럼!(이 라우터가 공항이자 비행기이다!)&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;위 문제는 라우팅 테이블의 역할을 알고 있는지 간접적으로 물어보는 문제이다.&lt;br/&gt;
라우터의 IP주소는 맥주소와 매핑되며, 라우팅 테이블을 통해 찾을 수 있다.&lt;br/&gt;
&lt;br/&gt;
※라우팅 테이블의 역할&lt;br/&gt;
: 라우팅 테이블은 네트워크에서 패킷을 올바른 목적지로 전달하기 위한 경로정보를 저장하는 표이다. 라우터나 네트워크 장치에 위치하며 다음과 같은 역할을 한다.&lt;br/&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;경로선택&lt;/li&gt;
&lt;li&gt;네트워크 경로 관리&lt;/li&gt;
&lt;li&gt;게이트웨이 지정&lt;/li&gt;
&lt;li&gt;매트릭 관리
&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;3.5. 송신자는 다른 네트워크에 있는 호스트로 향하는 데이터그램을 수신한 라우터이다. 물리 주소와 매핑되는 논리주소는  ___  이다.&lt;br/&gt;
a) 데이터그램 헤더 안에 있는 목적지 IP주소&lt;br/&gt;
b) 라우팅 테이블에서 찾을 수 있는 라우터의 IP주소&lt;br/&gt;
c) 발신지 IP주소&lt;br/&gt;
d) 정답없음&lt;br/&gt;
→ (a)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491315_Lk2rjBPonYTeSIBcYHfn.png" src="/resources/media/images/content/2024/9/13/202491315_Lk2rjBPonYTeSIBcYHfn.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;라우터는 다른 네트워크로 향하는 데이터그램을 수신한다. 목적지 IP주소는 최종 호스트를 나타낸다. 따라서 맥주소와 매핑되는 논리주소는 &amp;quot;데이터그램 헤더 안에 있는 목적지 IP주소&amp;quot;인 것이다.
&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3.6. 송신자는 동일한 네트워크에 있는 호스트로 향하는 데이터그램을 수신한 라우터이다. 물리주소와 매핑되는 논리 주소는  ___  이다.&lt;br/&gt;
a) 데이터그램 헤더 안에 있는 목적지 IP주소&lt;br/&gt;
b) 라우팅 테이블에서 찾을 수 있는 라우터의 IP주소&lt;br/&gt;
c) 발신지 IP주소&lt;br/&gt;
d) 정답없음&lt;br/&gt;
→ (a)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/9/13/202491315_L4jMmehmNwNJVUo31UBg.png" src="/resources/media/images/content/2024/9/13/202491315_L4jMmehmNwNJVUo31UBg.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;논리주소는 주로 IP주소를 가리키며, 네트워크 계층에서 패킷의 목적지를 나타낸다. 데이터그램 헤더에 포함된 목적지 IP주소는 패킷이 전달될 대상 호스트의 논리주소를 나타낸다.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3.9. 데이터 링크층에서 패킷을 일반적으로  ___ 라고 부른다.&lt;br/&gt;
→  데이터그램&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OSI7계층에서 보통 패킷을 다음과 같이 부른다.&lt;br/&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;물리계층 → 비트(열)&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;데이터링크계층 → 프레임&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;네트워크계층 → 데이터그램&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;전송계층 → 세그먼트&lt;br/&gt;
cf.참고로 전송계층 프로토콜에는 TCP(연결지향프로토콜)와 UDP(비연결지향프로토콜)가 있는데,&lt;br/&gt;
TCP에서는 패킷이 세그먼트라 불리우고, UDP에서는 패킷이 데이터그램이라 불리운다.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;3.15. 다음 중 단일 비트 오류에 대해 가장 잘 설명한 것은?&lt;br/&gt;
a) 단일 비트가 반전되어 있다.&lt;br/&gt;
b) 매 전송마다 단일 비트가 반전되어 있다.&lt;br/&gt;
c) 매 데이터 단위마다 단일 비트가 반전되어 있다.&lt;br/&gt;
d) 모두 정답&lt;br/&gt;
→ (a)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;아래와 같은 이유로 단일 비트가 반전되는 상황이 발생한다.&lt;br/&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;노이즈&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;하드웨어 결함&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;전기적 간섭(깁스현상)&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><pubDate>Thu, 12 Sep 2024 18:31:24 +0900</pubDate><guid>http://blex.me/@smithsolution/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%A7%9D-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</guid></item><item><title>데이터 과학자와 기계학습 엔지니어라면 주목! 이들을 위한 최고의 도구, Kaggle에 대해 알아보자!</title><link>http://blex.me/@smithsolution/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%BC%ED%95%99%EC%9E%90%EC%99%80-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%9D%BC%EB%A9%B4-%EC%A3%BC%EB%AA%A9-%EC%9D%B4%EB%93%A4%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%B5%9C%EA%B3%A0%EC%9D%98-%EB%8F%84%EA%B5%AC-kaggle%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</link><description>&lt;p&gt;학교에서 데이터과학을 배우시거나 저처럼 머신러닝 딥러닝 같은 기계학습에 관심을 갖고 공부를 하고 계시나요?
데이터를 분석하고 모델을 개발하며 다양한 프로젝트 경험을 해보고 싶나요? 그렇다면 오늘부터 해당 사이트에 들어가 어떤게 있는지 탐색해보시길 추천합니다!
&lt;a href="https://www.kaggle.com/"&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/1/28/202412814_rGHiDBP3ovB8cztcuFfG.png" src="/resources/media/images/content/2024/1/28/202412814_rGHiDBP3ovB8cztcuFfG.png.preview.jpg" alt="kaggle"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="kaggle은-어떤-곳인가요"&gt;Kaggle은 어떤 곳인가요?&lt;/h4&gt;&lt;p&gt;캐글(Kaggle)은 전세계의 데이터 과학자나 기계 학습 엔지니어를 위한 커뮤니티 및 플랫폼입니다.
이 플랫폼은 다음과 같은 장점을 갖고 있습니다.&lt;/p&gt;
&lt;h6 id="데이터셋과-대회"&gt;🏆데이터셋과 대회&lt;/h6&gt;&lt;p&gt;다양한 데이터셋과 대회에서 경험을 쌓으며 실력을 향상시킬 수 있습니다. 대회에서 좋은 성적을 거두면 상금을 받을수도 있죠!&lt;/p&gt;
&lt;h6 id="데이터-과학-학습"&gt;🤓데이터 과학 학습&lt;/h6&gt;&lt;p&gt;캐글은 학습 리소스와 강의를 통해 데이터 과학 및 기계 학습에 대한 지식을 습득하는데 도움을 줍니다.&lt;/p&gt;
&lt;h6 id="커널-공유"&gt;📤커널 공유&lt;/h6&gt;&lt;p&gt;여러분의 데이터 분석 작업을 다른 사용자와 공유하고, 다른 사람의 작업에서 배울 수도 있죠!&lt;/p&gt;
&lt;h6 id="커뮤니티"&gt;💡커뮤니티&lt;/h6&gt;&lt;p&gt;캐글의  커뮤니티는 여러분이 궁금한 질문을 물어보고 전문가들과 소통하는 하나의 활발한 장입니다.&lt;/p&gt;
&lt;h6 id="프로젝트-공유"&gt;🚀프로젝트 공유&lt;/h6&gt;&lt;p&gt;깃허브처럼 여러분의 데이터셋과 모델을 호스팅하고 다른 사용자와 협업을 할 수 있습니다.&lt;/p&gt;
&lt;h4 id="그러면-왜-캐글을-선택해야-할까요"&gt;그러면 왜 캐글을 선택해야 할까요?&lt;/h4&gt;&lt;p&gt;캐글은 데이터과학 프로젝트를 가속화하는데 필요한 모든 도구와 리소스를 제공합니다. 여기에서 데이터과학을 배우고 발전시키며, 놀라운 프로젝트를 시작할 수도 있죠!&lt;/p&gt;
&lt;h4 id="깃허브처럼-리소스를-공유하는-사이트아닌가요-어"&gt;깃허브처럼 리소스를 공유하는 사이트아닌가요? 어떤 차이점이 있죠?&lt;/h4&gt;&lt;p&gt;캐글은 데이터 과학 및 기계학습 프로젝트에 특화되어 있다고 말할 수 있을 것 같습니다. 깃허브는 주로 소프트웨어 개발 및 프로젝트 협업을 위한 플랫폼으로 사용이 됩니다. 두 플랫폼은 각자의 목적과 컨텐츠에 따라 다양한 사용  사례를 제공하며, 프로젝트의 성격에 따라 선택할 수 있습니다.&lt;/p&gt;
</description><pubDate>Sun, 28 Jan 2024 14:20:47 +0900</pubDate><guid>http://blex.me/@smithsolution/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%BC%ED%95%99%EC%9E%90%EC%99%80-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%9D%BC%EB%A9%B4-%EC%A3%BC%EB%AA%A9-%EC%9D%B4%EB%93%A4%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%B5%9C%EA%B3%A0%EC%9D%98-%EB%8F%84%EA%B5%AC-kaggle%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</guid></item><item><title>당신의 웹사이트에 지도 및 지리 정보를 활용해 넣고 싶다면? "simplemaps"에 들어가 보세요!</title><link>http://blex.me/@smithsolution/%EB%8B%B9%EC%8B%A0%EC%9D%98-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%97%90-%EC%A7%80%EB%8F%84-%EB%B0%8F-%EC%A7%80%EB%A6%AC-%EC%A0%95%EB%B3%B4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%84%A3%EA%B3%A0-%EC%8B%B6%EB%8B%A4%EB%A9%B4-simplemaps%EC%97%90-%EB%93%A4%EC%96%B4%EA%B0%80-%EB%B3%B4%EC%84%B8%EC%9A%94</link><description>&lt;p&gt;&lt;a href="https://simplemaps.com/"&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/1/14/202411419_N5qMaNizYaIZFjVE9JYW.png" src="/resources/media/images/content/2024/1/14/202411419_N5qMaNizYaIZFjVE9JYW.png.preview.jpg" alt="simplemaps"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;이곳에서 간편하게 맞춤형 지도를 생성하고, 지리 데이터를 활용하여 사용자 경험을 향상시킬 수 있습니다!&lt;/p&gt;
&lt;h2 id="simplemapscom를-통해-제공되는-기능"&gt;SimpleMaps.com를 통해 제공되는 기능과 혜택&lt;/h2&gt;&lt;h4 id="-맞춤형-지도-생성"&gt;✨ 맞춤형 지도 생성&lt;/h4&gt;&lt;p&gt;simpleMaps에서는 사용자가 원하는 위치 및 데이터를 기반으로 지도를 생성할 수 있습니다. 이를 통해 사용자는 웹사이트, 앱, 보고서 또는 다른 매체에 사용할수 있는 맞춤형 지도를 만들 수 있습니다..&lt;/p&gt;
&lt;h4 id="-다양한-지리-데이터"&gt;🗺️ 다양한 지리 데이터&lt;/h4&gt;&lt;p&gt;SimpleMaps에서는 다양한 지리 데이터와 API를 제공합니다.
이러한 데이터는 나라, 주, 도시, 지역 및 다른 지릭적 특성에 관한 정보를 포함할 수 있습니다.
(저는 개인적으로 파이썬으로 데이터 분석웹앱을 만들때, streamlit이라는 라이브러리를 애용합니다. 개인적으로 데이터분석 웹앱을 만드는게 주목적이라면, 다양한 라이브러리를 이용해서 만들수 있겠지만, 구현 난이도는 다음과 같은 것 같습니다. 장고(상)&amp;gt;플라스크(중)&amp;gt;streamlit(하), 그만큼  streamlit으로 데이터분석 웹앱을 구현하기가 매우 쉬운데요! 나중에 제가 운영하는 소모임의 인원에 대한 출신 데이터를 시각화할때, 해당 API를 끌어다 쓸까 생각중입니다. ㅎㅎ&lt;/p&gt;
&lt;h4 id="-지도-스타일링"&gt;🎨 지도 스타일링&lt;/h4&gt;&lt;p&gt;사용자는 원하는 스타일로 지도를 커스터마이징할 수 있습니다. 색상, 텍스트, 아이콘 등을 변경하여 지도를  자신의 브랜드 또는 프로젝트에 맞게 꾸밀 수 있습니다.&lt;/p&gt;
&lt;h4 id="-지도-플러그인"&gt;🔌 지도 플러그인&lt;/h4&gt;&lt;p&gt;SimpleMaps에서는 웹사이트 또는 앱에 쉽게 통합할 수 있는 지도 플러그인을 제공합니다.
이를 사용하면 사용자 위치를 시각화하고 지도 기능을 웹사이트에 추가할 수 있습니다.&lt;/p&gt;
&lt;h4 id="-데이터-시각화"&gt;📊 데이터 시각화&lt;/h4&gt;&lt;p&gt;지리 정보를 효과적으로 시각화하고 분석할 수 있는 다양한 도구 및 차트를 제공합니다.&lt;/p&gt;
</description><pubDate>Sun, 14 Jan 2024 19:52:16 +0900</pubDate><guid>http://blex.me/@smithsolution/%EB%8B%B9%EC%8B%A0%EC%9D%98-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%97%90-%EC%A7%80%EB%8F%84-%EB%B0%8F-%EC%A7%80%EB%A6%AC-%EC%A0%95%EB%B3%B4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%84%A3%EA%B3%A0-%EC%8B%B6%EB%8B%A4%EB%A9%B4-simplemaps%EC%97%90-%EB%93%A4%EC%96%B4%EA%B0%80-%EB%B3%B4%EC%84%B8%EC%9A%94</guid></item><item><title>라우팅을 편하게!, CIDR로 더 효율적인 네트워크 환경을 경험해보세요!</title><link>http://blex.me/@smithsolution/%EB%9D%BC%EC%9A%B0%ED%8C%85%EC%9D%84-%ED%8E%B8%ED%95%98%EA%B2%8C-cidr%EB%A1%9C-%EB%8D%94-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%99%98%EA%B2%BD%EC%9D%84-%EA%B2%BD%ED%97%98%ED%95%B4%EB%B3%B4%EC%84%B8%EC%9A%94</link><description>&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/1/14/202411419_9tZE35QJyNjMVYhCdJvA.png" src="/resources/media/images/content/2024/1/14/202411419_9tZE35QJyNjMVYhCdJvA.png.preview.jpg" alt="Master CIDR Block"&gt;&lt;/p&gt;
&lt;p&gt;네트워크를 공부하고 있다면 주목해주세요! 여러분 혹시 CIDR이라고 들어보셨나요?
아마 IT계열이라고 하더라도 정보통신쪽에 종사하시는 분이 아니라면 생소한 단어이실 것 같습니다. 오늘은 좀 다른 지식이긴 하지만 그래도 한번쯤 교양으로 알아두면 좋을 것 같아 이렇게 소개해드릴려고 합니다!&lt;/p&gt;
&lt;h2 id="cidr이란"&gt;CIDR이란?&lt;/h2&gt;&lt;p&gt;&amp;quot;Classless Inter-Domain Routing&amp;quot;의 약자로,IP주소를 효율적으로 관리하고 라우팅을 단순화하기 위한 주소할당방식입니다. 아마 AWS로 서버관리를 조금 해보셨다면 한번쯤 단어를 들어보셨을 것 같습니다. 예전에 저는 네트워크 관리사를 준비하면서 네트워크 체계에서 네트워크 ID, 주소등을 구하는 방법에 대해서 배웠었는데, 이제는 네트워크 상에서 주소할당방식도 트렌드가 바뀐 것 같습니다.&lt;/p&gt;
&lt;p&gt;그러면 왜 이렇게 트랜드가 바뀐 걸까요? 기존에 어떤 문제가 있어서 이렇게 변화하게 된걸까요?&lt;/p&gt;
&lt;h4 id="기존-ip주소-할당-방식의-문제점"&gt;기존 IP주소 할당 방식의 문제점&lt;/h4&gt;&lt;h4 id="1클래스-기반-할당의-제한"&gt;1.클래스 기반 할당의 제한&lt;/h4&gt;&lt;p&gt;이전에는 IP주소를 A,B,C 클래스로 나누어 할당했습니다. 이로 인해 작은 네트워크에는 큰 주소 범위가 할당되어 낭비가 발생했습니다.&lt;/p&gt;
&lt;h4 id="2유연성-부족"&gt;2.유연성 부족&lt;/h4&gt;&lt;p&gt;클래스 기반 할당은 네트워크 크기가 변경될 때 유연한 대응이 어려웠습니다.&lt;/p&gt;
&lt;p&gt;그럼 CIDR은 어떤 점이 좋을까요?&lt;/p&gt;
&lt;h4 id="cidr의-특징과-이점"&gt;CIDR의 특징과 이점&lt;/h4&gt;&lt;h4 id="1cidr표기법"&gt;1.CIDR표기법&lt;/h4&gt;&lt;p&gt;CIDR의 표기법에 대해 주목할 필요가 있는데요! CIDR은 IP주소를 더 효과적으로 표현할 수 있도록 도입된 표기법입니다. 예를 들어 &amp;quot;192.168.1.0/24&amp;quot;는 네트워크 주소가 &amp;quot;192.168.1.0&amp;quot;이고 서브넷 마스크가 24비트인 것을 의미합니다. 참고로 CIDR을 계산하는 방법은 아래 링크를 통해 배우실 수 있습니다.
&lt;a href="https://kim-dragon.tistory.com/154"&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/1/14/202411419_agZwIBsvYut4rAdA43ds.png" src="/resources/media/images/content/2024/1/14/202411419_agZwIBsvYut4rAdA43ds.png.preview.jpg" alt="이미지를 누르면 링크로 들어가집니다"&gt;&lt;/a&gt;
&lt;div style="text-align: center;"&gt;(이미지를 누르면 링크로 들어가집니다)&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;근데 만약 저처럼 원리는 몰라도 되고, 그냥 계산해서 결과값만 얻고 싶다면 아래 계산기를 이용해보세요!
&lt;a href="https://www.ipaddressguide.com/"&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2024/1/14/202411419_M25W4uL43Nb2f2f6yOUL.png" src="/resources/media/images/content/2024/1/14/202411419_M25W4uL43Nb2f2f6yOUL.png.preview.jpg" alt="ipaddressguide"&gt;&lt;/a&gt;
&lt;div style="text-align: center;"&gt;(이미지를 누르면 링크로 들어가집니다)&lt;/div&gt;&lt;/p&gt;
&lt;h4 id="2가변-길이-서브넷-마스크"&gt;2.가변 길이 서브넷 마스크&lt;/h4&gt;&lt;p&gt;CIDR에서는 서브넷 마스크의 길이를 조절하여 유연하게 IP주소를 할당할 수 있습니다. 더 작은 네트워크에는 더 짧은 서브넷 마스크를 사용하고, 큰 네트워크에는 긴 서브넷 마스크를 사용할 수 있습니다.&lt;/p&gt;
&lt;h4 id="3효율적인-주소-공간-활용"&gt;3.효율적인 주소 공간 활용&lt;/h4&gt;&lt;p&gt;CIDR을 사용하면 필요한 만큼의 IP주소만 할당할 수 있어 낭비를 최소화합니다.&lt;/p&gt;
&lt;h4 id="4라우팅-효율성"&gt;4.라우팅 효율성&lt;/h4&gt;&lt;p&gt;CIDR은 라우터에서 라우팅 테이블을 관리할 때 효율적입니다. 여러 개의 IP주소를 하나의 라우팅 엔트리로 표현하여 라우팅 테이블의 크기를 줄이고 관리를 쉽게 합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CIDR은 현대 네트워크 관리의 핵심이 되어, 더욱 효율적이고 지능적인 네트워크를 구축하는데 도움을 줍니다. 여러분의 비즈니스 관리와 프로젝트에서 CIDR을 도입해 더 나은 네트워크 성능을 경험해보세요!&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Sun, 14 Jan 2024 19:26:35 +0900</pubDate><guid>http://blex.me/@smithsolution/%EB%9D%BC%EC%9A%B0%ED%8C%85%EC%9D%84-%ED%8E%B8%ED%95%98%EA%B2%8C-cidr%EB%A1%9C-%EB%8D%94-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%99%98%EA%B2%BD%EC%9D%84-%EA%B2%BD%ED%97%98%ED%95%B4%EB%B3%B4%EC%84%B8%EC%9A%94</guid></item><item><title>Ajax란 무엇인가?</title><link>http://blex.me/@smithsolution/ajax%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link><description>&lt;h2 id="ajax란-무엇인가"&gt;Ajax란 무엇인가?&lt;/h2&gt;&lt;p&gt;Ajax는&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Asynchronous
Javascript
And
XML&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;의 약자로서, &amp;quot;서버와 비동기적으로 데이터를 주고받는 자바스크립트 기술&amp;quot;을 의미하는데,
이 얘기를 처음 들어보셨다면, 너무 추상적일거라 예상이 됩니다.&lt;/p&gt;
&lt;h2 id="ajax를-이해하기-위한-사전지식-서버"&gt;ajax를 이해하기 위한 사전지식 - 서버&lt;/h2&gt;&lt;p&gt;그래서! 비유를 통해 설명드리기에 앞서 다음과 같은 사전지식들을 알고 있어야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;quot;바로 서버입니다!&amp;quot;
&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238118_oLoVRQ0KNyCPdLoySCdt.png" src="/resources/media/images/content/2023/8/1/20238118_oLoVRQ0KNyCPdLoySCdt.png.preview.jpg" alt=""&gt;
서버는 비유하자면, 은행창구와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238118_E9LHajgYW968kXnqRZK1.png" src="/resources/media/images/content/2023/8/1/20238118_E9LHajgYW968kXnqRZK1.png.preview.jpg" alt=""&gt;
&lt;br/&gt;
우리가 창구에 가서 내 돈 찾아달라고 하면, 내 계좌에 있는 돈을 주겠죠?
이때 이걸 클라이언트에서 서버에게 데이터를 달라고 요청하면,
서버에서 그에 맞게 데이터를 주는 것으로 응답하는 것과 같다고 볼 수 있습니다.
예를 들어 보도록 하겠습니다.&lt;/p&gt;
&lt;h2 id="서버의-예시"&gt;서버의 예시&lt;/h2&gt;&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238118_YKI1vcRco744ibnfrQqT.png" src="/resources/media/images/content/2023/8/1/20238118_YKI1vcRco744ibnfrQqT.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;자! 그러면 네이버 웹툰 서버는 뭘까요?
클라이언트가 웹툰 달라고  요청하면 서버는 웹툰을 주는 역할(응답)을 하죠.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238118_a2AIXsOcWu1g2jeUmvcD.png" src="/resources/media/images/content/2023/8/1/20238118_a2AIXsOcWu1g2jeUmvcD.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;그러면! 인스타 서버는요?
클라이언트가 &amp;quot;내 인스타 사진 보여주세요&amp;quot;라고 요청을 보내오면, 서버가 그에 맞게 인스타사진을 던져주는 역할(응답)을 하죠.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238118_ikeSExE2PaN8N7VCYKLL.png" src="/resources/media/images/content/2023/8/1/20238118_ikeSExE2PaN8N7VCYKLL.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;그러면! 토스서버는요?
클라이언트가 나의 게좌정보를 달라고 요청하면 서버는 유저의 계좌정보를 주는 역할(응답)을 하죠.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_nHRovln3u4hbsHEcBvkB.png" src="/resources/media/images/content/2023/8/1/20238119_nHRovln3u4hbsHEcBvkB.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;유튜브 서버도 마찬가지겠죠? 영상 달라고 요청하면 영상을 서버에서 던져주게 됩니다.(응답)&lt;/p&gt;
&lt;h2 id="서버한테-싸가지없이-달라고-하면-안줍니다"&gt;서버한테 싸가지없이 달라고 하면 안줍니다&lt;/h2&gt;&lt;p&gt;자! 그런데 여기서부터가 문제입니다! 클라이언트가 그냥 싸가지 없이 달라고 하면 서버는 무시하고 안줍니다.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_8U6U98rOx5TUtKEL1VWc.png" src="/resources/media/images/content/2023/8/1/20238119_8U6U98rOx5TUtKEL1VWc.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;서버도 하나의 프로그램이기 떄문에, 정해진 양식에 맞춰 보내진 요청에만 응답하도록 규칙이 되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_0IrGuJXCsWVYK4f5VDZO.png" src="/resources/media/images/content/2023/8/1/20238119_0IrGuJXCsWVYK4f5VDZO.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;그래서 정확한 양식에 맞춰서 달라고 요청서를 보내야 합니다.&lt;/p&gt;
&lt;h2 id="요청서-작성하는-법feat-서버한테-싸가지-있"&gt;요청서 작성하는 법(feat. 서버한테 싸가지 있게 요청하는 법)&lt;/h2&gt;&lt;p&gt;그 요청서가 뭐냐면요!
바로 아래 양식에 맞춰 요청서를 짜면 됩니다.
위에서 말한 첫번째 조건에는 대표적으로 &amp;quot;&lt;a href="http://www.naver.com"&gt;www.naver.com&lt;/a&gt;&amp;quot; 이 있을 겁니다. 그러면! get요청을 보내는 방법에는 무엇이 있을까요?
&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_RdjKipPmLhl9lYDkNRqn.png" src="/resources/media/images/content/2023/8/1/20238119_RdjKipPmLhl9lYDkNRqn.png.preview.jpg" alt=""&gt;
&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_mbcNnCSSvvFMgIRPbb7p.png" src="/resources/media/images/content/2023/8/1/20238119_mbcNnCSSvvFMgIRPbb7p.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;단점: 전부 브라우저가 새로고침됨(사용자가 보기에 시각적으로 별로다)&lt;/p&gt;
&lt;p&gt;첫번째 방법은 일일이 입력해야 해서 귀찮고, 두번째 방법은 요청보낼따마다 브라우저에 내용을 처음부터 다시 그리는 문제가 발생하니까 싫다고 하면 3번째 방법을 쓰여야 합니다.
-&amp;gt;그게 바로 Ajax로 get요청을 보내는 겁니다.&lt;/p&gt;
&lt;h2 id="그래서-ajax가-쉽게-말해서-뭔냐면요"&gt;그래서 Ajax가 쉽게 말해서 뭔냐면요?!&lt;/h2&gt;&lt;p&gt;Ajax는 쉽게 말해서 &amp;quot;새로고침 없이 서버에게 get요청하는 쪼그만한 js코드&amp;quot;라고 보시면 됩니다.
그럼 뭐가 좋을까요?(what is advantage?)
장점: 새로고침이 없으니까 웹페이지 전환이 부드러워집니다.&lt;/p&gt;
&lt;p&gt;네이버 같은 경우에도 2006년 이전 버전의 &lt;a href="https://web.archive.org/web/20040926050258/http://www.naver.com/"&gt;옛날페이지&lt;/a&gt;에서는 이벤트가 발생할때마다 항상 화면이 새롭게 그려지는 문제가 있었으나, &lt;a href="https://www.naver.com/"&gt;그 이후&lt;/a&gt;로는 ajax비동기 통신으로 화면전환이 부드럽게 되어지게 되었습니다.&lt;/p&gt;
&lt;h2 id="실제-api서버에서-데이터-받아오기"&gt;실제 API서버에서 데이터 받아오기&lt;/h2&gt;&lt;p&gt;아래 링크를 실제 API서버의 링크입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://codingapple1.github.io/price.json"&gt;https://codingapple1.github.io/price.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;안에 들어가면 { &amp;quot;price&amp;quot;: 5000 }이 있습니다.
이를 받아오는 방법은 위와 같이 3가지일 겁니다.
1&amp;gt; 브라우저 url입력칸에 입력하기
2&amp;gt; 버튼으로 GET요청하기
3&amp;gt;ajax로 GET요청 보내기
여기서는 3번쨰 방법에 대해서만 다뤄보도록 하겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;옛날방식
&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_EMZd2ZuE4ucLA3Sg5ECs.png" src="/resources/media/images/content/2023/8/1/20238119_EMZd2ZuE4ucLA3Sg5ECs.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;요즘 방식
&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_i3g4EJQJl8IKfo2lznYP.png" src="/resources/media/images/content/2023/8/1/20238119_i3g4EJQJl8IKfo2lznYP.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;외부 라이브러리를 쓰는 방식(JQuery 라이브러리)
&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_s0KP3EZJWGRumamF4Uzl.png" src="/resources/media/images/content/2023/8/1/20238119_s0KP3EZJWGRumamF4Uzl.png.preview.jpg" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※리액트나 Vue같은 프론트엔드 프레임워크에서는 axios라는 키워드를 사용하여 ajax를 구현하기도 합니다.)&lt;/p&gt;
&lt;h2 id="실무에서-ajax를-쓰다보면-겪게되는-문제점"&gt;실무에서 AJAX를 쓰다보면 겪게되는 문제점&lt;/h2&gt;&lt;p&gt;실무에서 ajax를 쓰다보면 항상 브라우저의 CORS정책 때문에 데이터유입이 막히게 되는 것을 자주 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/8/1/20238119_mwMPqNciX9X68NkwNcZU.png" src="/resources/media/images/content/2023/8/1/20238119_mwMPqNciX9X68NkwNcZU.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;이 부분에 대해서 자세히 알아보고 싶으시면 아래 링크를 참고해주시면 감사하겠습니다.
&lt;a href="https://evan-moon.github.io/2020/05/21/about-cors/"&gt;CORS는 왜 이렇게 우리를 힘들게 하는 걸까?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;출처: &lt;a href="https://www.youtube.com/watch?v=nKD1atl6cAw&amp;amp;t=292s"&gt;https://www.youtube.com/watch?v=nKD1atl6cAw&amp;amp;t=292s&lt;/a&gt;
참고:
&lt;a href="https://www.youtube.com/watch?v=avfIUwDG2d8"&gt;https://www.youtube.com/watch?v=avfIUwDG2d8&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=U_ICTI-1DBc&amp;amp;t=7s"&gt;https://www.youtube.com/watch?v=U_ICTI-1DBc&amp;amp;t=7s&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Tue, 01 Aug 2023 19:28:58 +0900</pubDate><guid>http://blex.me/@smithsolution/ajax%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid></item><item><title>왜 ChatGPT로 영어를 배워야 하는가?</title><link>http://blex.me/@smithsolution/%EC%99%9C-chatgpt%EB%A1%9C-%EC%98%81%EC%96%B4%EB%A5%BC-%EB%B0%B0%EC%9B%8C%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80</link><description>&lt;p&gt;최근 생성형 AI라 주로 불리는, GPT모델 기반의, 챗GPT가 인기를 얻고 있는데요,
이에 따라 영어학습에 있어서 인공지능을 활용한 다양한 시도들이 이루어지고 있습니다.
그 중, 주목을 받고 있는 &amp;lt;챗GPT를 이용한 영어 배우기&amp;gt;의 장점과 효과 및 활용에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;그에 앞서, GPT모델의 기반이 되는 프롬프트 엔지니어링에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h2 id="프롬프트-엔지니어링이란"&gt;프롬프트 엔지니어링이란?&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;프롬프트 엔지니어링이란 언어모델을 사용하여, 텍스트 프롬프트를 입력했을때 사용자가 원하는 결과를 스스로  생성할 수 있도록 유도하는 기술입니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;사용자는 프롬프트에 입력하는 텍스트를 통해 원하는 문장, 답변 소설 등 다양한 결과를 얻을 수 있습니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bard와 같은 다양한 GPT모델 인공지능이 있지만, 챗GPT만 봐도 프롬프트 엔지니어링은 사용자 친화적인데요, 이는 챗봇이 가져야 할 필수 인터렉션 방식인 대화형 사용자 경험(CUX:Conversational UX)이 적용되었기 때문입니다. 뿐만 아니라 고퀄리티의 챗봇 서비스를 구축하기 위햇서는 적절한 패턴과 유형의 Agent Interaction을 고려하여 설계해야 하며, 대화의 목적에 맞는 Conversation Scenario를 구성하도록 해야 합니다.그러면 이제 이 ChatGPT를 어떻게 나의 입맛에 맞게 튜닝을 할 것인지에 대해 알아보도록 하겠습니다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="chatgpt커스터마이징을-위한-템플릿대화형식"&gt;ChatGPT커스터마이징을 위한 템플릿(대화형식)&lt;/h2&gt;&lt;h6 id="1격식비격식-표현"&gt;(1)격식/비격식 표현&lt;/h6&gt;&lt;p&gt;교수님께 이메일을 보내야 하는 상황에서 격식표현의 이메일 내용을 생성해보도록 하겠습니다.
&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/202372211_YdNglUzWXAz3l12NXQjh.png" src="/resources/media/images/content/2023/7/22/202372211_YdNglUzWXAz3l12NXQjh.png.preview.jpg" alt=""&gt;
좀 더 현실감 있게 구체적인 시간,날짜,이름 등을 임의로 넣어주겠습니다.(아래는 해당 내용을 실제로 이메일로 보내본 상황입니다)
&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/202372212_LkZ4ZR4QQcxf2S95YJ5x.png" src="/resources/media/images/content/2023/7/22/202372212_LkZ4ZR4QQcxf2S95YJ5x.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;제목: 원격 학습 수업 일정에 대한 문의
이 이메일을 잘 받으셨기를 바랍니다. 제 이름은 사라 파커이고 그린필드 대학교에 재학중인 학생입니다.  &lt;br/&gt;&lt;br/&gt;
이번 학기 학업 계획을 세울때 귀교에서 실시할 원격 수업의 구체적인 시작 시간과 기간에 관한 정보를 알려주시면 대단히 감사하겠습니다. 가능하다면 월요일과 수요일 오후 4시에 시작하는 수업 일정이나 다른 요일애 수업을 진행할 수 있는지 알려주시겠어요?
&lt;br/&gt;&lt;br/&gt;
또한 참여에 필요한 전제 조건, 강의 자료 또는 특정 기술 요구 사항이 있으면 이에 대해서도 친절하게 조언해주시기 바랍니다.
&lt;br/&gt;&lt;br/&gt;
이 주제에 대한 전문 지식과 강의의 평판이 제 관심을 불러 일으켰고, 강의에 참여하고 싶습니다. 하지만 수업 일정을 명확히 알려주셔야 제가 학업에 전념할 수 있을 것 같습니다.
&lt;br/&gt;&lt;br/&gt;
바쁜 일정이 있으시다는 것을 잘 알고 있으며, 도움을 주시면  진심으로 감사하겠습니다. 이 문제에 대한 귀하의 지도는 저의 학업 계획을 촉진하는데 중요한 역할을 할 것입니다.
&lt;br/&gt;&lt;br/&gt;
시간과 배려에 감사드립니다. 귀하의 답변과 대학 원격 수업에 참여할 수 있는 기회를 기다리겠습니다.
&lt;br/&gt;&lt;br/&gt;
진심으로 감사드립니다.
&lt;br/&gt;&lt;br/&gt;
사라 파커
학생 ID: 123456
그린필드 대학교
이메일: &lt;a href="mailto:sarah.parker@email.com"&gt;sarah.parker@email.com&lt;/a&gt;
전화: (555) 555-1234&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;좋습니다! 이번에는 친구에게 이메일을 보내야 하는 상황에서 격식표현의 이메일 내용을 생성해보도록 하겠습니다!
&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/202372212_sPduHAel2SVmAnIiL8T8.png" src="/resources/media/images/content/2023/7/22/202372212_sPduHAel2SVmAnIiL8T8.png.preview.jpg" alt=""&gt;
좀 더 현실감 있게 구체적인 시간,날짜,이름 등을 임의로 넣어주겠습니다.(아래는 해당 내용을 실제로 이메일로 보내본 상황입니다)
&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/202372212_hlzSjr5RVh9AOtU9R7p6.png" src="/resources/media/images/content/2023/7/22/202372212_hlzSjr5RVh9AOtU9R7p6.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;제목: 같이 농구할래? 🏀
안녕 마크,
&lt;br/&gt;&lt;br/&gt;
잘 지내고 있지! 내가 지역 농구팀에 가입할까 생각중인데, &amp;quot;같이 농구하면 어떨까?&amp;quot;하는 생각이 들었어.
&lt;br/&gt;&lt;br/&gt;
내가 농구를 얼마나 좋아하는지 알잖아. 너보다 더 좋은 팀원은 없을 거야! 코트에서 너의 실력은 정말 대단하고. 우리가 멋진 듀오가 될 거라고 확신해.
&lt;br/&gt;&lt;br/&gt;
팀 연습은 다음 주부터 매주 수요일과 금요이 오후 6시부터 8시까지입니다. 첫 경기는 2주후인 일요일에 열릴 예정이야.
&lt;br/&gt;&lt;br/&gt;
어때?  농구여정에 함께할 준비가 됐니? 코트에서 멋진 추억을 만들고 우리가 얼마나 멋진지 보여주자!
&lt;br/&gt;&lt;br/&gt;
너의 슬램덩크 답변을 기다릴게!🏀💥
&lt;br/&gt;&lt;br/&gt;
곧 다시 보자!
&lt;br/&gt;&lt;br/&gt;
Michael에게&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;-제안서·보고서 템플릿
(준비중)&lt;/p&gt;
&lt;h2 id="생성유형상황제시"&gt;생성유형(상황제시)&lt;/h2&gt;&lt;h4 id="1상황을-주고-여기에-맞는-대화꺼리-생성하기"&gt;(1)상황을 주고 여기에 맞는 대화꺼리 생성하기&lt;/h4&gt;&lt;h4 id="2세부적인-상황을-주고-거기에-맞는-영어-대본"&gt;(2)세부적인 상황을 주고 거기에 맞는 영어 대본 생성하기&lt;/h4&gt;&lt;h4 id="3영어로-이메일이-온-상황에서-영어-이메일-자"&gt;(3)영어로 이메일이 온 상황에서, 영어 이메일 자동으로 생성하기&lt;/h4&gt;&lt;h4 id="4상황을-제시하고-일대일로-챗gpt와-대화하기"&gt;(4)상황을 제시하고 일대일로 챗GPT와 대화하기&lt;/h4&gt;&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/202372210_mcFWLbB3uWfseVyl27TO.jpg" src="/resources/media/images/content/2023/7/22/202372210_mcFWLbB3uWfseVyl27TO.jpg.preview.jpg" alt=""&gt;
챗GPT 대화창을 열고 영어로 일대일로 &amp;lt;Bar Owner와 Business Traveler의 상황극&amp;gt;을 시작해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_gZv0AUsfp4qddIhdIivO.png" src="/resources/media/images/content/2023/7/22/20237221_gZv0AUsfp4qddIhdIivO.png.preview.jpg" alt=""&gt;
Business Traveler인 저에게 음료를 주문 할 건지에 대해 이야기를 해달라고 하네요!&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_7UN3wmhFOXVp4FsjIGCl.png" src="/resources/media/images/content/2023/7/22/20237221_7UN3wmhFOXVp4FsjIGCl.png.preview.jpg" alt=""&gt;
스페셜 메뉴가 있냐고 물었더니 '코리아 선셋'이라는 칵테일을 추천하는 센스를 발휘하네요!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;하지만 여기서!
막상 처음 일대일로 영어대화를 하다보면, 어떤 얘기를 꺼내서 이야기를 진행할지 막막하실 수 있습니다.
이럴 경우 저처럼 ChatGPt를 하나 더 띄워서 아까와는 반대로 역할을 부여해줍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_YCRvynGud1CFG3yOQFlN.png" src="/resources/media/images/content/2023/7/22/20237221_YCRvynGud1CFG3yOQFlN.png.preview.jpg" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;챗GPT가 제 말의 의도를 잘못 파악한 것 같습니다. 내용을 보완하여 설명하고 다시 상황극을 시작하도록 하겠습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_Quro2dDk5PK2I9W7UfUE.png" src="/resources/media/images/content/2023/7/22/20237221_Quro2dDk5PK2I9W7UfUE.png.preview.jpg" alt=""&gt;
&amp;quot;코리아 선셋&amp;quot;칵테일을 만들어드릴까요?라고 물어보니 흔쾌히 수락하네요!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이전 챗GPT의 대화문으로 이동해서 아까 전에 내놓은 답변을 복사해서 제가 말한 것처럼 챗GPT와 대화를 이어나가도록 하겠습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_J8WOBfhpYxmoGc8Y0IAN.png" src="/resources/media/images/content/2023/7/22/20237221_J8WOBfhpYxmoGc8Y0IAN.png.preview.jpg" alt=""&gt;
세부적으로 비언어적인 묘사까지 해주면서 상황극을 잘 이어나가는 것을 볼 수 있네요!
&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_QZgabhzdZHfCcGwAUQRK.png" src="/resources/media/images/content/2023/7/22/20237221_QZgabhzdZHfCcGwAUQRK.png.preview.jpg" alt=""&gt;
표현 및 리액션도 풍부한 것 같습니다!&lt;/p&gt;
&lt;p&gt;&lt;img class="lazy" data-src="/resources/media/images/content/2023/7/22/20237221_5eZFGCgFqFZT8TAYYEQX.png" src="/resources/media/images/content/2023/7/22/20237221_5eZFGCgFqFZT8TAYYEQX.png.preview.jpg" alt=""&gt;
상황극 마무리도 깔끔하게 하는 것 같습니다!&lt;/p&gt;
&lt;h2 id="결론"&gt;결론&lt;/h2&gt;&lt;p&gt;ChatGPT를 활용한 영어학습은 기존의 영어 학습 방법과는 다른 혁신적인 접근 방식입니다.
자연스러운 대화 환경과 다양한 주제, 상황에 대응하는 유동적인 학습은 재미와 흥미를 높여줄 뿐더러, 지속적으로 영어학습에 대한 동기를 부여하는데요! 문법과 어휘 습득, 실시간 피드백과 개인화 학습을 제공하는 ChatGPT를 통해 가성비 좋은 영어학습을 진행해보세요!&lt;/p&gt;
&lt;p&gt;앞으로 더 효과적인 ChatGPT를 이용한 학습방법과 컨텐츠가 나오면 꾸준히 포스팅을 하도록 하겠습니다 :)&lt;/p&gt;
&lt;p&gt;출처 및 참고:
&lt;a href="https://fastcampus.co.kr/data_online_chatgpte"&gt;https://fastcampus.co.kr/data_online_chatgpte&lt;/a&gt;
&lt;a href="https://www.samsungsds.com/kr/insights/chatgpt_conversational_ai_chatbot.html"&gt;https://www.samsungsds.com/kr/insights/chatgpt_conversational_ai_chatbot.html&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=0Y4WLJQp8HI"&gt;https://www.youtube.com/watch?v=0Y4WLJQp8HI&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=FomgfpRJU0Y"&gt;https://www.youtube.com/watch?v=FomgfpRJU0Y&lt;/a&gt;
&lt;a href="https://wikidocs.net/197916"&gt;https://wikidocs.net/197916&lt;/a&gt;
&lt;br/&gt;
추가로 사용한 번역기: DeepL
&lt;a href="https://www.deepl.com/translator"&gt;https://www.deepl.com/translator&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sat, 22 Jul 2023 01:26:17 +0900</pubDate><guid>http://blex.me/@smithsolution/%EC%99%9C-chatgpt%EB%A1%9C-%EC%98%81%EC%96%B4%EB%A5%BC-%EB%B0%B0%EC%9B%8C%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80</guid></item></channel></rss>