<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyeri.log</title>
        <link>https://velog.io/</link>
        <description>Backend Developer</description>
        <lastBuildDate>Wed, 19 Mar 2025 04:57:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyeri.log</title>
            <url>https://velog.velcdn.com/images/hyeri_hello/profile/8053c4cb-8173-4e42-8a8f-d0d72ebde271/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyeri.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyeri_hello" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Spring/Vue.js] Side Project 1 (프로젝트 생성)]]></title>
            <link>https://velog.io/@hyeri_hello/JavaSpring-Side-Project</link>
            <guid>https://velog.io/@hyeri_hello/JavaSpring-Side-Project</guid>
            <pubDate>Wed, 19 Mar 2025 04:57:19 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>나홀로 싸우면서 만드는 프로젝트의 여정을 시작하려고한다!</p>
</blockquote>
<h1 id="1-intellij-내에서-프로젝트-생성">1. IntelliJ 내에서 프로젝트 생성</h1>
<p>나는 플랫폼을 만들어 보기위해 프로젝트 구조를 아래와 같이 설계했다. 
또한 프로젝트를 구별하기위해 D드라이브에 진행하니 참고하길 바란다.</p>
<pre><code>cleans-platform/        # 메인 프로젝트 루트 폴더
│── cleans-bo-api/      # Spring Boot 백엔드 프로젝트
│   ├── src/           
│   │   ├── main/      
│   │   │   ├── java/com/example/ # Java 소스 코드
│   │   │   ├── resources/        # 설정 파일 (application.yml 등)                
│
│── cleans-bo-app/       # Vue.js 프론트엔드 프로젝트
│   ├── src/            # Vue 컴포넌트 및 소스 코드
│   │   ├── assets/     
│   │   ├── components/
│   │   ├── views/
│   │   ├── router/index.js   # Vue Router 설정
│   │   ├── store/index.js    # Vuex 또는 Pinia 상태 관리
│   │   ├── App.vue           
│   │   ├── main.js           
│   ├── public/          # 정적 파일
│   ├── package.json     # npm 패키지 설정
│   ├── vite.config.js   # Vite 또는 Webpack 설정
│   ├── node_modules/    # npm dependencies
│   ├── README.md        
│
│── README.md            # 전체 프로젝트 설명서

</code></pre><h2 id="11-spring-boot-백엔드-프로젝트-생성">1.1 Spring Boot 백엔드 프로젝트 생성</h2>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/65987325-c43f-4de6-a296-c787c37e23eb/image.png" alt="">
⬆️ 프로젝트 이름과 언어, 타입, jdk 설정 후 다음</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/a4c26e11-df68-4862-8393-b0df70869c93/image.png" alt="">
⬆️ 나는 기본적으로 위 3개정도 설정하고 생성한다. </p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/90b53c0e-219f-4c92-ab3e-f8dab9ba318f/image.png" alt="">
⬆️ 이후 Main으로 들어가면 위와 같이 생성되어 있다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/27529074-0347-4c6e-9bcc-4eedc8ca4054/image.png" alt="">
⬆️ port 설정을 따로 하고싶으면 위와 같이 하면된다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/00db479b-bcff-4dc8-82dc-20a794ebbea3/image.png" alt="">
⬆️ 그리고 Boot 를 run하면 잘 뜬것을 확인 할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/ffedc491-083c-4169-a93d-a517e99bb7c8/image.png" alt="">
⬆️ localhost:9090으로 접속하면 이 화면이 뜨면 정상접속이다!</p>
<br>

<h4 id="ex-시큐리티-설정한-사람들을-위해">ex) 시큐리티 설정한 사람들을 위해</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/ba4c5e49-964f-4647-977a-12e80dff1fc8/image.png" alt="">
⬆️ 시큐리티 설정 후 run을 하게되면 console에 password가 생겨난 것을 볼 수 있다.
<code>Using generated security password: edd03d18-b169-4502-a69c-047666bdbe94</code></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/e60eae89-bb0d-48ac-b153-decfacd9eff4/image.png" alt="">
⬆️ 그리고 web을 확인하면 위와 같은 화면이 뜨는데
Username - user
Password - 콘솔에서 알려준 password를 치고 진입하면 된다.</p>
<br>

<h1 id="2-view-설정">2. View 설정</h1>
<p>방법은 여러 가지이다.
나는 기존 방법에서 <code>vue</code>를 사용하는 방법을 택했다.</p>
<h2 id="21-정적-리소스-설정-커스터마이징---webconfigurer">2.1 정적 리소스 설정 커스터마이징 - WebConfigurer</h2>
<p>기본적으로 스프링 부트에서 web의존성 추가 후 
<code>localhost:9090</code>으로 접근하면 <code>resources/static/index.html</code>을 읽게된다.</p>
<p>만약 <code>resources/templates/index.html</code>로 위치하려면 
스프링 부트에서 제공하는 <code>WebMvcConfigurer</code>를 implements 한 후 <code>addResourceHandlers</code>를 override 해야한다.</p>
<pre><code class="language-java">package com.example.ilapofol.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class ViewConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(&quot;/**&quot;)
                .addResourceLocations(&quot;classpath:/templates/&quot;, &quot;classpath:/static/&quot;);
    }
}</code></pre>
<br>

<h2 id="22-thymeleaf설정">2.2 Thymeleaf설정</h2>
<p><code>application.properties</code> 를 아래와같이 <code>thymeleaf</code> 추가</p>
<pre><code class="language-java">spring.application.name=cleans
server.port = 9090

#thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
spring.thymeleaf.check-template-location=true</code></pre>
<p><code>build.gradle</code> 에 thymeleaf 의존성 추가</p>
<pre><code class="language-java">plugins {
    id &#39;java&#39;
    id &#39;org.springframework.boot&#39; version &#39;3.4.3&#39;
    id &#39;io.spring.dependency-management&#39; version &#39;1.1.7&#39;
}

group = &#39;com.cleans&#39;
version = &#39;0.0.1-SNAPSHOT&#39;

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation &#39;org.springframework.boot:spring-boot-starter-security&#39;
    implementation &#39;org.springframework.boot:spring-boot-starter-thymeleaf&#39;
    implementation &#39;nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect&#39;
    implementation &#39;org.springframework.boot:spring-boot-starter-web&#39;
    implementation &#39;org.thymeleaf.extras:thymeleaf-extras-springsecurity6&#39;
    compileOnly &#39;org.projectlombok:lombok&#39;
    developmentOnly &#39;org.springframework.boot:spring-boot-devtools&#39;
    annotationProcessor &#39;org.projectlombok:lombok&#39;
    testImplementation &#39;org.springframework.boot:spring-boot-starter-test&#39;
    testImplementation &#39;org.springframework.security:spring-security-test&#39;
    testRuntimeOnly &#39;org.junit.platform:junit-platform-launcher&#39;
}

tasks.named(&#39;test&#39;) {
    useJUnitPlatform()
}
</code></pre>
<br>

<h2 id="23-vue-project-셋팅">2.3 vue project 셋팅</h2>
<h3 id="231-nodejs-다운">2.3.1 nodejs 다운</h3>
<p><a href="https://nodejs.org/ko/">https://nodejs.org/ko/</a></p>
<h3 id="232-node-및-npm-version-확인">2.3.2 node 및 npm version 확인</h3>
<p>(참고, 명령프롬포트를 관리자권한으로 실행하면 C드라이브가 디폴트일때 D로 가려면 :D 입력하면된다)</p>
<pre><code class="language-cmd">D:\&gt;node -v
v22.14.0

D:\&gt;npm -v
10.9.2</code></pre>
<h3 id="233-프로젝트-내에-vue를-설치한다">2.3.3 프로젝트 내에 vue를 설치한다.</h3>
<pre><code>D:\&gt;cd project

D:\project&gt;cd cleans-platform

D:\project\cleans-platform&gt;npm install vue

added 23 packages in 4s

3 packages are looking for funding
  run `npm fund` for details
npm notice
npm notice New major version of npm available! 10.9.2 -&gt; 11.2.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.2.0
npm notice To update run: npm install -g npm@11.2.0
npm notice</code></pre><h3 id="234-vue-version-확인">2.3.4 vue version 확인</h3>
<pre><code>D:\project\cleans-platform&gt;npm vue -v
10.9.2</code></pre><h3 id="235-vue-cli-설치하기">2.3.5 Vue CLI 설치하기</h3>
<pre><code>npm install -g @vue/cli c</code></pre><pre><code>added 834 packages in 39s

76 packages are looking for funding
  run `npm fund` for details

D:\project\cleans-platform&gt;</code></pre><p>위처럼 packages 받으면 된것! <br></p>
<p>이후 차례대로 설치해주기!</p>
<pre><code>npm install -D webpack webpack-cli</code></pre><pre><code>npm install -D vue-loader vue-template-compiler</code></pre><pre><code>npm install -D @babel/core @babel/preset-env babel-loader</code></pre><p>다 설치후 <code>vue -v</code>를 확인하면 아래와 같이 잘뜬다.</p>
<pre><code>D:\project\cleans-platform&gt;vue -V
@vue/cli 5.0.8</code></pre><h3 id="236-이후-원하는-경로에-project를-만든다">2.3.6 이후 원하는 경로에 project를 만든다</h3>
<p>(경로는 맨위 참조)</p>
<pre><code>D:\&gt;cd project

D:\project&gt;cd cleans-platform

D:\project\cleans-platform&gt;vue create cleans-bo-app</code></pre><p><img src="https://velog.velcdn.com/images/hyeri_hello/post/c76c7a34-20c2-4984-a0b7-b069e946d64e/image.png" alt="">
위와 같이 생긴 것을 알 수 있다.</p>
<h3 id="237-spring-boot-프로젝트-연동-분리된-프로젝트-연동하기">2.3.7 Spring Boot 프로젝트 연동 (분리된 프로젝트 연동하기)</h3>
<h4 id="2371-packagejson-수정">2.3.7.1 package.json 수정</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/716afc46-a15a-4009-924c-f066502dd49d/image.png" alt=""></p>
<p>Vue.js에서 사용할 port 3000으로 변경 
<code>&quot;serve&quot; : &quot;vue-cli-service serve --port 3000&quot;</code>
코드 변경 시 자동 재빌드 옵션 추가
<code>&quot;build&quot; : &quot;vue-cli-service build --watch&quot;</code></p>
<h4 id="2372-vueconfigjs-파일-수정">2.3.7.2 vue.config.js 파일 수정</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/6c971154-8869-4c4d-a9d9-2f8211df03d7/image.png" alt=""></p>
<pre><code class="language-javascript">const { defineConfig } = require(&#39;@vue/cli-service&#39;)
module.exports = defineConfig({
  transpileDependencies: true,
  // npm run build target (backend - api쪽)
  outputDir: &quot;../cleans-bo-api/src/main/resources/static&quot;,
  // npm run server 개발 진행시 포트가 다르기 때문에 프록시 설정해줘야 한다
  // target : 백엔드 port
  // changeOrigin : true로 해야지 cros 문제 해결할 수 있다.
  devServer: {
    proxy: {
      &#39;/&#39;: {
        target: &quot;http://localhost:9090&quot;,
        changeOrigin: true,
      }
    }
  }
})</code></pre>
<h4 id="2373-vue-project-build">2.3.7.3 Vue project build</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/ad0e4521-fd32-4d45-8a26-aaccf2dc9e26/image.png" alt=""></p>
<p>프로젝트 폴더에서 <code>npm run build</code> 입력</p>
<h4 id="2374-spring-boot-project-내-indexhtml-생성-확인">2.3.7.4 Spring Boot project 내 index.html 생성 확인</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/31c47469-d36a-4ff4-b107-cfcbb6723f86/image.png" alt=""></p>
<h4 id="2375-spring-boot-project-실행">2.3.7.5 Spring Boot project 실행</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/29d95e42-e18e-4827-86fa-436aa7c28658/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/Practitioner] 요약정리 (네트워크)]]></title>
            <link>https://velog.io/@hyeri_hello/AWSPractitioner-%EC%9A%94%EC%95%BD%EC%A0%95%EB%A6%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@hyeri_hello/AWSPractitioner-%EC%9A%94%EC%95%BD%EC%A0%95%EB%A6%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Tue, 23 May 2023 07:53:58 GMT</pubDate>
            <description><![CDATA[<h1 id="2네크워크">2.네크워크</h1>
<h3 id="1-aws-cloudfront">1) AWS CloudFront</h3>
<ul>
<li>웹 사이트, API, 동영상 콘텐츠 또는 기타 웹 자산의 전송을 가속화하는 글로벌 전송 네트워크(CDN) 서비스</li>
<li>Front에서 미리 Request를 처리</li>
<li>DDOS 방어 제공(AWS Shield)</li>
<li>사용자 입장에서 가장 가까운 곳에서 컨텐츠를 받게 해주는 서비스</li>
</ul>
<blockquote>
<p>reference
<a href="https://mk-jung.tistory.com/190">https://mk-jung.tistory.com/190</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/Practitioner] 요약정리 (컴퓨팅)]]></title>
            <link>https://velog.io/@hyeri_hello/AWSPractitioner-%EC%9A%94%EC%95%BD%EC%A0%95%EB%A6%AC-f1w2gyd9</link>
            <guid>https://velog.io/@hyeri_hello/AWSPractitioner-%EC%9A%94%EC%95%BD%EC%A0%95%EB%A6%AC-f1w2gyd9</guid>
            <pubDate>Mon, 22 May 2023 03:22:53 GMT</pubDate>
            <description><![CDATA[<h1 id="1-컴퓨팅">1. 컴퓨팅</h1>
<h3 id="1-aws-ec2elastic-computing-cloud">1) AWS EC2(Elastic Computing Cloud)</h3>
<ul>
<li>컴퓨팅 서버를 애플리케이션 수요에 따라 늘리거나, 줄이거나 가능한 서버</li>
<li>탄력적(Elastic), EC2 인스턴스</li>
</ul>
<h3 id="2-aws-ecsec2-container-service">2) AWS ECS(EC2 Container Service)</h3>
<ul>
<li>도커 컨테이너를 지원하는 컨테이너 관리 서비스</li>
<li>클러스터 관리 인프라 설치, 운영 및 확장</li>
</ul>
<h3 id="3-aws-ec2-container-registry">3) AWS EC2 Container Registry</h3>
<ul>
<li>개발자가 도커 컨테이너 이미지를 손쉽게 저장, 관리, 및 배포할 수 있게 해주는 완전관리형 도커 컨테이너 레지스트리 </li>
</ul>
<h3 id="4-aws-lightsail">4) AWS Lightsail</h3>
<ul>
<li>AWS에서 가상 프라이빗 서버를 시작하고 관리할 때 사용할 수 있는 간편한 방법</li>
<li>프라이빗 서버 인스턴스, 컨테이너, 스토리지, 데이터베이스 등 서비스를 저렴하고 예측 가능한 비용으로 사용가능 </li>
</ul>
<h3 id="5-aws-batch">5) AWS Batch</h3>
<ul>
<li>개발자가 AWS에서 수많은 배치 컴퓨팅 작업을 효율적으로 손쉽게 실행할 수 있도록 도와주는 서비스</li>
</ul>
<h3 id="6-aws-elastic-beanstalk">6) AWS Elastic Beanstalk</h3>
<ul>
<li>AWS에 애플리케이션을 배포하는 가장 빠르면서 간편한 서비스</li>
<li>AWS 상에 코드 업로드 시 용량 프로비저닝, 로드 밸런싱, Auto Scaling, 애플리케이션 상태 모니터링에 대한 정보를 자동으로 처리해주는 서비스</li>
<li>NET, JAVA, Node.js, PHP, Python, Ruby등 다양한 애플리케이션 지원</li>
</ul>
<h3 id="7-aws-lambda--서버리스-컴퓨팅">7) AWS Lambda : 서버리스 컴퓨팅</h3>
<ul>
<li>서버리스, 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스</li>
<li>서버 없이 코드만으로 특정 업무를 처리(이벤트 처리 기반)</li>
<li>Lambda 비용 청구 기준 : 실행시간 기준 / 요청 수 기준</li>
</ul>
<h3 id="8-auto-scaling">8) Auto Scaling</h3>
<ul>
<li>애플리케이션 가용성을 유지하는데 도움이 되고 정의한 조건에 따라 Amazon EC2 용량을 자동으로 확장하거나 축소할 수 있는 기능</li>
</ul>
<blockquote>
<p>reference
<a href="https://mk-jung.tistory.com/190">https://mk-jung.tistory.com/190</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[디자인패턴] 생성 (Prototype Pattern)]]></title>
            <link>https://velog.io/@hyeri_hello/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-Prototype-Pattern</link>
            <guid>https://velog.io/@hyeri_hello/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-Prototype-Pattern</guid>
            <pubDate>Wed, 01 Feb 2023 03:30:22 GMT</pubDate>
            <description><![CDATA[<h2 id="1-디자인-패턴-정의">1. 디자인 패턴 정의</h2>
<p><a href="https://velog.io/@hyeri_hello/Java-3-%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4">https://velog.io/@hyeri_hello/Java-3-%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4</a></p>
<h2 id="2-prototype-pattern">2. Prototype Pattern</h2>
<p>처음부터 일반적인 원형을 만들어놓고 그것을 복사한 후 필요한 부분만 수정하여 사용하는 패턴
기존 객체를 복제함으로써 객체를 생성 한다.</p>
<h2 id="3-prototype-pattern-장점-및-특징">3. Prototype Pattern 장점 및 특징</h2>
<p>재사용성: 프로토타입 패턴을 사용하면 기존 개체를 새 개체를 만들기 위한 청사진으로 재사용할 수 있으므로 시간과 각각의 새 객체를 생성하는 데 필요한 노력.</p>
<p>유연성: 패턴을 사용하면 런타임에 새 객체를 생성할 수 있으므로 응용 프로그램의 요구 사항에 따라 객체를 생성할 수 있는 유연성이 제공됩니다. </p>
<p>성능: 프로토타입을 복제하여 새 개체를 만드는 것이 처음부터 새 개체를 만드는 것보다 빠르고 효율적입니다. 특히 개체의 구조가 복잡한 경우에는 더욱 그렇습니다.</p>
<p>결합 감소: 프로토타입 패턴은 객체 자체의 실제 구현에서 객체 생성 프로세스를 분리하여 나머지 코드에 영향을 주지 않고 향후 객체 생성 방식을 쉽게 변경할 수 있습니다. .</p>
<p>추상화: 프로토타입 패턴은 객체 생성 프로세스를 추상화하여 코드를 이해하고 유지하기 쉽습니다.</p>
<h2 id="4-코드예제">4. 코드예제</h2>
<pre><code class="language-java">/** Prototype Class **/
public class Cookie implements Cloneable {

   public Object clone() {
      try {
         Cookie copy = (Cookie)super.clone();

         //In an actual implementation of this pattern you might now change references to
         //the expensive to produce parts from the copies that are held inside the prototype.

         return copy;

      }
      catch(CloneNotSupportedException e) {
         e.printStackTrace();
         return null;
      }
   }
}

/** Concrete Prototypes to clone **/
public class CoconutCookie extends Cookie { }

/** Client Class**/
public class CookieMachine {

   private Cookie cookie;//could have been a private Cloneable cookie;

   public CookieMachine(Cookie cookie) {
      this.cookie = cookie;
   }
   public Cookie makeCookie() {
      return (Cookie)cookie.clone();
   }
   public Object clone() { }

   public static void main(String args[]) {
      Cookie tempCookie =  null;
      Cookie prot = new CoconutCookie();
      CookieMachine cm = new CookieMachine(prot);
      for (int i=0; i&lt;100; i++)
         tempCookie = cm.makeCookie();
   }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLP] 데이터 모델과 성능 1]]></title>
            <link>https://velog.io/@hyeri_hello/SQLP-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EC%84%B1%EB%8A%A5-1</link>
            <guid>https://velog.io/@hyeri_hello/SQLP-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EC%84%B1%EB%8A%A5-1</guid>
            <pubDate>Wed, 25 Jan 2023 09:20:14 GMT</pubDate>
            <description><![CDATA[<h1 id="1-성능-데이터-모델링-개요">1. 성능 데이터 모델링 개요</h1>
<h2 id="1-성능-데이터-모델링">1) 성능 데이터 모델링</h2>
<p>데이터베이스 성능 향상을 목적으로, 설계 단계의 데이터 모델링 때부터 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것</p>
<br>

<h2 id="2-성능-데이터-모델링-고려사항">2) 성능 데이터 모델링 고려사항</h2>
<ol>
<li><p>데이터 모델링을 할때 정규화를 정확하게 수행한다. (분산효과)</p>
</li>
<li><p>데이터베이스 용량 산정을 수행한다. [테이블 (엔티티) 데이터 집중 파악]</p>
</li>
<li><p>데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.</p>
</li>
<li><p>용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
(테이블, 속성, 관계에 대한 포괄적인 반 정규화)</p>
</li>
<li><p>이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
(우수한 컬럼순위 지정)</p>
</li>
<li><p>성능 관점에서 데이터 모델을 검증한다.</p>
<br>
## 3) *트랜잭션 유형 파악
</li>
<li><p><span style="background-color: #ff696969">*CRUD 매트릭스</span>를 보고 파악, 객체지향 모델링을 적용한다면 시퀀스 다이어그램을 이용</p>
</li>
<li><p>입력, 수정, 삭제, 조회에 따라 테이블 데이터 추리 유추</p>
</li>
<li><p>SQL문 조인관계 테이블에서 데이터 조회의 컬럼 파악에 따른 성능고려</p>
<br>

