<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yeong_mu.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 16 Jan 2025 11:47:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yeong_mu.log</title>
            <url>https://velog.velcdn.com/images/yeong_mu/profile/9bde3c99-d026-4774-aa10-ec3305271cec/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yeong_mu.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yeong_mu" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[백준(BOJ)] 11718번 : 그대로 출력하기 - JAVA]]></title>
            <link>https://velog.io/@yeong_mu/%EB%B0%B1%EC%A4%80BOJ-11718%EB%B2%88-%EA%B7%B8%EB%8C%80%EB%A1%9C-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0-JAVA</link>
            <guid>https://velog.io/@yeong_mu/%EB%B0%B1%EC%A4%80BOJ-11718%EB%B2%88-%EA%B7%B8%EB%8C%80%EB%A1%9C-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0-JAVA</guid>
            <pubDate>Thu, 16 Jan 2025 11:47:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeong_mu/post/a4c1b7ba-3b59-4ec7-bd4c-4065279817d9/image.png" alt=""></p>
<p><a href="https://acmicpc.net/problem/11718">11718번 : 그대로 출력하기</a></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/03d3c3b5-3e08-4cb7-810c-b473539ce7c3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/4ab09c03-7b80-4ae3-9749-b7f5b4d59019/image.png" alt=""></p>
<hr>
<h2 id="문제-접근">문제 접근</h2>
<p>문제를 보고 처음 느낀 것은 &quot;출력을 어떻게 끝내라는 것인가?&quot;였다.
입력의 경우 Scanner로 처리 한다고 생각하고
출력도 Result에 계속 누적하면 된다고 생각했다.
그런데 언제까지 입력을 받고 출력을 하며,
마지막을 알 수 있는 방법은 무엇인지 막막했다.</p>
<p>우선은 계속 입력을 받을 수 있도록 while로 처리하였고
내부는 빈값을 입력받을 경우 종료할 수 있도록 하였다.</p>
<hr>
<h2 id="코드">코드</h2>
<pre><code class="language-java">import java.util.Scanner;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String input = &quot;&quot;;
        String result = &quot;&quot;;

        while (sc.hasNextLine()) {
            input = sc.nextLine();

                if (input.equals(&quot;&quot;)) {
                    break;
                }

                result += input + &quot;\n&quot;;
        }

        System.out.print(result.substring(0, result.length() - 1));

    }
}

</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준(BOJ)] 1271번 : 엄청난 부자2 - JAVA]]></title>
            <link>https://velog.io/@yeong_mu/%EB%B0%B1%EC%A4%80BOJ-1271%EB%B2%88-%EC%97%84%EC%B2%AD%EB%82%9C-%EB%B6%80%EC%9E%902-JAVA</link>
            <guid>https://velog.io/@yeong_mu/%EB%B0%B1%EC%A4%80BOJ-1271%EB%B2%88-%EC%97%84%EC%B2%AD%EB%82%9C-%EB%B6%80%EC%9E%902-JAVA</guid>
            <pubDate>Thu, 09 Jan 2025 04:02:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeong_mu/post/a4c1b7ba-3b59-4ec7-bd4c-4065279817d9/image.png" alt=""></p>