</li>
</ol>
<h3 id="✔️-crud-매트릭스란">✔️ CRUD 매트릭스란?</h3>
<p>2차원 형태의 표로서, <code>행에는 프로세스</code>를, <code>열에는 테이블</code>을, 행과 열이 만나는 위치에는 프로세스가 테이블에 발생시키는 변화를 표시하는 업무 프로세스와 데이터 간 상관 분석표이다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/fc176f74-8143-460f-a3d9-70b74e96d402/image.png" alt=""></p>
<h1 id="2-정규화와-성능">2. 정규화와 성능</h1>
<blockquote>
<ul>
<li>데이터 중복(이상현상)을 최소화 하기 위해 릴레이션을 분해하는 과정</li>
</ul>
</blockquote>
<ul>
<li>제 1정규형 ~ 제 6정규형, BCNF가 있지만 대체적으로 실무에서는 대체로 1~3 정규화까지의 과정을 거친다.</li>
<li>정규화는 논리적 설계 단계에서 수행</li>
<li>정규형의 차수가 높아질수록 데이터 중복이 줄어 이상현상이 발생하지 않는 릴레이션이 됨</li>
<li>즉, 정규형의 차수가 높아질수록 제약조건이 높다.<h4 id="✔️-이상현상-">✔️ 이상현상 ?</h4>
불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 <code>삽입, 수정, 삭제</code> 연산을 할 때 발생할 수 있는 부작용</li>
</ul>
<br>

<h2 id="1-정규화-수행과-성능">1) 정규화 수행과 성능</h2>
<ul>
<li>조회 성능 : 처리 조건에 따라 향상될 수 있고 아닐 수 있다.</li>
<li>입력, 수정, 삭제 성능 : 성능이 향상 된다.<br>

</li>
</ul>
<h2 id="2-정규화">2) 정규화</h2>
<h3 id="1-제-1정규화-1nf--종속-속성-제거-일반-속성-대상">(1) 제 1정규화 (1NF) : 종속 속성 제거, 일반 속성 대상</h3>
<blockquote>
<p>릴레이션에 속한 모든 속성의 도메인이 원자값으로만 구성되어 있어야 한다.
즉, 모든 속성은 반드시 하나의 값만 가져야 한다.</p>
</blockquote>
<p>테이블(Relation)이 제 1정규형을 만족했다는 것은 아래 세 가지 조건를 만족했다는 것을 의미한다.</p>
<ul>
<li>어떤 Relation에 속한 모든 Domain이 원자값(atomic value)만으로 되어 있다.</li>
<li>모든 attribute에 반복되는 그룹(repeating group)이 나타나지 않는다.</li>
<li>기본 키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.<br>

</li>
</ul>
<p><strong>예시 1. 다중값을 가진다 (1번 사항 위배)</strong></p>
<ul>
<li>비정규화 테이블<ul>
<li>고객아이디, 이름은 복합 기본키 (기본키 : {고객아이디, 이름})</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/646d079c-466f-4938-af72-9c909e8aaa73/image.png" alt=""></p>
<p><strong>예시 2. 반복 그룹을 가진다 (2번사항 위배)</strong></p>
<ul>
<li>비정규화 테이블<ul>
<li>고객아이디, 이름은 복합 기본키 (기본키 : {고객아이디, 이름})
<img src="https://velog.velcdn.com/images/hyeri_hello/post/fc56ea61-11e4-4c43-af79-0dda7308a11a/image.png" alt=""></li>
</ul>
</li>
</ul>
<br>

<h4 id="🌱-제-1-정규화">🌱 제 1 정규화</h4>
<pre><code>단, 기본키가 유일하지 않다는 것을 알 수 있다. 
따라서 3번 조건을 만족하기 위해서 아래와 같이 테이블을 나누어 디자인 하는 것이 좋다. 
(예시가 전화번호 테이블이기 때문에 실 업무에서는 더 생각해 볼 필요가 있음)</code></pre><ul>
<li>정규화 테이블 (1정규화)
<img src="https://velog.velcdn.com/images/hyeri_hello/post/e2ff5085-1a00-45a6-b941-cca84f9358da/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/18f98d63-b18b-442e-83f2-21571f4baed5/image.png" alt=""></p>
<p>위 테이블은 고객정보 테이블과 고객 전화번호 테이블이 1 : N 관계를 형성하는 것을 알 수 있다.</p>
<br>


<h3 id="2-제-2정규화-2nf--부분적-함수종속-제거-복합식별자만-대상">(2) 제 2정규화 (2NF) : 부분적 함수종속 제거, 복합식별자만 대상</h3>
<blockquote>
<ul>
<li>테이블의 모든 컬럼이 완전함수적 종속을 만족한다.
즉, 모든 속성은 반드시 모든 기본키에 종속되어야 한다. 
(기본키 일부에만 종속 되어서는 안됨)</li>
</ul>
</blockquote>
<ul>
<li>주문 테이블<ul>
<li>주문번호, 상품코드는 복합 기본키이다. (기본키 : {주문번호, 상품코드})</li>
<li>상품명은 상품코드에만 종속된다. (상품코드 : 결정자, 상품명 : 종속자)</li>
<li>즉, 상품코드는 상품명을 결정하고 상품코드는 상품명에 종속된다 할 수 있다. (상품코드 → 상품명) <ul>
<li>‘부분함수 종속성’</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/094b9a1f-3f28-4a3e-ba25-f4fb00c76e95/image.png" alt=""></p>
<p> 위 주문 테이블은 이상현상이 발생한다.</p>
<ol>
<li>입력이상 : 주문이 발생하지 않으면 상품명이 입력 불가</li>
<li>수정이상 : 상품명이 변경될 경우 해당되는 주문 ROW UPDATE 필요</li>
<li>삭제이상 : 상품 삭제시 주문까지 삭제</li>
</ol>
<h4 id="🌱-제-2-정규화">🌱 제 2 정규화</h4>
<pre><code>주문과 관계없이 상품의 데이터입력, 수정, 삭제가 가능하다.
따라서 현재 테이블의 핵심 주제와 상관없는 컬럼을 제거하면 된다.</code></pre><p><img src="https://velog.velcdn.com/images/hyeri_hello/post/f3b67d8d-dcfd-4ed7-a70c-1aebc92d01f0/image.png" alt="">
<br></p>
<h3 id="3-제-3정규화-3nf--이행함수-종속성-제거">(3) 제 3정규화 (3NF) : 이행함수 종속성 제거</h3>
<blockquote>
<p>기본키가 아닌 모든 속성간에는 서로 종속될 수 없다.</p>
</blockquote>
<p>테이블(Relation)이 제 3정규형을 만족한다는 것은 아래 두 가지 조건을 만족하는 것을 의미한다.</p>
<ol>
<li>테이블이 제 2정규형을 만족해야한다.</li>
<li>테이블 내의 모든 속성이 기본키에만 의존해야하며, 다른 후보키에 의존하지 않는다.</li>
</ol>
<p>즉,  이행적 함수종속은 기능적 종속으로 X⟶ Y 이고 Y⟶ Z 에 의해서 X⟶ Z (X가 Z를 결정한다) 가 되는 것이다.</p>
<ul>
<li>상품 테이블<ul>
<li>상품코드는 유일한 기본키이다. (기본키 : 상품코드)</li>
<li>제공업체는 상품코드에 종속되지 않고 상품명(후보키)에 종속된다.</li>
<li>데이터 이상 현상 발생 가능!</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/0d37a978-5d80-4a61-b268-e4600f24b3e6/image.png" alt=""></p>
<h4 id="🌱-제-3-정규화">🌱 제 3 정규화</h4>
<pre><code>제공업체는 주문번호(기본키)와 상관이 없는 컬럼이기 때문에 제거하면된다.</code></pre><p><img src="https://velog.velcdn.com/images/hyeri_hello/post/1f1109da-7e6e-417c-8778-224e1f62aa83/image.png" alt=""></p>
<h3 id="4-bcnf-정규화--결정자가-후보키가-아닌-함수-종속성-제거-→-bcnf를-만족한다">(4) BCNF 정규화 : 결정자가 후보키가 아닌 함수 종속성 제거 → BCNF를 만족한다.</h3>
<blockquote>
<p>릴레이션의 함수 종속관계에서 모든 결정자가 후보키이면 보이스/코드 정규형에 속한다.</p>
</blockquote>
<p>결정자가 후보키가 아니고 종속자가 기본키의 부분집합인 속성을 분해
BCNF 정규형인 모든 릴레이션은 제 3정규형에 속한다. 그 역은 성립되지 않는다.</p>
<ul>
<li>주문테이블</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/20461c66-d25a-4b15-85f8-b3cbb98e10c7/image.png" alt=""></p>
<p>제공업체가 상품을 제공하겠다고 결정해야 주문번호가 일어난다.
만약 주문이 일어났는데 제공업체가 상품을 제공하지 않는다면 주문을 받을 수가 없다.
즉, 제공업체도 후보키가 되어야한다.  (결정자가 후보키가 아닌 속성 분리)</p>
<h4 id="🌱-bcnf">🌱 BCNF</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/c5cd909d-b07c-4733-8447-51f05dc0a563/image.png" alt=""></p>
<p>따라서 상품테이블이 먼저 결정이된 후 주문테이블이 생성될 수 있게 만들어 주는 구조를 BCNF라고한다.</p>
<h3 id="5-제-4정규화-4nf---다중값-종속성을-제거한다">(5) 제 4정규화 (4NF)  : 다중값 종속성을 제거한다</h3>
<blockquote>
<p>하나의 결정자가 다른속성에서 여러 종속자를 결정할 때 다치종속 이라고한다.</p>
</blockquote>
<p>한 릴레이션에서 1:N, 1:N 두 개 이상으로 다치종속이 구성되어 있을때 이상현상이 발생한다.
중심이 되는 속성을 기준으로 릴레이션을 분리해줘야한다.</p>
<ul>
<li>개발자 테이블</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/dedc6b92-bb19-4602-a578-37a7b85149af/image.png" alt=""></p>
<h4 id="🌱-제-4정규화">🌱 제 4정규화</h4>
<p>개발자마다 자격증 값들이 여러개 존재하고, 개발자마다 언어 값들이 여러개 존재하는 경우 다치 종속 관계라고 한다.
이러한 경우  개발자, 자격증 / 개발자, 언어 테이블로 분리하여 관리하며 다치종속 관계를 제거하기 때문에 4차 정규화를 만족한다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/dcbd2d6c-4683-48b1-ac9d-a03ef8b2c3e4/image.png" alt=""></p>
<h3 id="6-제-5정규화-5nf---조인-종속성을-제거한다">(6) 제 5정규화 (5NF)  : 조인 종속성을 제거한다</h3>
<blockquote>
<p>릴레이션을 셋으로 분해 하여야만 조인을 통해서 원본 조회가 가능하다.</p>
</blockquote>
<p>4차정규화 테이블에 대해 조인연산을 수행하면 4차 정규화 수행전 데이터와 다르게 되는 문제인 조인 종속이 발생한다.</p>
<ul>
<li>4차 정규화 테이블
<img src="https://velog.velcdn.com/images/hyeri_hello/post/3a72b19b-734c-4652-89ed-8465be4a8db1/image.png" alt=""></li>
</ul>
<h4 id="🌱-제-5정규화">🌱 제 5정규화</h4>
<pre><code>조인 종속 관계를 제거하기 위해서는 모든 속성 관계인 개발자,자격증 / 개발자, 언어 / 자격증, 언어 관계에 대한 테이블을 만들어 줌으로써 조인을 했을때 정확히 원래의 데이터로 복원할 수 있게 한다.</code></pre><p><img src="https://velog.velcdn.com/images/hyeri_hello/post/0436bb8b-dcfd-46b3-903f-8e1dbf48f224/image.png" alt=""></p>
<h1 id="3-반정규화-de-normalization와-성능">3. 반정규화 (De-Normalization)와 성능</h1>
<pre><code>* 중복 데이터를 데이터베이스에 추가하여 데이터 검색에 필요한 조인 수를 줄여 성능을 향상시키는 프로세스
* 정규화된 엔티티, 속성, 관계에 대해 성능 향상과 개발 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법
* 비정규화, 역정규화라고 불린다.
* 조회 성능 향상 - 중복성의 원리를 활용하여 데이터 조회시 성능을 향상시키는 역할을 할 수 있음.
(테이블의 중복성,  컬럼의 중복성, 관계의 중복성)</code></pre><h2 id="1-반정규화-절차">(1) 반정규화 절차</h2>
<ol>
<li><p>반정규화 대상조사</p>
<p>범위처리빈도수 조사
대량의 범위처리 조사
통계성 프로세스 조사(통계성 테이블생성)
테이블 조인 개수</p>
</li>
<li><p>다른 방법유도 검토</p>
<p>뷰테이블
클러스터링 적용(조회중심- 인덱스로 안될경우)
인덱스의 조정
파티셔닝 기법 적용
응용 애플리케이션
반정규화 적용(기법)</p>
</li>
</ol>
<h2 id="2-반정규화-적용기법">(2) 반정규화 적용(기법)</h2>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/6e3b008b-5617-4e2e-9814-10f9e452c656/image.png" alt="">
<img src="https://velog.velcdn.com/images/hyeri_hello/post/4787e6ca-a0bb-4917-a1c6-cdf95fac63ab/image.png" alt="">
<img src="https://velog.velcdn.com/images/hyeri_hello/post/08767558-c5fa-4ea0-90ed-33ca365e535b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/d866f8d5-70a7-4627-8611-65bb15cc6c2e/image.png" alt="">
<img src="https://velog.velcdn.com/images/hyeri_hello/post/b48e909a-f1c1-4774-9269-4b4e95de96b8/image.png" alt="">
<img src="https://velog.velcdn.com/images/hyeri_hello/post/66d17c2c-8a50-4580-96da-f60eacb033e3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLP] 데이터 모델링의 이해]]></title>
            <link>https://velog.io/@hyeri_hello/SQLP-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@hyeri_hello/SQLP-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Wed, 25 Jan 2023 06:09:45 GMT</pubDate>
            <description><![CDATA[<h1 id="1-데이터-모델링의-이해">1. 데이터 모델링의 이해</h1>
<h2 id="1-모델링-정의">1) 모델링 정의</h2>
<ul>
<li>정의 : 복잡한 현실세계를 일정한 표기법에 의해 표현하는 일<br></li>
<li>특징 : <ol>
<li>추상화 : <code>일정한 형식</code> 에 맞춰 표현함</li>
<li>단순화 : <code>제한된 표기법</code>이나 언어로 표현함<ol start="3">
<li>명확성 : <code>이해가 쉽게</code> 표현함<br></li>
</ol>
</li>
</ol>
</li>
<li>관점<ol>
<li>데이터 관점 : <code>업무와 데이터</code> 및 <code>데이터 사이</code>의 관계<ol start="2">
<li>프로세스 관점 : <code>진행</code>되고 있거나 진행 되어야 하는 업무</li>
<li>상관 관점 : 데이터에 대한 <code>업무 처리 방식</code>의 영향</li>
</ol>
</li>
</ol>
</li>
</ul>
<h2 id="2-데이터-모델링-3요소">2) 데이터 모델링 3요소</h2>
<ul>
<li>정의 : 정보 시스템 구축을 위한 <code>데이터 관점</code>의 업무 분석 기법</li>
</ul>
<ol>
<li>개체 : 업무가 관여하는 어떤 것 (Things)</li>
<li>속성 : 어떤 것이 가지는 성격 (Attribute)</li>
<li>관계 : 업무가 관여하는 어떤 것 간의 관계 (Relationships)</li>
</ol>
<h2 id="3-데이터-모델링-3단계">3) 데이터 모델링 3단계</h2>
<ol>
<li>개념적 모델링 : 엔터티와 속성을 도출하고 ERD를 작성함</li>
<li>논리적 모델링 : 식별자를 도출하고 속성과 관계 등을 정의함</li>
<li>물리적 모델링 : DB 구축, 성능 및 보안 등 물리적인 성격 고려 </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Thymeleaf] option 값 가져오기]]></title>
            <link>https://velog.io/@hyeri_hello/Thymeleaf-option-%EA%B0%92-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@hyeri_hello/Thymeleaf-option-%EA%B0%92-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Tue, 17 Jan 2023 02:58:17 GMT</pubDate>
            <description><![CDATA[<h1 id="thymeleaf로-반복출력한-option-값을-jquery에서-가져오기">Thymeleaf로 반복출력한 Option 값을 jQuery에서 가져오기</h1>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/38307880-498b-44ce-b2bf-9cef7147ad64/image.png" alt=""></p>
<pre><code>&lt;body &gt;
    &lt;form id=&quot;signup-form&quot;&gt;    
      &lt;select class=&quot;stm-select&quot; th:name = &quot;keyword&quot; style = &quot;width: 18em;&quot; &gt;
        &lt;option value=&quot;선택&quot;&gt;지역선택&lt;/option&gt;
        &lt;option th:each=&quot;addr , i : ${addr}&quot; th:text=&quot;|${addr.sido} ${addr.gungu}|&quot; th:value=&quot;|${addr.sido} ${addr.gungu}|&quot;&gt;&lt;/option&gt;
      &lt;/select&gt;
      &lt;input class=&quot;addr&quot; type=&quot;hidden&quot;&gt;
      &lt;button type=&quot;submit&quot; id=&quot;search_btn&quot;&gt;조회&lt;/button&gt;
    &lt;/form&gt;

&lt;/body&gt;</code></pre><pre><code>&lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;/assets/js/main2.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    $(&quot;#search_btn&quot;).click(
            function() {
                //option 값 가져오기
                var keyword = $(&quot;select option:selected&quot;).val();
                console.log(keyword);
                }
            );
&lt;/script&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[디자인패턴] 생성 (Builder Pattern)]]></title>
            <link>https://velog.io/@hyeri_hello/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-Builder-Pattern</link>
            <guid>https://velog.io/@hyeri_hello/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-Builder-Pattern</guid>
            <pubDate>Fri, 13 Jan 2023 08:58:49 GMT</pubDate>
            <description><![CDATA[<h2 id="1-디자인-패턴-정의">1. 디자인 패턴 정의</h2>
<p><a href="https://velog.io/@hyeri_hello/Java-3-%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4">https://velog.io/@hyeri_hello/Java-3-%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4</a></p>
<h2 id="2-builder-pattern">2. Builder Pattern</h2>
<p>builder pattern은 객체 생성을 위해 사용되며, 
필수 필드를 생성자에서 설정하고, 선택적 필드를 설정하는 메서드를 통해 설정할 수 있게 해준다.
즉, 객체의 생성 방법과 표현 방법을 분리한다.</p>
<p>빌더 패턴은 생성에서 어떤 문제를 해결하기 위해 고안되었나?
: 객체 생성 시 생성자(Constructor)만 사용할 때 발생할 수 있는 문제를 개선하기 위해 고안됐다.</p>
<p>즉 필수 값에 대해서는 생성자를 통해, 선택 값에 대해서는 메소드를 통해 차례로 값을 입력 받은 후 build() 메소드를 통해 최종적으로 하나의 인스턴스를 return 하는 방식이다. </p>
<h2 id="3-builder-pattern-장점-및-특징">3. Builder Pattern 장점 및 특징</h2>
<p>빌더 패턴은 많은 Optional 한 멤버변수, 파라미터, 지속성 없는 상태 값들에 대해 처리해야 하는 문제들을 해결한다.</p>
<h2 id="4-코드-예제">4. 코드 예제</h2>
<p>예를들어 여행 계획을 세우는 앱을 개발한다고 할때 다음과 같은 요구사항이 있다.</p>
<p><code>✅ 요구사항1 :  여행 제목, 여행 출발 일, 몇 박, 며칠, 장소, 스케줄</code>
<br></p>
<p>요구사항 1을 만족 하기 위해 아래와 같은 도메인 으로 구성된다.</p>
<h3 id="1-domain-code">(1) domain code</h3>
<pre><code>public class TourPlan{
    private String title; // 여행 제목
    private LocalDate startDate; // 여행 출발 일
    private int nights; // 몇 박
    private int days; // 며칠
    private String places; // 장소
    private List&lt;DetailPlan&gt; plans; // n일차 할 일
}

/**
 * n일차 할 일
 */
public class DetailPlan {
    private int day; // n일차
    private String plan; // 할 일
}</code></pre><br>


<p><code>✅  요구사항2 :  당일 치기 계획도 필요함</code>
<br></p>
<p>요구사항 2 같은경우는 몇박 며칠인지 필요가 없다. 
필수적인 정보와 선택적인 정보가 생겼을 땐 어떻게 처리해야 할까?</p>
<h3 id="-builder-패턴-특징">* Builder 패턴 특징</h3>
<ol>
<li>필요한 객체를 직접 생성하는 대신, 먼저 필수 인자들을 생성자에 전부 전달하여 빌더 객체를 만든다.</li>
<li>그리고 선택 인자는 가독성이 좋은 코드로 인자를 넘길 수 있다.</li>
<li>setter가 없으므로 객체 일관성을 유지하여 불변 객체로 생성할 수 있다. </li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/fc4ca363-12c2-493f-b14c-fe20cd70b778/image.png" alt=""></p>
<h3 id="2-interface---tourplanbuilder">(2) Interface - TourPlanBuilder</h3>
<pre><code>public interface TourPlanBuilder {

    TourPlanBuilder nightsAndDays(int nights, int days);

    TourPlanBuilder title(String title);

    TourPlanBuilder startDate(LocalDate localDate);

    TourPlanBuilder whereToStay(String whereToStay);

    TourPlanBuilder addPlan(int day, String plan);

    TourPlan getPlan();

}</code></pre><h3 id="3-class---concretebuilder">(3) class - ConcreteBuilder</h3>
<pre><code>public class DefaultTourBuilder implements TourPlanBuilder {

    private String title;

    private int nights;

    private int days;

    private LocalDate startDate;

    private String whereToStay;

    private List&lt;DetailPlan&gt; plans;

    @Override
    public TourPlanBuilder nightsAndDays(int nights, int days) {
        this.nights = nights;
        this.days = days;
        return this;
    }

    @Override
    public TourPlanBuilder title(String title) {
        this.title = title;
        return this;
    }

    @Override
    public TourPlanBuilder startDate(LocalDate startDate) {
        this.startDate = startDate;
        return this;
    }

    @Override
    public TourPlanBuilder whereToStay(String whereToStay) {
        this.whereToStay = whereToStay;
        return this;
    }

    @Override
    public TourPlanBuilder addPlan(int day, String plan) {
        if (this.plans == null) {
            this.plans = new ArrayList&lt;&gt;();
        }

        this.plans.add(new DetailPlan(day, plan));
        return this;
    }

    @Override
    public TourPlan getPlan() {
        return new TourPlan(title, startDate, days, nights, whereToStay, plans);
    }
}</code></pre><h3 id="4-생성">(4) 생성</h3>
<h4 id="1-concretebuilder에-바로생성">(1) ConcreteBuilder에 바로생성</h4>
<pre><code>return tourPlanBuilder.title(&quot;미국 여행&quot;)
        .nightsAndDays(5, 6)
        .startDate(LocalDate.of(2023, 01, 25))
        .whereToStay(&quot;리조트&quot;)
        .addPlan(0, &quot;체크인하고 짐 풀기&quot;)
        .addPlan(0, &quot;저녁 식사&quot;)
        .getPlan();</code></pre><h4 id="2-director-통해서-생성">(2) Director 통해서 생성</h4>
<pre><code>public class TourDirector {

    private TourPlanBuilder tourPlanBuilder;

    public TourDirector(TourPlanBuilder tourPlanBuilder) {
        this.tourPlanBuilder = tourPlanBuilder;
    }

    public TourPlan cancunTrip() {
        return tourPlanBuilder.title(&quot;칸쿤 여행&quot;)
                .nightsAndDays(2, 3)
                .startDate(LocalDate.of(2020, 12, 9))
                .whereToStay(&quot;리조트&quot;)
                .addPlan(0, &quot;체크인하고 짐 풀기&quot;)
                .addPlan(0, &quot;저녁 식사&quot;)
                .getPlan();
    }

    public TourPlan longBeachTrip() {
        return tourPlanBuilder.title(&quot;롱비치&quot;)
                .startDate(LocalDate.of(2021, 7, 15))
                .getPlan();
    }
}


public static void main(String[] args) {
    TourDirector director = new TourDirector(new DefaultTourBuilder());
    TourPlan tourPlan = director.cancunTrip();
}
</code></pre><p>빌더 패턴은 굉장히 자주 사용되는 생성 패턴 중 하나로,
실무에서는 Stream.Builder API, StringBuilder, UriComponentsBuilder 등에 활용된다.</p>
<br>

<blockquote>
<p>reference
<a href="https://dev-youngjun.tistory.com/197">https://dev-youngjun.tistory.com/197</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/Practitioner]  AWS Well-Architected Framework]]></title>
            <link>https://velog.io/@hyeri_hello/AWSPractitioner-AWS-Well-Architected-Framework</link>
            <guid>https://velog.io/@hyeri_hello/AWSPractitioner-AWS-Well-Architected-Framework</guid>
            <pubDate>Thu, 12 Jan 2023 05:50:15 GMT</pubDate>
            <description><![CDATA[<h2 id="1-문제">1. 문제</h2>
<p>회사에서 물리적 온프레미스 컴퓨팅 서버를 AWS 서버리스 컴퓨팅 서비스로 교체할 계획입니다. 회사는 마이그레이션 후 신속하게 고급 기술을 활용할 수 있기를 원합니다.
이 계획이 나타내는 AWS Well-Architected 프레임워크의 기둥은 무엇입니까?</p>
<h2 id="2-보기">2. 보기</h2>
<p>A. 보안
B. 성능 효율성
C. 운영 우수성
D. 신뢰성</p>
<h2 id="3-답-해설">3. 답, 해설</h2>
<p>B. 성능 효율성 또는 C. 운영 우수성</p>
<p>AWS Well-Architected 프레임워크는 AWS 클라우드에서 안정적이고 안전하며 효율적이고 비용 효율적인 시스템을 구축하기 위한 일련의 모범 사례 및 아키텍처 원칙입니다. 
이를 통해 조직은 다양한 설계 결정의 장단점을 이해하고 비즈니스 및 기술 요구 사항을 충족하기 위해 AWS 서비스를 사용하는 방법에 대해 정보에 입각한 선택을 할 수 있습니다.</p>
<p>프레임워크는 5개의 기둥으로 구성됩니다.</p>
<p>운영 우수성: 조직의 시스템이 원활하게 실행되고 시간이 지남에 따라 쉽게 관리 및 유지될 수 있도록 도와줍니다.</p>
<p>보안: 조직의 시스템과 데이터를 무단 액세스, 사용, 공개, 중단, 수정 또는 파괴로부터 보호하는 데 도움이 됩니다.</p>
<p>안정성: 조직 시스템의 가용성, 확장성 및 자가 복구 기능을 보장하는 데 도움이 됩니다.</p>
<p>성능 효율성: 조직의 시스템이 리소스(컴퓨팅, 메모리, 스토리지 및 네트워크)를 최적의 방식으로 사용하고 있는지 확인하는 데 도움이 됩니다.</p>
<p>비용 최적화: 조직이 가장 비용 효율적인 방식으로 AWS 서비스를 사용하고 있으며 사용 가능한 유연한 요금 및 결제 옵션을 활용하고 있는지 확인하는 데 도움이 됩니다.</p>
<p>프레임워크의 모범 사례와 원칙을 따르면 조직은 안전하고 안정적이며 고성능이며 비용 효율적이고 변화하는 비즈니스 요구 사항에 쉽게 적응할 수 있는 시스템을 구축할 수 있습니다.</p>
<p>프레임워크의 목표는 조직이 AWS 서비스를 최대한 활용하여 비즈니스 목표를 지원하도록 하는 것입니다.</p>
<blockquote>
<p><a href="https://aws.amazon.com/blogs/apn/the-6-pillars-of-the-aws-well-architected-framework/">https://aws.amazon.com/blogs/apn/the-6-pillars-of-the-aws-well-architected-framework/</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/Practitioner] AWS 마이그레이션 이점]]></title>
            <link>https://velog.io/@hyeri_hello/AWSPractitioner-AWS-Well-Architected-la0jb9my</link>
            <guid>https://velog.io/@hyeri_hello/AWSPractitioner-AWS-Well-Architected-la0jb9my</guid>
            <pubDate>Wed, 11 Jan 2023 07:34:09 GMT</pubDate>
            <description><![CDATA[<h2 id="1-문제">1. 문제</h2>
<p>다음 중 AWS 클라우드로 마이그레이션할 때의 이점은 무엇입니까? (두 가지를 선택하세요.)</p>
<h2 id="2-보기">2. 보기</h2>
<p>A. 운영 탄력성 
B. Amazon.com 제품 할인
C. 비즈니스 민첩성 
D. 비즈니스 우수성
E. 직원 보유 증가</p>
<h2 id="3-답-해설">3. 답, 해설</h2>
<p>A. 운영 탄력성 
C. 비즈니스 민첩성 </p>
<h3 id="1-aws-마이그레이션-이란">(1) AWS 마이그레이션 이란?</h3>
<p>AWS 마이그레이션은 <code>데이터, 애플리케이션 또는 기타 비즈니스 요소</code> 를 사내 또는 다른 클라우드 환경에서 <code>AWS(Amazon Web Services) 클라우드 플랫폼으로 이동</code> 하는 프로세스를 말합니다. 
여기에는 데이터를 AWS 스토리지 서비스로 마이그레이션하거나, AWS 컴퓨팅 서비스에서 실행할 애플리케이션을 이동하거나, AWS 도구 및 서비스를 사용하여 마이그레이션 프로세스를 관리하고 최적화하는 작업이 포함될 수 있습니다.
AWS로 마이그레이션하면 확장성, 유연성 및 비용 절감과 같은 이점을 제공할 수 있지만 원활한 전환을 위해 신중한 계획과 실행이 필요합니다.</p>
<h3 id="2-aws-마이그레이션의-주요-이점">(2) AWS 마이그레이션의 주요 이점</h3>
<p>AWS 클라우드는 동적 기술 환경에 빠르게 적응할 수 있도록 해주는 이상적인 클라우드 컴퓨팅 플랫폼 역할을 합니다.</p>
<p>다음은 AWS 클라우드 솔루션으로 마이그레이션할 때 얻을 수 있는 몇 가지 주요 이점입니다.</p>
<h4 id="1-높은-유연성">1. 높은 유연성</h4>
<p>AWS 클라우드 컴퓨팅은 여러분이 기다려온 최고의 솔루션입니다. 이는 높은 수준의 유연성을 제공하기 때문입니다. 운영 체제(OS), 데이터베이스, 웹 애플리케이션 플랫폼 및 프로그래밍 언어를 선택할 수 있습니다. 
AWS 클라우드 마이그레이션  의 주요 이점 중 하나는  요구 사항에 따라 애플리케이션을 로드할 수 있다는 것입니다. 
가상 환경에서 애플리케이션에 필요한 요소를 디자인할 수 있습니다. 따라서 마이그레이션 프로세스가 정말 간단하고 편리해집니다. </p>
<h4 id="2-사용이-간편하다">2. 사용이 간편하다</h4>
<p>AWS 클라우드 플랫폼을 사용하면 벤더와 애플리케이션 공급자가 애플리케이션을 안전하고 빠르게 호스팅할 수 있습니다. 
따라서 새로운 애플리케이션이든 기존 애플리케이션이든 상관없이 플랫폼은 프로세스를 단순화합니다. 이는 IT 리소스와 기능을 최적으로 사용하는 데 도움이 되는  AWS 마이그레이션  의 주요 이점 중 하나입니다. </p>
<h4 id="3-확장성">3. 확장성</h4>
<p>현 시대에 운영되는 비즈니스는 진화하는 시장 트렌드와 수요에 적응해야 합니다. AWS 마이그레이션 의 주요  이점  중 하나 는 변화하는 수요에 따라 애플리케이션을 확장할 수 있도록 다양한 요소를 사용할 수 있다는 것입니다 . 예를 들어 애플리케이션이 최적의 성능을 발휘할 수 있도록 AWS 도구, Elastic Load Balancing 및 Auto Scaling을 사용할 수 있습니다.  </p>
<h4 id="4-최고의-성능">4. 최고의 성능</h4>
<p>AWS 마이그레이션 의 주요  이점  중 하나는 비즈니스 성능 향상입니다. 
AWS 클라우드 플랫폼을 사용하면 원하는 목표를 달성하기 위해 IT 애플리케이션을 원활하게 사용할 수 있습니다.
애플리케이션과 작동 방식을 쉽게 배포, 관리 및 모니터링할 수 있습니다. 
따라서 애플리케이션 활용도와 비즈니스 성과를 더 잘 조정할 수 있습니다.</p>
<h4 id="5-높은-수준의-보안">5. 높은 수준의 보안</h4>
<p>보안은 기업과 개인을 괴롭히는 주요 측면 중 하나입니다. 
AWS는 클라우드 인프라가 최고 수준의 보안 프레임워크를 갖도록 종단 간 접근 방식을 사용합니다. 
AWS에서 활용하는 접근 방식은 물리적 운영 및 소프트웨어 조치를 포함하여 전체 IT 인프라를 강화하는 데 도움이 됩니다.  따라서 보안 문제에 대한 걱정 없이 AWS 클라우드 마이그레이션 기술 을 사용할 수 있습니다  . 강력한 보안 요소 세트를 통해 모든 비즈니스 요구 사항을 충족할 수 있습니다. </p>
<h4 id="6-비용-효율성">6. 비용 효율성</h4>
<p>AWS 클라우드로 마이그레이션하는 데 비용이 많이 든다고 생각한다면 다시 생각해야 합니다. 실제로는 비용 관리가 훨씬 더 간단해질 것입니다. 
이것이 어떻게 가능할지 궁금하다면 여기에 답이 있습니다. 스토리지, 컴퓨팅 성능 및 사용해야 하는 기타 리소스에 대해서만 비용을 지불하면 됩니다. 
귀하는 장기 계약이나 약속의 일부가 될 필요가 없습니다. </p>
<p>따라서  AWS 마이그레이션의 주요 이점  중 하나는 인프라 비용 부담이 없다는 것입니다. 
효율적이고 효과적인 방식으로 비즈니스 운영에 집중할 수 있습니다. </p>
<h4 id="7-믿을-수-있는-자연">7. 믿을 수 있는 자연</h4>
<p>AWS 클라우드 솔루션의 주요 특징 중 하나는 높은 수준의 안정성과 의존성입니다. AWS 마이그레이션 서비스 를 선택  하면 안전하고 신뢰할 수 있는 글로벌 인프라를 활용할 수 있습니다. 여전히 클라우드 환경이 불안하다면 긴장을 풀 필요가 있습니다. AWS 클라우드는 Amazon의 가상 백본 역할을 하므로 신뢰할 수 있는 인프라입니다. </p>
<p>AWS 클라우드 솔루션은 다른 서비스에 비해 훨씬 안정적입니다. 에코시스템은 애플리케이션과 소프트웨어에 필요한 지원을 제공하도록 설계되었습니다. 따라서 IT 인프라를 최대한 활용하기 위해 클라우드 설정으로 마이그레이션할 수 있습니다. </p>
<h4 id="8-높은-탄력성과-민첩성">8. 높은 탄력성과 민첩성</h4>
<p>AWS 클라우드 컴퓨팅 기술은 IT 리소스를 최적으로 활용할 수 있도록 보장합니다. 따라서 실제로 불필요하므로 리소스를 과도하게 프로비저닝할 필요가 없습니다. 비즈니스를 운영하는 데 실제로 필요한 IT 리소스와 기능을 활용할 수 있습니다. 금상첨화는 비즈니스 요구 사항을 효율적으로 충족할 수 있도록 리소스를 조정할 수 있다는 것입니다. </p>
<h3 id="9-운영-탄력성">9. 운영 탄력성</h3>
<p>AWS 마이그레이션  의 핵심 이점 중 하나는  비즈니스가 더 안전하고 덜 위험한 공간에서 운영될 수 있다는 것입니다. AWS 클라우드로의 마이그레이션에 대해 생각해 본 적이 없다면 비즈니스를 위험에 빠뜨리는 것입니다. 안전한 클라우드 플랫폼으로 마이그레이션하면 비즈니스 운영이 탄력적인 IT 배경으로 이동할 수 있습니다. 이러한 움직임은 자연스럽게 운영 탄력성에도 긍정적인 영향을 미칠 것입니다. </p>
<p>매우 예측하기 어려운 IT 시나리오에서 AWS 솔루션은 비즈니스에 가장 탄력적인 환경을 제공할 수 있습니다. 
비즈니스 위험을 최소화하고 지속 가능성을 높이려면 AWS로 마이그레이션하는 것이 이상적인 선택일 수 있습니다. 보다 안전한 환경을 통해 IT 리소스를 생산적으로 사용하고 운영 분야에서 탁월할 수 있습니다.  </p>
<h4 id="10-가능한-데이터-저장">10. 가능한 데이터 저장</h4>
<p>현재 적절한 데이터 저장은 대부분의 비즈니스 사업에서 주요 관심사일 수 있습니다. 하지만 AWS 클라우드 솔루션을 선택하면 데이터 저장 문제에 대해 걱정할 필요가 없습니다.
AWS 마이그레이션 의 주요  이점 중 하나  는 데이터 스토리지와 관련하여 높은 유연성이 있다는 것입니다. 다양한 종류의 전자기기에서 다양한 파일에 쉽게 접근할 수 있습니다. 장소가 다르거나 시간이 달라 걱정되더라도 걱정하지 않으셔도 됩니다. AWS 클라우드 컴퓨팅은 이러한 측면을 처리합니다.</p>
<blockquote>
<p><a href="https://www.easydeploy.io/blog/benefits-of-aws-migration/">https://www.easydeploy.io/blog/benefits-of-aws-migration/</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/Practitioner] AWS Well-Architected ]]></title>
            <link>https://velog.io/@hyeri_hello/AWSPractitioner-AWS-Well-Architected</link>
            <guid>https://velog.io/@hyeri_hello/AWSPractitioner-AWS-Well-Architected</guid>
            <pubDate>Tue, 10 Jan 2023 06:41:13 GMT</pubDate>
            <description><![CDATA[<h2 id="1-문제">1. 문제</h2>
<p>AWS Well-Architected 프레임워크의 핵심 요소 중 인프라 또는 <code>서비스 중단으로부터 복구하고 수요를 충족하기 위해 컴퓨팅 리소스를 동적으로 확보</code>하는 시스템의 기능?</p>
<h2 id="2-보기">2. 보기</h2>
<p>A. 보안 (Security)
B. 신뢰성 (Reliability)
C. 성능 효율성 (Performance efficiency)
D. 비용 최적화 (Cost optimization)</p>
<h2 id="3-답-해설">3. 답, 해설</h2>
<p>B. 신뢰성</p>
<p>안정성 원칙은 의도한 기능을 수행하는 워크로드와 요구 사항을 충족하기 위해 실패로부터 신속하게 복구하는 방법에 중점을 둡니다. 주요 주제에는 분산 시스템 설계, 복구 계획 및 변화하는 요구 사항에 대한 적응이 포함됩니다.</p>
<blockquote>
<p><a href="https://aws.amazon.com/ko/architecture/well-architected/?nc1=h_ls&amp;wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&amp;wa-lens-whitepapers.sort-order=desc&amp;wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&amp;wa-guidance-whitepapers.sort-order=desc">https://aws.amazon.com/ko/architecture/well-architected/?nc1=h_ls&amp;wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&amp;wa-lens-whitepapers.sort-order=desc&amp;wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&amp;wa-guidance-whitepapers.sort-order=desc</a></p>
</blockquote>
<h2 id="4-다른-보기-정의">4. 다른 보기 정의</h2>
<h3 id="1-보안-security">1) 보안 (Security)</h3>
<p>보안 원칙은 정보 및 시스템 보호에 중점을 둡니다. 
주요 주제에는 데이터의 기밀성 및 무결성, 사용자 권한 관리, 보안 이벤트 감지를 위한 제어 설정이 포함됩니다.</p>
<h3 id="2-성능-효율성-performance-efficiency">2) 성능 효율성 (Performance Efficiency)</h3>
<p>성능 효율성 원칙은 IT 및 컴퓨팅 리소스의 체계적이고 능률적인 할당에 중점을 둡니다. 주요 주제에는 워크로드 요구 사항에 최적화된 리소스 유형 및 크기 선택, 성능 모니터링 및 비즈니스 요구 사항의 변화에 ​​따른 효율성 유지가 포함됩니다.</p>
<h3 id="3-비용-최적화-cost-optimization">3) 비용 최적화 (Cost Optimization)</h3>
<p>비용 최적화 원칙은 불필요한 비용을 피하는 데 중점을 둡니다. 주요 주제에는 시간 경과에 따른 지출 이해 및 자금 할당 제어, 올바른 유형 및 수량의 리소스 선택, 초과 지출 없이 비즈니스 요구 사항에 맞게 확장하는 것이 포함됩니다.</p>
<h3 id="4-운영-우수성-operational-excellence">4) 운영 우수성 (Operational Excellence)</h3>
<p>운영 우수성 원칙은 시스템 실행 및 모니터링과 프로세스 및 절차를 지속적으로 개선하는 데 중점을 둡니다. 주요 주제에는 변경 자동화, 이벤트 대응, 일상 운영 관리를 위한 표준 정의가 포함됩니다.</p>
<h3 id="5-지속-가능성-sustainability">5) 지속 가능성 (Sustainability)</h3>
<p>지속 가능성 원칙은 클라우드 워크로드 실행이 환경에 미치는 영향을 최소화하는 데 중점을 둡니다. 주요 주제에는 지속 가능성에 대한 공동 책임 모델, 영향 이해, 활용도 극대화를 포함하여 필요한 자원을 최소화하고 다운스트림 영향을 줄입니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS/Practitioner] Amazon CloudFront]]></title>
            <link>https://velog.io/@hyeri_hello/AWSPractitioner-Amazon-CloudFront</link>
            <guid>https://velog.io/@hyeri_hello/AWSPractitioner-Amazon-CloudFront</guid>
            <pubDate>Mon, 09 Jan 2023 05:27:40 GMT</pubDate>
            <description><![CDATA[<h2 id="1-문제">1. 문제</h2>
<p>회사는 AWS 클라우드에서 글로벌 마케팅 애플리케이션을 실행할 계획입니다. 
이 애플리케이션은 사용자가 볼 수 있는 동영상을 제공합니다. 
회사는 모든 사용자가 짧은 대기 시간으로 이러한 비디오를 볼 수 있도록 해야 합니다.
회사에서 이 요구 사항을 충족하려면 어떤 AWS 서비스를 사용해야 합니까?</p>
<h2 id="2-보기">2. 보기</h2>
<p>A. AWS Auto Scaling
B. Amazon Kinesis 비디오 스트림
C. 탄력적 로드 밸런싱
D. 아마존 클라우드프론트</p>
<h2 id="3-답-해설">3. 답, 해설</h2>
<p>D. 아마존 클라우드프론트</p>
<p>AWS에서는 콘텐츠 전송 네트워크(CDN)인 Amazon CloudFront를 사용할 수 있습니다. 
CloudFront는 전 세계 여러 지역에 위치한 캐시 서버를 사용하여 콘텐츠를 제공합니다. 
사용자가 인터넷에 접속할 때, CloudFront는 사용자의 위치에 가장 가까운 캐시 서버를 찾아 콘텐츠를 제공하기 때문에, 짧은 대기 시간으로 동영상을 제공할 수 있습니다.</p>
<h2 id="4-다른-보기-정의">4. 다른 보기 정의</h2>
<h3 id="1-aws-auto-scaling">1) AWS Auto Scaling</h3>
<p>AWS Auto Scaling은 인프라 구성 요소의 수를 자동으로 조정하는 서비스입니다. </p>
<p>예를 들어, 웹 서버 인스턴스가 증가한 트래픽을 처리할 수 있도록 인스턴스를 추가할 수 있고, 적은 트래픽을 처리할 때는 인스턴스를 제거할 수 있습니다.
Auto Scaling은 인스턴스의 수를 조정하기 위해 설정한 임계치(threshold)를 기반으로 작동합니다. 
임계치는 정해진 작업(scaling policy)을 수행하기 위한 상태를 지정합니다. 
예를 들어, 인스턴스의 CPU 사용률이 80% 이상일 경우 인스턴스를 추가하거나, 인스턴스의 CPU 사용률이 10% 이하일 경우 인스턴스를 제거할 수 있습니다.
Auto Scaling을 사용하면 인프라 구성 요소의 수를 자동으로 조정할 수 있기 때문에, 서비스의 유연성과 가용성을 향상시킬 수 있습니다.</p>
<h3 id="2-amazon-kinesis-video-streams">2) Amazon Kinesis Video Streams</h3>
<p>Amazon Kinesis Video Streams는 실시간 비디오 스트림을 전송, 저장, 처리할 수 있는 AWS 서비스입니다. 
Kinesis Video Streams는 실시간 영상과 오디오를 전송할 수 있는 소프트웨어 개발 키트(SDK)를 제공하고, 스트림을 저장하고 재생할 수 있는 기능을 제공합니다.
Kinesis Video Streams는 실시간 비디오 스트림을 전송하고 저장할 수 있기 때문에, 실시간 영상 스트리밍 애플리케이션을 구축할 때 유용합니다. 
예를 들어, 인터넷 생중계, 원격 진료, 전자정부 서비스 등의 실시간 영상 제공 서비스를 구축할 때 사용할 수 있습니다.</p>
<h3 id="3-탄력적-로드-밸런싱-dynamic-load-balancing">3) 탄력적 로드 밸런싱 (Dynamic Load Balancing)</h3>
<p>탄력적 로드 밸런싱(Dynamic Load Balancing)은 시스템이 요청을 처리할 수 있는 자원의 상태를 계속 모니터링하고, 요청을 적절한 자원에게 전달하는 기능을 제공합니다. 
이를 통해 시스템의 처리량과 응답 속도를 개선할 수 있습니다.</p>
<p>탄력적 로드 밸런싱은 정적 로드 밸런싱과 달리 요청을 처리할 수 있는 자원의 상태를 실시간으로 모니터링하기 때문에, 시스템의 처리량과 응답 속도를 좀 더 효과적으로 개선할 수 있습니다. 예를 들어, 요청이 많은 시간대에는 추가 자원을 사용하고, 요청이 적은 시간대에는 자원을 절약할 수 있습니다.
탄력적 로드 밸런싱은 시스템의 처리량과 응답 속도를 개선할 수 있기 때문에, 서비스의 가용성과 스케일 성을 개선할 수 있습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java/Spring] SMTP(Email 보내기)]]></title>
            <link>https://velog.io/@hyeri_hello/JavaSpring-SMTPEmail-%EB%B3%B4%EB%82%B4%EA%B8%B0</link>
            <guid>https://velog.io/@hyeri_hello/JavaSpring-SMTPEmail-%EB%B3%B4%EB%82%B4%EA%B8%B0</guid>
            <pubDate>Thu, 24 Nov 2022 09:22:00 GMT</pubDate>
            <description><![CDATA[<h1 id="1-smtp란">1. SMTP란?</h1>
<p>Simple Mail Transfer Protocol의 약자로, 이메일 전송에 사용되는 네트워크 프로토콜이다. </p>
<h1 id="2-google-gmail-smtp-활용">2. Google Gmail SMTP 활용</h1>
<h2 id="1-계정-생성">(1). 계정 생성</h2>
<p>나는 테스트용 구글 계정을 새로 만들었다! (과정은 생략)</p>
<p>계정 생성 후 Google계정관리로 이동 
<a href="https://myaccount.google.com/">https://myaccount.google.com/</a></p>
<h2 id="2-보안-2단계-인증-사용">(2). 보안 2단계 인증 사용</h2>
<p>하단의 2단계 인증이 사용안함 → 사용으로 변경해 줘야한다. 
인증사용절차는 인증코드만 하면 간단하니 넘어가도록 하겠다!</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/d55f56e5-4a43-4f9b-ad31-f40d10483056/image.png" alt=""></p>
<h2 id="3-앱-비밀번호-생성">(3). 앱 비밀번호 생성</h2>
<p>아래의 앱 비밀번호를 클릭후 아래와 같이 기타를 선택한다.
이름은 SMTP 로 해주고 (원하는데로 지으면됨) 생성 후 자동 발급된 기기용 앱 비밀번호를 기억한다! </p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/f5ef4f1b-a7c9-4434-9f0f-4bb9d27b9368/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/ec3be90b-b3fa-47ee-bf5c-0159334a900d/image.png" alt=""></p>
<h1 id="3-spring-setting">3. Spring Setting</h1>
<h2 id="1-dependencis-추가">(1). dependencis 추가</h2>
<p>프로젝트로 돌아와서 의존성을 추가해준다. (gradle사용)</p>
<pre><code>implementation &#39;org.springframework.boot:spring-boot-starter-mail&#39;</code></pre><h2 id="2-applicationproperties-추가">(2). application.properties 추가</h2>
<pre><code>#mail
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=(user email)
spring.mail.password=(위에서 셋팅했던 앱 비밀번호)
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true</code></pre><h2 id="3-프로젝트-셋팅">(3). 프로젝트 셋팅!</h2>
<p>Controller에서 DTO 객체로 담아 서비스로 보낸다는 가정하에 설명한다.</p>
<p><code>MailController.java</code></p>
<pre><code>    @PostMapping(&quot;/contact/send&quot;)
    @ResponseBody
    public String mail(@RequestBody MailDto data) {

        String    res = this.mailService.sendSimpleMessage(data);
        return    res;
    }</code></pre><p><code>MailService.java</code></p>
<pre><code>package com.example.ilapofol.business;

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import com.example.ilapofol.model.MailDto;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service
@RequiredArgsConstructor
@Slf4j
public class MailService {

    private final JavaMailSender emailSender;

    public String sendSimpleMessage(MailDto data) {

        System.out.println(data);

        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(data.getEmail());
        message.setTo(&quot;보낼 메일 즉 나의 메일!&quot;);
        message.setSubject(data.getName());
        message.setText(data.getMessage() + data.getEmail());
        emailSender.send(message);

        log.info(&quot;성공 메세지 {} : &quot;, message);
        return &quot;전송 성공!&quot;;
    }
}
</code></pre><p><code>MailDto.java</code></p>
<pre><code>package com.example.ilapofol.model;

import lombok.Data;

@Data
public class MailDto {

    private int id;
    private String name;
    private String email;
    private String message;
}
</code></pre><br>


<h1 id="4-구현">4. 구현</h1>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/5fe2a10b-2ee3-4df3-badb-c743812e8daf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/1656162d-9743-4a7d-8ab0-6bb98ec7b27e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/25bf66af-9695-43a5-90eb-4eff71420317/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java/Spring] Project 실전]]></title>
            <link>https://velog.io/@hyeri_hello/JavaSpring-Project-%EC%8B%A4%EC%A0%84</link>
            <guid>https://velog.io/@hyeri_hello/JavaSpring-Project-%EC%8B%A4%EC%A0%84</guid>
            <pubDate>Thu, 03 Nov 2022 03:03:15 GMT</pubDate>
            <description><![CDATA[<h2 id="1-개요">1. 개요</h2>
<p>MVC 패턴을 기본으로 하는 Springboot Project를 구성함</p>
<h2 id="2-프로젝트-생성">2. 프로젝트 생성</h2>
<h3 id="1-setting">1. Setting</h3>
<p>이클립스(또는 STS) 기준으로 함 </p>
<h4 id="1-spring-starter-project">1) Spring Starter Project</h4>
<p><code>File &gt; New &gt; Spring Starter Project</code> <img src="https://velog.velcdn.com/images/hyeri_hello/post/c6548d84-7c5a-408a-b4e3-c6c1b7f93559/image.png" alt=""> 위와 같이 세팅 후 Next</p>
<h4 id="2-dependencies">2) Dependencies</h4>
<p><code>Lombok, Spring Web</code> 선택 (원하는 의존성 추가 가능) 후 next → Finish
<img src="https://velog.velcdn.com/images/hyeri_hello/post/e8c8965d-ff60-42cf-91cf-e08131c23cb4/image.png" alt=""></p>
<h4 id="3-applicationproperties-추가">3) application.properties 추가</h4>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/ea860d9e-41a3-43ea-8a3e-c6e752d064eb/image.png" alt=""></p>
<pre><code># 사용할 포트 :: port
server.port = 9090