<p><a href="https://acmicpc.net/problem/1271">1271번 : 엄청난 부자2</a></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/b01cad15-5d59-4a42-9ba0-2c34427ed14c/image.png" alt=""><img src="https://velog.velcdn.com/images/yeong_mu/post/9bea429c-d3a3-47f2-9fd4-e40fe0286d2c/image.png" alt=""></p>
<hr>
<h2 id="문제-접근">문제 접근</h2>
<p>첫 접근 방법으로는 값 두개를 int로 받아서 &quot;/&quot; , &quot;%&quot; 로 결과를 출력하려고 하였다.
그러곤 런타임 에러 (InputMismatch)의 반복
조건을 다시 살펴보니 입력값은 1보다 크거나 같고 10^1000보다 작거나 같다.</p>
<p>int의 범위 (-2^31 ~ (2^31)-1)를 초과하는 입력값을 가질 수 있고
long의 범위 (-2^63 ~ (2^63)-1)로도 처리가 불가능한 값이 존재한다.</p>
<p>BigInteger은 이론상 무제한의 값을 저장할 수 있다는 것을 알게 되었다.</p>
<hr>
<h2 id="코드">코드</h2>
<pre><code class="language-java">import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        BigInteger first = sc.nextBigInteger();
        BigInteger second = sc.nextBigInteger();

        BigInteger first_answer = first.divide(second);
        BigInteger second_answer = first.remainder(second);

        System.out.print(first_answer +&quot;\n&quot; +second_answer);

    }
}</code></pre>
<hr>
<h3 id="biginteger">BigInteger</h3>
<p>BigIntger은 문자열 형식으로 되어있기 때문에 사칙연산을 수행할 수 없다.</p>
<p>&quot;+&quot; : add()
&quot;-&quot; : subtract()
&quot;*&quot; : multiply()
&quot;/&quot; : divide()
&quot;%&quot; : remainder()</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.12]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.12</link>
            <guid>https://velog.io/@yeong_mu/2024.07.12</guid>
            <pubDate>Mon, 15 Jul 2024 00:09:04 GMT</pubDate>
            <description><![CDATA[<h3 id="jenkins-로컬-docker-war-배포">jenkins 로컬 Docker war 배포</h3>
<ol>
<li><p>Plugin 설치 (docker plugin, docker pipeline)<img src="https://velog.velcdn.com/images/yeong_mu/post/5b4c45c4-4a82-4a77-b7de-7c6d77600972/image.png" alt=""></p>
</li>
<li><p>디렉토리 생성
 <img src="https://velog.velcdn.com/images/yeong_mu/post/7317809f-57d8-410b-b25d-0ff8c73aafcf/image.png" alt=""></p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/2ddf9b8a-ae16-4507-bec5-dad1f1ab8c4b/image.png" alt=""></p>
<ol start="3">
<li><p>back-end/Jenkinsfile 수정</p>
<pre><code>pipeline {
   agent any
   tools{
       maven &#39;Maven&#39;//젠킨스 tools의 설정한 Maven 이름
   }
   environment{
       JAVA_HOME = &#39;D:\\dev\\java-11-openjdk-11.0.15.9-1&#39; //자바가 설치된 경로
       PATH = &quot;${env.JAVA_HOME}\\bin;${env.PATH}&quot;
   }
   // trigger{
   //     pollSCM(&#39;H/6 * * * 1-5&#39;)
   // }
   stages {
       stage(&#39;clone repository&#39;) {
           steps {
            git branch:&#39;main&#39;,credentialsId:&#39;github-token&#39;, 
                       url:&#39;https://github.com/wooshinkwak/test_jenkins2.git&#39;
           }
       }
       stage(&#39;build WAR&#39;){
           steps{
               script{
                   def mvnHome = tool name:&#39;Maven&#39;, type:&#39;hudson.tasks.Maven$MavenInstallation&#39;
                   withEnv([&quot;MAVEN_HOME=${mvnHome}&quot;] ){
                       //pom.xml에 version노드의 이름으로 war가 targit 디렉토리에 생성된다.
                       bat &quot;\&quot;${mvnHome}\\bin\\mvn\&quot; clean package -DskipTests&quot;
                   }
               }
           }
       }
       stage(&#39;Copy WAR&#39;) {
           steps {
               script {
                   def warFile = &#39;target\\sist-1.0.0-BUILD-SNAPSHOT.war&#39;
                   def destDir = &#39;d:\\test_docker&#39;
                   bat &quot;&quot;&quot;
                   if not exist ${destDir} mkdir ${destDir}
                   copy ${warFile} ${destDir}\\test_jenkins.war
                   &quot;&quot;&quot;
               }
           }
       }
      stage(&#39;Build Docker Image&#39;) {
           steps {
               script {
                   def imageName = &quot;test_jenkins_image&quot;
                   def containerName = &quot;test_jenkins_container&quot;

                   // 기존 Docker 컨테이너 중지 및 삭제
                   bat &quot;&quot;&quot;
                   docker stop ${containerName} || exit 0
                   docker rm ${containerName} || exit 0
                   &quot;&quot;&quot;

                   // 기존 Docker 이미지 삭제
                   bat &quot;&quot;&quot;
                   docker rmi -f ${imageName} || exit 0
                   &quot;&quot;&quot;

                   // Dockerfile이 있는 디렉토리로 이동
                   dir(&#39;d:\\test_docker&#39;) {
                       def app = docker.build(imageName)
                   }
               }
           }
       }
       stage(&#39;Run Docker Image&#39;) {
           steps {
               script {
                   def containerName = &quot;test_jenkins_container&quot;
                   // Docker 이미지 실행
                   docker.image(&quot;test_jenkins_image&quot;).run(&quot;-d --name ${containerName} -p 80:8080&quot;)
               }
           }
       }
       }
}</code></pre></li>
<li><p>Github push</p>
</li>
<li><p>Jenkins build
<img src="https://velog.velcdn.com/images/yeong_mu/post/ed3cfe55-2a3c-4965-9832-6fb6764454dc/image.png" alt=""></p>
</li>
<li><p>Docker에서 image생성과 container생성 확인</p>
<ul>
<li>docker images</li>
<li>docker ps -a</li>
</ul>
</li>
<li><p>브라우저 열고 접속</p>
</li>
</ol>
<hr>
#

<ul>
<li><p>WINGET Install nektos.act
<img src="https://velog.velcdn.com/images/yeong_mu/post/24cc966f-f569-4779-b321-858b85318878/image.png" alt=""></p>
</li>
<li><p>act 버전체크</p>
<ul>
<li>act --version
<img src="https://velog.velcdn.com/images/yeong_mu/post/c0fb5060-0f48-4efb-a39d-312661ab9417/image.png" alt=""></li>
</ul>
</li>
<li><p>repository fork 후 VS코드에 Clone repository (지금은 바탕화면에 java_githubaction 폴더 생성)</p>
<ul>
<li><a href="https://github.com/YeongKing/test-java11-17.git">https://github.com/YeongKing/test-java11-17.git</a></li>
</ul>
</li>
<li><p>github cli 설치</p>
<ul>
<li>winget install --id github.cli
<img src="https://velog.velcdn.com/images/yeong_mu/post/7fccc434-2c09-443a-9825-f43fb17915bb/image.png" alt=""></li>
</ul>
</li>
<li><p>C:\Users\user\Desktop\java_githubaction\test-java11-17.git\hooks</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.11]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.11</link>
            <guid>https://velog.io/@yeong_mu/2024.07.11</guid>
            <pubDate>Thu, 11 Jul 2024 08:11:42 GMT</pubDate>
            <description><![CDATA[<h2 id="war를-사용한-web-service">war를 사용한 web Service</h2>
<ol>
<li>tomcat이미지를 다운 (hub.docker.com)<ul>
<li>docker pull tomcat:9.0</li>
</ul>
</li>
<li>실행<ul>
<li>docker run -d -p 80:8080 --name 컨테이너명 이미지명:버전</li>
<li>docker run -d -p 80:8080 --name tomcat-service tomcat:9.0</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/7278770e-51ef-4a5c-93ff-4036f1d261be/image.png" alt=""></p>
<ol start="3">
<li>컨테이너 접속 ( exec ) =&gt; vim설치 =&gt; webapps/ROOT 디렉토리 생성<ul>
<li>docker exec -it  mvc-service /bin/bash</li>
</ul>
</li>
</ol>
<ul>
<li>도커가 사용하는 네트워크 확인( 브릿지 네트워크 )<ul>
<li>docker network ls
<img src="https://velog.velcdn.com/images/yeong_mu/post/69dee8d9-f75d-4c42-82b5-e96faa25f032/image.png" alt=""></li>
</ul>
</li>
</ul>
<ol start="4">
<li>mvc-service 진입 후 apt-get 업데이트 후 vim설치(선택, 필요한 패키지 설치)
<img src="https://velog.velcdn.com/images/yeong_mu/post/e939f0c9-c471-4e59-98f2-ae1bc8b90f4f/image.png" alt=""></li>
</ol>
<ol start="5">
<li>webapps디렉토리로 이동 후 ROOT 디렉토리 생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/79ef9f0e-da50-4f43-bbc5-dbc6dcfc2494/image.png" alt=""></li>
</ol>
<ul>
<li>index.html 작성
<img src="https://velog.velcdn.com/images/yeong_mu/post/3a4b1483-b027-46d5-b9e4-175ca9249571/image.png" alt=""></li>
</ul>
<ol start="6">
<li><p>index.html , war 복사</p>
<ul>
<li><p>docker cp 복사할경로 컨테이너명:/위치</p>
</li>
<li><p>index.html</p>
<ul>
<li>docker cp C:\dev\workspace_spring\jenkins_prj\src\main\webapp\index.html mvc-service:/usr/local/tomcat/webapps/ROOT
<img src="https://velog.velcdn.com/images/yeong_mu/post/200d7cab-a575-4c52-8948-99ea92bded4f/image.png" alt=""></li>
</ul>
</li>
<li><p>war 복사</p>
<ul>
<li>docker cp C:\dev\spring_mvc.war mvc-service:/usr/local/tomcat/webapps
<img src="https://velog.velcdn.com/images/yeong_mu/post/ac07ac01-0dd6-47cb-b905-fd29d44d6d39/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>stu14.sist.co.kr 검색 후 결과 확인
<img src="https://velog.velcdn.com/images/yeong_mu/post/af0fc7e7-9b76-482b-8377-085d251f2e09/image.png" alt=""></p>
</li>
</ol>
<h3 id="도커-이미지-생성--docker-hub에-올리기-공개">도커 이미지 생성 &gt; Docker Hub에 올리기 (공개)</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/4c21e2f7-6f16-4bf9-9c0d-00ec387164a6/image.png" alt=""></p>
<ol>
<li><p>실행중인 컨테이너를 이미지로 commit</p>
<ul>
<li>docker commit 컨테이너명 계정명/이미지명:버전</li>
<li>docker commit mvc-service yeongking/mvc-app:latest
<img src="https://velog.velcdn.com/images/yeong_mu/post/3788f2a8-8c7a-46a2-9025-89f6a427f4b1/image.png" alt=""></li>
</ul>
</li>
<li><p>Docker Hub 로그인</p>
<ul>
<li>docker login
<img src="https://velog.velcdn.com/images/yeong_mu/post/92509266-bf2f-45ae-b802-6d4cc00f3850/image.png" alt=""></li>
</ul>
</li>
<li><p>이미지를 Docker Hub 푸시</p>
<ul>
<li>docker push 계정명/이미지명:버전</li>
<li>docker push yeongking/mvc-app:latest
<img src="https://velog.velcdn.com/images/yeong_mu/post/9d17e839-de73-417f-9d2e-879fbc1a5126/image.png" alt=""></li>
</ul>
</li>
</ol>
<h3 id="도커-허브-이미지-다운">도커 허브 이미지 다운</h3>
<ol>
<li><p>도커 로그인</p>
<ul>
<li>docker login</li>
</ul>
</li>
<li><p>이미지 다운로드</p>
<ul>
<li>docker pull 계정명/이미지명:latest</li>
</ul>
</li>
<li><p>실행</p>
<ul>
<li>docker run -d -p 80:8080 yeongking/mvc-app:latest
<img src="https://velog.velcdn.com/images/yeong_mu/post/51461d81-5752-4ec8-8395-aeb18c9904a7/image.png" alt=""></li>
</ul>
</li>
</ol>
<h3 id="docker-script">Docker script</h3>
<ul>
<li>개별 Docker 이미지를 정의하고 빌드하기 위해서.</li>
<li>이미지 생성을 자동화 할 수 있다.</li>
<li>컨테이너 실행 시 필요한 모든 종속성, 설정 및 초기화를 할 수 있다.</li>
<li>Dockerfile을 생성하여 script을 정의</li>
<li>docker build명령을 사용하여 이미지를 생성.
<img src="https://velog.velcdn.com/images/yeong_mu/post/274aae2b-19db-4c2c-8254-b3575bb80861/image.png" alt=""></li>
<li>주 명령<ul>
<li>FROM : 이미지를 저장</li>
<li>WORKDIR : 작업디렉토리</li>
<li>RUN : 이미지를 빌드할 때 실행할 명령어를 지정</li>
<li>COPY/ADD : 이미지에 파일이나 폴더를 추가할 때 사용</li>
<li>EXPOSE : 이미지가 통신에 사용할 PORT (web server : 80, tomcat : 8080)</li>
<li>CMD : 컨테이너를 실행할 때 실행할 명령어를 지정</li>
<li>ENTRYPOINT : 컨테이너를 실행할 때 실행할 명령어를 <strong>강제</strong> 지정<h3 id="dockerfile-실행명령">Dockerfile 실행명령</h3>
</li>
</ul>
</li>
<li>Dockerfile이 기본 파일명인 Dockerfile일 때:<ul>
<li>docker build -t 이미지명 dockerfile경로
<img src="https://velog.velcdn.com/images/yeong_mu/post/4f10fd5a-b388-431e-b7cb-f10eed09cad1/image.png" alt=""></li>
<li>이미지 생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/ee3908cc-c917-4a3c-89b6-ccedbd16b15b/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>Dockerfile이 다른 이름의 파일에 저장되어 있을 때:<ul>
<li>docker build -t 이미지명 -f 다른파일명 dockerfile경로</li>
<li>다른파일명이 존재하는 경로로 이동하여 실행해야 함. 경로를 사용할 수 없음.
<img src="https://velog.velcdn.com/images/yeong_mu/post/428f423a-e84a-4845-82bc-aa22cf8a3fc8/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/e39f69a4-0cb4-4213-9bcd-8cfa17f10c67/image.png" alt=""><hr>
```
# 기본 이미지 설정
FROM tomcat:9.0

</li>
</ul>
</li>
</ul>
<h1 id="작업-디렉토리-설정">작업 디렉토리 설정</h1>
<p>WORKDIR /usr/local/tomcat/webapps</p>
<h1 id="필요한-파일을-복사">필요한 파일을 복사</h1>
<p>COPY spring_mvc.war ./spring_mvc.war</p>
<h1 id="root-디렉토리를-생성한-후-indexhtml-파일-생성">ROOT 디렉토리를 생성한 후 index.html 파일 생성</h1>
<p>RUN mkdir -p /usr/local/tomcat/webapps/ROOT &amp;&amp; <br>    echo &#39;<!DOCTYPE html><html><head><script>location.href="<a href="http://stu14.sist.co.kr/spring_mvc/index.html&quot;">http://stu14.sist.co.kr/spring_mvc/index.html&quot;</a>;</script></head><body></body></html>&#39; &gt; /usr/local/tomcat/webapps/ROOT/index.html</p>
<h1 id="포트-설정">포트 설정</h1>
<p>EXPOSE 8080</p>
<h1 id="tomcat-실행">Tomcat 실행</h1>
<p>CMD [&quot;catalina.sh&quot;, &quot;run&quot;]</p>
<pre><code>- docker build -t 이미지명 .
- docker run -d -p 80:8080 --name 이름 이미지명

# kubernetes(K8S)
- 기능을 축소하여 배포하는 K3S도 제공
- 컨테이너화된 애플리케이션의 배포, 관리, 확장 및 네트워킹을 자동화하는 오픈소스 플랫폼.
- Google에서 개발, 현재 CNCF(Cloude Native Computing Foundation)에서 관리
## 특징
- 자동화된 배포 및 롤 아웃
  - 롤 아웃 : 새로운 버전이나 업데이트를 점진적으로 배포하는 과정
  - 단계적 배포로 가용성, 안정성이 유지
- 새로운 애플리케이션을 쉽게 배포하거나 롤백할 수 있다.
- CI/CD에 용이
- 스토리지 오케스트레이션 
- 셀프 힐링
  - 장애가 발생한 컨테이너를 자동으로 재시작하고, 문제가 있는 노드를 격리한다.
  - deployment에서 설정한 상태에 따라 컨테이너를 복구하여 원하는 상태로 유지한다.

# Kubernetes의 주요 구성 요소
- Master Node
  - API Server : 클러스터의 모든 구성요소와의 상호작용을 관리합니다.
  - Controller Manager : 클러스터 상태를 관리하고, 원하는 상태로 유지합니다.
  - Scheduler : 새로 생성된 컨테이너를 적절한 워커 노드에 할당합니다.
  - etcd : 클러스터의 상태 정보를 저장하는 분산 Key-Value 저장소입니다.
- Worker Node
  - Kubelet : 각 노드에서 실행되며, 컨테이너의 라이프사이클을 관리합니다.
    - 각 노드에서 실행되는 agent로 노드의 Pod(파드)와 Container를 관리합니다.
    - 주요기능
      - Pod 라이프사이클(컨테이너를 생성,시작,중지)관리
      - 헬스체크 : 각 Pod, 컨테이너의 상태를 주기적으로 점검하고, 문제가 발생하면 다시 시작하거나 , 재배포
      - 노드의 리소스 관리 : 노드 CPU, 메모리, 네트워크 리소스를 관리하고 사용량을 모니터링.
      - 로그와 메트릭 수집 : 수집된 로그와 메트릭을 중앙 로그 시스템이나 모니터링 시스템 전달.
  - Container Runtime : Docker, Containerd 등의 컨테이너를 관리하는 소프트웨어입니다.
  - Kube-proxy : 네트워크 프록시 및 로드밸런서로써 서비스 간의 네트워크 동선을 관리합니다.
- 기타 구성 요소
  - Kubeadm : 쿠버네티스 클러스터를 설치하고, 초기화하는 도구로 클러스터의 설치 및 설정을 자동화해줍니다.
    - 주요기능
      - 클러스터 초기화 : kubeadm init 명령어를 사용하여 새로운 쿠버네티스 클러스터를 초기화.(마스터노드를 설정)
      - 노드 조인 : kubeadm join 명령어를 사용하여 워커노드를 기존 노드에 추가
      - 클러스터 업그레이드 : kubeadm upgrade 명령어를 사용하여 K8S를 최신상태로 유지
  - Kubectl : 쿠버네티스 클러스터와 상호작용하기 위한 명령줄 도구로 클러스터의 리소스를 관리하고 애플리케이션을 배포하는데 사용됩니다.
    - 주요기능
      - 리소스관리 : Pod, service, deployment, namespace 등 다양한 K8S 리소스를 생성, 조회, 업데이트, 삭제하는일.
        - 예 ) kubectl create, kubectl get
      - 애플리케이션 배포 : YAML파일 사용하여 애플리케이션을 클러스터에 배포한다.
        - 예 ) kubectl apply -f deployment.yaml
      - 로그 확인 : pod, container의 로그를 조회
        - 예 ) kubectl logs pod-name 
      - 디버깅, Pod내 명령어를 실행

![](https://velog.velcdn.com/images/yeong_mu/post/feb1ef1d-229f-4a75-8177-eeee78e8da48/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.10]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.10</link>
            <guid>https://velog.io/@yeong_mu/2024.07.10</guid>
            <pubDate>Wed, 10 Jul 2024 08:40:25 GMT</pubDate>
            <description><![CDATA[<h3 id="busybox-컨테이너-실행과정">busybox 컨테이너 실행과정</h3>
<ul>
<li>Busybox : 표준 유닉스 도구의 단일 실행파일 구현체를 제공하는 소프트웨어 패키지. 리눅스 환경에서 흔히 사용되며, 작은 크기와 효율성 때문에 임베디드시스템, 초기화 램, 컨테이너 환경에서 주로 사용.<ul>
<li>ls, cp, mv, echo 등등 명령어를 단일 실행파일로 제공.</li>
<li>리소스가 제한적인 환경에서 효율적으로 사용할 수 있다.</li>
</ul>
</li>
</ul>
<h4 id="docker-정보-확인">docker 정보 확인</h4>
<ul>
<li><p>docker -v
<img src="https://velog.velcdn.com/images/yeong_mu/post/0d8a4916-52b8-4be2-9bf6-bd48409e0cf2/image.png" alt=""></p>
</li>
<li><p>docker -version
<img src="https://velog.velcdn.com/images/yeong_mu/post/beeab93b-26f5-4267-977c-440c42272608/image.png" alt=""></p>
</li>
</ul>
<h4 id="docker-디스크-사용량-확인">docker 디스크 사용량 확인</h4>
<ul>
<li>docker system df
<img src="https://velog.velcdn.com/images/yeong_mu/post/5ee55a96-df4c-426a-afce-818b0ef370cc/image.png" alt=""></li>
</ul>
<h4 id="더-세부적인-정보-확인">더 세부적인 정보 확인</h4>
<ul>
<li>docker ststem df -v
<img src="https://velog.velcdn.com/images/yeong_mu/post/7072888e-7834-4a45-8fd1-4105034dc036/image.png" alt=""></li>
</ul>
<h3 id="docker-명령어-cli">docker 명령어 CLI</h3>
<h4 id="도움말">도움말</h4>
<ul>
<li>docker command --help</li>
</ul>
<h3 id="도커-이미지-명령">도커 이미지 명령</h3>
<ul>
<li><p>도커를 사용하거나 이미지를 관리하기위한 명령, Docker Hub와 registry에서 이미지를 다운로드 하거나 업로드할 때 사용.</p>
</li>
<li><p>Docker pull : 도커 허브에서 이미지를 다운로드.</p>
</li>
<li><p>Docker push : 도커 허브에서 이미지를 업로드.</p>
</li>
<li><p>Docker login : 도커 허브에 로그인할 때.</p>
</li>
<li><p>Docker logout : 도크 허브에서 로그아웃할 때.</p>
</li>
</ul>
<h3 id="도커-이미지-다운">도커 이미지 다운.</h3>
<ul>
<li>문법 )</li>
<li>docker image pull 이미지이름:버전</li>
<li>예 ) Nginx 이미지 다운<ul>
<li>docker image pull nginx
<img src="https://velog.velcdn.com/images/yeong_mu/post/5af37c2c-a588-49c1-8261-7e699a5d2a2e/image.png" alt=""></li>
</ul>
</li>
<li>image 생략<ul>
<li>docker pull nginx:latest</li>
</ul>
</li>
<li>특정 버전 지정 ( 버전 지정을 잘 못하면 error 발생 )<ul>
<li>docker pull nginx:1.28.0 (버전 존재 X)
<img src="https://velog.velcdn.com/images/yeong_mu/post/833feaaf-6311-4ec2-8833-0ed6cec47afa/image.png" alt=""></li>
</ul>
</li>
<li>apache httpd ( web server )를 다운. [] : 생략 가능<ul>
<li>docker [image] pull httpd[:latest]</li>
</ul>
</li>
</ul>
<h3 id="이미지는-존재하나-container은-존재하지-않는다">이미지는 존재하나 container은 존재하지 않는다.</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/97feb026-033f-45be-8a49-a2e6f193d7e4/image.png" alt=""></p>
<h3 id="다운로드된-이미지-확인">다운로드된 이미지 확인</h3>
<ul>
<li>docker images</li>
<li>docker image ls
<img src="https://velog.velcdn.com/images/yeong_mu/post/33a48583-a670-4d51-a91a-8b4a1216c8d7/image.png" alt=""></li>
</ul>
<h4 id="실행중인-프로세스ps를-확인">실행중인 프로세스(ps)를 확인</h4>
<ul>
<li>docker ps</li>
<li>docker ps -a
<img src="https://velog.velcdn.com/images/yeong_mu/post/cff037e9-1260-4ad3-9fca-f3f3938d84e7/image.png" alt=""></li>
</ul>
<h4 id="도커-실행-run">도커 실행 (run)</h4>
<ul>
<li>docker run -d -p 서비스할포트:원래포트 --name 컨테이너이름 이미지명<ul>
<li>-d : background동작</li>
<li>-p : port설정</li>
<li>--name : 컨테이너 이름 설정</li>
</ul>
</li>
<li>httpd 이미지를 사용하여 이름이 my-httpd1인 container를 8083포트로 서비스할 수 있게 생성하기<ul>
<li>docker run -d -p 8083:80 --name my-httpd1 httpd
<img src="https://velog.velcdn.com/images/yeong_mu/post/d2956990-5109-4e12-ac0e-36337a730c3a/image.png" alt=""></li>
</ul>
</li>
</ul>
<h4 id="도커-컨테이너-파일-복사">도커 컨테이너 파일 복사</h4>
<ul>
<li><p>docker cp 복사할파일명 컨테이너명:컨테이너의경로</p>
</li>
<li><p>httpd는 /url/local/apache/htdocs에 html를 배포한다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/5f27ea56-cdf6-4818-8131-0e22ef813843/image.png" alt=""></p>
</li>
<li><p>docker cp C:\dev\workspace_spring\jenkins_prj\src\main\webapp\index.html my-httpd1:/usr/local/apache/htdocs</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/5297be28-a9ee-4d28-a66a-5cce3218b797/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/9fe84651-ef1d-4086-a928-47964c2845ff/image.png" alt=""></p>
<h4 id="container-중지">container 중지</h4>
<ul>
<li>docker stop 컨테이너명(컨테이너ID)</li>
<li>docker stop my-httpd1</li>
<li>docker stop 273d239cca5f
<img src="https://velog.velcdn.com/images/yeong_mu/post/5ff487c7-85b0-49e2-a378-01eaa3c31dbf/image.png" alt=""><h4 id="container-시작">container 시작</h4>
</li>
<li>docker start 컨테이너명(컨테이너ID)</li>
<li>docker start my-httpd1</li>
<li>docker start 273d239cca5f
<img src="https://velog.velcdn.com/images/yeong_mu/post/c1c7e77c-b21d-478b-861b-eaac604eaaea/image.png" alt=""></li>
</ul>
<h4 id="container-삭제">container 삭제</h4>
<ul>
<li>docker rm [-f]컨테이너명(컨테이너ID)<ul>
<li>-f : 강제
<img src="https://velog.velcdn.com/images/yeong_mu/post/3f124e4a-ef99-4972-8e3a-7f209d9630e1/image.png" alt=""></li>
</ul>
</li>
</ul>
<h4 id="copy">copy</h4>
<ul>
<li>HostOS -&gt; Container
<img src="https://velog.velcdn.com/images/yeong_mu/post/1d8c0f27-8a43-49c1-a98e-f5c2e9186afc/image.png" alt=""><ul>
<li>Docker cp 호스트경로 컨테이너명:/컨테이너경로
<img src="https://velog.velcdn.com/images/yeong_mu/post/7617ac5f-d2ac-4157-ba2b-6d5399ff28a5/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>Container -&gt; HostOS
<img src="https://velog.velcdn.com/images/yeong_mu/post/bac5ceb1-38cc-411a-8f86-42bcd9be7c05/image.png" alt=""></p>
<ul>
<li>Docker cp 컨테이너명:/컨테이너경로 호스트경로
<img src="https://velog.velcdn.com/images/yeong_mu/post/4bba95df-e9d9-4014-a957-74fa0ecbe089/image.png" alt=""></li>
</ul>
</li>
</ul>
<h4 id="docker-run">docker run</h4>
<ul>
<li>도커 이미지가 있다면 container를 생성 및 실행기능 수행</li>
<li>도커 이미지가 없다면 이미지를 다운받아서 container를 생성 및 실행 수행</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/90dfac3a-c8df-46db-8a2e-b71033aacb4c/image.png" alt=""></p>
<ul>
<li>도커 이미지 다운 , container 생성 및 실행 3가지 수행 (docker run)
<img src="https://velog.velcdn.com/images/yeong_mu/post/4ecbbc2a-38dd-47ac-b7fd-a17970d04755/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/c94a361f-21a4-48b1-ab45-4189bd59ba50/image.png" alt=""></li>
</ul>
<hr>

<ul>
<li><p>tomcat9.0의 이미지를 이름을이my-tomcat이며 백그라운드에서 기본포트가 8080인 포트를 80으로 컨테이너 생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/692d96b0-af88-4661-9f42-7b0e1bb6dd9f/image.png" alt=""></p>
</li>
<li><p>Docker 컨테이너 내의 Bash 쉘을 실행하는 명령어</p>
<ul>
<li>docker exec -it my-tomcay /bin/bash<ul>
<li>-i(interactive) : 터미널을 통해 입력을 받을 수 있도록 해준다.</li>
<li>-t(tty) : 가상 터미널을 할당하여 쉘과 같은 프로세스를 실행할 수 있도록 해준다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/7b8f92e0-89f0-4ffe-902c-84ef4a9852a4/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/36e47a90-4732-4afe-ab85-baa10f5d5c6f/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/929639e3-0daf-4f0b-ab63-2727d2a07e4f/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/bdf5bab5-1152-4632-a2bf-38c7a01ed3e3/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="tomcat을-외부에서-종료">tomcat을 외부에서 종료</h4>
<ul>
<li>docker exec 컨테이너명 /usr/local/tomcat/bin/catalina.sh stop<h4 id="컨테이너-실행">컨테이너 실행</h4>
</li>
<li>docker start 컨테이너명</li>
<li>docker exec 컨테이너명 /usr/local/tomcat/bin/catalina.sh start</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.09]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.09</link>
            <guid>https://velog.io/@yeong_mu/2024.07.09</guid>
            <pubDate>Tue, 09 Jul 2024 00:46:32 GMT</pubDate>
            <description><![CDATA[<p>-remote repository에서 브렌치를 복제 
pipeline {
    agent any</p>
<pre><code>stages {
    stage(&#39;Hello&#39;) {
        steps {
  git branch:’브렌치명’,credentialsId:’github-token’, url:’repository URL’
}
    }</code></pre><h3 id="name-email-설정">name/ email 설정</h3>
<ul>
<li>git config --global user.name &quot;값&quot;</li>
<li>git config --global user.email &quot;값&quot;
<img src="https://velog.velcdn.com/images/yeong_mu/post/b6956cad-e689-443f-af7d-c69de16fb327/image.png" alt=""></li>
</ul>
<h3 id="git-초기화">Git 초기화</h3>
<ul>
<li>git init</li>
</ul>
<h3 id="branch-명-변경">branch 명 변경</h3>
<ul>
<li>git branch –m 이전브랜치명 변경할 브랜치명
<img src="https://velog.velcdn.com/images/yeong_mu/post/69d49cd5-1de1-4c05-8a35-d75afab5fa2c/image.png" alt=""></li>
</ul>
<h3 id="원격-저장소-추가">원격 저장소 추가</h3>
<ul>
<li>git remote add origin “저장소명”
<img src="https://velog.velcdn.com/images/yeong_mu/post/94ac4c2c-028b-498e-afae-8f1519478f3e/image.png" alt=""></li>
</ul>
<h3 id="원격저장소와-동기화">원격저장소와 동기화</h3>
<ul>
<li>git pull origin 브랜치명
<img src="https://velog.velcdn.com/images/yeong_mu/post/1ab15729-68f0-4192-8267-2594300f6b7c/image.png" alt=""></li>
</ul>
<h2 id="push">push</h2>
<ul>
<li><p>초기화 </p>
<ul>
<li>git init</li>
</ul>
</li>
<li><p>원격저장소가 추가되어있지 않으면 추가</p>
<ul>
<li>git remote add origin “Repository URL”
<img src="https://velog.velcdn.com/images/yeong_mu/post/efaf1605-4e14-42e7-bd6b-6f7945e51747/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>파일 추가<ul>
<li>git add .
<img src="https://velog.velcdn.com/images/yeong_mu/post/01fa16fb-cfdd-4d7f-9368-aeb87afd448f/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>커밋<ul>
<li>git commit -m “커밋메시지”
<img src="https://velog.velcdn.com/images/yeong_mu/post/543cf259-398c-4924-9b9c-a4b67c33d04d/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>push<ul>
<li>git push –u origin 브렌치명
<img src="https://velog.velcdn.com/images/yeong_mu/post/30ad6aff-2e34-4db9-94ad-e0bbe5ec6c9d/image.png" alt=""></li>
</ul>
</li>
</ul>
<hr>

<h3 id="젠킨스에서-빌드">젠킨스에서 빌드</h3>
<h3 id="jenkins--console-output">jenkins &gt; console output</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/8f7af3d5-9d39-4eef-b5b0-9633f12988b0/image.png" alt=""></p>
<ul>
<li><p>JDK 설정
<img src="https://velog.velcdn.com/images/yeong_mu/post/2dbc9016-05af-4c58-94b0-691430a575b3/image.png" alt=""></p>
</li>
<li><p>apache-maven-3.8.8 zip 다운</p>
</li>
<li><p><a href="https://maven.apache.org/download.cgi">https://maven.apache.org/download.cgi</a>
<img src="https://velog.velcdn.com/images/yeong_mu/post/540bd24a-3351-4072-95ab-fd7fb945e03b/image.png" alt=""></p>
</li>
<li><p>Maven Home 잡아주기 (bin폴더가 보이는곳이 홈임)
<img src="https://velog.velcdn.com/images/yeong_mu/post/1fd4578c-73ab-46e3-9869-676c82c65d7e/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/3c00608c-78da-4563-bc5b-91ea7db0cbc5/image.png" alt=""></p>
<pre><code>pipeline {
    agent any

    tools {
        maven &#39;Maven&#39; // Jenkins에 설정한 Maven 이름
    }

    environment {
        JAVA_HOME = &#39;C:\\dev\\java-17-openjdk-17.0.3.0.6-1&#39;
        PATH = &quot;${env.JAVA_HOME}\\bin;${env.PATH}&quot;
    }

    triggers {
        pollSCM(&#39;H/6 * * * 1-5&#39;)
    }

    stages {
        stage(&#39;clone repository&#39;) {
            steps {
                git branch: &#39;main&#39;, credentialsId: &#39;github-token&#39;, url: &#39;https://github.com/YeongKing/test_jenkins2.git&#39;
            }
        }
        stage(&#39;build WAR&#39;) {
            steps {
                script {
                    def mvnHome = tool name: &#39;Maven&#39;, type: &#39;hudson.tasks.Maven$MavenInstallation&#39;
                    withEnv([&quot;MAVEN_HOME=${mvnHome}&quot;]) {
                        //pom.xml에 version노드의 war가 targit 디렉토리에 생성된다.
                        bat &quot;\&quot;${mvnHome}\\bin\\mvn\&quot; clean package -DskipTests&quot;
                    }
                }
            }
        }
    }
}</code></pre><p><img src="https://velog.velcdn.com/images/yeong_mu/post/b12103f7-2db6-495d-85da-35ebfbe9e38a/image.png" alt=""></p>
<h2 id="docker">Docker</h2>
<ul>
<li>리눅스의 LXC(LinuX Container)기술을 기반으로 발전해온 컨테이너 가상화 플랫폼.</li>
<li>데이터 또는 프로그램을 각각 독립된 환경에 격리시키는 기능을 제공하는 소프트웨어.</li>
<li>2013년 3월 닷 클라우드의 솔로몬 하익스에 의해서 발표된 운영체제를 통째로 격리시키는 오픈소스 가상화 플랫폼<ul>
<li>가상화 플랫폼(Virtualization Platform)은 물리적인 하드웨어 자원을 가상화하여 여러 가상머신이나 컨테이너에서 독립적으로 운영체제와 애플리케이션을 실행 할 수 있는 소포트웨어.</li>
<li>가상화 플랫폼은 서버 자원을 효율적으로 활용, 비용절감, 유연한 자원 관리 제공.</li>
</ul>
</li>
<li>가상화 플랫폼<ol>
<li>Hypervisor<ul>
<li>타입1 : 베어메탈 =&gt; 직접 하드웨어 위에 설치되며 VM관리(MS Hyper-V)</li>
<li>타입2 : 호스트형 =&gt; 기존 운영체제 위에 설치되며 VM관리(VirtualBox, VMWare)</li>
</ul>
</li>
<li>가상머신(VM)<ul>
<li>Hypervisor에 의해 실행되는 독립적인 운영체제와 애플리케이션 환경</li>
<li>물리적인 서버의 H/W자원을 공유하면서도 독립적인 시스템 처럼 동작</li>
</ul>
</li>
<li>컨테이너<ul>
<li>운영체 수준에서 가상화된 환경을 제공하며, 애플리케이션과 종속성을 격리된 공간에서 실행.</li>
<li>가볍고 빠르게 실행된다.( Docker,Kubernetes(k8s) 대표적인 기술)
<img src="https://velog.velcdn.com/images/yeong_mu/post/500254c2-5b1a-4bf8-893d-52e69d23e043/image.png" alt=""><h3 id="사용-기술">사용 기술</h3>
</li>
</ul>
</li>
</ol>
</li>
<li>chroot, 네임스페이스, Cgroup 3가지 기술을 사용한다.<ul>
<li>chroot : 특정 디렉토리를 최상위 디렉토리( root )로 설정하는 리눅스 명령.</li>
<li>네임스페이스 : 프로세스 자원 관리 기능( mnt, pid,,, 그룹화하여 할당기능 )</li>
<li>Cgroup : CPU, 메모리, Disk IO, 네트워크 기능 등의 자원사용량을 제어하는 기능. =&gt; 특정 애플리케이션에서 과도한 자원사용을 방지할 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="도커와-가상머신의-차이">도커와 가상머신의 차이</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/55ebe28a-c18c-4dc5-a9cf-75fe4d413cf8/image.png" alt=""></p>
<ul>
<li>VM : H/W를 Host OS가 제어하고 Hypervisor를 사용하여 Guest OS를 올려서 별도에 독립적인 기능을 제공.</li>
<li>Container : H/W를 OS가 제어하고 Container를 사용하여 애플리케이션을 올려서 격리된 환경에서 독립적인 기능을 제공.<h3 id="컨테이너-가상화의-장점">컨테이너 가상화의 장점</h3>
</li>
<li>Hypervisor와 Guest OS가 없으므로 가볍다.</li>
<li>경량의 이미지로 만들어지므로 복제, 이관, 배포가 용이하다.</li>
<li>Guest OS 부팅시간이 필요없다.</li>
<li>가상머신보다 가볍기 때문에 동일한 H/W자원에서 더 많은 애플리케이션을 실행할 수 있다.</li>
</ul>
<h4 id="컨테이너">컨테이너</h4>
<ul>
<li>코드와 모든 종속성을 패키지화 하는 표준 소프트웨어의 단위</li>
</ul>
<h4 id="도커-컨테이너-이미지">도커 컨테이너 이미지</h4>
<ul>
<li>애플리케이션 실행에 필요한 모든 것을 포함한 경량의 격리된 실행가능한 소프트웨어 패키지</li>
</ul>
<h3 id="주요기능">주요기능</h3>
<ul>
<li>LXC를 이용한 컨테이너 구동, 도커 CLI제공 (도커제어명령)<ul>
<li>LXC : Containerd의 데몬 프로세스로 이미지 전송, 컨테이너 실행 및 감독, 네트워커 연결 등 모든 컨테이너 라이프 사이클을 관리.</li>
</ul>
</li>
</ul>
<h3 id="구성요소">구성요소</h3>
<ul>
<li>Docker Engine : 컨테이너 및 이미지 제어</li>
<li>Docker Hub : 컨테이너 이미지를 배포하기 위한 공공 레지스트리 (공개 - 무료 , 비공개 - 유료)<ul>
<li><a href="http://hub.docker.com">http://hub.docker.com</a></li>
</ul>
</li>
<li>Docker compose : 연관된 컨테이너 구성정보를 YAML 코드로 관리</li>
<li>Docker Swarm : 클러스터 기반의 도커 오케스트레이션 도구.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.08]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.08</link>
            <guid>https://velog.io/@yeong_mu/2024.07.08</guid>
            <pubDate>Mon, 08 Jul 2024 07:21:21 GMT</pubDate>
            <description><![CDATA[<h2 id="jenkins">Jenkins</h2>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/a4356f0c-fdad-43aa-8809-244a1510b0d0/image.png" alt=""></p>
<ul>
<li>SUN사에서 개발된 Hudson프로젝트에서 파생된 프로젝트.</li>
<li>CI(Continuous Integration)/CD(Continuous Delivery)툴(오픈소스 자동화 서버)</li>
<li>개발 프로세스를 자동화하여 빌드 &gt; 테스트 &gt; 배포 작업을 자동으로 수행</li>
<li>빌드 &gt; 테스트 &gt; 배포 작업 : Pipeline</li>
<li>자바로 구현된 프로그램 (JDK11부터 동작)
<img src="https://velog.velcdn.com/images/yeong_mu/post/45cca294-265a-44f1-bc06-66455088e62f/image.png" alt=""></li>
</ul>
<h3 id="주요기능">주요기능</h3>
<ol>
<li>지속적인 통합 <ul>
<li>개발자가 소스코드를 repository에 병합할때마다 자동으로 빌드하고 테스트 실행</li>
</ul>
</li>
<li>지속적인 배포<ul>
<li>빌드 &gt; 테스트를 통과한 후 자동으로 다양한 환경에 배포를 수행.</li>
</ul>
</li>
<li>파이프라인 지원</li>
<li>웹 인터페이스 지원<ul>
<li>웹 기반 인터페이스를 제공하여 빌드시 로그를 손쉽게 모니터링 할 수 있다.</li>
</ul>
</li>
</ol>
<ul>
<li>Jenkins는 다양한 플러그인을 지원하기 때문에 파이프라인 구성이 복잡해질 수 있고, 버전간의 호환성, 보안사항등을 고려해야 한다.<h3 id="master와-slave-구성">Master와 Slave 구성</h3>
<ul>
<li>Master : Controller라고 불리며, Jenkins slave를 관리하고 작업 스케줄링과 모니터링을 수행. </li>
<li>slave <ul>
<li>agent라고 불리며 파이프라인에 정의된 작업을 수행.</li>
<li>다양한 환경에서 작동하며 작업을 분산시켜 부하를 감소시키는 역할.<br/></li>
</ul>
</li>
</ul>
</li>
<li>설정파일 : C:\ProgramData\Jenkins\jenkins.xml</li>
<li>경로 변경가능
<img src="https://velog.velcdn.com/images/yeong_mu/post/c2c97b78-dfe9-443c-95d0-0631e0ac4b60/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/c74182c1-d158-4270-b78f-dbb1730fef1e/image.png" alt=""></li>
</ul>
<h3 id="jenkins와-github-연결">Jenkins와 Github 연결</h3>
<ol>
<li>Github repository에서 token발급</li>
<li>Github Repository에 Webhook설정</li>
<li>Jenkins에 plugin 설치 (Webhook Trigger, GitHub Integration, Github API Plugin)</li>
<li>Jenkins Credentials 생성</li>
<li>Jenkins Pipeline 설정</li>
<li>Jenkinsfile 작성</li>
</ol>
<h2 id="ngrop">ngrop</h2>
<ul>
<li>외부 접속 불가능한 ip를 domain으로 제공하여 연결 가능하도록 만들어준다.</li>
</ul>
<ol>
<li><p>ngrok.io 접속 후 Get ngrok 탭 클릭
<img src="https://velog.velcdn.com/images/yeong_mu/post/847a2bdb-4333-4756-b399-e6bbca1722a0/image.png" alt=""></p>
</li>
<li><p>Windows 클릭 후 ZIP파일 다운로드
<img src="https://velog.velcdn.com/images/yeong_mu/post/0bae9509-3364-4956-a91f-6b7e6ae09d4d/image.png" alt=""></p>
</li>
<li><p>ngrok config add-authtoken 토큰값 을 cmd 관리자모드 실행 후 
ngrok.exe 가 설치된 폴더로 이동 후 
ngrok config add-authtoken 키값 입력
<img src="https://velog.velcdn.com/images/yeong_mu/post/e41a2e47-0fea-4d25-b313-9d1a7794a3ee/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/a9f8325c-6ac7-4be8-99a4-09e1fd21147c/image.png" alt=""></p>
</li>
<li><p>ngrok.exe실행 후 
ngrok http <a href="http://localhost:8082">http://localhost:8082</a> 입력  (8080은 Tomcat과 충돌우려)
<img src="https://velog.velcdn.com/images/yeong_mu/post/ab5420a4-b33f-4be3-ac3c-25526328596f/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/f1ec9b90-d463-4fd1-bf35-0cda971f458a/image.png" alt=""></p>
</li>
<li><p>Forwarding에 나온 주소를 인터넷에서 입력 -&gt; <a href="http://localhost:8082%EC%99%80">http://localhost:8082와</a> 동일한 결과
<img src="https://velog.velcdn.com/images/yeong_mu/post/810258c2-f435-434c-a5ed-f6dc96db32b3/image.png" alt=""></p>
</li>
</ol>
<hr>

<h3 id="github-token-생성">github token 생성</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/9225e39d-91e8-4d8f-8ba8-a4eea6141080/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/e1426192-4765-4c35-9c53-9dded6325d22/image.png" alt=""></p>
<ul>
<li>필수 : repo, admin:org, admin:repo_hook</li>
<li>나머지 선택 : workflow, notifications, user</li>
</ul>
<h3 id="repository-생성-후-webhook-설정">repository 생성 후 webhook 설정</h3>
<ul>
<li>Repository &gt; </li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/a04adba9-8a1b-4560-bb8d-5bd965d21646/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/beb438b7-eaed-4dc6-92a3-c1c01c711fa1/image.png" alt=""></p>
<ul>
<li><p>Payload URL : 외부 접속이 가능한 Jenkins의 URL</p>
<ul>
<li><a href="http://211.63.xx.xx:8082/github-webhook">http://211.63.xx.xx:8082/github-webhook</a></li>
</ul>
</li>
<li><p>젠킨스 에서 플러그인 설치
<img src="https://velog.velcdn.com/images/yeong_mu/post/485c2f53-dd03-4d1e-b093-cb15a92c159c/image.png" alt=""></p>
</li>
<li><p>Generic Webhook Trigger Plugin</p>
<ul>
<li>웹 훅 이벤트를 감지하여 빌드를 트리거 할 때 사용.</li>
<li>커밋 , 풀리퀘스트 등 특정 이벤트가 발생했을 때 빌드 작업 수행.</li>
</ul>
</li>
<li><p>GitHub API Plugin</p>
</li>
<li><p>GitHub Branch Source Plugin</p>
</li>
<li><p>GitHub Integration Plugin</p>
<ul>
<li>젠킨스와 GitHub에 통합을 지원하는 플러그인</li>
<li>GitHub에 push 될때마다 자동으로 젠킨스의 빌드를 시작한다.</li>
<li>CI/CD파이프라인을 실행.</li>
</ul>
</li>
</ul>
<h3 id="tools-gitexe를-선택">Tools (git.exe를 선택)</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/2d5f7ce7-c77d-426d-a6aa-729e50c35339/image.png" alt=""></p>
<h3 id="jenkins-credentials-생성">Jenkins Credentials 생성</h3>
<ul>
<li>global 클릭
<img src="https://velog.velcdn.com/images/yeong_mu/post/5c26a61b-db79-4872-a9fa-83700b7e66bd/image.png" alt=""></li>
<li>add Credential 클릭
<img src="https://velog.velcdn.com/images/yeong_mu/post/f4f33123-e936-4d89-91db-dd0ce7c0c86a/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/701992fa-5a6e-40d4-9ba0-eb5579181f17/image.png" alt=""></p>
<ul>
<li>Username : Github_id</li>
<li>Password : Webhook이 설정된 token</li>
<li>ID : 아이디</li>
</ul>
<h3 id="jenkins-pipeline-설정">Jenkins pipeline 설정</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/ba9edf50-ef9b-4472-aa06-d85e56269053/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/5001bd44-f311-4c1e-9f2f-88f00a640721/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/28cebcff-5811-4042-8f3e-6e6bf8f8053c/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/02dbdfef-9062-438f-a33b-9831a7cd6e45/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/c6e22317-0c2a-49a4-9983-568265cc6f41/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/85881136-4bea-45d6-b15e-564ee539a9e5/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/deb2a965-604f-4ad6-8111-33c8cdc499dc/image.png" alt=""></p>
<h3 id="일정시간마다-자동-빌드-설정">일정시간마다 자동 빌드 설정</h3>
<ul>
<li>configure &gt; 소스코드 관리 &gt; 빌드 유발 &gt; Poll SCM
<img src="https://velog.velcdn.com/images/yeong_mu/post/4c205258-7a22-41d0-8113-48da264aacbc/image.png" alt=""></li>
<li>Schedule <ul>
<li>Cron 표현식 (<em>1\</em>2*3*4*5 )</li>
<li>*1 : 시간 H/5 : 5분 , H : 1시간</li>
<li>*2 : 일</li>
<li>*3 : 월</li>
<li>*4 : 년</li>
<li>*5 : 요일</li>
<li>H/5 * * * 1-5 : 5분에 한번씩 월요일에서 금요일까지 진행</li>
</ul>
</li>
</ul>
<h3 id="pipeline-구성">Pipeline 구성</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/121b8a4a-302a-4da2-ad6a-0a43dea7a8f7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/6e1943a9-b575-4416-a562-07f2f05f1d2b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/74a590a1-30f6-491a-b4c2-a3aa95b5394c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/755a4595-f826-4d7b-a88d-2a92fd2a4c44/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/372c2a32-d6c7-43d5-90a5-fa5de931ae37/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/415072be-313b-499d-a055-7de376d0419e/image.png" alt=""></p>
<h3 id="jenkinsfile-작성법">jenkinsfile 작성법</h3>
<ul>
<li><p><a href="https://www.jenkins.io/doc/book/pipeline/getting-started/back-end/Jenkinsfile">https://www.jenkins.io/doc/book/pipeline/getting-started/back-end/Jenkinsfile</a></p>
<pre><code>pipeline {// 전체 파이프라인 정의
    agent any // 어떤 agent에서나 실행될 수 있다.

    stages { //여러 Stage를 관리하기 위해서 사용하는 블록
        stage(&#39;Hello&#39;) { // 하나의 작업 stage(&#39;식별될 수 있는 이름&#39;);
            steps { // 하는일
                echo &#39;Hello World&#39;
                sh 리눅스 명령어
                bat DOS 명령어
            }
        }
    }
}
</code></pre></li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/yeong_mu/post/0257cca8-3c44-44ae-94ef-56139affdf67/image.png)
- git branch : 깃 레퍼지토리 브랜치명
- credentialsId : Jenkins Credentials ID
- url : 깃 레퍼지토리 경로
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.06]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.06</link>
            <guid>https://velog.io/@yeong_mu/2024.07.06</guid>
            <pubDate>Fri, 05 Jul 2024 04:34:51 GMT</pubDate>
            <description><![CDATA[<h2 id="component">Component</h2>
<ul>
<li><p>사용자 인터페이스를 구성하는 독립적이며, 재사용 가능한 단위.</p>
</li>
<li><p>컴포넌트를 사용하면 애플리케이션을 더 작은 단위로 나누어 관리하기 쉽게 만들 수 있다.</p>
</li>
<li><p>컴포넌트는 자체적인 HTML, CSS, JavaScript 로직을 포함할 수 있다.</p>
<ul>
<li>HTML : &lt;template&gt;</li>
<li>CSS : &lt;style&gt;</li>
<li>JavaScript : &lt;style&gt;</li>
</ul>
</li>
<li><p>등록하여 사용.</p>
</li>
<li><p>전역 등록</p>
<pre><code>  import 컴포넌트명 from &quot;사용할컴포넌트&quot;;
  new Vue({
      el:&quot;#app&quot;
  })</code></pre></li>
<li><p>지역 등록</p>
<pre><code>  import 컴포넌트명 from &quot;사용할컴포넌트&quot;;

  export default{
      components:{
          이름 : 컴포넌트명

      }
  }

  &lt;template&gt;
      &lt;이름 : 변수명=&quot;&quot;/&gt;</code></pre><p><img src="https://velog.velcdn.com/images/yeong_mu/post/fbaadee2-c218-4dfb-8d6e-b245eab3911f/image.png" alt=""></p>
</li>
<li><p>components폴더에서 component를 만든다.</p>
<h3 id="부모-컴포넌트에서-자식-컴포넌트의-변수를-사용">부모 컴포넌트에서 자식 컴포넌트의 변수를 사용</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/21403be9-aec0-4472-9026-955aa0a95d2d/image.png" alt=""></p>
</li>
<li><p>부모 컴포넌트 : App.vue</p>
</li>
<li><p>자식 컴포넌트 : MessageDisplay.vue
<img src="https://velog.velcdn.com/images/yeong_mu/post/8b9c2a57-de59-47d3-89f3-11e0b6d6ca06/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/52df4140-517d-4f6b-a25e-5ae392e8b317/image.png" alt=""></p>
</li>
</ul>
<hr>

<h2 id="yaml">YAML</h2>
<ul>
<li><p>서로 다른 시스템 간의 데이터를 주고 받을 필요가 있을 때 사용.</p>
<ul>
<li><p>연동과 호환성을 위한 포맷 : CSV, XML, JSON, properties, YAML</p>
<ul>
<li>CSV (Comma-Separated Values)<ul>
<li>텍스트 파일 형식으로, 각 행이 데이터 레코드를 나타내며 각 필드는 쉼표로 구분됩니다.</li>
<li>간단하고 많은 시스템에서 지원되지만, 데이터 구조가 복잡해지면 관리가 어려울 수 있습니다.</li>
</ul>
</li>
<li>XML (eXtensible Markup Language):<ul>
<li>데이터 객체를 계층적이고 가독성 있는 형식으로 표현합니다.</li>
<li>다양한 시스템과의 호환성이 높으며, 데이터를 구조화하고 검증하기 위한 스키마를 사용할 수 있습니다.</li>
</ul>
</li>
<li>JSON (JavaScript Object Notation):<ul>
<li>경량 데이터 교환 형식으로, 사람이 읽고 쓰기 쉽고 기계가 분석하고 생성하기 쉽습니다.</li>
<li>대부분의 프로그래밍 언어와 웹 API에서 널리 사용됩니다.</li>
</ul>
</li>
<li>Properties:<ul>
<li>주로 Java 애플리케이션에서 설정 파일로 사용됩니다.</li>
<li>키-값 쌍의 형태로 구성되며, 간단한 설정 정보를 저장하는 데 적합합니다.</li>
</ul>
</li>
<li>YAML (YAML Ain&#39;t Markup Language):<ul>
<li>사람이 쉽게 읽을 수 있도록 설계된 데이터 직렬화 표준입니다.</li>
<li>중첩된 데이터 구조를 표현하는 데 적합하며, 구문이 간단하고 가독성이 좋습니다.<hr></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>XML</p>
<ul>
<li>사용하기 까다롭다.</li>
<li>가독성이 떨어진다.<pre><code>&lt;부모노드명&gt;
&lt;자식노드명&gt;
    &lt;자식노드명&gt;값&lt;/자식노드명&gt;
    &lt;자식노드명&gt;값&lt;/자식노드명&gt;
    &lt;자식노드명&gt;값&lt;/자식노드명&gt;
&lt;/자식노드명&gt;
&lt;자식노드명&gt;
    &lt;자식노드명&gt;값&lt;/자식노드명&gt;
    &lt;자식노드명&gt;값&lt;/자식노드명&gt;
    &lt;자식노드명&gt;값&lt;/자식노드명&gt;
&lt;/자식노드명&gt;
&lt;/부모노드명&gt;</code></pre><hr>
</li>
</ul>
</li>
<li><p>JSON</p>
<ul>
<li>주석을 달 수 없다.</li>
<li>괄호는 짝, 문자열은 &quot;,&#39;로 묶여야한다.</li>
<li>값의 구분은 ,<pre><code>{
&quot;이름&quot; : 
[
    {
    &quot;이름&quot;:&quot;값&quot;,
    &quot;이름&quot;:&quot;값&quot;,
    &quot;이름&quot;:&quot;값&quot;,
    },
    {
    &quot;이름&quot;:&quot;값&quot;,
    &quot;이름&quot;:&quot;값&quot;,
    &quot;이름&quot;:&quot;값&quot;,
    }
]
}</code></pre><hr>
</li>
</ul>
</li>
<li><p>YAML</p>
<ul>
<li>주석을 달 수 있다.</li>
<li>괄호를 사용하지 않고, 값의 구분(,)을 사용하지 않는다.</li>
<li>Code가 줄어든다.
```
이름:</li>
</ul>
</li>
<li><p>이름: 값
이름: 값
이름: 값</p>
</li>
<li><p>이름: 값
이름: 값
이름: 값</p>
<pre><code></code></pre></li>
</ul>
<hr>

<h2 id="yaml-1">YAML</h2>
<ul>
<li><p>YAML Ain&#39;t Markup Language</p>
</li>
<li><p>2001년 Clark Evans에 의해 최초로 제안된 새로운 포맷팅 언어.</p>
</li>
<li><p>YAML 또는 YML 파일 확장자를 사용한다</p>
<ul>
<li>YML : OS중에 확장자를 3자만 인식하는 OS를 위해 제공. =&gt; 요즘에는 사용하지 않는다.<ul>
<li>MS-DOS, Windows 95, Windows 98</li>
</ul>
</li>
</ul>
</li>
<li><p>사람이 쉽게 읽을 수 있도록 설계된 데이터 직렬화 표준</p>
</li>
<li><p>중첩된 데이터 구조를 표현하는 데 적합하며, 간단한 구문과 가독성을 제공</p>
</li>
<li><p>주석 지원</p>
</li>
<li><p>2001년 clark evans에 의해 최초로 제안된 새로운 포맷팅 YAML / YML</p>
</li>
<li><p>들여쓰기(띄어쓰기)로 데이터를 구분한다. (PyThon도 동일)</p>
</li>
<li><p>json2yaml.com =&gt; (JSON &lt;-&gt; YAML로 변환하는 일)</p>
</li>
<li><p>CI(Continuous Integration) 툴에서 주로 사용 (Jenkins)</p>
</li>
<li><p>작성법 )</p>
<ul>
<li><strong>키와 값의 쌍</strong> ( 값은 공백으로 구분하기 위해선 &#39; : &#39;을 사용하며, 값은 공백으로 구분)
key : value</li>
<li>값을 공백으로 구분하지 않으면 하나의 문자열로 인식하여 문법 에러가 발생.
key:value </li>
<li><strong>콤마를 표기하지 않는다.</strong>(JSON과 달리 여러 개의 데이터가 있어도 엔터로 개행처리하면 된다.)
name : 윤웅찬
age : 20
addr : 경기도 수원시<h3 id="들여쓰기-indent">들여쓰기 (indent)</h3>
</li>
</ul>
</li>
<li><p>YAML은 계층구조로 데이터를 표현(Python도 동일)</p>
</li>
<li><p>들여쓰기는 기본적으로 2칸 또는 4칸 지원</p>
</li>
<li><p>이름, 나이, 학과가 student의 포함이 되어야 하면 들여쓰기를 한다.</p>
</li>
<li><p>예 )</p>
<pre><code>student : 
  name : 김동섭
  age : 25
  major : 컴퓨터공학</code></pre></li>
<li><p>값에 &#39; : &#39; 기호가 포함되는 경우 사용.</p>
<ul>
<li>YAML은 문자열이나 숫자를 자동으로 인식한다.<pre><code>name : 김동섭
addr1 : 서울시 강남구    #값을 문자열로 인식
addr2 : &quot;강남구 역삼동&quot;    # &quot; 나 &#39;로 묶어서 사용
addr3 : &#39;윤웅찬의 옆집&#39;    #값을 문자열로 인식
age : 20                #값을 숫자로 인식
value : &quot;1:2&quot;            # &quot; 나 &#39;로 묶어서 사용</code></pre><h3 id="와-의-차이">&quot;와 &#39;의 차이</h3>
</li>
</ul>
</li>
<li><p>특수문자를 구분할 때 차이가 난다.</p>
</li>
<li><p>&quot; : 특수문자를 해석한다.</p>
</li>
<li><p>&#39; : 특수문자를 일반 문자열로 해석한다. (\t가 그냥 출력된다.)</p>
<pre><code>str1 : &quot;\t tab \n newLine&quot; =&gt;    tab
                                newLine

str2 : &#39;\t tab \n newLine&#39; =&gt;\\t tab \\n newLine  
</code></pre><p><img src="https://velog.velcdn.com/images/yeong_mu/post/0e5b04b4-01f9-4fa6-8d4c-6009d9dbb260/image.png" alt=""></p>
</li>
</ul>
<h3 id="단순배열">단순배열</h3>
<ul>
<li>YAML은 -로 시작하면 배열로 인식 (하위 요소는 - 생략하고 들여쓰기로 맞추면 된다.)</li>
<li>-를 쓰지 않고 [] 로 묶으면 리스트로 인식을 한다.
```
member :</li>
<li>우미연</li>
<li>정명호</li>
<li>홍성강</li>
</ul>
<p>member : [우미연 , 정명호 , 홍성강]</p>
<pre><code>
![](https://velog.velcdn.com/images/yeong_mu/post/e9b02723-499f-4776-b5e0-c02340e047c4/image.png)

### 객체배열(JSONArray에 JSONObject가 들어있는 것)
- 문법 )
- 동일 객체의 멤버라면 -를 생략하고 들여쓰기로 쓴다.</code></pre><p>키 :</p>
<ul>
<li>이름 : 값
이름 : 값
이름 : 값</li>
<li>이름 : 값
이름 : 값<pre><code>![](https://velog.velcdn.com/images/yeong_mu/post/16657298-ddfb-4d2d-a660-9c577d0753d3/image.png)
</code></pre></li>
</ul>
<h3 id="boolean">boolean</h3>
<ul>
<li>yes, no, true, false : 4가지를 사용한다.</li>
<li>&quot;YES&quot;, &quot;NO&quot;를 하면 문자열로 취급된다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/bb37310d-deec-45b9-aed1-4ed7e8a8dec5/image.png" alt=""></li>
</ul>
<h3 id="주석">주석</h3>
<ul>
<li>&#35; 으로 주석 처리<pre><code>#학생정보
student:
.
.</code></pre></li>
</ul>
<h3 id="여러줄-사용">여러줄 사용</h3>
<ul>
<li><p>&gt; , | 를 사용하여 값을 여러 행으로 나눠서 작성가능</p>
<ul>
<li><p>&gt; (folded block scalr)
 &gt;기호는 엔터만 기술된 부분을 줄 변경으로 처리한다.
 -를 기술하면 가장 마지막에 \n이 붙지 않는다.</p>
<pre><code>  data : &gt;
  abc
  def

  ghi
  ddd

  data : &gt;-
  abc
  def

  ghi
  ddd</code></pre><p><img src="https://velog.velcdn.com/images/yeong_mu/post/4f7d1c72-b562-48e8-bd65-37784df1a054/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>| (literal block scalar)</p>
<ul>
<li><p>엔터는 모두 \n으로 인식</p>
</li>
<li><p>-를 기술하면 가장 마지막에 \n이 붙지 않는다.</p>
<pre><code>data : |
abc
def

ghi
ddd

data : |-
abc
def

ghi
ddd</code></pre><p><img src="https://velog.velcdn.com/images/yeong_mu/post/f8403fc3-0b5b-4a03-8403-7ef3225c558a/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="multiple-document">Multiple Document</h3>
<ul>
<li>&#45;&#45;&#45; 를 넣으면 여러 파일을 하나의 파일에 포함 시켜줄 수 있다.</li>
<li>spring boot에서 사용.<pre><code>spring1:
profile: dev
datasource:
  url: 192.168.0.1
</code></pre></li>
</ul>
<hr>
<p>spring2:
  profile: prod
  datasource:
    url: 211.63.89.11</p>
<pre><code>
## Jenkins
- LocalSystem 계정은 Windows에 높은 권한을 가진 기본 시스템 계정
- 추가적인 사용자 설정이 없어서 설정이 간단하다.
![](https://velog.velcdn.com/images/yeong_mu/post/c62c1d19-bda3-407c-aae4-ec3bce289b67/image.png)

- Port를 넣고 충돌이 발생하지 않는지 확인.
![](https://velog.velcdn.com/images/yeong_mu/post/d4409054-1972-4e62-96ad-c5b256bb6953/image.png)

- 초기 비밀번호 확인 가능
![](https://velog.velcdn.com/images/yeong_mu/post/7faafe23-dcef-4a79-8a0c-492cb967d3f9/image.png)

- 플러그인 자동 설치
![](https://velog.velcdn.com/images/yeong_mu/post/f9aae7d5-69e2-4309-af4f-02423f0d22bb/image.png)


![](https://velog.velcdn.com/images/yeong_mu/post/001439f3-adbc-46b0-a53c-e243d73f7006/image.png)

- 계정 생성
![](https://velog.velcdn.com/images/yeong_mu/post/e91d1818-5e48-43b3-a7da-e7ebd7bced06/image.png)

- cmd 관리자 권한 실행 후 systeminfo
![](https://velog.velcdn.com/images/yeong_mu/post/1b16c98a-30f7-4a9a-b312-0de8071eeae7/image.png)

- 4가지가 전부 &quot;예&quot; 여야함
![](https://velog.velcdn.com/images/yeong_mu/post/c82fb38c-9ac6-40f5-b37f-31b780acfeb5/image.png)




- Window 용 Docker와 VirtualBox가 충돌하지 않도록 설정
  - 현재 온라인 상태의 Windows 설치에 활성화된 기능과 비활성화된 기능을 표 형식으로 나열
    - dism /online /get-features format:table
  - ![](https://velog.velcdn.com/images/yeong_mu/post/efe105f2-b6eb-469c-a19f-644f966ed937/image.png)
  - ![](https://velog.velcdn.com/images/yeong_mu/post/25de6171-32b5-4e34-af05-97a5f06b3d1c/image.png)

- HypervisorPlatform , VirtualMachinePlatform 활성화 시키기
  - dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  - dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart


![](https://velog.velcdn.com/images/yeong_mu/post/e530e3cc-1b1e-4fe5-97d0-472ba1c72ff1/image.png)

![](https://velog.velcdn.com/images/yeong_mu/post/b5fb309b-873f-4dd7-833b-4337795cfac9/image.png)

![](https://velog.velcdn.com/images/yeong_mu/post/ce16bf7f-248f-4bfd-9034-557661a46936/image.png)

- 관리자모드로 powershell or cmd 실행 후 코드 실행
- WSL 2 를 기본버전으로 설정
![](https://velog.velcdn.com/images/yeong_mu/post/b17dea64-072b-4f4d-ab5e-d55da849c3f3/image.png)

&lt;hr&gt;

### Docker 설치
![](https://velog.velcdn.com/images/yeong_mu/post/b125d3d3-ceba-429a-bbc7-d6bd72066509/image.png)

- 로그아웃 후 재접속시 해당 창이 뜬다.
![](https://velog.velcdn.com/images/yeong_mu/post/c63144d7-7afa-4e47-ab06-4c60594d54ca/image.png)

![](https://velog.velcdn.com/images/yeong_mu/post/c4b83646-203c-4d3e-9f4b-2d1095e27983/image.png)

![](https://velog.velcdn.com/images/yeong_mu/post/adc298b2-d2b5-45a2-87b0-072a23821578/image.png)

- Use the WSL 2 based engine 체크 되어있는지 확인
![](https://velog.velcdn.com/images/yeong_mu/post/03e7d307-7131-4c5b-9b58-03d27d6bfa92/image.png)

- Enable integration with my default WSL distro 체크 되어있는지 확인
![](https://velog.velcdn.com/images/yeong_mu/post/d6b5fcdc-4cb5-43e3-8170-8feba0aad99b/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.04]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.04</link>
            <guid>https://velog.io/@yeong_mu/2024.07.04</guid>
            <pubDate>Thu, 04 Jul 2024 09:37:36 GMT</pubDate>
            <description><![CDATA[<h2 id="vue-인스턴스에-함수-추가">Vue 인스턴스에 함수 추가</h2>
<ul>
<li>new 객체에 methods 속성을 사용하여 함수를 정의.</li>
<li>예)<pre><code>  new Vue({
    el: &quot;vue객체가 적용될 id&quot;,
    data: {
      // vue객체에서 사용할 값 (JSON)
    },
    methods: {
      속성명: function(매개변수) {
        // 함수 내용
      },
      함수명(매개변수) {
        // 함수 내용
      }
    }
  });</code></pre></li>
</ul>
<ul>
<li><p>호출)</p>
<ul>
<li>{{  함수명() }}<pre><code>&lt;div id=&quot;app&quot;&gt;
{{ callFunction() }}
&lt;/div&gt;
</code></pre></li>
</ul>
<script>
  new Vue({
    el: "#app",
    data: { 
      person: { 
        name: "윤웅찬", 
        age: 27 
      } 
    },
    methods: {
      test: function(msg) {
        return msg + " 이름 : " + this.person.name;
      },
      callFunction() {
        return this.test("안녕");
      }
    }
  });
</script>
<p>```</p>
</li>
<li><p>methods 속성안에서 다른 함수나 vue객체가 가진 변수를 사용할 때에는 this.를 붙여서 사용</p>
</li>
<li><p>결과
<img src="https://velog.velcdn.com/images/yeong_mu/post/03338fa9-2171-4fa4-9451-6c4bfac5e396/image.png" alt=""></p>
<h2 id="event">event</h2>
</li>
<li><p>사용법)</p>
<ul>
<li>v-on:이벤트=“함수명” 속성사용</li>
<li>vue 2.0이상에서는 축약형으로 <strong>@을 v-on</strong> 대신 사용가능.</li>
</ul>
</li>
<li><p>예)</p>
<pre><code>&lt;input type=“button” v-on:click=“함수명”/&gt;
 &lt;input type=“button” @click=“함수명”/&gt;</code></pre></li>
<li><p>클릭 이벤트 )</p>
<pre><code>&lt;div id=&quot;app&quot;&gt;
  &lt;input type=&quot;button&quot; value=&quot;클릭&quot; class=&quot;btn btn-sm btn-primary&quot; v-on:click=&quot;handleClick&quot; /&gt;
  &lt;input type=&quot;button&quot; value=&quot;더블클릭&quot; class=&quot;btn btn-sm btn-primary&quot; v-on:dblclick=&quot;handleDblClick&quot; /&gt;
  &lt;input type=&quot;text&quot; placeholder=&quot;엔터를 치면 동작&quot; v-on:keyup.enter=&quot;handleEnter&quot; /&gt;
  &lt;input type=&quot;text&quot; value=&quot;clip board이벤트&quot; v-on:copy=&quot;handleClip&quot; /&gt;
  &lt;form v-on:submit.prevent=&quot;handleSubmit&quot;&gt;
    &lt;input type=&quot;text&quot; v-model=&quot;formValue&quot; /&gt;
    &lt;button type=&quot;submit&quot;&gt;전송&lt;/button&gt;
  &lt;/form&gt;
&lt;/div&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
  new Vue({
    el: &quot;#app&quot;,
    data: {
      formValue: &#39;&#39;
    },
    methods: {
      handleClick() {
        alert(&quot;버튼클릭됬슈~~~~&quot;);
      },
      handleDblClick() {
        alert(&quot;더블클릭&quot;);
      },
      handleEnter() {
        alert(&quot;엔터 푸슝파슝&quot;);
      },
      handleClip() {
        alert(&quot;Text가 복사되었음&quot;);
      },
      handleSubmit() {
        alert(&quot;폼이 서브밋 이벤트를 발생시킴 &quot; + this.formValue);
      }
    }
  });