#spring :: 스프링 setting
spring.application.name=ila-pofol
spring.application.sql=mysql
</code></pre><br>

<h3 id="2-view-설정">2. View 설정</h3>
<p>방법은 두 가지 이다.</p>
<h4 id="1-정적-리소스-설정-커스터마이징---webconfigurer">1) 정적 리소스 설정 커스터마이징 - WebConfigurer</h4>
<p>기본적으로 스프링 부트에서 web의존성 추가 후 <code>localhost:9090</code>으로 접근하면 <code>resources/static/index.html</code>을 읽게된다.</p>
<p>만약 <code>resources/templates/index.html</code>로 위치하려면 스프링 부트에서 제공하는 <code>WebMvcConfigurer</code>를 <code>implements</code> 한후 <code>addResourceHandlers</code>를 override 해야한다.
<br></p>
<pre><code>package com.example.ilapofol.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class ViewConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(&quot;/**&quot;)
                .addResourceLocations(&quot;classpath:/templates/&quot;, &quot;classpath:/static/&quot;);
    }
}
</code></pre><h4 id="2-thymeleaf설정">2) Thymeleaf설정</h4>
<p><code>application.properties</code> 를 아래와같이 thymeleaf 추가 </p>
<pre><code>#port
server.port = 9090

#spring
spring.application.name=ila-pofol
spring.application.sql=mysql

#thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
spring.thymeleaf.check-template-location=true

</code></pre><p><code>build.gradle</code> 에 thymeleaf 의존성 추가 </p>
<pre><code>plugins {
    id &#39;org.springframework.boot&#39; version &#39;2.7.5&#39;
    id &#39;io.spring.dependency-management&#39; version &#39;1.0.15.RELEASE&#39;
    id &#39;java&#39;
}

group = &#39;com.example.ila-pofol&#39;
version = &#39;0.0.1-SNAPSHOT&#39;
sourceCompatibility = &#39;17&#39;

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation &#39;org.springframework.boot:spring-boot-starter-web&#39;

    // 타임리프 아래 3개 implementation 추가
    implementation &#39;org.springframework.boot:spring-boot-starter-thymeleaf&#39;
    implementation &#39;nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect&#39;
    implementation &#39;org.thymeleaf.extras:thymeleaf-extras-springsecurity5&#39;

    compileOnly &#39;org.projectlombok:lombok&#39;
    annotationProcessor &#39;org.projectlombok:lombok&#39;
    testImplementation &#39;org.springframework.boot:spring-boot-starter-test&#39;
}

tasks.named(&#39;test&#39;) {
    useJUnitPlatform()
}

</code></pre><h3 id="3-database-setting">3. Database Setting</h3>
<pre><code>create database ilapofol;
</code></pre><pre><code>CREATE TABLE brewerypg (
  id int(11) NOT NULL auto_increment PRIMARY KEY,
  commend varchar(100) NOT NULL,
  regularvisit char(1) CHECK (regularvisit in (&#39;Y&#39;,&#39;N&#39;)),
  time time NOT NULL,
  brnm varchar(50) NOT NULL,
  braddr varchar(50) NOT NULL,
  brtel varchar(20) NOT NULL,
  resevisit char(1) CHECK (resevisit in (&#39;Y&#39;,&#39;N&#39;)),
  placenm varchar(20) NOT NULL,
  kind varchar(10), 
  programnm varchar(20),
  cost int(10),
  url varchar(20)
);</code></pre><pre><code>CREATE TABLE translang ( 
id int (11) NOT NULL auto_increment PRIMARY KEY, 
langcode char(20), 
langnm varchar(20))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] 데이터베이스 관리도구 (DBeaver) 연결 ]]></title>
            <link>https://velog.io/@hyeri_hello/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EB%A6%AC%EB%8F%84%EA%B5%AC-DBeaver-%EC%97%B0%EA%B2%B0</link>
            <guid>https://velog.io/@hyeri_hello/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EB%A6%AC%EB%8F%84%EA%B5%AC-DBeaver-%EC%97%B0%EA%B2%B0</guid>
            <pubDate>Tue, 01 Nov 2022 08:50:47 GMT</pubDate>
            <description><![CDATA[<h2 id="1-개요">1. 개요</h2>
<p><a href="https://velog.io/@hyeri_hello/%EB%A6%AC%EB%88%85%EC%8A%A4-MySQL-%EC%84%A4%EC%B9%98">https://velog.io/@hyeri_hello/%EB%A6%AC%EB%88%85%EC%8A%A4-MySQL-%EC%84%A4%EC%B9%98</a></p>
<p>이전에 생성한 MySql을 관리/사용하기 위해 관리도구에 연결하는 방법을 설명한다.
나는 <code>DBeaver</code> 를 사용 했으나, 다른 툴도 동일하게 적용 가능하다.</p>
<h2 id="2-연결">2. 연결</h2>
<p><code>DBeaver</code> 설치 방법은 생략 한다.</p>
<h3 id="1-connection">1) Connection</h3>
<p>목록에서 오른쪽 마우스 클릭 후 
Connection 선택 → 관련 DB선택 → 아래 화면과 같이 setting 후 일단 완료
<img src="https://velog.velcdn.com/images/hyeri_hello/post/3c919bcf-9502-4636-b4e7-f407efd45ffa/image.png" alt=""><img src="https://velog.velcdn.com/images/hyeri_hello/post/e3827067-f6e8-4b7b-869b-db40192507aa/image.png" alt=""><img src="https://velog.velcdn.com/images/hyeri_hello/post/14520be4-bbc3-4f67-a543-075d4b7cb223/image.png" alt=""></p>
<p>오른쪽 마우스 클릭 후 
Edit Connection 선택 → SSH 선택 → 아래 화면과 같이 setting → Test Connection 
<img src="https://velog.velcdn.com/images/hyeri_hello/post/1fafd4cd-959e-4dde-9078-b3281db1160b/image.png" alt=""><img src="https://velog.velcdn.com/images/hyeri_hello/post/7be5f6d0-4c80-4396-af75-e2f3c57f0ebf/image.png" alt=""></p>
<ul>
<li>Host/IP : 외부 IP (이전 클라우드 셋팅 참고) </li>
<li>User Name : 클라우드 사용자 이름</li>
<li>Public Key : 클라우드 연결시 사용 했던 키</li>
<li>Passphrase : 클라우드 계정 비밀번호 </li>
</ul>
<h2 id="3-error">3. Error</h2>
<p><code>Access denied for user &#39;root@&#39;@&#39;localhost&#39;</code> 해결방법</p>
<p>초기 설정되어있는 mysql root 계정의 pw 타입이 문제가 될 수 있는데 </p>
<p><code>select user, host, plugin from mysql.user;</code><img src="https://velog.velcdn.com/images/hyeri_hello/post/416cdf56-4174-40f0-be00-1e4151cbb12b/image.png" alt=""></p>
<ol>
<li>auth_socket을 mysql_native_password로 변경해주면 가능하다.
<code>update user set plugin=&#39;mysql_native_password&#39; where user=&#39;root&#39;;</code></li>
</ol>
<ol start="2">
<li><p>현재 사용중인 MySQL의 캐시를 지우고 새로운 설정을 적용
<code>flush privaileges;</code> </p>
</li>
<li><p>정보 재확인 (변경 확인)
<code>select user, host, plugin from user;</code><img src="https://velog.velcdn.com/images/hyeri_hello/post/7e74dcf9-82a5-43f7-b1ef-11763151f16c/image.png" alt=""></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[리눅스] MySQL 설치]]></title>
            <link>https://velog.io/@hyeri_hello/%EB%A6%AC%EB%88%85%EC%8A%A4-MySQL-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@hyeri_hello/%EB%A6%AC%EB%88%85%EC%8A%A4-MySQL-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 31 Oct 2022 09:16:56 GMT</pubDate>
            <description><![CDATA[<h2 id="1-개요">1. 개요</h2>
<p>리눅스 환경에서 apt 명령어로 mysql 설치하는 방법</p>
<br>

<h2 id="2-설치">2. 설치</h2>
<h3 id="1-apt-업데이트">1) apt 업데이트</h3>
<p><code>sudo apt-get update</code></p>
<h3 id="2-mysql-설치">2) mysql 설치</h3>
<p><code>sudo apt-get install mysql-server</code></p>
<h3 id="3-mysql-버전-확인">3) mysql 버전 확인</h3>
<p><code>mysql --version</code></p>
<pre><code># 결과 (버전 확인 되면 설치 성공)
mysql  Ver 8.0.31-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))</code></pre><br> 

<h2 id="3-접속">3. 접속</h2>
<h3 id="1-root-유저로-접속">1) root 유저로 접속</h3>
<p><code>mysql.server start</code></p>
<p><code>sudo mysql -u root -p</code></p>
<p><code>[Enter password :</code>  가 나오면 password 입력하면 된다. (생략도 가능, 생략 원할 시 Enter 입력)
<img src="https://velog.velcdn.com/images/hyeri_hello/post/bbddc6a0-5b0d-47ff-9f71-7f878cdea21e/image.png" alt=""></p>
<br>

<h3 id="2-계정-확인-user-목록-확인">2) 계정 확인 (User 목록 확인)</h3>
<ol>
<li>User 목록 확인 
<code>SELECT user, host, plugin FROM user;</code></li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/e549a7ca-35b5-4348-b88a-b50d9927a474/image.png" alt=""></p>
<ol start="2">
<li>계정 추가 (% : 외부 접근 허용)
<code>CREATE USER &#39;[계정명]&#39;@&#39;%&#39; IDENTIFIED BY &#39;[password]&#39;;</code> </li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/b70d7e68-ebf6-4177-91bd-1c437ab7420b/image.png" alt=""></p>
<ol start="3">
<li>권한 부여 
<code>GRANT ALL PRIVILEGES ON *.* TO &#39;ila&#39;@&#39;%&#39; WITH GRANT OPTION;</code></li>
</ol>
<br>

<h3 id="3-databases-추가">3) databases 추가</h3>
<ol>
<li><p>데이터베이스 생성
<code>CREATE DATABASE [데이터베이스 이름]</code></p>
</li>
<li><p>데이터베이스 보기
<code>SHOW DATABASES;</code>
<img src="https://velog.velcdn.com/images/hyeri_hello/post/aa61f1fa-d2b6-4645-95c1-48c2fa05d645/image.png" alt=""></p>
</li>
<li><p>데이터베이스 사용
<code>USE [데이터베이스 이름];</code></p>
</li>
</ol>
<br>

<h2 id="4-클라우드-이용-gcp---외부-ip-사용-시">4. 클라우드 이용 (GCP) - 외부 ip 사용 시</h2>
<h3 id="1-port-할당">1) Port 할당</h3>
<p><a href="https://velog.io/@hyeri_hello/Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-GCP-Google-Cloud-Platform-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC">https://velog.io/@hyeri_hello/Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-GCP-Google-Cloud-Platform-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC</a></p>
<p>위 url 내의 4번 목록 참고해서 3306 port 를 열어줘야 한다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/5b78be02-0b9b-4d8a-9fe8-930130fe549e/image.png" alt=""></p>
<h3 id="2-bind-address-변경">2) bind-address 변경</h3>
<p>port open 후 주소 변경을 해줘야 한다.</p>
<ol>
<li><p>디렉토리 변경
<code>cd /etc/mysql/mysql.conf.d</code> </p>
</li>
<li><p>root 계정으로 mysqld.cnf 파일 열기
<code>sudo vi mysqld.cnf</code> </p>
<br>


</li>
</ol>
<ul>
<li><p><code>i</code> 를 누르면 <code>insert</code> 환경으로 바뀌고  ip <code>127.0.0.1</code> 을 <code>0.0.0.0</code> 로 변경 후 
<code>esc</code> 누르면 저장 전 readonly로 변경된다. 
<img src="https://velog.velcdn.com/images/hyeri_hello/post/29da58d7-5ce4-4456-9af2-d8576a10f36b/image.png" alt=""><img src="https://velog.velcdn.com/images/hyeri_hello/post/a31db7ec-7b64-4d3c-80de-074a152ad6f7/image.png" alt="">
이후 <code>:wq</code> 저장 후 빠져나온다.</p>
</li>
<li><p>변경된 내용 재확인 하려면 <code>cat mysqld.cnf</code>로 열어서 확인한다.<img src="https://velog.velcdn.com/images/hyeri_hello/post/7dc8d389-4daa-40d1-9284-c4c7f80acb82/image.png" alt=""></p>
</li>
<li><p>이후 리스타트 </p>
</li>
</ul>
<p><code>sudo /etc/init.d/mysql restart</code><img src="https://velog.velcdn.com/images/hyeri_hello/post/35e1c8db-2355-4738-8049-beeae9638d1b/image.png" alt=""></p>
<h2 id="5-관리도구-연결-dbeaver">5. 관리도구 연결 (DBeaver)</h2>
<p><a href="https://velog.io/@hyeri_hello/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EB%A6%AC%EB%8F%84%EA%B5%AC-DBeaver-%EC%97%B0%EA%B2%B0">https://velog.io/@hyeri_hello/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EB%A6%AC%EB%8F%84%EA%B5%AC-DBeaver-%EC%97%B0%EA%B2%B0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Mac OS] SSH 접속 방법 (로컬 > 원격) GCP 활용 ]]></title>
            <link>https://velog.io/@hyeri_hello/Mac-OS-SSH-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95-%EB%A1%9C%EC%BB%AC-%EC%9B%90%EA%B2%A9-GCP-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@hyeri_hello/Mac-OS-SSH-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95-%EB%A1%9C%EC%BB%AC-%EC%9B%90%EA%B2%A9-GCP-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Fri, 28 Oct 2022 06:28:31 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<p>Cloud Virtual Machine 을 사용하게 되면 기본적으로 쉘 접속은 클라우드에 로그인 한 후 브라우저에 연결된 쉘로 접속하게 된다. (AWS, GCP)
따라서 클라우드 로그인 없이 로컬 PC의 터미널을 활용해 접속하는 방법 정리했다. </p>
<p><code>ex) Google Cloud Platform</code> 활용 </p>
<h2 id="1-ssh-key-생성">1. SSH Key 생성</h2>
<p><code>SSH</code> 란 Secure Shell, 원격지 호스트 컴퓨터에 접속하기 위해 사용되는 보안 쉘 이다. </p>
<p>로컬 PC에서는 <code>ssh-keygen</code>  을 사용해서 키 를 생성 할 수 있다. 
<code>ip_rsa.pub</code> 디폴트 키로 적용해도 되나 나는 VM용으로 따로 만들었다. (계속 오류가 났음..🥲)
</br></p>
<pre><code># 키 생성 명령어 

ssh-keygen -t rsa -f ~/.ssh/[키 파일 이름] -C [username = GCP계정]</code></pre><ol>
<li><code>ssh-keygen -t rsa -f ~/.ssh/gcp_key -C hyerihello@gmail.com</code></br>

</li>
</ol>
<pre><code># 생성된 키 열어서 확인 명령어 

cat ~/.ssh/[키 파일 이름]</code></pre><ol start="2">
<li><code>cat ~/.ssh/gcp_key.pub</code></li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/60477db0-8998-4681-bdcc-16b0480c0bf6/image.png" alt=""></p>
<p>✅ ** 여기서 잠깐! **</p>
<p>.ssh 폴더를 열어서 확인 하면 이름이 비슷한 2개의 파일을 볼 수 있는데
<code>gcp_key.pub = public key (공개키)</code>
<code>gcp_key = private key (비밀키)</code> 이다.
<br></p>
<pre><code># 숨겨져 있는 폴더 보는 명령어

cd ~/.[폴더명]</code></pre><p><code>cd ~/.ssh</code>
<code>ls -al</code></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/f507010f-44da-4d60-84df-262ab6dce897/image.png" alt=""></p>
<p>원격 연결을 위해서는 public key가 필요하기 때문에 <code>gcp_key.pub</code> 를 사용한다!
<br></p>
<h2 id="2-gcp-원격-서버에-public-key-등록">2. GCP 원격 서버에 Public Key 등록</h2>
<p>로컬 PC에서 생성했던 <code>~/.ssh/gcp_key.pub</code> 내용을 복사 후 
GCP 서버의 <code>~/.ssh/authorized_keys</code> 에 추가해야 한다. </p>
<p>GCP shell 에서 </p>
<ol>
<li><code>vi ~/.ssh/authorized_keys</code>
<code>i</code> 를 입력하면 insert 모드로 수정이 가능하며, 로컬 에서 복사했던 <code>gcp_key.pub</code> 내용을 붙여넣고 
<code>esc</code> 를 누르면 읽기 모드로 다시 변환 된다. 
<code>:wq</code> 를 누르면 수정사항이 저장되고 빠져나온다. (참고, 저장하지 않고 빠져나오려면 <code>:q</code> 사용)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/5569af90-7728-4eee-9a85-ce6f13418f43/image.png" alt=""></p>
<p>잘 저장되었는지 확인한다.</p>
<ol start="2">
<li><code>cat ~/.ssh/authorized_keys</code>
<img src="https://velog.velcdn.com/images/hyeri_hello/post/2a8cab29-29a9-4329-8a60-26d51bbc895e/image.png" alt=""></li>
</ol>
<br>

<h2 id="3-gcp-인스턴스-ssh-key-등록">3. GCP 인스턴스 SSH key 등록</h2>
<p>클라우드 브라우저로 돌아가서 Key를 추가로 등록해줘야한다. 
<code>Compute Engine &gt; 메타데이터 &gt; SSH키 &gt; 수정 또는 항목추가 &gt; gcp_key.pub 입력 &gt; 저장</code> </p>
<p>참고, 나는 등록한 키가 두 개여서 아래와 같이 나오지만 한 개만 등록 할 시 하나만 나온다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/ec740cb8-29ab-4247-b57f-df58ae796efc/image.png" alt=""></p>
<p><a href="https://console.cloud.google.com/compute/metadata?project=solar-semiotics-366106&amp;tab=sshkeys">https://console.cloud.google.com/compute/metadata?project=solar-semiotics-366106&amp;tab=sshkeys</a></p>
<h2 id="4-원격접속">4. 원격접속</h2>
<p>VM인스턴스로 돌아가서 외부 IP 확인한다.
<img src="https://velog.velcdn.com/images/hyeri_hello/post/abd8083f-d717-468c-8d64-1546150b57c6/image.png" alt=""></p>
<p>로컬 PC로 돌아와 shell 에 접속 명령어를 입력한다. </p>
<p><code>ssh -i {로컬pc의 키파일 경로} {VM의 user계정이름}@{VM의 외부 ip}</code>
<code>ssh -i /Users/ila/.ssh/gcp_key hyerihello@34.64.***.***</code></p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/eebc89d6-f089-4c8c-96b7-d6ae48a65b28/image.png" alt=""></p>
<p>연결 성공 ~! 
수고하셨습니다 👍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring 프로젝트 GCP (Google Cloud Platform) 서버 배포 ]]></title>
            <link>https://velog.io/@hyeri_hello/Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-GCP-Google-Cloud-Platform-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC</link>
            <guid>https://velog.io/@hyeri_hello/Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-GCP-Google-Cloud-Platform-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC</guid>
            <pubDate>Thu, 27 Oct 2022 07:07:22 GMT</pubDate>
            <description><![CDATA[<h2 id="1-개요">1. 개요</h2>
<p>Spring boot project 를 클라우드로 배포하는 과정을 정리함</p>
<h2 id="2-vm-인스턴스-생성">2. VM 인스턴스 생성</h2>
<h3 id="1-google-cloud-가입">1) google cloud 가입</h3>
<p>아래의 클라우드 사이트 계정 가입 한다.
처음 가입 시 $300 크레딧 제공</p>
<p><a href="https://cloud.google.com/">https://cloud.google.com/</a> </p>
<h3 id="2-프로젝트-만들기-vm-인스턴스-생성">2) 프로젝트 만들기 (VM 인스턴스 생성)</h3>
<p>GCP는 프로젝트 단위로 리소스/서비스를 관리 함
즉, 프로젝트 생성 후에 프로젝트 내에서 VM 인스턴스를 생성/사용하는 방식이다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/252e9109-ffcd-44f5-92ab-d24b280e41fe/image.png" alt=""></p>
<h4 id="1-이름">(1) 이름</h4>
<p>원하는 인스턴스 이름 사용</p>
<h4 id="2-리전">(2) 리전</h4>
<p>서버의 물리적 위치, 한국 서비스라면 서울로 선택 하면 된다.</p>
<h4 id="3-시리즈">(3) 시리즈</h4>
<p>머신 구성 선택, 
나는 E2, e2-micro 또는 e2-small 정도 사용한다. 
가격과 성능에 따라 선택 하면 된다. (추후 업그레이드 가능)</p>
<h4 id="4-부팅-디스크">(4) 부팅 디스크</h4>
<p>원하는 운영체제 선택,
나는 Ubuntu , 20.4 버전 선택 했다.</p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/59878560-ee3e-4a73-a89f-998815b3e346/image.png" alt=""></p>
<h4 id="5-id-및-api-액세스">(5) ID 및 API 액세스</h4>
<p>액세스 범위 - 모든 Cloud API 대한 전체 액세스 허용 선택
방화벽 - &quot;HTTP&quot;, &quot;HTTPS&quot; 트래픽 모두 선택 </p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/1a541333-8c72-4f0e-9b3b-95070d09cc40/image.png" alt=""></p>
<h4 id="4-만들기">(4) 만들기</h4>
<p>하단의 만들기 선택 후 1분 안쪽으로 기다리면 인스턴스가 생성된다. </p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/83cdb2fc-d3db-4877-adcf-3b6228e1c4e0/image.png" alt=""></p>
<p>외부 IP : 외부 브라우저 등을 통해 접근 가능한 주소 
SSH : 버튼을 클릭하면 해당 인스턴스의 웹 콘솔로 접근 할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/b3f7e037-3c59-44e9-a5ba-0580d70c36a7/image.png" alt=""></p>
<h2 id="3-배포-작업">3. 배포 작업</h2>
<p>Spring boot project가 있다는 가정 하에 시작한다. </p>
<h3 id="1-root-계정-비번-설정-및-이동">1) root 계정 비번 설정 및 이동</h3>
<p><code>sudo passwd</code>
<code>sudo su</code>
<img src="https://velog.velcdn.com/images/hyeri_hello/post/bcd5f806-42d9-4bbe-a7ba-f8a3ec5fc1f9/image.png" alt=""></p>
<h3 id="2-java-설치">2) Java 설치</h3>
<p>모든 기존 패키지가 최신 상태인지 확인
<code>sudo apt update</code></p>
<p>사용가능한 목록 찾기
<code>sudo apt-cache search openjdk</code></p>
<p>OpenJDK17 - JRE, JDK 설치</p>
<p><code>sudo apt-get install openjdk-17-jre</code>
<code>sudo apt-get install openjdk-17-jdk</code></p>
<p>자바 버전이 확인 되면 설치가 완료 된 것! 
<code>java --version</code></p>
<pre><code>root@instance-1:/home/abcd# java --version
openjdk 17.0.4 2022-07-19
OpenJDK Runtime Environment (build 17.0.4+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.4+8-Ubuntu-120.04, mixed mode, sharing</code></pre><h3 id="3-spring-project-jar-파일-만들기">3) Spring project .jar 파일 만들기</h3>
<ul>
<li><p>JAR(Java Archive) 
JAVA 어플리케이션 동작 할 수 있도록 한 자바 프로젝트 압축 파일</p>
</li>
<li><p>STS4 , Gradle 로 jar 파일 만들기 </p>
</li>
</ul>
<p>우측 상단에 돋보기 모양을 클릭한 후 Gradle Tasks를 클릭하면 콘솔창에 Gradle Tasks창이 오픈된다.
<img src="https://velog.velcdn.com/images/hyeri_hello/post/089908cb-25cc-48c1-ae07-d1eb773b7eca/image.png" alt=""></p>
<p>아래의 bootJar를 클릭하면 빌드가 완료 된다. 
<img src="https://velog.velcdn.com/images/hyeri_hello/post/457edd3b-4f4c-41df-bfc7-34161e5f12c3/image.png" alt=""></p>
<p>빌드된 빌드파일은 해당 프로젝트 폴더 내의 <code>build &gt; libs</code> 에 있다. </p>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/2480c5b2-3133-47ee-ac4d-8c6fe23b847f/image.png" alt=""></p>
<h3 id="4-로컬-pc에서-원격-vm-에-이동-jar-파일">4) 로컬 pc에서 원격 VM 에 이동 (.jar 파일)</h3>
<h4 id="ssh-key-생성-및-자세한-연결-내용-아래--참고">&quot; ssh key 생성 및 자세한 연결 내용&quot; 아래  참고</h4>
<blockquote>
<p><a href="https://velog.io/@hyeri_hello/Mac-OS-SSH-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95-%EB%A1%9C%EC%BB%AC-%EC%9B%90%EA%B2%A9-GCP-%ED%99%9C%EC%9A%A9">https://velog.io/@hyeri_hello/Mac-OS-SSH-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95-%EB%A1%9C%EC%BB%AC-%EC%9B%90%EA%B2%A9-GCP-%ED%99%9C%EC%9A%A9</a></p>
</blockquote>
<ul>
<li>VS Code 활용
가장 쉽게 접하는 VS Code IDE를 이용해 이동 시킬 수 있다. </li>
</ul>
<ol>
<li><p>Extensions 에서 <code>Remote - SSH</code> 설치 하면 하단에 <code>Remote Explore</code> 가 보여진다.
<img src="https://velog.velcdn.com/images/hyeri_hello/post/cec695ea-56b8-43f6-871c-b35a13e85587/image.png" alt=""></p>
</li>
<li><p>Remote Explorer 에서 SSH Targets을 선택 후 Add New 클릭 
<img src="https://velog.velcdn.com/images/hyeri_hello/post/f65ab0d1-af95-476c-a124-fb0ac2189d51/image.png" alt=""></p>
</li>
<li><p>ssh 계정이름@외부ip(연결할 ip) 입력 및 톱니바퀴모양 클릭 후 config 파일 수정 
<img src="https://velog.velcdn.com/images/hyeri_hello/post/3894eecb-33f0-4506-a21d-f107e8d953cf/image.png" alt=""><img src="https://velog.velcdn.com/images/hyeri_hello/post/e10ca503-b777-4e42-a7b0-20d65dbfd075/image.png" alt="">
Host : 원하는 이름 
HostName : VM 외부 IP
User : VM User nm
IdentifyFile : 키 파일 경로<img src="https://velog.velcdn.com/images/hyeri_hello/post/d239ca53-3903-47ee-8067-4d4373ab75fe/image.png" alt=""></p>
</li>
<li><p>연결시도 후 연결 성공 ~!
<img src="https://velog.velcdn.com/images/hyeri_hello/post/3877859e-6f68-4788-8824-9d938af8e6ae/image.png" alt=""></p>
</li>
<li><p>.jar 파일 이동 </p>
</li>
</ol>
<p><code>EXPLORER</code> 이동 후  상단 바의 <code>File &gt; OpenFolder</code> 클릭하면 아래와 같이 경로를 설정할 수 있다.
경로 설정 후 원하는 폴더에 <code>.jar</code> 파일을 이동 시킨다. <img src="https://velog.velcdn.com/images/hyeri_hello/post/d3936258-eb51-454a-8453-37a9a0ce9aa7/image.png" alt=""></p>
<ol start="6">
<li>console 창을 열고 실행 명령어를 입력하면 배포가 완료된다.<pre><code># 백그라운드 .jar 파일 배포
</code></pre></li>
</ol>
<p>nohup java -jar [jar파일명].jar</p>
<p>```
<code>nohup java -jar ilaapi-0.0.1-SNAPSHOT.jar</code>
<img src="https://velog.velcdn.com/images/hyeri_hello/post/29a941d7-c1ef-4735-9008-f56a13c0fb44/image.png" alt=""></p>
<p>nohup.out 을 클릭해서 보면 서버가 올라간 것을 알 수 있다~! </p>
<h3 id="5-브라우저-실행">5) 브라우저 실행</h3>
<p><a href="http://34.64.***.***:9090/swagger-ui/index.html">http://34.64.***.***:9090/swagger-ui/index.html</a></p>
<p>설정해 둔 스웨거를 열면 성공~!  </p>
<h2 id="4-url-연결-오류시-참고-사항-외부-접속-포트-설정">4. url 연결 오류시 참고 사항 (외부 접속 포트 설정)</h2>
<p>나는 스프링부트 프로젝트 서버를 9090을 사용하고 있었는데 (기존 작업하던 포트가 80 이어서 계속 죽이기 귀찮았음)</p>
<p>클라우드 VM 사용할때 무조건 Port를 열어줘야 사용이 가능하다. </p>
<p><a href="https://console.cloud.google.com/networking/firewalls/list?project=solar-semiotics-366106">https://console.cloud.google.com/networking/firewalls/list?project=solar-semiotics-366106</a></p>
<p><code>VPC 네트워크 &gt; 방화벽 &gt; 방화벽 규칙만들기</code> 아래와 같이 설정 후 저장을 누른다! 
<img src="https://velog.velcdn.com/images/hyeri_hello/post/ddde4641-4998-4bb2-9341-5889d9ffd012/image.png" alt=""><img src="https://velog.velcdn.com/images/hyeri_hello/post/9180fcf4-2230-4a51-8fef-0ef4e1a84fad/image.png" alt=""></p>
<p>끝! 수고했습니다~! 👻</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java/Spring] Swagger (2) Springdoc 이용]]></title>
            <link>https://velog.io/@hyeri_hello/JavaSpring-Swagger-2-Springdoc-%EC%9D%B4%EC%9A%A9</link>
            <guid>https://velog.io/@hyeri_hello/JavaSpring-Swagger-2-Springdoc-%EC%9D%B4%EC%9A%A9</guid>
            <pubDate>Thu, 20 Oct 2022 05:40:21 GMT</pubDate>
            <description><![CDATA[<p>SpringBoot로 백엔드 개발 시 API 도큐먼트를 위해 swagger를 많이 사용한다. 
예전에는 springfox-swagger를 사용하여 적용하였는데 최근에 많이 사용되는 springdoc을 이용해서 swagger 설정을 해본다. 
참고로 springfox-swagger는 2020년부터 업데이트가 되지 않고 있다.</p>
<blockquote>
<p>Reference 
<a href="https://happy-jjang-a.tistory.com/164">https://happy-jjang-a.tistory.com/164</a></p>
</blockquote>
<h2 id="swagger-ui-실행">Swagger UI 실행</h2>
<h3 id="1-dependencis-추가">1. dependencis 추가</h3>
<ul>
<li>아래 url 참고 </li>
</ul>
<p><a href="https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-ui/1.6.11">https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-ui/1.6.11</a></p>
<pre><code>// https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-ui
    implementation group: &#39;org.springdoc&#39;, name: &#39;springdoc-openapi-ui&#39;, version: &#39;1.6.11&#39;</code></pre><br>

<h3 id="2-url-실행">2. Url 실행</h3>
<pre><code>http://localhost:9090/swagger-ui.html</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Java/Spring] Swagger (1) springfox 이용]]></title>
            <link>https://velog.io/@hyeri_hello/JavaSpring-Swagger</link>
            <guid>https://velog.io/@hyeri_hello/JavaSpring-Swagger</guid>
            <pubDate>Tue, 18 Oct 2022 08:37:15 GMT</pubDate>
            <description><![CDATA[<h2 id="swagger란">Swagger란?</h2>
<p>개발한 REST API를 편리하게 문서화 해주고 이를 통해서 관리 및 제 3의 사용자가 편리하게 API를 호출해보고 테스트 할 수 있는 프로젝트</p>
<p>Spring boot에서는 간단하게 springfox-boot-starter를 gradle dependencis에 추가함으로 사용할 수 있다. </p>
<h2 id="swagger-annotation">Swagger Annotation</h2>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/9fbe574e-7c53-4191-b63c-1d1edcb5638d/image.png" alt=""></p>
<h2 id="swagger-실행">Swagger 실행</h2>
<h3 id="1-dependencis-추가">1. dependencis 추가</h3>
<h4 id="1-아래의-url에서-원하는-버전을-선택해-의존성을-추가-할-수-있다">1) 아래의 url에서 원하는 버전을 선택해 의존성을 추가 할 수 있다</h4>
<p><a href="https://mvnrepository.com/search?q=springfox">https://mvnrepository.com/search?q=springfox</a></p>
<h4 id="2-300-버전-선택-시-springfox-swagger2--springfox-swagger-ui">2) 3.0.0 버전 선택 시 (SpringFox Swagger2 + SpringFox Swagger UI)</h4>
<ul>
<li><p>기존엔 &quot;SpringFox Swagger2 + SpringFox Swagger UI&quot;  두 가지를 추가해서 사용해야 했으나 3.0.0 버전부터는 아래의 SpringFox Boot Starter를 통해 통합해서 이용 할 수 있다.
<img src="https://velog.velcdn.com/images/hyeri_hello/post/5ddba376-50cd-49e0-adf9-0fc770afb979/image.png" alt=""></p>
</li>
<li><p>Gradle 사용 : 아래의 코드를 복사해서 의존성 추가한다.</p>
<pre><code>// https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter
implementation group: &#39;io.springfox&#39;, name: &#39;springfox-boot-starter&#39;, version: &#39;3.0.0&#39;</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyeri_hello/post/a99f7c0c-16a7-4037-b812-510845e0c11a/image.png" alt=""></p>
<ul>
<li>build.gradle 추가 <pre><code>plugins {
  id &#39;org.springframework.boot&#39; version &#39;2.7.4&#39;
  id &#39;io.spring.dependency-management&#39; version &#39;1.0.14.RELEASE&#39;
  id &#39;java&#39;
}
</code></pre></li>
</ul>
<p>group = &#39;com.example.swaggerapi&#39;
version = &#39;0.0.1-SNAPSHOT&#39;
sourceCompatibility = &#39;17&#39;</p>
<p>configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}</p>
<p>repositories {
    mavenCentral()
}</p>
<p>dependencies {
    implementation &#39;org.springframework.boot:spring-boot-starter-web&#39;
    compileOnly &#39;org.projectlombok:lombok&#39;
    annotationProcessor &#39;org.projectlombok:lombok&#39;
    testImplementation &#39;org.springframework.boot:spring-boot-starter-test&#39;
    // <a href="https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter">https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter</a>
    implementation group: &#39;io.springfox&#39;, name: &#39;springfox-boot-starter&#39;, version: &#39;3.0.0&#39;
}</p>
<p>tasks.named(&#39;test&#39;) {
    useJUnitPlatform()
}</p>
<pre><code>
### 2. Controller 
아래와 같이 TestController를 만든 후 SwaggerUi가 연결 되었는지 확인한다.
</code></pre><p>package com.example.swaggerapi.controller;</p>
<p>import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;</p>
<p>import io.swagger.v3.oas.annotations.tags.Tag;</p>
<p>@RestController
@RequestMapping(&quot;/api&quot;)
public class ApiController {</p>
<pre><code>@GetMapping(&quot;/hello&quot;)
public String hello() {
    return &quot;hello ila world&quot;;
}</code></pre><p>}</p>
<pre><code>
### 3. 버전 오류 해결

실행 후 아래와 같이 오류가 난다면 버전 오류 일 수 있다. 

**&quot; Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 
ant_apth_matcher에서 path_pattern_parser로 변경되면서 몇몇 라이브러리(swagger포함)에 오류가 발생한다고 한다.&quot;
**
&gt; 출처: https://skmouse.tistory.com/entry/SpringBoot-Swagger-에러-Failed-to-start-bean-documentationPluginsBootstrapper-nested-exception-is-javalangNullPointerException [SK_MOUSE 개발일기:티스토리]

![](https://velog.velcdn.com/images/hyeri_hello/post/c0bc7481-bf49-4f36-9b91-26f127c33033/image.png)

버전 해결을 위해 application.properties에 아래 문장을 추가한다. </code></pre><p>spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER</p>
<pre><code>![](https://velog.velcdn.com/images/hyeri_hello/post/3b8a552d-81a6-4c8b-b3a3-5d9a556a734c/image.png)


### 4. Swagger UI 접속 

http://localhost:9090/swagger-ui/

위 경로로 접속하면 컨트롤러로 자동 연결 된 것을 확인 할 수 있다. 

![](https://velog.velcdn.com/images/hyeri_hello/post/49c296b9-f0d4-4035-b56c-d3ca4daaf0ba/image.png)

Execute 해보면 실행 된 것도 확인 할 수 있다.

![](https://velog.velcdn.com/images/hyeri_hello/post/9c6e23e4-85a3-47ac-8adb-3e1ee9683181/image.png)
</code></pre>]]></description>
        </item>
    </channel>
</rss>