&lt;/script&gt;</code></pre></li>
<li><p>화면
<img src="https://velog.velcdn.com/images/yeong_mu/post/7922bc83-e398-4796-b923-be6baf3d833f/image.png" alt=""></p>
</li>
<li><p>결과</p>
</li>
</ul>
<ol>
<li>클릭
<img src="https://velog.velcdn.com/images/yeong_mu/post/05f036ed-6ca5-409b-97c8-65bc84b07411/image.png" alt=""></li>
<li>더블클릭
<img src="https://velog.velcdn.com/images/yeong_mu/post/c15af12a-b6a9-480b-aeb8-b615e3721e40/image.png" alt=""></li>
<li>엔터
<img src="https://velog.velcdn.com/images/yeong_mu/post/455b1b59-18e4-43da-8c9e-09a36b06facf/image.png" alt=""></li>
<li>복사 (안에있는내용 긁어서 ctrl+c 했을경우)
<img src="https://velog.velcdn.com/images/yeong_mu/post/8110feef-3b99-49f1-9d13-e4d4dc35b3de/image.png" alt=""></li>
<li>폼 이벤트
<img src="https://velog.velcdn.com/images/yeong_mu/post/2842be12-cb37-405c-9a49-d58baca60f38/image.png" alt=""></li>
</ol>
<h3 id="새로운프로젝트만듬">새로운프로젝트만듬</h3>
<h3 id="event_testsrcappvue">EVENT_TEST/SRC/App.vue</h3>
<pre><code>  &lt;template&gt;
    &lt;div id=&quot;app&quot;&gt;
      &lt;h1&gt;VueJS 이벤트리스너 연습&lt;/h1&gt;
      &lt;input type=&quot;text&quot; placeholder=&quot;이름을 입력해주세요&quot; v-model=&quot;name&quot; /&gt;
      &lt;button @click=&quot;greet&quot;&gt;인사하기 (@click 축약형)&lt;/button&gt;
      &lt;button v-on:click=&quot;greet&quot;&gt;인사하기 (v-on:click)&lt;/button&gt;
      &lt;p&gt;{{ greetingMsg }}&lt;/p&gt;
    &lt;/div&gt;
  &lt;/template&gt;

  &lt;style&gt;
  #app {
    text-align: center;
    color: #2c3e50;
    margin-top: 60px;
  }
  input {
    padding: 10px 20px;
  }
  &lt;/style&gt;

  &lt;script&gt;
  export default {
    data() {
      return {
        name: &#39;&#39;, // 사용자의 이름을 저장하는 상태
        greetingMsg: &#39;&#39;, // 인사 메시지를 저장하는 상태
         // JavaScript 표준 스타일에서는 마지막 요소 뒤에 쉼표를 붙이는 것이 권장된다. 
         // greetingMsg : &#39;&#39;   ,  &lt;- 이거
      };
    },
    methods: {
      greet() {
        if (this.name) { // 만약 이름이 있으면
          this.greetingMsg = `안녕하세요? ${this.name}님!!!!`;
        } else {
          this.greetingMsg = &quot;이름을 입력해 주세요.&quot;;
        } // end else
      }
    }
  };
  &lt;/script&gt;

  &lt;style&gt;
  #app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    margin-top: 60px;
  }
  &lt;/style&gt;</code></pre><ol>
<li>localhost:8080 접속 화면
<img src="https://velog.velcdn.com/images/yeong_mu/post/6ac8ca36-2e12-46f2-b805-3f65de692f25/image.png" alt=""></li>
<li>아무 이름을 입력 후 버튼 클릭시 아래 결과 출력
<img src="https://velog.velcdn.com/images/yeong_mu/post/fcd41a99-8f97-4209-b2f5-c917fb2045d5/image.png" alt=""></li>
</ol>
<h2 id="v-if">v-if</h2>
<ul>
<li>문법)</li>
<li>HTML 태그에 넣어서 사용.<pre><code>   v-if=“조건식”
  조건에 맞을 때
 v-else-if=“조건식”
  조건에 맞을 때
   .
 v-else
  모든조건에 맞지 않을 때
  &lt;태그명 v-if=&quot;조건식&quot;&gt;조건에 맞을 때 실행코드&lt;/태그명&gt;
  &lt;태그명 v-else-if=&quot;조건식&quot;&gt;조건에 맞을 때 실행코드&lt;/태그명&gt;
  &lt;태그명 v-else-if=&quot;조건식&quot;&gt;조건에 맞을 때 실행코드&lt;/태그명&gt;
  &lt;태그명 v-else&gt;모든 조건에 맞지 않을 떄 실행코드&lt;/태그명&gt;</code></pre><ul>
<li>직접제어 가능한 이유 : vue가 양방향 바인딩을 지원하기때문에.<h3 id="if_testsrcappvue">IF_TEST/SRC/App.vue</h3>
<pre><code>&lt;template&gt;
&lt;div id=&quot;app&quot;&gt;
&lt;h2&gt;Vue if 예&lt;/h2&gt;
&lt;input type=&quot;number&quot; v-model=&quot;age&quot; placeholder=&quot;나이를 입력해 주세요&quot; /&gt;
&lt;button @click=&quot;chkAge&quot;&gt;입력&lt;/button&gt;
&lt;p v-if=&quot;ageMsg === &#39;adult&#39;&quot;&gt;성인입니다&lt;/p&gt;
&lt;p v-else-if=&quot;ageMsg === &#39;teenager&#39;&quot;&gt;청소년입니다&lt;/p&gt;
&lt;p v-else-if=&quot;ageMsg === &#39;child&#39;&quot;&gt;아동입니다&lt;/p&gt;
&lt;p v-else&gt;나이를 입력해 주세요&lt;/p&gt;
&lt;/div&gt;
&lt;/template&gt;
</code></pre></li>
</ul>
</li>
</ul>
<script>
export default { 
  data() {
    return {
      age: null,
      ageMsg: ""
    };
  },
  methods: {
    chkAge() {
      if (this.age === null) {
        this.ageMsg = "";
      } else if (this.age >= 20) {
        this.ageMsg = "adult";
      } else if (this.age >= 13) {
        this.ageMsg = "teenager";
      } else if (this.age >= 0) {
        this.ageMsg = "child";
      } else {
        this.ageMsg = "";
      }
    }
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
<pre><code>- 실행화면
![](https://velog.velcdn.com/images/yeong_mu/post/8784f360-d09c-4f5d-a7a4-3c5b9a06516b/image.png)
- 결과
![](https://velog.velcdn.com/images/yeong_mu/post/fbc1d9da-e783-4ce6-8603-9cbbd06cb568/image.png)

## v-for
- 반복시킬 때 사용.
- 문법 )</code></pre><p>  v-for = “(배열방의 값을 저장할 변수, 인덱스 저장변수) in 배열명” : key=&quot;index&quot;</p>
<pre><code>- key는 배열요소를 식별할 수 있는 고유값이 들어가야한다. (관리가능)</code></pre><p>  export default{
  data(){
  return{이름:[]}
  }
  }//모듈</p>
<p>  &lt;태그명 v-for=&quot;(변수명,인덱스) in 배열명&quot; :key=&quot;인덱스&quot;&gt;
  {{ 변수명 }}
  &lt;/태그명&gt;</p>
<pre><code>### FOR_TEST / App.vue</code></pre><template>
  <div id="app">
  <h2>VueJs v-for</h2>
  <input type="text" placeholder="해야 할일을 입력해주세요" v-model="newTodo"/>
  <button @click="addTodo">추가하기</button>
  <ul>
    <li v-for="(todo,index) in todos" :key="index">
      <strong>{{index}}.</strong>{{todo}}
      <button @click="removeTodo(index)">삭제</button>
    </li>
  </ul>
  </div>
</template>

<script>

export default {
  data(){
    return{
      newTodo : "",
      todos:[]
    }
  },
  methods:{
    addTodo(){
      if(this.newTodo.trim()){
        this.todos.push(this.newTodo.trim());
        this.newTodo="";
      }
    },
    removeTodo(index){ //:KEY의 값
      this.todos.splice(index,1);

    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

<pre><code>- 실행화면
![](https://velog.velcdn.com/images/yeong_mu/post/b45bba39-8969-47b6-8cbe-ea6664331f30/image.png)
- 결과 (삭제하기를 누르면 해당 요소가 삭제됨)
![](https://velog.velcdn.com/images/yeong_mu/post/6570a601-9ab9-40a6-a336-e08998831d58/image.png)

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.03]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.03</link>
            <guid>https://velog.io/@yeong_mu/2024.07.03</guid>
            <pubDate>Thu, 04 Jul 2024 08:51:47 GMT</pubDate>
            <description><![CDATA[<ul>
<li><a href="https://www.npmjs.com/">https://www.npmjs.com/</a> : 다양한 자바스크립트 모듈 또는 라이브러리가 등록된 npm repository</li>
<li>npm CLI(Command Line Interface ) : 명령으로 모듈을 다운하고 관리하는 사이트
<img src="https://velog.velcdn.com/images/yeong_mu/post/50e6ba99-02d8-45cc-b049-ec0af6b7c022/image.png" alt=""></li>
<li>npm.exe : 자바스크립트 명령어를 실행하는 도구.</li>
<li>설치 방법<ul>
<li>npm install 대상</li>
<li>예 ) jquery 설치 : npm install jquery</li>
</ul>
</li>
<li>설치된 리스트 확인<ul>
<li>npm list</li>
</ul>
</li>
<li>설치된 리스트의 의존성 트리 확인<ul>
<li>npm list -g -depth=0<ul>
<li>-g : 설치된 cli명령을 전역적을 어디에서든 사용가능.<h2 id="vue-cli설치">Vue CLI설치</h2>
</li>
</ul>
</li>
</ul>
</li>
<li>Back-end로 개발할 때 필요</li>
<li>Vue 프로젝트 생성, 실행, 빌드, 배포등 다양한 명령어를 제공하는 툴.</li>
<li>사용법 )<ul>
<li>npm install -g @Vue/cli<ul>
<li>-g : 설치된 cli명령을 전역적을 어디에서든 사용가능.</li>
</ul>
</li>
</ul>
</li>
<li>확인 )<ul>
<li>npm list -g</li>
</ul>
</li>
</ul>
<ol>
<li>vue project 생성 (vue cli명령실행) =&gt; cmd를 관리자권한으로 실행<ul>
<li>vue create 프로젝트명</li>
</ul>
</li>
<li>프로젝트 실행 (프로젝트르 실행하기 위해서 별도의 웹 서버를 설치할 필요가 없다.)<ul>
<li>파일 편집 vue app을 편집</li>
</ul>
</li>
<li>서버 실행 <ul>
<li>npm run serve</li>
</ul>
</li>
<li>배포
4.1 3번서버 중지 : ctrl + c
4.2 빌드 npm run build
4.3 dist 디렉토리에 개발된 파일들이 배포
<img src="https://velog.velcdn.com/images/yeong_mu/post/12370c24-6e4c-48f1-b233-ae66fa4f8065/image.png" alt=""><h2 id="실행">실행</h2>
</li>
</ol>
<ul>
<li>npm run serve &gt; 
<img src="https://velog.velcdn.com/images/yeong_mu/post/bac6879c-30c3-482a-8071-b650b27c8e88/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/fd25834d-dfee-46a6-8c09-aa28e3c4d523/image.png" alt=""></li>
<li>dist : Npm run build에 의해 생성되며 배포파일이 들어가는 디렉토리</li>
<li>node_modules : Node의 모듈이 들어가는 디렉토리</li>
<li>public : static 파일이 저장된 위치 /index.html( app entry point )</li>
<li>static 파일 저장된 위치 / index.html ( app entry point )</li>
<li>src / main.js ( javascript entry point )
src / App.vue ( Component entry point )
src/component/HelloWorld.vue ( component )</li>
</ul>
<ol>
<li>index.html이 호출된다.</li>
<li>javascript entry point로 들어가짐 (main.js)
<img src="https://velog.velcdn.com/images/yeong_mu/post/41642993-179f-4ee2-933a-6a80464c69be/image.png" alt=""></li>
<li>1 Component entry point로 감 (App.vue)</li>
<li>2 Component를 사용하게된다. (HelloWorld.vue)</li>
</ol>
<h2 id="vue-파일-구성">.vue 파일 구성</h2>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/ec5bd3a0-32f7-4e92-8969-73f75d5d9d3a/image.png" alt=""></p>
<ul>
<li>확장자는 vue로 생성</li>
</ul>
<ol>
<li>Template 구성요소 ( 화면 구성 ) </li>
<li>script 구성요소 ( 업무 로직 )</li>
<li>style 구성요소 ( 디자인 구성 )</li>
</ol>
<h2 id="front-end-개발방식-cdn사용">front-end 개발방식 (CDN사용)</h2>
<ol>
<li>cdn사용
<img src="https://velog.velcdn.com/images/yeong_mu/post/73416a14-7079-4827-a22f-f79913d6772d/image.png" alt=""></li>
</ol>
<ol start="2">
<li>HTML 태그 사이에 필요한 코드 작성
<img src="https://velog.velcdn.com/images/yeong_mu/post/69d8a038-4802-49a3-b0b0-67ac93bd80dc/image.png" alt="">
2.1 Vue 객체 생성<pre><code> $(function{
     new Vue({
     el:&quot;데이터를 적용할 id&quot;,
     data : 보여줄 데이터
     })
 })</code></pre>2.3 데이터 바인딩<pre><code> &lt;div&gt;
     {{이름}}
  &lt;div&gt;</code></pre><h2 id="data-binding">data-binding</h2>
</li>
</ol>
<ul>
<li>Vue 객체가 사용하는 값(model)을 타깃에서 보여주기 위해 사용하는 문법.</li>
<li>값은 vue객체에 data속성에 들어 있어야 한다.</li>
</ul>
<pre><code class="language-js">new Vue({
    el : &quot;적용될ID&quot;,
    data : {이름:값,이름:값,,,}
})</code></pre>
<ol>
<li><p>html body에 직접 출력</p>
<ul>
<li>{{이름}}<pre><code class="language-js">&lt;b&gt;{{이름}}&lt;/b&gt;</code></pre>
</li>
</ul>
</li>
<li><p>tag사이에 값을 출력</p>
<ul>
<li>v-text=&quot;이름&quot;<pre><code>&lt;h2 v-text=&quot;이름&quot;&gt;&lt;/h2&gt;</code></pre></li>
</ul>
</li>
<li><p>value속성 값으로 출력</p>
<ul>
<li>v-bind:value=&quot;이름&quot; =&gt; v-bind는 생략가능 :value=&quot;이름&quot;<pre><code>&lt;input type=&quot;text&quot; name=&quot;&quot; v-bind:value=&quot;이름&quot;/&gt;</code></pre><hr>
</li>
</ul>
</li>
<li><p>프로젝트 생성</p>
<ul>
<li>vue create sec_vue</li>
</ul>
</li>
<li><p>사용할 vue 버전
<img src="https://velog.velcdn.com/images/yeong_mu/post/4b13f9ce-3314-4927-8ffe-76d527bf6b00/image.png" alt=""></p>
</li>
</ol>
<ol start="3">
<li>프로젝트 생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/1a2080d4-9683-4f5a-9141-8245a7ac830e/image.png" alt=""></li>
<li>디렉토리 이동</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.02]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.02</link>
            <guid>https://velog.io/@yeong_mu/2024.07.02</guid>
            <pubDate>Tue, 02 Jul 2024 07:02:57 GMT</pubDate>
            <description><![CDATA[<h2 id="다른-서버-연동-virtual-hosting">다른 서버 연동 (Virtual Hosting)</h2>
<pre><code>server { #서버블록 
  listen 80; #80포트로 들어오는 HTTP요청 수신
  server_name ; #Nginx가 설치된 컴퓨터의 ip : server_name 3.38.209.232;

  location / { # URL 경로의 처리 / 
      proxy_pass ; # URL을 처리할 WAS의 주소(요청을 전달할 서버의 주소)
      proxy_set_header Host $host; # Host 헤더(클라이언트가 접근할 호스트의 도메인명,ip주소)의 정보를 WAS에 전달하기 위해 설정
      proxy_set_header X-Real-IP $remote_addr; # 접속자의 IP를 WAS로 전달
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }

  location / 하위URL { # URL 경로의 처리 /하위URL
      proxy_pass ; # URL을 처리할 WAS의 주소(요청을 전달할 서버의 주소)
      proxy_set_header Host $host; # Host 헤더(클라이언트가 접근할 호스트의 도메인명,ip주소)의 정보를 WAS에 전달하기 위해 설정
      proxy_set_header X-Real-IP $remote_addr; # 접속자의 IP를 WAS로 전달
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }

}</code></pre><h2 id="rdsrelational-database-service">RDS(Relational Database Service)</h2>
<ul>
<li>Amazon에서 제공하는 RDBMS 서비스로 사용자가 사용하기 쉽도록 인프라를 제공하는 서비스</li>
<li>사용자는 엔드포인트를 사용하여 서버에 접근
<img src="https://velog.velcdn.com/images/yeong_mu/post/6a9b15fd-e5d3-4781-b71d-b2920aeb2b65/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/42fa8710-f86d-4636-b689-66733594034e/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/bedb3a23-62fb-4da7-8deb-9b357a15db85/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/cda5030a-c719-43bd-936c-75a40fd6d0bd/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/67da3d1e-d861-4b1e-9eb4-e195fc98dc25/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/cfe237bf-b62c-4b12-8290-15d827efbec2/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/5cf71b1a-2d57-45c2-85a5-f9759c2a25d1/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/d0c60c9d-be99-4277-8fed-f290b3963fab/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/4f06aca8-2913-471b-abb1-d1d013e74cc9/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/fc4e3e78-7be6-445b-ad76-7519c786bfa1/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/917af1eb-6997-45df-9faa-c287a65ed969/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/389c2423-3043-4008-b462-30b3e4f2c9f4/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/70615c4f-7746-4692-b8f8-94d228a9fd0c/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/4786820c-0344-4a61-bcab-7bf9f1863eaf/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/0f952506-7e5f-4ace-aaf4-82c4ef633d31/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/ea7d72fe-324a-4e15-9805-906471d64257/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/86c584d0-2cec-49af-adf7-cde30b6632c2/image.png" alt=""></li>
</ul>
<h2 id="vuejs">Vue.js</h2>
<ul>
<li>2세대 자바스크립트 프레임워크</li>
<li>Web Application에서 사용자 UI를 제작하기위해 사용하는 오픈소스 Progressive JavaScript Framework</li>
<li>Evan You가 개발.(Angular JS에서 필요한 부분만 추출하고 기능을 더해 제작)</li>
<li>다른 JS Library를 사용하는 웹 프로젝트에 점진적으로 도입하기 쉽게 설계되어있다.</li>
<li>선언적 렌더링{{이름}} - 연결된 대상을 즉시 변경할 수 있다.</li>
<li>명령형 렌더링 - jquery - 연결된 대상을 순차적으로 변경.<h3 id="장점">장점</h3>
</li>
<li>유연하고 가볍다.</li>
<li>SPQ를 제작하기 좋다.</li>
<li>가상 DOM을 지원하여 빠른 UI Rendering 할 수 있다. (React.js와 같은 기능)</li>
<li>Vue는 AngularJS의 양방향 데이터 바인딩과 React의 단방향 데이터 바인딩의 장점을 결합한 프레임워크<ul>
<li>양방향 데이터 바인딩 : 화면에 표시된 값과 프레임워크의 모델 값이 동기화되어서 어느 한쪽이 변경되면 다른 한쪽도 자동으로 변경 되는것.</li>
<li>단방향 데이터 바인딩 : 컴포넌트가 데이터를 전달할 때 상위컴포넌트에서 하위컴포넌트 방향으로 전달되는 것</li>
</ul>
</li>
<li>CDN 제공</li>
<li>Vue 제공 사이트 : <a href="https://v2.ko.vuejs.org/">https://v2.ko.vuejs.org/</a><pre><code class="language-html">&lt;!-- 개발버전, 도움되는 콘솔 경고를 포함. --&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
</code></pre>
</li>
</ul>
<!-- 상용버전, 속도와 용량이 최적화됨. min-->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<pre><code>![](https://velog.velcdn.com/images/yeong_mu/post/32d1aaac-1b90-4cae-a7fb-8ccbf2aced13/image.png)

## Node.js
- Chrome V8자바스크립트 엔진으로 빌드된 JavaScript Runtime
- 다운 : https://nodejs.org/en
- 처음에는 자바스크립트 런타임으로 나왔으나 다양한 모듈을 설치하여 다양하게 개발할 수 있게 진화.
- Node.js는 JavaScript으로 Back-end 개발을 하고 싶을 때 사용.
![](https://velog.velcdn.com/images/yeong_mu/post/616c4af1-2abe-4a12-9f58-0ea4d2357477/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2024.07.01]]></title>
            <link>https://velog.io/@yeong_mu/2024.07.01</link>
            <guid>https://velog.io/@yeong_mu/2024.07.01</guid>
            <pubDate>Tue, 02 Jul 2024 00:20:04 GMT</pubDate>
            <description><![CDATA[<h2 id="설치된-ec2-이미지-생성-ami생성">설치된 EC2 이미지 생성 (AMI생성)</h2>
<ul>
<li>EC2 중지 &gt; 이미지생성 및 템플릿 &gt; 이미지생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/3d344217-d672-49f6-8898-800d1b4436e3/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/ad97ecf7-f792-43f3-8ba6-ac424a5ece07/image.png" alt=""></li>
</ul>
<h2 id="nginx-연동">Nginx 연동</h2>
<ul>
<li>웹 서버</li>
</ul>
<h2 id="nginx와-tomcat연동-장점">Nginx와 Tomcat연동 장점</h2>
<ul>
<li>웹 애플리케이션의 성능, 보안성 향상.</li>
</ul>
<ol>
<li><p>성능향상</p>
<ul>
<li>Nginx는 리버스 프록시로 클라이언트의 요청을 WAS에 전달하고 클라이언트에게 응답하는 역할</li>
<li>고성능 HTTP서버로 정적 컨텐츠(HTML,CSS, 이미지)를 빠르게 처리하여 Tomcat에 부하를 줄여준다.(Tomcat은 동적 컨텐츠(JSP/Servlet)만 처리하도록 집중시킬 수 있다.)</li>
<li>로드 밸런싱(load balancing) : 하나의 tomcat에 요청이 집중되지 않도록 트래픽을 분산시킬 수 있다.(특정 서버의 장애가 전체 서비스에 영향을 주지 않는다.)</li>
</ul>
</li>
<li><p>보안강화</p>
</li>
<li><p>관리효율성</p>
<ul>
<li>빠른설정적용 : 설정파일을 수정후 빠르게 재 로드 가능 =&gt; 서버의 다운타임을 줄일 수 있다.</li>
</ul>
</li>
<li><p>확장성 유연성</p>
<ul>
<li>다양한 MSA를 통합하고 관리할 수 있다. (각각의 MSA가 독립적으로 배포되고 운영됨.)</li>
</ul>
</li>
</ol>
<ul>
<li><ol>
<li>설치 )</li>
</ol>
<ul>
<li>sudo apt-get install nginx</li>
</ul>
</li>
<li><ol start="2">
<li>실행 )</li>
</ol>
<ul>
<li>sudo systemctl start nginx : 실행</li>
<li>sudo systemctl stop nginx : 정지</li>
<li>sudo systemctl restart nginx : 재실행</li>
<li>sudo systemctl reload nginx : 재설정</li>
</ul>
</li>
<li><ol start="3">
<li>설정파일(nginx.conf) 변경</li>
</ol>
<ul>
<li>위치 : /etc/nginx/nginx.conf
<img src="https://velog.velcdn.com/images/yeong_mu/post/41293ecd-b5e6-4bab-a42a-c21637543052/image.png" alt=""></li>
<li>설정파일에 /etc/nginx/conf.d/*.conf가 include되어있기 때문에 확장자가 .conf인 파일을 생성하여 설정하면 된다.</li>
</ul>
<p>3.1 : /etc/nginx/conf.d/proxy.conf
<img src="https://velog.velcdn.com/images/yeong_mu/post/4dd41699-722e-457a-b1de-ba9b5248bee8/image.png" alt=""></p>
<pre><code>server { #서버블록 
  listen 80; #80포트로 들어오는 HTTP요청 수신
  server_name ; #Nginx가 설치된 컴퓨터의 ip : server_name 3.38.209.232;

  location / { # URL 경로의 처리 / 
      proxy_pass ; # URL을 처리할 WAS의 주소(요청을 전달할 서버의 주소)
      proxy_set_header Host $host; # Host 헤더(클라이언트가 접근할 호스트의 도메인명,ip주소)의 정보를 WAS에 전달하기 위해 설정
      proxy_set_header X-Real-IP $remote_addr; # 접속자의 IP를 WAS로 전달
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }

}</code></pre></li>
<li><ol start="4">
<li>설정 파일의 문법 검사</li>
</ol>
<ul>
<li>sudo nginx -t</li>
</ul>
</li>
<li><ol start="5">
<li>재실행 </li>
</ol>
<ul>
<li>sudo systemctl restart(reload)nginx</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.28]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.28</link>
            <guid>https://velog.io/@yeong_mu/2024.06.28</guid>
            <pubDate>Fri, 28 Jun 2024 05:41:00 GMT</pubDate>
            <description><![CDATA[<h2 id="tomcat-설치">tomcat 설치</h2>
<ul>
<li><p>패키징 시스템에서 제공한다. (apt-get으로 설치할 수 있다.)
<img src="https://velog.velcdn.com/images/yeong_mu/post/23e53a80-33da-4495-a4f6-364b14b25880/image.png" alt=""></p>
</li>
<li><p>wget사용한 웹 링크에서 다운 받아 설치</p>
<ul>
<li>wget : 패키징 시스템에서 제공하는 설치파일이 없을 때</li>
</ul>
</li>
<li><p>사용법 ) - 사용자 홈 디렉토리가 아니면 보안상 다운이 되지 않을 수 있다.</p>
<ul>
<li>wget 다운 URL</li>
<li>wget <a href="https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.90/bin/apache-tomcat-9.0.90.tar.gz">https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.90/bin/apache-tomcat-9.0.90.tar.gz</a>
<img src="https://velog.velcdn.com/images/yeong_mu/post/db7efb7e-61a7-4d3d-a549-dd47d877c06e/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/bd226ce9-b2b3-450a-a658-871a0f94ff6d/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="tar-압축">tar 압축</h2>
<ul>
<li>압축하기<ul>
<li>tar -cvf 압축파일명 대상</li>
</ul>
</li>
<li>압축풀기
-tar -xvf 압축파일명 -C 압축이풀려질위치<h2 id="보안그룹-수정">보안그룹 수정</h2>
<img src="https://velog.velcdn.com/images/yeong_mu/post/d77d0228-2c64-4359-837f-dcd54bc78618/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/0774ef7e-6d99-4fbb-a82e-ab77e8347f32/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/ff92aa74-fccc-4332-88ad-eef5ed357b00/image.png" alt=""></li>
<li>0.0.0.0/0 : 모든 사용자</li>
</ul>
<h2 id="tomcat실행">tomcat실행</h2>
<ul>
<li>CATALINA_HOME에서 sudo ./bin/startup.sh (bin디렉토리가 보이는 디렉토리에서 실행)
<img src="https://velog.velcdn.com/images/yeong_mu/post/b97f90d2-5689-462f-a2f4-57c2d7112dd0/image.png" alt=""></li>
</ul>
<h3 id="중지">중지</h3>
<ul>
<li>CATALINA_HOME에서 sudo ./bin/shutdown.sh
<img src="https://velog.velcdn.com/images/yeong_mu/post/5e8d1cf5-577b-4426-aa64-242e0d7ec78b/image.png" alt=""></li>
</ul>
<h3 id="process-확인">Process 확인</h3>
<ul>
<li>어떤 프로그램이 동작하고 있는지 확인<ul>
<li>top : 실행중인 프로세스를 확인</li>
<li>ps : 실행중인 프로그램의 PID와 CPU사용률을 확인할 수 있다.</li>
</ul>
</li>
<li>특정 프로그램의 process가 동작중?<ul>
<li>BSD형식<ul>
<li>ps aux | grep 프로그램명 </li>
</ul>
</li>
<li>리눅스형식<ul>
<li>ps -ef | grep 프로그램명</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="프로세스-죽이기">프로세스 죽이기</h3>
<ul>
<li>sudo kill PID</li>
</ul>
<h2 id="파일-업로드">파일 업로드</h2>
<ul>
<li>winscp (SFTP, FTP) 프로그램</li>
<li><a href="https://winscp.net/eng/download.php">https://winscp.net/eng/download.php</a>
<img src="https://velog.velcdn.com/images/yeong_mu/post/13a61919-3077-4fa7-a699-9eaaa8893600/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/a57eeb69-1870-4ed1-89f0-028bf16c60e9/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/3e052a74-50a0-45ea-830e-e529dea8ecc0/image.png" alt=""></li>
</ul>
<hr>

<p><img src="https://velog.velcdn.com/images/yeong_mu/post/7b81bfb3-8639-4efb-b51d-876adcab8033/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.26]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.26</link>
            <guid>https://velog.io/@yeong_mu/2024.06.26</guid>
            <pubDate>Fri, 28 Jun 2024 00:18:27 GMT</pubDate>
            <description><![CDATA[<h2 id="탄력적-ip-eip">탄력적 IP (EIP)</h2>
<ul>
<li>외부에서 접근할 수 있는 고정 IP를 사용해야할 때.</li>
<li>인스턴스 하나당 하나의 EIP를 가질 수 있다.</li>
<li>탄력적 IP는 월 750시간이 무료이지만, EC2와 연결이 끊어지면 과금이 된다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/bcd1a413-991c-45c5-bfb2-6ddd0db4358b/image.png" alt=""></li>
<li>네트워크 및 보안 &gt; 탄력적 IP
<img src="https://velog.velcdn.com/images/yeong_mu/post/c210b2e0-b51e-4db6-a878-4e768038d035/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/40b7c44b-604a-48c8-ab6e-d1cda88bf58a/image.png" alt=""></li>
</ul>
<h3 id="탄력적-ip주소연결">탄력적 IP주소연결</h3>
<ul>
<li>탄력적 IP 선택한 후 &gt; 작업 &gt; 탄력적 IP주소연결
<img src="https://velog.velcdn.com/images/yeong_mu/post/a71ab55b-c51b-43d4-abc5-900908a85623/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/66e05aa6-5259-4409-abd7-1201507b75cc/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/28152884-ffbe-405c-9ccb-bfd4d0e5459c/image.png" alt=""></li>
</ul>
<h3 id="탄력적-ip삭제">탄력적 IP삭제</h3>
<ol>
<li>네트워크 및 보안 &gt; 탄력적 IP &gt; 작업 &gt; 탄력적 IP주소연결 해제
<img src="https://velog.velcdn.com/images/yeong_mu/post/e4273165-c641-494c-8e8b-bcd9360128d2/image.png" alt=""></li>
<li>작업 &gt; 탄력적 IP주소 릴리스
<img src="https://velog.velcdn.com/images/yeong_mu/post/84c717f6-bd98-4c0f-abb9-201793c0d5f0/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeong_mu/post/8b6a1477-4664-4d7e-ad97-a1df1ba39cc4/image.png" alt=""></li>
</ol>
<h2 id="directory-생성">directory 생성</h2>
<ul>
<li><p>생성 권한이 없는 계정이 디렉토리를 생성할 때에는 sudo를 사용하여 관리자 권한을 가지고 디렉토리를 생성한다.(sudo mkdir...)</p>
</li>
<li><p>사용법 )
sudo mkdir 생성할 디렉토리명
sudo mkdir /home/ubuntu/test : /home/ubuntu가 존재하므로 test 디렉터리가 생성
sudo mkdir /home/ubuntu/temp/test : test를 만들기위해서 temp라는 디렉터리가 존재해야하는데 temp디렉터리가 존재하지 않기때문에 error가 발생한다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/b43158f0-5747-4909-addb-0f74b7cf3546/image.png" alt=""></p>
<h2 id="리눅스-파일정보">리눅스 파일정보</h2>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/4ecea7e0-79f4-46c0-b4c8-149f391ec010/image.png" alt=""></p>
</li>
<li><p>파일유형 </p>
<ul>
<li>- : 파일</li>
<li>d : 디렉터리</li>
<li>l : 심볼릭 링크(단축아이콘)</li>
<li>c : 문자장치파일</li>
<li>b : 블록 장치파일</li>
</ul>
</li>
<li><p>파일의 권한(9개 문자)</p>
<ul>
<li>3개씩<ul>
<li>앞 3개 : 소유자 (user)</li>
<li>중 3개 : 그룹 사용자 권한</li>
<li>끝 3개 : 기타 사용자 권한</li>
</ul>
</li>
<li>r : 읽기 권한(4 : 1 0 0)</li>
<li>w : 쓰기 권한(2 : 0 1 0)</li>
<li>x : 실행 권한(1 : 0 0 1)</li>
<li>- : 권한 없음 (0 : 0 0 0)</li>
<li>8진수
0 0 0 - 권한없음.
0 0 1 - 실행권한
0 1 0 - 쓰기권한
1 0 0 - 읽기권한</li>
</ul>
</li>
<li><p>하드 링크</p>
<ul>
<li>이 파일이 HDD에 링크가 몇 개 걸려있는지</li>
</ul>
</li>
<li><p>소유자와 그룹</p>
</li>
<li><p>파일크기</p>
</li>
<li><p>파일이 마지막으로 수정된 날짜</p>
</li>
<li><p>파일명 또는 디렉토리명</p>
</li>
</ul>
<h3 id="조회된-파일이-많은-경우-끊어서-확인">조회된 파일이 많은 경우 끊어서 확인.</h3>
<ul>
<li>ls -la | more - 페이지의 끝에 도착하면 종료</li>
<li>ls -la | less - 페이지의 끝에 도착하더라도 방향키. PgUp, pgDn키로 계속 확인 가능
q를 누르면 빠져나간다</li>
<li>enter : 한 줄씩 갱신</li>
<li>spacebar : 한 페이지 씩 갱신</li>
</ul>
<h3 id="파일생성">파일생성</h3>
<ul>
<li>관리자 권한으로 실행되는 명령 (sudo)</li>
<li>생성되는 파일은 크기가 (0Kbyte)로 비어있는 text파일 생성</li>
<li>사용법 )
sudo touch 경로/파일명</li>
</ul>
<h3 id="파일내용-확인">파일내용 확인</h3>
<ul>
<li>사용법 )
cat 경로/파일명</li>
</ul>
<h3 id="삭제-파일을-삭제하거나-디렉토리-삭제">삭제 (파일을 삭제하거나 디렉토리 삭제)</h3>
<ul>
<li>rm</li>
<li>파일 삭제 (파일 하나 또는 *(wildcard)을 사용하여 해당파일을 모두 삭제)<ul>
<li><em>(wildcard) : *.java, a</em>.txt</li>
<li>sudo rm -r 삭제할 대상파일</li>
</ul>
</li>
<li>디렉토리 삭제<ul>
<li>sudo rm -r 삭제할 디렉토리명<ul>
<li>r 옵션을 사용하지 않으면 디렉토리 안에 파일이 존재하는 경우 삭제되지 않는다.</li>
<li>Ubuntu는 삭제할 디렉토리 내에서 삭제명령을 수행하면 삭제되지 않고, 해당 디렉토리를 빠져나왔을 때 삭제가 된다.<h3 id="복사-파일또는-디렉토리-복사">복사 (파일또는 디렉토리 복사)</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>cp</li>
<li>사용법 )<ul>
<li>파일 복사<ul>
<li>sudo cp -r 원본파일명 복사될디렉토리명</li>
</ul>
</li>
<li>디렉토리 복사<ul>
<li>sudo cp -r 원본디렉토리명 복사될디렉토리명<ul>
<li>-r : 원본 디렉토리안의 모든 파일, 디렉토리가 복사된다.</li>
<li>-r 옵션을 사용하지 않으면 복사되지 않는다.<h3 id="이동-파일-디렉토리">이동 (파일, 디렉토리)</h3>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>mv</li>
<li>사용법 )<ul>
<li>sudo mv 원본파일명 이동할 디렉토리</li>
</ul>
</li>
</ul>
<h3 id="연습">연습</h3>
<ul>
<li>사용자 홈 디렉토리 하위에 day0626/sub라는 이름의 디렉토리를 생성하고 , 홈 디렉터리 안에서 &quot;이니셜20240625.txt&quot;를 생성한 후 sub 디렉토리 하위에 복사 수행한다.</li>
<li>sub 디렉토리로 이동하여 해당 디렉토리안의 내용을 페이지 단위로 볼 수 있게 ls실행</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.27]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.27</link>
            <guid>https://velog.io/@yeong_mu/2024.06.27</guid>
            <pubDate>Thu, 27 Jun 2024 06:02:39 GMT</pubDate>
            <description><![CDATA[<h2 id="vi-editor--vim도-명령과-모드-같다">VI editor ( VIM도 명령과 모드 같다.)</h2>
<ul>
<li>파일의 내용을 편집할 때  사용하는 툴.( text, XML, HTML 등 문자열로  이루어진 파일을 
 편집할 수 있다.)</li>
<li>읽기모드, 편집모드, 명령모드 3가지 모드로 이루어져있고, 작업간의 이동이 가능하다.</li>
</ul>
<p>사용법)
 sudo vi 경로/파일명</p>
<ul>
<li>파일이 없다면 생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/e4687eb4-7093-4d57-90d1-91be20caeb0b/image.png" alt=""></li>
</ul>
<h3 id="읽기모드">읽기모드</h3>
<ul>
<li>최초실행 상태 또는 편집모드, 명령모드 에서 esc 키를 누르면 방향키로 커서를 이동할 수 있다.</li>
<li>방향키가 없는 키보드 <ul>
<li>h :왼쪽, j : 아랫쪽, k : 윗쪽, l : 오른쪽</li>
<li>w : 다음 단어의 첫 글자로 이동</li>
<li>b : 이전단어의 첫 글자로 이동</li>
<li>gg : 가장 첫 줄로 이동</li>
<li>G : 가장 마지막 줄로 이동</li>
</ul>
</li>
<li>:라인수  - n번 줄로 이동</li>
<li>작업 취소 :<ul>
<li>u : 작업취소 ( undo )</li>
<li>ctrl + r : undo를 다시 돌림 ( redo )</li>
</ul>
</li>
</ul>
<h3 id="편집모드--i-a-o-o">편집모드 : i, a, o, O</h3>
<ul>
<li>i : 커서 앞에서 문자를 입력할 때</li>
<li>a : 커서 뒤에 문자를 입력할 때.</li>
<li>o : 커서 아랫줄에 문자를 입력할 때.</li>
<li>O  : 커서 윗줄에 문자를 입력할 때</li>
</ul>
<h3 id="명령모드--esc키를-누르고-을-누르면-명령모드-진입">명령모드 : esc키를 누르고 :을 누르면 명령모드 진입.</h3>
<ul>
<li>q : 종료 – 파일에 문제가 있다면 빠져나지 못한다.</li>
<li>q! : 강제종료 – 파일에 문제가 있더라도 빠져나간다.</li>
<li>w : 저장</li>
<li>wq : 저장 후 종료</li>
<li>wq! : 저장 후 강제 종료</li>
</ul>
<h3 id="검색--읽기모드-">검색 ( 읽기모드 )</h3>
<ul>
<li>/찾을 문자열  : 앞에서부터 문자열을 찾는다.</li>
<li>문자열을 찾은 후 <ul>
<li>n : 다음 문자열을 검색</li>
<li>N : 이전 문자열을 검색</li>
</ul>
</li>
</ul>
<h3 id="복사">복사</h3>
<ul>
<li>yy : 커서가 있는 한 줄 을 복사 ( 여러 줄 복사  : 복사할라인수 yy – 3줄 복사 : 3yy )<h3 id="붙임">붙임</h3>
</li>
<li>p :커서가 있는 아랫줄에 붙임.</li>
<li>P : 커서가 있는 윗줄에 붙임.</li>
</ul>
<h3 id="삭제--삭제한-문자열은-클립보드에-저장되므로-p-p로-붙여넣기-할-수-있다">삭제 : 삭제한 문자열은 클립보드에 저장되므로 p, P로 붙여넣기 할 수 있다.</h3>
<ul>
<li>dd : 한줄 삭제</li>
<li>X : 커서앞에 있는 글자 삭제</li>
<li>x : 커서 뒤에 있는 글자를 삭제.</li>
<li>dw : 커서뒤에있는 단어 삭제</li>
<li>db : 커서 앞에 있는 단어 삭제.</li>
</ul>
<h3 id="작업-중에-shell로-나갈-때">작업 중에 shell로 나갈 때</h3>
<ul>
<li>명령모드에서  :sh  -&gt; 운영체제에 대한 작업.</li>
<li>작업 종료 후 exit</li>
</ul>
<h3 id="linux-프로그램-설치">Linux 프로그램 설치</h3>
<ul>
<li>debian 계열 : apt로  설치, red hat 계열 : rpm, yum으로 설치</li>
<li>패키징 시스템을 사용한 설치.</li>
</ul>
<h3 id="apt">apt</h3>
<ul>
<li><p>관리자권한으로 실행.</p>
<ol>
<li>apt update : 리눅스에 설치 가능한 패키지 리스트를 최신상태로 갱신.</li>
<li>apt upgrade : 갱신된 리스트를 기반으로 실제 업데이트를 수행.( 갱신된 항목이 적용)<ul>
<li>패키지 설치 도구</li>
<li>설치된 리눅스의 버전에 따라 그 리눅스가 가지고 있는 S/W설치 목록이 다르다.</li>
</ul>
</li>
</ol>
</li>
<li><p>사용법)</p>
<ul>
<li><p>apt update수행</p>
<ul>
<li>sudo apt-get update   ( sudo apt update )</li>
</ul>
</li>
<li><p>apt upgrade 수행</p>
<ul>
<li>sudo apt-get upgrade ( sudo apt upgrade )</li>
</ul>
</li>
</ul>
</li>
<li><p>apt-get update를 하지 않으면 최신프로그램이 보이지 않는다.</p>
</li>
</ul>
<ul>
<li><p>HDD의 사용률 확인</p>
<ul>
<li>sudo df –h</li>
</ul>
</li>
<li><p>snapshort 정리</p>
<ul>
<li>sudo apt autoremove --purge snapd</li>
</ul>
</li>
<li><p>apt list 확인</p>
<ul>
<li>sudo apt list</li>
<li>sudo apt list | less</li>
</ul>
</li>
</ul>
<h3 id="설치">설치</h3>
<ul>
<li>sudo apt-get install 패키지명</li>
</ul>
<h3 id="재설치">재설치</h3>
<ul>
<li>sudo apt-get reinstall 패키지명</li>
</ul>
<h3 id="제거">제거</h3>
<ul>
<li><p>sudo apt-get remove 패키지명   : 설정파일은 삭제되지 않고 남는다.</p>
</li>
<li><p>sudo apt-get remove purge 패키지명  : 설정파일 까지 삭제</p>
</li>
<li><p>sudo apt-get autoremove : 사용하지 않는 의존성 패키지를 삭제</p>
</li>
<li><p>sudo apt-get clean</p>
</li>
<li><p>예)</p>
<ul>
<li>openjdk 17설치<ul>
<li>sudo apt-get install openjdk …. <h3 id="설치된-패키지-확인">설치된 패키지 확인</h3>
dpkg --list
<img src="https://velog.velcdn.com/images/yeong_mu/post/5940c838-9936-4d14-bf32-5b393dfb44fa/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>jdk : GUI가 없는환경 ( GUI 가 포함되지 않는 버전)</p>
</li>
</ul>
<h3 id="grep">grep</h3>
<ul>
<li>명령을 필터링하여 특정패턴(입력값)에 일치하는 줄만 표현
기존의 명령어 뒤에 | 를 사용하여 붙여준다.</li>
<li>예 ) dpkg --list | grep 패턴 =&gt; dpkg -list | grep openjdk</li>
</ul>
<h3 id="java가-설치된-경로-확인">java가 설치된 경로 확인</h3>
<ul>
<li>whereis사용</li>
<li>사용법 ) <ul>
<li>whereis 찾을이름</li>
</ul>
</li>
</ul>
<ol>
<li>whereis 프로그램명 (프로그램을 어떤 디렉토리에서 참조하는가?)
<img src="https://velog.velcdn.com/images/yeong_mu/post/0318cae8-b9a7-49f0-b24f-50a70eaf90b0/image.png" alt=""></li>
<li>ls -l로 실제 경로를 참조 (심볼릭링크 사용)<ul>
<li>ls -l 이름</li>
<li>ls -l /usr/bin/java
<img src="https://velog.velcdn.com/images/yeong_mu/post/52cf413e-674e-4c6d-886f-7c26802495c2/image.png" alt=""></li>
</ul>
</li>
</ol>
<ul>
<li>/usr/bin/java에서는 이 파일이 참조하고있는 위치가 보인다./java가 보임.</li>
<li>/usr/share/java에서는 java가 보이지 않는다.</li>
</ul>
<h3 id="ls--l-ectalternativesjava를-하면-실제-참조하고있는-주소를-보여준다">ls -l /ect/alternatives/java를 하면 실제 참조하고있는 주소를 보여준다.</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/f55baf76-7981-4878-816b-ec6b41b1e13c/image.png" alt=""></p>
<h3 id="환경설정--사용자-홈-디렉토리에-bashrc파일">환경설정 =&gt; 사용자 홈 디렉토리에 .bashrc파일</h3>
<ol>
<li><p>./bashrc파일 열기</p>
<ul>
<li>sudo vi ~/.bashrc</li>
</ul>
</li>
<li><p>가장 아랫줄로 이동하여 JAVA_HOME과 PATH설정</p>
<ul>
<li>export JAVA_HOME=자바가 설치된 디렉토리</li>
<li>export PATH=$PATH:$JAVA_HOME/bin<ul>
<li>&amp;는 기존 디렉토리 참조 $JAVA_HOME -&gt; JAVA_HOME</li>
</ul>
</li>
<li>export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH</li>
</ul>
</li>
<li><p>저장 후 빠져나옴.</p>
</li>
<li><p>PATH 적용</p>
<ul>
<li>재부팅 : 시간 소요<ul>
<li>sudo reboot -h now  리눅스 종료 sudo shutdown -h now</li>
</ul>
</li>
</ul>
</li>
<li><p>재부팅 없이 변경설정 적용.</p>
<ul>
<li>source ~/.bashrc</li>
</ul>
</li>
</ol>
<h3 id="적용된-path-확인">적용된 PATH 확인</h3>
<ul>
<li>echo 사용</li>
<li>사용법 )<ul>
<li>echo $PATH</li>
<li>echo $JAVA_HOME
<img src="https://velog.velcdn.com/images/yeong_mu/post/e1774bd8-a97a-4d16-8b45-af8b0537c9a8/image.png" alt=""><h3 id="설치된-프로그램-확인">설치된 프로그램 확인</h3>
</li>
</ul>
</li>
<li>sudo apt list --installed 프로그램명</li>
<li>sudo apt list --installed openjdk-17-jdk</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.25]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.25</link>
            <guid>https://velog.io/@yeong_mu/2024.06.25</guid>
            <pubDate>Tue, 25 Jun 2024 05:21:30 GMT</pubDate>
            <description><![CDATA[<h2 id="aws-프리티어">AWS 프리티어</h2>
<ul>
<li>AWS 신규가입자에게 1년간 무료로 사용할 수 있는 프리티어 제공.<h3 id="ec2--t2micro-tcmicro에-한하여-월-750시간-무료">EC2 – t2.micro, tc.micro에 한하여 월 750시간 무료</h3>
</li>
<li>인스턴스 (OS가 설치된 컴퓨터 한대 )를 두 개돌리면 각 월 375시간 무료<h3 id="eip--elastic-ip---ec2에서-고정-ip를-사용-할-수-있는-서비스">EIP ( Elastic IP ) – EC2에서 고정 IP를 사용 할 수 있는 서비스</h3>
</li>
<li>프리티어에서는 하나의 EIP를 사용할 수 있다.</li>
<li>EC2와 연결이 끊어지거나 ECP가 stop상태라면 과금된다. </li>
<li>월 750시간 기본</li>
</ul>
<h2 id="elb-load-balancing">ELB (Load Balancing)</h2>
<ul>
<li>애플리케이션의 트래픽을 여러 EC2인스턴스에 자동 배포해주는 서비스.</li>
<li>월 750시간 무료</li>
</ul>
<h2 id="esb-elastic-block-store">ESB (Elastic Block Store)</h2>
<ul>
<li>EC2인스턴스용 스토리지 ( 30GByte 무료 )</li>
<li>30GByte가 초과되었을 때 1GByte당 과금된다. ( 0.005$ )</li>
<li>(RDBMS의 데이터를 저장, File 저장, 로그 저장 … )</li>
</ul>
<h2 id="s3">S3</h2>
<ul>
<li>보안성, 안정성을 가진  저장소( 버킷단위로 저장 – 데이터의 암호화 지원)</li>
<li>표준 스토리지로 5GByte까지 무료 사용가능.</li>
<li>GET- 20,000건까지만 무료, PUT 요청시 2,000건 까지만 무료</li>
<li>RDS – MySQL, MariaDB, Oracle, SQL Server를 제공하는 데이터베이스 서비스.</li>
<li>RDS 인스턴스 1개 무료( db.t2.micro 만 사용가능 )</li>
<li>월별 750시간 무료. SSD 데이터베이스 스토리지 20GByte제한.</li>
<li>( 꼭!!!! RDS생성시 오토백업 안되게 주의, RDS 스토리지 자동 조정옵션끄기,
 Multi-AZ와 고성능 IO 종료 )</li>
</ul>
<hr>
### 리전 선택(서울인지 확인)

<p><img src="https://velog.velcdn.com/images/yeong_mu/post/66dbb1bb-f4c1-4b6c-841a-c9592b12719c/image.png" alt=""></p>
<h3 id="ec2설치">EC2설치</h3>
<ul>
<li><p>AMI 인스턴스 생성
<img src="https://velog.velcdn.com/images/yeong_mu/post/6cc1b2c5-56d5-4518-9503-b8fea2f5e278/image.png" alt=""></p>
<ul>
<li>인스턴스 중지(정지)</li>
<li>인스턴스 종료(삭제) =&gt; 30분 정도 후에 사라진다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/27378af1-2e54-4dbc-82f0-a8f81ec7b7eb/image.png" alt=""><h3 id="putty다운">PuTTY다운</h3>
</li>
</ul>
</li>
<li><p>리눅스에 접근하기위한 터미널 프로그램.</p>
</li>
<li><p>putty.org에서 다운
<img src="https://velog.velcdn.com/images/yeong_mu/post/4a03f2a5-0a9e-49a7-af38-0beab214097a/image.png" alt=""></p>
<h3 id="putty를-실행하여-ec2에-접속">PuTTY를 실행하여 EC2에 접속</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/2b68fa8e-b900-44c8-a689-b30e62248244/image.png" alt=""></p>
<h3 id="lunux무료도-있지만-유료도-존재">Lunux(무료도 있지만 유료도 존재)</h3>
</li>
<li><p>degbian 계열과 Red Hat 계열있음.(directory구성과 명령어가 조금 씩 다르다.)
<img src="https://velog.velcdn.com/images/yeong_mu/post/829abd2e-ca39-45f0-9797-d087d29e24cb/image.png" alt=""></p>
<h3 id="리눅스-명령어">리눅스 명령어</h3>
<ul>
<li>접속사 정보:</li>
</ul>
</li>
<li><p>who : 모든 접속자 정보
<img src="https://velog.velcdn.com/images/yeong_mu/post/51150388-afc5-46e3-8859-33fc72bab0bc/image.png" alt=""></p>
<ul>
<li>계정명</li>
</ul>
</li>
<li><p>whoami
<img src="https://velog.velcdn.com/images/yeong_mu/post/33034b29-2753-4021-938a-b54777ad2cd0/image.png" alt=""></p>
<ul>
<li>현재위치 확인</li>
</ul>
</li>
<li><p>pwd
<img src="https://velog.velcdn.com/images/yeong_mu/post/dcaf4b0d-aa5a-44ce-8ea0-45a147ced62e/image.png" alt=""></p>
<ul>
<li>날짜 확인(UTC)</li>
</ul>
</li>
<li><p>date : 기본 AMI이미지를 사용하면 미국날짜에 맞게 설치된다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/feb476b5-eb05-4d62-8662-d5cbc1ac0c39/image.png" alt=""></p>
<ul>
<li>날짜 변경 (UTC - KST)</li>
</ul>
</li>
<li><p>zonefino</p>
<ul>
<li>전세계의 시간을 측정하는 표준시간대 
( 국제적으로 날짜를 동기화할 때 사용 )
UTC  ( Coordinated Universal Time )
영어로는 CUT 프랑스어로 TUC로 약자가 다른데
공통으로 사용하기 위해서 순서를 맞춰 UTC부름.
KST는  UTC+9</li>
</ul>
<ol>
<li>지역검색 ( 날짜를 변경할 zone이 있는지 조회, 우리는 Asia/Seoul )
ls /usr/share/zoneinfo  또는   ls /usr/share/zoneinfo/Asia
<img src="https://velog.velcdn.com/images/yeong_mu/post/dd22ead6-b29d-4484-bb0f-ff8bed436743/image.png" alt=""></li>
<li>timezone 변경
sudo ln –sf 변경할zone  /etc/localtime
sudo ln –sf /usr/share/zoneinfo/Asia/Seoul  /etc/localtime
<img src="https://velog.velcdn.com/images/yeong_mu/post/345aeda1-0f1a-4846-99d3-505d2063dc9c/image.png" alt=""><h3 id="directory-이동">directory 이동</h3>
</li>
</ol>
<ul>
<li>cd 사용 ( 절대경로, 상대경로 모두 사용가능 )</li>
<li>사용법)</li>
</ul>
</li>
<li><p>cd 경로</p>
</li>
<li><p>절대경로 ( 어디에 있는 이동가능 )</p>
<ul>
<li>cd /최상위경로/하위경로</li>
</ul>
</li>
<li><p>최상위 root로 이동</p>
<ul>
<li>cd /</li>
</ul>
</li>
<li><p>사용자 home directory 이동 ( /home/ubuntu )</p>
<ul>
<li>cd /home/ubuntu</li>
<li>cd ~</li>
</ul>
</li>
<li><p>상대경로</p>
<ul>
<li>cd .. ( 현재경로에서 한 수준(directory) 위로 이동 )</li>
<li>cd ../상위디렉토리의 다른 디렉토리명</li>
</ul>
</li>
<li><p>화면초기화</p>
<ul>
<li>clear<h3 id="directory와-file-확인">directory와 file 확인</h3>
</li>
<li>Is -옵션</li>
<li>파일명만 검색 : Is
<img src="https://velog.velcdn.com/images/yeong_mu/post/4d32deda-d6ea-4865-98f7-a8bf90886289/image.png" alt=""></li>
<li>Is- I : 모든 파일과 디렉토리 정보를 보여준다.</li>
<li>Is -a : 파일, 디렉토리의 간략한 정보와 상위 디렉토리가 있으면 보여준다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/f989b959-5bab-4462-96a2-fe3a434ea48b/image.png" alt=""></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.24]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.24</link>
            <guid>https://velog.io/@yeong_mu/2024.06.24</guid>
            <pubDate>Tue, 25 Jun 2024 05:07:05 GMT</pubDate>
            <description><![CDATA[<h1 id="aws-amazon-web-service-">AWS( Amazon Web Service )</h1>
<ul>
<li>amazon.com에서 개발한 클라우드 컴퓨팅 플랫폼</li>
<li>server less환경 ( 개발된 프로그램을 서비스 하기위해 서버장비를 구매하는 방식이 아닌 서버를 임대하여 서비스하는 방식)</li>
<li>클라우드 서비스하는 방식에 따라 IaaS, Paas, SaaS 3가지로 구분한다.<h3 id="iaasinfrastructor-as-a-service">Iaas(Infrastructor as a Service)</h3>
</li>
<li>AWS나 네이버플랫폼 처럼 인프라를 제공하는 클라우드 서비스.</li>
<li>infra : 가상서버, 저장소, 가상 네트워크 등의 서비스를 제공하는 환경.<ul>
<li>장점 : 사용자가 물리적인 H/W를 관리할 필요가 없으며, Scale Out을 손쉽게 할 수 있다.</li>
</ul>
</li>
<li>AWS, MA Area, IBM Softlayer등이 대표적인 서비스 제공 업체.</li>
<li><strong>Sacle up</strong> : 고사양의 H/W로 교체하는 것. (CPU, Memory를 증설하는 물리적인 성능향상)<ul>
<li>고비용, 고효율</li>
<li>장점 : 상대적으로 관리가 쉽다.(낮은 관리비용, 관리에서 발생하는 이슈가 적다.)</li>
<li>단점 : 성능향상에 한계가 있다.(서버 한대가 분담하는 양이 많아지면 타격이 있다.)<ul>
<li>다운타임이 발생할 수 있다.(증설할 때 서비스를 할 수 없는 상황이 발생)</li>
</ul>
</li>
</ul>
</li>
<li><strong>Scale out</strong> : 비슷한 사양의 서버를 추가적으로 연결하는 것 <ul>
<li>저비용, 적당한 효율</li>
<li>장점 : 확장의 유연성이 좋다. 확장비용이 scale up보다 적다.</li>
<li>단점 : 관리가 어렵다. 관리비용이 많이 든다.<ul>
<li>데이터 정합성에 대한 이슈가 발생할 수 있다.<h3 id="paasplatform-as-a-service">Paas(Platform as a Service)</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>클라우드 서비스로 DBMS, Application Server, Middel ware만 제공하는 서비스</li>
<li>주로 개발에 관련된 환경만 서비스 (OS, DBMS, WAS, JDK)<h3 id="saassoftware-as-a-service">SaaS(Software as a Service)</h3>
</li>
<li>클라우드 서비스를 프로그램만 제공하는 서비스</li>
<li>웹메일, ERP, OPffice365 등과 같은 프로그램만 사용자에게 제공하는 서비스<hr>
## AWS 고객층</li>
<li>기업고객 : 넷플릭스, SEGA, 아마존, SAP,,,</li>
<li>공공고객 : NASA<h2 id="aws-장점">AWS 장점</h2>
</li>
<li>저렴한 비용(장기약정이 없다, 종량제 과금방식)</li>
<li>속도(전세계에 리전(저장소)이 분산되어 있어 사용자의 위치와 물리적으로 가장 가까운 서버를 선택하여 서비스 할 수 있다.)</li>
<li>민첩성 : OS 설치가 빠르다(5분만에 설치가능), 관리가 편하다.</li>
<li>리전에 따라 가격이 다르다.(광고, 전력수급 =&gt; 개도국-비쌈, 선진국-저렴)</li>
<li>리전의 속도 체크. (<a href="http://cloudping.info/">http://cloudping.info/</a>)
<img src="https://velog.velcdn.com/images/yeong_mu/post/1902ec75-958e-4ac0-81cf-b3ecf64717c8/image.png" alt=""></li>
<li>현재 접속자의 위치와 지리적으로 가까운 리전이 응답속도가 빠르다.<h2 id="aws의-기초서비스">AWS의 기초서비스</h2>
</li>
<li>컴퓨팅, 네트워킹, 저장소, 관리도구등을 서비스한다.
<img src="https://velog.velcdn.com/images/yeong_mu/post/a7589ad7-955b-4de4-b28a-cc45b697f0f2/image.png" alt=""><h3 id="aws-컴퓨팅-ec2">AWS 컴퓨팅 (EC2)</h3>
</li>
<li>Elastic Compute Cloud(EC2) : AWS 핵심 서비스<ul>
<li>OS의 이미지를 사용하여 서버 인스턴스를 빠르게 확보하고 서비스할 수 있다.<h3 id="네트워킹">네트워킹</h3>
</li>
</ul>
</li>
<li>사용자에게 AWS의 가상네트워크환경을 직접 제어할 수 있도록 인터페이스를 제공.<h3 id="스토리지">스토리지</h3>
</li>
<li>서비스 사용자의 사용유형에 따라 다양한 스토리지를 제공한다.</li>
<li>프로그램 서비스 -EC2(30Gbyte)</li>
<li>파일서버(이미지,동영상) -S3 저장소를 사용하면 단일파일로 5TByte까지 저장하고 서비스할 수 있다.<h3 id="관리도구">관리도구</h3>
</li>
<li>Amazon IAM(Identity and Access Management)을 제공하여 강력한 사용자 인증과 권한을 부여할 수 있다.<h3 id="region">Region</h3>
</li>
<li>전 세계의 각 지역에 있는 Data Center의 위치를 Region이라고 한다.</li>
<li>하나의 리전에는 두개 이상의 가용영역(AZ : Availability Zone)이 제공.<ul>
<li>하나의 가용영역에 장애가 발생하더라도 서비스를 지속적으로 제공할 수 있다.</li>
</ul>
</li>
<li>선택한 리전과 사용자의 거리가 멀수록 속도가 느려진다.</li>
<li>리전이 위치한 지역에 따라 사용요금이 차별화 되어있다.<h3 id="aws가입">AWS가입</h3>
</li>
<li>국제전화가능, 국외 결제가 가능한 카드(비자, 마스터)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.21]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.21</link>
            <guid>https://velog.io/@yeong_mu/2024.06.21</guid>
            <pubDate>Mon, 24 Jun 2024 00:14:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeong_mu/post/8c55a546-677d-4eda-935f-fd0513eed725/image.png" alt=""></p>
<h2 id="msamicroservices-architecture">MSA(Microservices Architecture)</h2>
<ul>
<li>MSA는 작고 독립적인 서비스들로 분리하여 구성하는 개발방식</li>
<li>각각의 서비스는 특정기능(로그인, 회원관리, 게시판관리)을 담당하며, 독립적으로 개발/배포가 가능하다.</li>
<li>특징<ul>
<li>독립적 배포 : 배포, 업데이트시 다른 서비스에 영향을 주지 않는다.</li>
<li>다양한 기술 스택 가능 : 각 서비스는 다른 프로그래밍언어, 데이터베이스, 프레임워크를 사용할 수 있어서 각 서비스에 최적화된 기술을 선택하여 개발할 수 있다.</li>
<li>확장성 : 필요한 서비스만 확장할 수 있어서 자원의 효율성을 향상시킬 수 있다.</li>
<li>도입 : Netflix, Amazon, Uber 등 도입하여 서비스 하고 있다.</li>
</ul>
</li>
<li>장점<ul>
<li>독립적인 배포와 개발</li>
<li>확장성 : 필요한 서비스만 개별적으로 확장하고 서비스 할 수 있다.<ul>
<li>Scale-out : 서버를 여러 대 추가하여 시스템을 확장</li>
<li>Scale-up : 기존 서버사양을 업그레이드하여 시스템 확장 ( RAM 증설 등등)</li>
</ul>
</li>
<li>신뢰성 : 하나의 서비스가 실패하더라도 전체시스템이 중단되지 않도록 설계와 서비스 가능.</li>
<li>유연한 기술 스택 : 서비스마다 다른언어나 환경으로 구현 가능.</li>
<li>유지 보수의 편의성.</li>
</ul>
</li>
<li>단점 <ul>
<li>복잡성 증가, 데이터 일관성문제, 네트워크 지연 발생 가능, 테스트의 복잡도 향상</li>
<li>운영부담 : 각 서비스의 배포, 모니터링, 로깅관리, 장애처리를 각각 수행해야하기 때문에 운영비용 증가.</li>
</ul>
</li>
<li>MSA는 대규모 시스템의 확장성과 유연성을 높이는데 매우 유용하나 복잡성, 운영부담이 따라온다.</li>
</ul>
<h2 id="모놀리식-아키텍쳐monolithic-architech">모놀리식 아키텍쳐(Monolithic Architech)</h2>
<ul>
<li>전통적인 개발방식으로 하나의 프로젝트에 모든 기능이 함께 포함되는 구조.</li>
<li>장점<ul>
<li>초기 개발이 유리하며 빠르게 프로토타입을 개발할 수 있다.</li>
<li>필요한 모든 기능을 한번만 호출하기 때문에 복잡한 통신 없이 직접 사용가능.</li>
</ul>
</li>
<li>단점<ul>
<li>코드 베이스가 커지면 커질수록 복잡해지므로 유지관리가 어려워진다.</li>
<li>일부 기능을 수정하거나 변경할 때마다 전체 애플리케이션을 재배포해야한다.</li>
</ul>
</li>
<li>간단한 소규모프로젝트나 단기프로젝트에 적합.<ul>
<li>스택오버플로우는 MSA 도입하지 않고 모놀리식으로 서비스(하루 평균 접속자 870만)<h2 id="spring-boot는-msa로-개발하는데-매우적합">Spring Boot는 MSA로 개발하는데 매우적합.</h2>
</li>
</ul>
</li>
<li>독립적 실행 가능 : Spring Boot는 독립적으로 실행하는 Jar로 패키징가능</li>
<li>간편한 설정 : application.properties를 사용하여 간편한 관리 및 운영.</li>
<li>내장서버 지원 : Tomcat,Jetty등 다양한 내장서버로 개발된 애플리케이션을 빠르게 실행</li>
</ul>
<h2 id="restful">RESTful</h2>
<ul>
<li>REST(Representational State Transfer) 아키텍쳐 스타일을 따르는 웹 서비스</li>
<li>REST는 웹의 기존 기술과 프로토콜을 사용하여 네트워크상의 클라이언트와 서버간의 통신을 설계하는 방법을 제안. (클라이언트가 다양하게 만들어질 수 있다.)<h3 id="rest의-기본-원칙">REST의 기본 원칙</h3>
</li>
</ul>
<ol>
<li>자원(Resource)에 기반한 아키텍처 스타일 자원은 URI로 식별된다.<ul>
<li>예) <a href="http://localhost/user/1">http://localhost/user/1</a> -&gt; 아이디가 1인 사용자의 자원을 나타낸다.</li>
</ul>
</li>
<li>표현 (Representation)<ul>
<li>자원은 여러 형태로 표현(응답 , 요청) =&gt; 가장 일반적으로 JSON , XML형식을 사용한다.<ul>
<li>예 ) {id:1,username:&quot;홍길동&quot;}</li>
</ul>
</li>
</ul>
</li>
<li>상태 (Staeless)<ul>
<li>RESTful 서비스는 무상태(Stateless)를 기본이고, 각 요청을 독립적이고 서버는 이전상태를 기억하지 않는다</li>
</ul>
</li>
<li>HTTP method를 사용.<ul>
<li>REST는 HTTP 프로토콜의 method를 사용하여 CRUD작업을 수행<ul>
<li>GET : 자원을 조회할 때 사용 $.ajax({type:&quot;GET&quot;}) -&gt; SELECT =&gt; @GetMapping</li>
<li>POST : 자원을 생성할 때 사용 $.ajax({type:&quot;POST&quot;}) -&gt; INSERT =&gt; @PostMapping</li>
<li>PUT : 자원을 전체 업데이트할 때 사용 $.ajax({type:&quot;PUT&quot;}) -&gt; UPDATE =&gt; @PutMapping</li>
<li>PATCH : 자원의 부분 업데이트할 때 사용 $.ajax({type:&quot;PATCH&quot;}) -&gt; UPDATE =&gt; @PutMapping</li>
<li>DELETE : 자원을 삭제할 때 사용 $.ajax({type:&quot;DELETE&quot;}) -&gt; DELETE =&gt; @DeleteMapping<h3 id="restful장점">RESTful장점</h3>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<ul>
<li><p>단순성 : REST는 HTTP표전을 기반하므로 이해와 사용이 쉽다.</p>
</li>
<li><p>유연성 : 다양한 데이터형식 지원 (JSON,XML)</p>
</li>
<li><p>무상태성 : 서버가 클라이언트의 상태를 유지하지 않으므로 서버 확장성이 향상된다.</p>
<h3 id="restful단점">RESTful단점</h3>
</li>
<li><p>복잡성증가.</p>
</li>
<li><p>표준이 없다. (REST자체는 명확한 표준이 아니므로 구현할 때 일관성 있게 하는게 중요)</p>
<h3 id="restcontroller와-controller">RestController와 Controller</h3>
</li>
<li><p>공통점 : 웹 프로토콜을 사용하여 요청을 받는다.</p>
</li>
<li><p>차이점 </p>
<ul>
<li>@RestController<ul>
<li>주로 JSON,XML등의 응답 데이터를 반환하는 Back-end API를 작성</li>
<li>@ResponseBody가 포함되어있어서 반환되는 값을 데이터 자체가 반환된다</li>
<li>웹 애플리케이션에서 일부분의 서비스를 구현할 때 사용.</li>
</ul>
</li>
<li>@Controller<ul>
<li>주로 HTML페이지를 랜더링하는 JSP(뷰)를 반환</li>
<li>클라이언트가 웹 브라우저에서 직접 접근할 수 있는 URL을 제공</li>
</ul>
</li>
</ul>
</li>
<li><p>@PathVariable : 요청 URl의 가장 마지막 URI만 잘라내는 annotation</p>
<ul>
<li><a href="Http://localhost/user/test%EC%98%80%EC%9D%84">Http://localhost/user/test였을</a> 때 @GetMapping(/user/{userId})라고 정의하고 parameter에 @PathVariable을 정의하면 가장 마지막 값인 test만 얻어진다.</li>
</ul>
</li>
<li><p>예 ) - AJAX <strong>GET방식</strong></p>
<ul>
<li>요청 URL =&gt;<pre><code>$.ajax({
    url:&quot;/user/접속자아이디&quot;,
    type:&quot;GET&quot;,
    dataType:&quot;JSON&quot;,
    success:function(jsonObj){
        파싱
    }
    })</code></pre></li>
</ul>
</li>
<li><p>예 ) - Back-end API</p>
<pre><code>   @GetMapping(&quot;/user/{userid}&quot;)
   public String method(@PathVariable String userId){
      조회작업을 JSONObject반환
   }</code></pre><hr></li>
<li><p>예 ) - AJAX <strong>POST방식</strong></p>
<ul>
<li>요청 URL =&gt;<pre><code>$.ajax({
    url:&quot;/user/접속자아이디&quot;,
    type:&quot;POST&quot;,
    dataType:&quot;JSON&quot;,
    success:function(jsonObj){
        파싱
    }
    })</code></pre></li>
</ul>
</li>
<li><p>예 ) - Back-end API</p>
<pre><code>  @PostMapping(&quot;/user/{userid}&quot;)
  public String method(@RequestParam String userId){
      조회작업을 JSONObject반환
  }</code></pre><hr></li>
<li><p>예 ) - AJAX <strong>PUT방식</strong></p>
<ul>
<li>요청 URL =&gt;<pre><code>$.ajax({
    url:&quot;/user/접속자아이디&quot;,
    type:&quot;PUT&quot;,
    dataType:&quot;JSON&quot;,
    success:function(jsonObj){
        입력된 아이디에 해당하는 자원 변경
    }
    })</code></pre></li>
</ul>
</li>
<li><p>예 ) - Back-end API</p>
<pre><code>  @PutMapping(&quot;/user/{userid}&quot;)
  public String method(@PathVariable String userId, 변경할 값,,,,){
      입력된 아이디
  }</code></pre><hr></li>
<li><p>예 ) - AJAX <strong>DELETE방식</strong></p>
<ul>
<li>요청 URL =&gt;<pre><code>$.ajax({
    url:&quot;/user/접속자아이디&quot;,
    type:&quot;DELETE&quot;,
    dataType:&quot;JSON&quot;,
    success:function(jsonObj){
        파싱
    }
    })</code></pre></li>
</ul>
</li>
<li><p>예 ) - Back-end API</p>
<pre><code>  @DeleteMapping(&quot;/user/{userid}&quot;)
  public String method(@PathVariable String userId,삭제할 기준의 다른값,){
      삭제 작업
      결과 JSONObject
  }</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.20]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.20</link>
            <guid>https://velog.io/@yeong_mu/2024.06.20</guid>
            <pubDate>Fri, 21 Jun 2024 00:09:12 GMT</pubDate>
            <description><![CDATA[<h2 id="spring-boot">Spring Boot</h2>
<ul>
<li>스프링 기반의 애플리케이션을 빠르고, 쉽게 개발할 수 있도록 도와주는 도구</li>
<li>장점 : <ul>
<li>간편한 설정(복잡한 설정을 줄여주고, 개발자는 업무로직 구현에 집중할 수 있게 한다.)</li>
<li>높은 생산성(빠르고 쉽게 개발하고 실행할 수 있게 해준다)</li>
<li>내장된 기능(내장된 서버, 보안기능 등 다양한 기능 내장 되어있다.)</li>
<li>자동화된 설정(많은 설정들을 자동으로 처리하여 개발초기에 시간 절약가능)</li>
</ul>
</li>
<li>단점 :<ul>
<li>복잡성 : 강력한 기능을 제공하나, 너무 많은 기능이 포함되어있어서 복잡함.<ul>
<li>옵션과 설정이 많아 초보자가 이해하고 관리하기 어렵다.</li>
</ul>
</li>
<li>추가적인 리소스의 사용 : 내장서버와 다양한 라이브러리가 포함되어있어 크기가 상대적으로 크다 (프로그램 시작 시간이 길어질 수 있다. - 소규모 프로젝트는 크게 영향을 주지 않지만 대규모 프로젝트나 서버리스환경에서는 고려해야할 사항.)</li>
<li>유연성 부족 : 개발자가 원하는 설정을 직접 추가하거나 수정하기 어렵다. <ul>
<li>특정한 경우 자동구성이 원하는 대로 동작하지 않을 수 있다.</li>
</ul>
</li>
<li>지원되지 않는 기능 : 특정 데이터베이스 연동x 특정프로토콜 지원 x - customizing 필요<h3 id="sts가-실행되지-않으면">STS가 실행되지 않으면</h3>
</li>
</ul>
</li>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/ebdfbe4f-e8b8-4b17-8278-2aeb744308e5/image.png" alt=""></li>
<li>SpringToolSuite4.ini 를 열어서 -VM옵션을 설정(STS4 JDK17 부터 인식)<ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/d1ee9da6-71ca-4ac0-a305-da89f1a5a239/image.png" alt=""><h3 id="설명">설명</h3>
<img src="https://velog.velcdn.com/images/yeong_mu/post/e8e7c953-2d2a-43b5-80c6-f3f2684b30c1/image.png" alt=""></li>
<li>Service URL : 스프링사이트에서 제공 : spring initializr를 통해서 boot project를 생성할 때 사용되는 자동 옵션을 제공하는 URL</li>
<li>Name : MSA서비스의 대표적인 이름(Microservices Architecture)</li>
<li>Group, Artifact, Version : Maven에서 사용되는 id</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/53a028f3-5de6-4e82-ac83-782747aa3bdc/image.png" alt=""></p>
<ul>
<li>Spring Boot DevTools : 자동재시작 <ul>
<li>소스코드가 변경되면 애플리케이션을 자동으로 재시작</li>
<li>라이브리로드 : 웹브라우저에서 페이지를 자동으로 새로고침.<ul>
<li>(HTML, CSS, JS파일 수정 유용 - 브라우저에 플러그인을 설치)</li>
</ul>
</li>
<li>캐시의 비활성화 : 개발중에는 소스변경을 바로 적용시켜서 반영해야하기 때문에 운영 중(프러덕션환경)에는 성능을 위해 캐시가 활성화되는 것이 좋다.</li>
<li>개발설정 적용 : 개발환경에 맞춘 기본 설정을 제공.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/eb029f31-42b5-455f-a0b5-4ec7a55f24f7/image.png" alt=""></p>
<ul>
<li>src/main/java/kr/co/sist : Java source code</li>
<li>static : HTML,CSS,JS 저장</li>
<li>application.properties : Project 환경설정(개발,테스트,프로덕션 환경용 분리해서 개발할 수 있다.)<ul>
<li>application-dev.properties</li>
<li>application-prd.properties</li>
</ul>
</li>
<li>webapp/WEB-INF/views : JSP저장</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/3b6d9d02-c63b-4d58-8954-4f8be90dda22/image.png" alt=""></p>
<ul>
<li>빨간박스의 코드가 없다면 개발은 되나 배포할 때 Servlet/JSP가 실행되지 않는다.</li>
</ul>
<h3 id="개발설정applicationproperties">개발설정(application.properties)</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/8bb81383-c59e-406e-ae4d-9faa60f01d3a/image.png" alt=""></p>
<ul>
<li>설정파일을 개발, 서비스용으로 분리하고 application.properties에서 spring.profiles.active=사용할 properties파일<ul>
<li>spring.profiles.active=dev -&gt; 개발용설정파일을 로딩한다. (application-dev.properties)</li>
</ul>
</li>
</ul>
<h3 id="static-폴더를-인식">static 폴더를 인식</h3>
<ul>
<li>application.properties (HTML이 서비서 되지 않으면 설정한다 - 서비스 되면 제거가능)</li>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/0ccacd6e-48d8-4b17-b0e9-8847d9322777/image.png" alt=""></li>
</ul>
<h3 id="jsp를-서비스">JSP를 서비스</h3>
<ul>
<li>pom.xml에 설정</li>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/9d193f74-5910-45ea-b6ab-1367370bb302/image.png" alt=""></li>
<li>boot 3.0이하(Tomcat9 - javax.servlet) 1가지<ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/aa689e11-c0cc-4156-b4ef-f52fdf7422ab/image.png" alt=""></li>
</ul>
</li>
<li>boot 3.0이상(Tomcat10 - jakarta 패키지 사용) 3가지 <ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/22f44565-ab73-4529-b03e-49b79dd6b1b3/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="charset-강제적용">CharSet 강제적용</h3>
<p><img src="https://velog.velcdn.com/images/yeong_mu/post/f6b8fbef-4d4c-49ea-a774-c471cb13051b/image.png" alt=""></p>
<ul>
<li><p>charset = UTF-8 : 서버에서 사용되는 기본 문자 encoding을 UTF-8로 설정</p>
</li>
<li><p>enabled = true : 서버에서 요청과 응답에 대한 지정한 charset을 사용하도록 활성화</p>
</li>
<li><p>force = true : 요청과 응답 인코딩을 다른 설정에서 변경하더라도 이 설정을 강제적용</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024.06.18]]></title>
            <link>https://velog.io/@yeong_mu/2024.06.18</link>
            <guid>https://velog.io/@yeong_mu/2024.06.18</guid>
            <pubDate>Thu, 20 Jun 2024 02:06:00 GMT</pubDate>
            <description><![CDATA[<h2 id="의존성-주입-설정파일">의존성 주입 (설정파일)</h2>
<ul>
<li><strong>생성자 의존성 주입, method 의존성주입, Factory Method 의존성 주입</strong><ul>
<li>Factory Method : 개발자가 singleton으로 클래스를 생성의존성 주입</li>
</ul>
</li>
</ul>
<h3 id="생성자-의존성-주입">생성자 의존성 주입</h3>
<ol>
<li><p>의존성 주입할 클래스 설정</p>
<pre><code>&lt;bean id = &quot;아이디&quot; class = &quot;패키지명.클래스명&quot; scope = &quot;singleton&quot;/&gt;</code></pre><ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/a16bf463-2aff-4953-854f-6024b5ad8638/image.png" alt=""></li>
</ul>
</li>
<li><p>의존성 주입 받을 클래스를 설정하고 &lt;constructor-arg ref=&quot;&quot;/&gt; 속성 정의</p>
<pre><code>&lt;bean id = &quot;아이디&quot; class = &quot;패키지명.클래스명&quot; scope = &quot;singleton&quot;&gt;
    &lt;constructor-arg ref&quot;의존성주입받을 객체&quot;/&gt;
&lt;/bean&gt;</code></pre><ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/42da61a1-df8e-4dc3-be3c-7bff9334d5fd/image.png" alt=""></li>
</ul>
</li>
</ol>
<ul>
<li>예 )<pre><code>1. 의존성 주입할 클래스 설정
   &lt;bean id=&quot;od&quot; class=&quot;day0618.OracleDAO&quot; scope=&quot;singleton&quot;/&gt;
2. 의존성 주입 받을 클래스를 설정하고 &lt;constructor-arg ref=&quot;&quot;/&gt; 속성 정의
  &lt;bean id = &quot;service&quot; class = &quot;day0618.ServiceImpl&quot; scope = &quot;singleton&quot;&gt;
  &lt;constructor-arg ref=&quot;od&quot;/&gt;
  &lt;/bean&gt;
3. Spring Container에서 얻기
  Service s = ac.getBean(&quot;service&quot;);</code></pre><h3 id="method-의존성-주입">method 의존성 주입</h3>
</li>
</ul>
<ol>
<li><p>의존성 주입할 클래스 설정</p>
<pre><code>&lt;bean id = &quot;아이디&quot; class = &quot;패키지명.클래스명&quot; scope = &quot;singleton&quot;/&gt;</code></pre><ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/a16bf463-2aff-4953-854f-6024b5ad8638/image.png" alt=""></li>
</ul>
</li>
<li><p>의존성 주입 받을 클래스를 설정하고 &lt;property name=&quot;&quot; ref=&quot;&quot;/&gt; 속성 정의</p>
<pre><code>&lt;bean id = &quot;아이디&quot; class = &quot;패키지명.클래스명&quot; scope = &quot;singleton&quot;&gt;
    &lt;property name=&quot;setter method명&quot; ref=&quot;의존성 주입할 객체&quot;/&gt;
&lt;/bean&gt;
// setter method명 : set을 제외한 method명을 소문자로 작성</code></pre><pre><code class="language-java">1. 의존성 주입받을 클래스 설정
   public class ServiceImpl{
     private DAO dao;

     public SerivceImpl(){

     }

     public void setDao(DAO dao){
         this.dao=dao;
     }

 }</code></pre>
<pre><code>&lt;bean id = &quot;od&quot; class = &quot;day0618.OracleDAO&quot; scope = &quot;singleton&quot;/&gt;
 &lt;bean id = &quot;service&quot; class = &quot;day0618.ServiceImpl&quot; scope = &quot;singleton&quot;&gt;
    &lt;property name=&quot;dao&quot; ref=&quot;od&quot;/&gt;
&lt;/bean&gt;</code></pre></li>
</ol>
<h3 id="factory-method의존성-주입">Factory Method의존성 주입</h3>
<ul>
<li><p>singleton pattern으로 구현된 클래스를 객체화</p>
<pre><code>&lt;bean factory-method=&quot;method명&quot;&gt;</code></pre></li>
<li><p>singleton pattern이 적용된 클래스</p>
<pre><code class="language-java"> public class ServiceImpl{
    private static ServiceImpl si;

  private ServiceImpl(){
  }

  public static ServiceImpl getInstance(){
  return si;
  }

 }</code></pre>
</li>
<li><p>private 접근지정자가 설정된 생성자도 호출 가능.</p>
<pre><code>&lt;bean id = &quot;아이디&quot; class=&quot;패키지명.클래스명&quot;/&gt;</code></pre></li>
<li><p>factory-method 호출</p>
<pre><code>&lt;bean id = &quot;아이디&quot; class=&quot;패키지명.클래스명&quot;&gt; factory-method=&quot;getInstance&quot;/&gt;
- getnInstance method가 생성하여 반환한 객체를 id로 저장하여 사용한다.</code></pre><h3 id="다양한-injection">다양한 injection</h3>
</li>
<li><p>생성자가 객체가 아닌 다른 데이터 형을 정의하고 있을 때</p>
</li>
<li><p>정수의 Injection : value속성( value=&quot;값&quot; )과 type속성 (type=&quot;데이터형&quot;)으로 사용.</p>
</li>
<li><p>사용법 )</p>
<pre><code>&lt;bean id=&quot;&quot; class=&quot;&quot;&gt;
  &lt;constructor-arg value=&quot;값&quot; type=&quot;데이터형&quot;/&gt;
&lt;/bean&gt;</code></pre><ul>
<li><p>데이터형 : type속성을 생략하면 숫자형태 일지라도 문자열로 입력.
예)
문자열 : type=&quot;java.lang.String&quot;
숫자 : type=&quot;int&quot;, type=&quot;long&quot;, type=&quot;float&quot;, type=&quot;double&quot;</p>
<pre><code>public class TestService{
  private String str;
private int value;

public TestService(int value){
    this.value=value;
}

public TestService(String str){
    this.str=str;
}
</code></pre></li>
</ul>
<p>}</p>
<pre><code>
</code></pre></li>
</ul>
<ul>
<li>type속성을 기술하지 않으면 문자열로 매개변수를 받음<pre><code>&lt;bean id=&quot;ts&quot; class=&quot;TestService&quot;&gt;
    &lt;constructor-arg value=&quot;2024&quot;/&gt;
&lt;/bean&gt;</code></pre></li>
<li>정수를 injection 하려면 type속성을 기술<pre><code>&lt;bean id=&quot;ts&quot; class=&quot;TestService&quot;&gt;
    &lt;constructor-arg value=&quot;2024&quot; type=&quot;int&quot;/&gt;
&lt;/bean&gt;</code></pre><h2 id="jcf-java-collection-framework-injection">JCF( Java Collection Framework )Injection</h2>
</li>
<li>java.util.List, Set, Map Injection<h3 id="listset-injection">List(Set) Injection</h3>
<pre><code class="language-java">public class Service{
private List&lt;String&gt; list;
</code></pre>
</li>
</ul>
<p>public Service(List<String> list){
this.list=list;
}
}</p>
<pre><code></code></pre><bean id="" class="">
    <constructor-arg>
        <list> 또는 <set>
        <value type="데이터형"> 값 </value>
        <value type="데이터형"> 값 </value>
        </list> 또는 </set>
    </constructor-arg>
</bean>
```
### Map Injection
```java
public class Service{
private Map<String,String> map;

<p>public Service(Map&lt;String,String&gt; map){
this.map=map;
}
}</p>
<pre><code></code></pre><bean id="" class="">
    <constructor-arg>
        <map>
            <entry>
                <key><value type="데이터형">값</value></key>
                <value type="데이터형"> 값 </value>
            </entry>
            .
            .
        </map>
    </constructor-arg>
</bean>
```

<h3 id="spring-di---annotation-방식">Spring DI - annotation 방식</h3>
<ul>
<li>설정용 XML에 의존성 주입관계를 설정하지 않고 사용하는 방식.<ul>
<li>주입관계 : &lt;bean&gt;</li>
</ul>
</li>
<li>의존성 주입관계를 한눈에 파악하기 힘들다.</li>
<li>대규모 프로젝트에는 적합하지 않고, 소규모 프로젝트에 적합한 방식.</li>
<li>Spring Context필요.</li>
<li>Spring Container가 지정된 package를 component-scan하여 클래스를 찾고 annotation이 지정된 대로 의존성 주입해준다.</li>
<li>사용법 )</li>
</ul>
<ol>
<li>Component scan의 대상이 될 클래스 (bean) 위에 @Component annotation 설정</li>
<li>의존성 주입받을 클래스(interface) 위에 @Autowired를 설정.</li>
</ol>
<ul>
<li><img src="https://velog.velcdn.com/images/yeong_mu/post/bc68f2a8-49e5-4ad6-9c67-dd4a6e32136c/image.png" alt=""></li>
</ul>
<h3 id="component">@Component</h3>
<ul>
<li>Spring franework에서 관리되는 bean을 설정할 때 사용.</li>
<li>annotation이 붙은 클래스는 Spring Container에서 빈으로 관리되며, 다른 클래스로 의존성주입이 될 수 있다.</li>
</ul>
<h3 id="autowired">@Autowired</h3>
<ul>
<li><p>자동으로 의존성 주입을 받을 때 사용.</p>
</li>
<li><p>class field에 정의된 객체를 찾아 의존성 주입할 때 사용.</p>
</li>
<li><p>@Autowired(required=false)를 설정하여 의존성 주입을 객체가 빈으로 생성되지 않더라도 실행되어야할 때 사용.</p>
</li>
<li><p>Filed Injection, Constructor Injection, setter method Injection 3가지를 할 수 있다.</p>
<h4 id="field-injection-필드-주입--클래스의-필드에-직접-주입">Field Injection (필드 주입) : 클래스의 필드에 직접 주입.</h4>
</li>
<li><p>예 )</p>
<pre><code>@Component
public class Test{
    @Autowired(required = false)
  private Temp temp;
}</code></pre><h4 id="constructor-injection-생성자-주입--생성자를-통해서-주입">Constructor Injection (생성자 주입) : 생성자를 통해서 주입</h4>
</li>
<li><p>예 )</p>
<pre><code>@Component
public class Test{
    private Temp temp;
    @Autowired(required =false)
  private Temp temp(Temp temp){
      this.temp = temp

  }
}</code></pre><h4 id="setter-method-injection-세터-method-주입--setter-method로-주입">setter method Injection (세터 method 주입) : setter method로 주입</h4>
</li>
<li><p>예 )</p>
<pre><code>@Component
public class Test{
    private Temp temp;

    @Autowired(required =false)
  private void setTemp(Temp temp){
      this.temp = temp

  }
}</code></pre></li>
<li><p><img src="https://velog.velcdn.com/images/yeong_mu/post/4076fd93-ff2c-4098-8277-5d6075b36f84/image.png" alt=""></p>
<ul>
<li>패키지명.* : 패키지내의 모든 클래스를 참조하겠다.(인식못할시)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>