<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_choi3.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 20 Mar 2024 14:49:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_choi3.log</title>
            <url>https://velog.velcdn.com/images/dev_choi3/profile/d5f7fe08-f882-4da2-91a5-4f81464b66a7/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_choi3.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_choi3" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Hibernate ddl-auto]]></title>
            <link>https://velog.io/@dev_choi3/Hibernate-ddl-auto</link>
            <guid>https://velog.io/@dev_choi3/Hibernate-ddl-auto</guid>
            <pubDate>Wed, 20 Mar 2024 14:49:14 GMT</pubDate>
            <description><![CDATA[<p>Java Spring에서 JPA의 구현체 Hibernate를 사용하게 되면 
resources &gt; applicaton.properties 에 아래 옵션을 추가해주어야 한다.</p>
<pre><code>spring.jpa.hibernate.ddl-auto=none</code></pre><p>ddl-auto 옵션 값으로는 아래의 값들이 존재한다.</p>
<ul>
<li>create</li>
<li>create-drop</li>
<li>update</li>
<li>validate</li>
<li>none</li>
</ul>
<h3 id="create">create</h3>
<ul>
<li>Entity로 등록된 클래스로 매핑된 테이블, 컬럼을 생성해준다. 서버 재실행 시 같은 테이블이 존재한다면 기존의 테이블을 drop하고 새롭게 생성해준다.</li>
</ul>
<h3 id="create-drop">create-drop</h3>
<ul>
<li>create와 같은 옵션을 가지고 있지만, 서버 종료시 기존의 테이블을 drop을 한다.</li>
</ul>
<h3 id="update">update</h3>
<ul>
<li>기존 테이블이 존재하지 않다면 =&gt; 테이블을 생성</li>
<li>기존 테이블이 존재한다면 =&gt; 기존 테이블 컬럼의 속성(nullable, 크기, 데이터 타입 등)은 변경하지 않고, 새롭게 추가되는 column만 추가한다.</li>
</ul>
<h3 id="validate">validate</h3>
<ul>
<li><p>기존의 테이블을 생성하거나 변경하지 않고, 서버 시작 시 Entity DDL을 작성하여 기존의 테이블을 검사를 진행한다.</p>
</li>
<li><p>Entity 클래스의 컬럼과 매핑되는 테이블에 존재만 한다면, 테이블에 컬럼이 더 많아도 상관X</p>
</li>
<li><p>테이블이 존재하지 않거나, 테이블에 엔티티 필드에 매핑되는 컬럼이 존재하지 않는다면 예외를 발생시키고 서버를 종료한다.</p>
</li>
</ul>
<h3 id="none">none</h3>
<ul>
<li>위의 4가지 경우를 제외한 모든 경우에 해당한다.</li>
<li>스프링부트의 경우에는 none이라고 명시하거나 아예 ddl-auto 속성을 명시하지 않아야 한다. 이 경우에는 아무 일도 일어나지 않는다.</li>
</ul>
<h3 id="주의-신경써야-한다">주의) 신경써야 한다.</h3>
<ul>
<li>개발 초기, 로컬 : create 또는 update</li>
<li>테스트 서버 : update 또는 validate</li>
<li>스테이징 및 운영 서버 : validate 또는 none</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Intellij] spring server Restart & Live load ]]></title>
            <link>https://velog.io/@dev_choi3/Intellij-spring-server-Restart-Live-load</link>
            <guid>https://velog.io/@dev_choi3/Intellij-spring-server-Restart-Live-load</guid>
            <pubDate>Tue, 12 Mar 2024 12:14:43 GMT</pubDate>
            <description><![CDATA[<h3 id="수동-재시작">수동 재시작</h3>
<p>개발을 하다보면 변경사항 추가 후 서버를 재시작을 수동으로 계속 해야하기 때문에 
java file 변경시 auto compile 과 html, javascript, css 변경 시 변경사항을 바로 확인할 수 있는 Live load 라이브러리를 추가하고자 한다.</p>
<h3 id="1-ide-auto-compile-setting">1. IDE auto compile setting</h3>
<p>IDE setting &gt; Advenced Settings &gt; Allow auto-make to start even if developed application is currently running 항목을 체크</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/4645f98b-f63d-40b6-9660-eac73a43add1/image.png" alt=""></p>
<p>IDE setting &gt; Compiler &gt; Build project automatically 항목 체크</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/12884870-6f78-4fa9-81ae-bf169dd1ccca/image.png" alt=""></p>
<h3 id="2-buildgradle">2. build.gradle</h3>
<pre><code>developmentOnly &quot;org.springframework.boot:spring-boot-devtools&quot;</code></pre><p>devtools 라이브러리 의존성 추가</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/77586a3b-a759-4d4b-ab17-855ccb4720c9/image.png" alt=""></p>
<h3 id="3-applicationproperties">3. application.properties</h3>
<p>project &gt; src &gt; main &gt; resources &gt; application.properties 에 아래의 속성을 추가</p>
<pre><code>spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true</code></pre><p><img src="https://velog.velcdn.com/images/dev_choi3/post/a3f903da-83ee-41b3-9569-8b90c21bae7e/image.png" alt=""></p>
<h3 id="4-chrome-확장-프로그램-추가">4. chrome 확장 프로그램 추가</h3>
<p>chrome의 웹 스토어에 들어가 LiveReload++ 를 검색하여 설치 후 활성화</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/7ecc8e32-8bd5-4ec6-a139-9978e9fbce5a/image.png" alt=""></p>
<p>이후 브라우저에서 동그란 모양에 체크표시가 없을테니 눌러서 체크</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/915888fb-3719-40f9-ade8-42f7b70d5b06/image.png" alt=""></p>
<p>모두 완료되었다면 html, javascript, css 변경을 해보고 Live Reload 가 재대로 작동하는지 확인
java 파일을 변경 후 몇 초뒤 자동으로 컴파일이 되니 확인해 보면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Spring Project build 를 진행해보자]]></title>
            <link>https://velog.io/@dev_choi3/Java-Spring-Project-build-%EB%A5%BC-%EC%A7%84%ED%96%89%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@dev_choi3/Java-Spring-Project-build-%EB%A5%BC-%EC%A7%84%ED%96%89%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Tue, 12 Mar 2024 11:34:30 GMT</pubDate>
            <description><![CDATA[<p>우선은 터미널로 가서 pc에 설치되어 있는 java 버전을 확인하자</p>
<pre><code>java -version</code></pre><p><img src="https://velog.velcdn.com/images/dev_choi3/post/6c81974a-6521-454e-8aef-927be8281492/image.png" alt=""></p>
<p>설치되어 있는 java 버전과 build 하려는 프로젝트의 java 버전이 호환되어야 한다.</p>
<p>이후 프로젝트의 경로로 이동</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/ac19bb97-e3e8-41da-8759-3e0555dc4b12/image.png" alt=""></p>
<pre><code>./gradlew build</code></pre><p>를 하여 프로젝트를 빌드한다. 빌드가 잘 실행되었다면 아래처럼 BUILD SUCCESSFUL 이라 뜰것이다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/ef2082bf-527c-4ff3-ac44-e664e1848de3/image.png" alt=""></p>
<p>그리고 다시 디렉토리를 확인해보면 build 폴더가 생성된 것을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/d65f9cdf-77cf-471b-b1a4-3de14e363dcc/image.png" alt=""></p>
<p>build &gt; libs 로 이동 이후 디렉토리 확인</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/9e6de8cc-d6a5-47e6-aaa6-58a63341efc2/image.png" alt=""></p>
<pre><code>java -jar hello-spring-0.0.1-SNAPSHOT.jar</code></pre><p>을 실행시켜보면 아래 그림처럼 빌드한 프로젝트가 실행됨을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/940910fd-f547-47e6-a609-59342765667f/image.png" alt=""></p>
<h3 id="error">Error</h3>
<p>혹시라도 IDE에서 8080포트 이용하여 웹 서버를 실행중이라면 아래처럼 8080포트를 이미 사용중이라고 Fail이 되니 IDE에 실행한 서버를 종료 후 다시 시작</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/db5f78e3-9686-4612-a7e2-41101c9adadf/image.png" alt=""></p>
<p>아래 그림처럼 이러한 에러가 발생한다면 pc에 설치된 java 버전과 프로젝트 java 버전을 맞추고 다시 진행</p>
<p>Exception in thread &quot;main&quot; java.lang.UnsupportedClassVersionError: hello/hellospring/HelloSpringApplication has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/b6e1c4bd-eef6-46ef-8560-21dd577b405c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Spring 시작하기]]></title>
            <link>https://velog.io/@dev_choi3/Java-Spring-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev_choi3/Java-Spring-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 12 Mar 2024 11:02:55 GMT</pubDate>
            <description><![CDATA[<p>인프런에 김영한님의 java spring 입문편 강의를 보는 중...</p>
<ul>
<li>개발환경
os : MAC OS m2
jvaa : java21
IDE : IntelliJ CE</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/2ce10ef6-913b-45a0-a494-0ee7d02de1ac/image.png" alt=""></p>
<p>spring 으로 프로젝트를 시작할 때 아래의 사이트에서 spring 프로젝트의 기본 설정을 세팅을 시작한다.</p>
<p><a href="https://start.spring.io/">https://start.spring.io/</a> </p>
<p>자신이 설정하고자 하는 프로젝트 세팅을 선택하여 진행</p>
<h3 id="project">Project</h3>
<p>프로젝트의 버전관리는 무엇으로 진행할 것인가 예전에는 Maven으로 했다고 하는데 요즘은 Gradle로 버전 관리를 한다고 한다. 그래서 Gradle-Groovy 선택</p>
<h3 id="language">Language</h3>
<p>언어는 당연히 Java를 사용하니 Java</p>
<h3 id="spring-boot">Spring Boot</h3>
<p>SNAPSHOT 의 경우 현재 개발 진행중인 버전이니 패스하고 release 버전으로 진행 </p>
<h3 id="project-metadata">Project Metadata</h3>
<ul>
<li><p>Group, Artifact : 본인이 하고싶은 naming으로 작성</p>
</li>
<li><p>Packaging : Jar, War 중 필요한것으로 선택</p>
</li>
<li><p>Java : 버전은 본인이 필요한 버전을 선택 </p>
</li>
</ul>
<h3 id="dependencies">Dependencies</h3>
<p>만들고자하는 프로젝트에 필요한 의존성 라이브러리를 추가한다.
오랜만에 java spring을 다시하는데 너무 편해졌네요..</p>
<p>기본적으로 웹 서버를 만들거니 ADD DEPENDENCIES 를 눌러</p>
<ul>
<li>Spring Web 추가</li>
<li>Thymeleaf 추가</li>
</ul>
<p>GENERATE 하여 파일을 다운 받는다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/5b6aa651-2f5a-4112-ba45-3d98e6326dfa/image.png" alt=""></p>
<p>다운받은 zip 파일을 열고 IDE에서 File &gt; Open &gt; 해당 폴더를 연다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/9add3634-0450-445c-a4f6-be281fcbdce7/image.png" alt=""></p>
<p>우선 프로젝트를 실행 해본다.
실행은 잘 되고</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/0ed3ca1d-fb84-4ce6-b964-a7f1bdad4103/image.png" alt=""></p>
<p>현재 페이지가 없으니 이렇게 뜨는게 맞다고한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/7d440286-9d3e-4b3e-bcdb-071bce598238/image.png" alt=""></p>
<p>일단 src &gt; main &gt; resources &gt; static &gt; index.html 정적 페이지를 생성하여 &quot;Hello Spring&quot;을 확인해 보면 된다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/f0dd3493-0564-47d9-8387-082dffd8526e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/72531347-a09a-499f-b91d-e5dbd020415f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java 기초 개념]]></title>
            <link>https://velog.io/@dev_choi3/Class-Object-instance</link>
            <guid>https://velog.io/@dev_choi3/Class-Object-instance</guid>
            <pubDate>Sun, 10 Mar 2024 15:35:55 GMT</pubDate>
            <description><![CDATA[<h3 id="class">Class</h3>
<ul>
<li>클래스는 객체를 생성하기 위한 틀 또는 설계도로 생각할 수 있다.</li>
<li>속성(변수), 기능(메서드)를 정의할 수 있다.</li>
</ul>
<h3 id="object">Object</h3>
<ul>
<li>객체는 클래스에서 정의한 속성과 기능을 가진 실체이다.</li>
<li>객체 자체는 독립적인 상태를 가진다.</li>
</ul>
<h3 id="instance">Instance</h3>
<ul>
<li>클래스로부터 생성된 객체를 의미한다.</li>
<li>객체와 인스턴스라는 용어는 자주 혼용되지만 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다. </li>
</ul>
<h3 id="기본형-primitive-type">기본형 (Primitive Type)</h3>
<ul>
<li>int, long, double, boolean 이 있다.</li>
<li>단순히 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라 부른다.</li>
</ul>
<h3 id="참조형-refernce-type">참조형 (Refernce Type)</h3>
<ul>
<li>데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형 이라고 한다. </li>
</ul>
<h3 id="대원칙">대원칙</h3>
<ul>
<li>자바는 항상 변수의 값을 복사해서 대입한다.
변수에 값을 대입하는 것은 변수에 들어있는 값을 복사해서 대입하는 것이다.
기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해 대입하고, 참조형이면 변수에 들어있는 참조값을 복사해 대입한다.</li>
</ul>
<h3 id="생성자-constructor">생성자 (Constructor)</h3>
<ul>
<li>매개변수가 없는 생성자를 기본 생성자라고 한다.</li>
<li>클래스에 생성자가 하나도 없으면 자바 컴파일러는 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 생성해준다.</li>
<li>초기 값을 매개변수로 받아 객체에 초기값을 설정 후 객체를 생성할 수 있다.</li>
</ul>
<h3 id="this">this</h3>
<ul>
<li><p>생성자에서 사용되며 생성자의 매개변수와 클래스 맴버변수의 이름이 같을 경우 클래스 맴버변수를 가르킨다.</p>
</li>
<li><p>클래스 내에 생성자가 여러개가 있을 경우 자기 자신의 생성자를 가르킨다.</p>
<pre><code>public class Test {
  String name;
  int age;

  Test(String name) {
      // 아래의 생성자를 가르키는 this
      this(name, 10);
  }

  Test(String name, int age) {
      // 여기 this 는 맴버변수 name, age를 가르킨다
      this.name = name;
      this.age = age;
  }
}</code></pre></li>
</ul>
<h3 id="오버로딩">오버로딩</h3>
<ul>
<li><p>오버로딩(Overloading)이라는 뜻은 사전적으로 &#39;과적하다.&#39;라는 뜻이다</p>
</li>
<li><p>같은 메서드 명으로 되어 있고, 매개변수의 타입이나 갯수가 달라야 하는 규칙을 가지고 있다.</p>
<h4 id="장점">장점</h4>
</li>
<li><p>같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.</p>
</li>
<li><p>메서드 명을 절약할 수 있다.</p>
<pre><code>public class Overloading {
  public static void main(String[] args) {
      print();
      print(1);
      System.out.println(print(2, 3));
  }

  private static void print() {
      System.out.println(&quot;printMethod&quot;);
  }

  private static void print(int a) {
      System.out.println(&quot;printMethod&quot; + a);
  }

  private static int print(int b, int c) {
      return b + c;
  }
}
</code></pre></li>
</ul>
<p>// 출력
printMethod
printMethod1
5</p>
<pre><code>
### 오버라이딩(Overriding)
- 부모 클래스 또는 인터페이스에서 정의한 메소드를 상속받는 자식 클래스는 부모 클래스 또는 인터페이스에 정의된 메소드를 무조건 재정의하여 사용해야하는 규칙을 가지고 있다.
- 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다. </code></pre><p>// 부모 클래스
public class ParentClass {
    void method1() {
        System.out.println(&quot;parent.method1&quot;);
    }
    void method2(int number) {
        System.out.println(&quot;parent.method2&quot;);
    }
}</p>
<p>// 자식 클래스
public class ChildClass extends ParentClass {
    @Override
    void method1() {
        System.out.println(&quot;Child.method1&quot;);
    }</p>
<pre><code>@Override
void method2(int number) {
    System.out.println(&quot;Child.method&quot; + number);
}</code></pre><p>}</p>
<p>// 
public class OverrideMain {
    public static void main(String[] args) {
        ChildClass child = new ChildClass();</p>
<pre><code>    child.method1();
    child.method2(2);
}</code></pre><p>}</p>
<p>// 출력
Child.method1
Child.method2</p>
<pre><code>
### 접근 제어자
- `private` : 모든 외부 호출을 막는다.
- `default` (package-private): 같은 패키지안에서 호출은 허용한다.
- `protected` : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다. 
- `public` : 모든 외부 호출을 허용한다.
- 접근 제어자의 핵심은 속성과 기능을 외부로부터 숨기는 것이다.
- 클래스 레벨에서는 `public` , `default` 만 사용할 수 있다. `private` , `protected` 는 사용할 수 없다.
- 하나의 자바 파일에 `public` 클래스는 하나만 등장할 수 있다.
- 하나의 자바 파일에 `default` 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.

### 캡슐화
- 캡슐화는 데이터와 해당 데이터를 처리하 는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다.
- 캡슐화를 통해 데이터의 직접적인 변경을 방지하 거나 제한할 수 있다.
- 속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다.

### 상속
- 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해 준다
- 이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받는 것이다. 
- 상속을 사용하려면 `extends` 키워드를 사용 하면 된다. 그리고 `extends` 대상은 하나만 선택할 수 있다.
- 부모 클래스 (슈퍼 클래스): 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
- 자식 클래스 (서브 클래스): 부모 클래스로부터 필드와 메서드를 상속받는 클래스

### Super
- 부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면, 자식에서 부모의 필드나 메서드를 호출할 수 없다.
- `super` 키워드를 사용하면 부모를 참조할 수 있다. `super` 는 이름 그대로 부모 클래스에 대한 참조를 나타낸다.

### Super 생성자
- 상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 한다.

### final (상수 - Constant)
- 변수에 `final` 키워드가 붙으면 더는 값을 변경할 수 없다.
- 대문자를 사용하며, 구분은 _ 언더스코어 구분한다.
ex) public static final int MAX_NUMBER = 10;

### 다형성
- 다형성(Polymorphism)은 이름 그대로 &quot;다양한 형태&quot;, &quot;여러 형태&quot;를 를 뜻한다.
- 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다. 
- 객체는 하나의 타입으로 고정되어 있다. 그런데 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있다

### 추상 클래스 (abstract class)
- 부모 클래스는 메서드를 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라 한다.
- 추상적인 개념을 제공하는 클래스이다.
- 상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.</code></pre><p>// 추상 클래스
public abstract class AbstractClass {
    public abstract void method1();</p>
<pre><code>public void method2() {
    System.out.println(&quot;Abstract.method2&quot;);
}</code></pre><p>}</p>
<p>// 상속받은 자식 클래스 
public class AbstractChildClass extends AbstractClass {
    @Override
    public void method1() {
        System.out.println(&quot;AbstractChildMethod1&quot;);
    }</p>
<pre><code>@Override
public void method2() {
    System.out.println(&quot;AbstractChildMehotd2&quot;);
}</code></pre><p>}</p>
<p>// main 
public class AbstractMain {
    public static void main(String[] args) {
        AbstractClass test = new AbstractChildClass();</p>
<pre><code>    test.method1();
    test.method2();
}</code></pre><p>}</p>
<p>// 출력
AbstractChildMethod1
AbstractChildMehotd2</p>
<pre><code>
### Interface
- 모든 메서드가 추상 메서드인 순수 추상 클래스는 코드를 실행할 바디 부분이 전혀 없다.
- 인스턴스를 생성할 수 없다.
- 상속시 자식은 모든 메서드를 오버라이딩 해야 한다.
- 주로 다형성을 위해 사용된다.
-  멤버 변수는 `public` , `static` , `final` 이 모두 포함되었다고 간주된다.
- 인터페이스의 경우는 상속받을 시 `implements` 을 사용하며, 여러개를 상속 받을 수 있다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[객체 지향 프로그래밍]]></title>
            <link>https://velog.io/@dev_choi3/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@dev_choi3/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Sun, 10 Mar 2024 15:22:19 GMT</pubDate>
            <description><![CDATA[<p>객체 지향 프로그래밍과 절차 지향 프로그래밍은 서로 대치되는 개념이 아닌 
어디에 초점을 두느냐에 따라 차이가 있다.</p>
<h3 id="절차-지향">절차 지향</h3>
<ul>
<li>실행 순서를 중요시 하는 방식</li>
<li>프로그램의 흐름을 순차적으로 따르고 처리하는 방식, 즉 &quot;어떻게&quot;를 중심으로 프로그래밍을 한다.</li>
<li>데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다.</li>
</ul>
<h3 id="객체-지향">객체 지향</h3>
<ul>
<li>객체를 중요하게 생각하는 방식</li>
<li>현실의 사물 또는 사건을 객체로 보고, 객체들 간의 상호작용을 중심으로 프로그래밍 하는 방식 &quot;무엇을&quot; 중심으로 프로그래밍 한다.</li>
<li>객체 지향에서는 데이터와 데이터에 대한 행동(메서드)이 하나의 &quot;객체&quot; 안에 포함되어 있다.</li>
</ul>
<h2 id="객체란-무엇인가">객체란 무엇인가?</h2>
<p>모든 사물을 단순하게 추상화해보면 속성(데이터)과 기능 2가지로 설명할 수 있다.</p>
<p>ex) 자동차</p>
<ul>
<li>속성 : 차량 색상, 현재 속도, 문 갯수 등</li>
<li>기능 : 엑셀, 브레이크, 문 열기,닫기 , 와이퍼</li>
</ul>
<p>동물</p>
<ul>
<li>속성 : 색상, 키, 온도</li>
<li>기능 : 먹는다, 걷는다</li>
</ul>
<p>게임 캐릭터</p>
<ul>
<li>속성 : 레벨, 경험치, 아이템</li>
<li>기능 : 이동, 공격, 아이템 획득</li>
</ul>
<p>모든 사물을 속성과 기능을 가진 객체로 생각하는 것이다. 객체는 속성과 기능만 존재한다. 단순화하면 세상에 있는 객체들을 컴퓨터 프로그램으로 쉽게 설계할 수 있다.
<img src="https://velog.velcdn.com/images/dev_choi3/post/5ab9c10e-770c-4fc8-bce6-d6b11a31cabe/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker buildx 사용기]]></title>
            <link>https://velog.io/@dev_choi3/docker-buildx-%EC%82%AC%EC%9A%A9%EA%B8%B0</link>
            <guid>https://velog.io/@dev_choi3/docker-buildx-%EC%82%AC%EC%9A%A9%EA%B8%B0</guid>
            <pubDate>Thu, 29 Feb 2024 18:45:00 GMT</pubDate>
            <description><![CDATA[<p>Google Cloud Platform 을 사용하여 E2서버를 Ubuntu x86/64, amd64    로 생성
<img src="https://velog.velcdn.com/images/dev_choi3/post/b730adb5-fa32-48a5-bfd7-03479ba45564/image.png" alt=""></p>
<p>Ubuntu docker 세팅, Ubuntu 세팅은 Docs를 참고 <a href="https://docs.docker.com/engine/install/ubuntu/">https://docs.docker.com/engine/install/ubuntu/</a> </p>
<p>세팅 이후 docker image를 pull 받고 컨테이너를 실행하는데</p>
<pre><code>WARNING: The requested image&#39;s platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested</code></pre><p><img src="https://velog.velcdn.com/images/dev_choi3/post/bb16e74b-0354-4a68-aaad-0492886a0398/image.png" alt=""></p>
<p>검색해보니 buildx 라는 docker build 시에 multi-platform 으로 원하는 환경으로 빌드할 수 있게 도와주는 녀석이 있었다.</p>
<pre><code>docker buildx</code></pre><p>일단 무작정 cli를 입력해봄
<img src="https://velog.velcdn.com/images/dev_choi3/post/847cdf84-e1a7-483c-852c-2ed02a0fab24/image.png" alt=""></p>
<p>위 문제는 ~/.docker/config.json 에 아래 항목을 추가하여 buildx를 활성화 시킨다.</p>
<pre><code>&quot;experimental&quot;: &quot;enabled&quot;</code></pre><p>다시 docker buildx 하면 아래처럼 buildx가 활성화된 것을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/4e9ccb32-2293-4e6c-b0e8-f3e59b07b587/image.png" alt=""></p>
<p>buildx가 활성화가 되었으니 어떻게 사용할지는 Docs를 참고하자
<a href="https://docs.docker.com/reference/cli/docker/buildx/create/">https://docs.docker.com/reference/cli/docker/buildx/create/</a> </p>
<pre><code>docker buildx ls</code></pre><p>현재 buildx 에 실행되고 있는 list를 확인하니 default와 desktop-linux가 보인다..</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/ea87d672-1958-49db-8573-538aeb6edd95/image.png" alt=""></p>
<p>된건가..? 하고 일단은 기존의 이미지를 buildx를 사용하여 다시 build</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/e8ceb5f1-4835-4afa-81dd-120025acc844/image.png" alt=""></p>
<p>그냥 buildx create를 사용해 만들어서 사용해보자</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/cd379384-a878-4b8a-a870-f040ce426bd1/image.png" alt=""></p>
<p>방금 생성한 linux 라는 이름으로 Endpoint가 desktop-linux로 잡혀있고 inactive 되어있다. 
이후 build 성공</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/887a22da-c5e5-478d-9dd5-498385960c04/image.png" alt=""></p>
<p>docker Hub에서 image를 확인해보면 linux/amd64, linux/arm64 플랫폼을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/a1ca3820-7343-463a-89c7-bbb768ce3bfc/image.png" alt=""></p>
<p>그리고 GCP E2 서버로가서 방금 업로드한 image를 pull 해보면
새로받은 image는 latest 최신버전으로 되어있고, 이전 image는 none으로 변경되어 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/20d51b0d-d97b-4a69-820d-d0cad10996b8/image.png" alt=""></p>
<p>컨테이너 실행 -완-</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/5c41dad4-aa56-4baa-869c-deef7f907537/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker image 생성하기]]></title>
            <link>https://velog.io/@dev_choi3/docker-image-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev_choi3/docker-image-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 Feb 2024 18:00:03 GMT</pubDate>
            <description><![CDATA[<p>vsc 에서 docker image를 생성해보는 예제를 진행하자</p>
<h2 id="vsc-docker-extension-install">[VSC docker extension install]</h2>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/b51ed927-87fd-473e-b816-0c0b447ce8fa/image.png" alt=""></p>
<h2 id="sample-프로젝트-생성">[sample 프로젝트 생성]</h2>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/665f5816-7f28-48fc-b9f6-73b044d668df/image.png" alt=""></p>
<h2 id="dockerfile-생성">[Dockerfile 생성]</h2>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/bc911785-23bf-4c1f-92e8-1e49e7278713/image.png" alt=""></p>
<p>From node:16-alpine  </p>
<ul>
<li>node:16(node 16버전을 사용)-alpine(작은 단위의 리눅스)</li>
<li>node 에서 이미 만들어놓은 base Image를 사용</li>
</ul>
<p>WORKDIR /app</p>
<ul>
<li>리눅스의 cd와 같은 기능 </li>
<li>app 디렉토리로 이동</li>
</ul>
<p>COPY package.json package-lock.json ./</p>
<ul>
<li>package.json 과 package-lock.json 을 app 디렉토리로 복사</li>
</ul>
<p>RUN npm ci</p>
<ul>
<li>RUN npm install의 경우 최신버전의 설치하기 때문에 ci를 이용하여 현재 package.json의 버전을 그대로 설치하기 위함</li>
</ul>
<p>COPY index.js ./</p>
<ul>
<li>index.js를 app 디렉토리로 복사</li>
</ul>
<p>ENTRYPOINT [ &quot;node&quot;,&quot;index.js&quot; ]</p>
<ul>
<li>실행시킬 script를 배열로 차례대로 입력</li>
</ul>
<p>위의 명령어들은 layer로 구성되어 있는데 위에서부터 layer 0 ~ layer 5 으로 구성된다.
기존의 docker image 변경시 변경되지 않은 명령어는 캐싱하여 사용하고 변경된 layer 만 update 하기때문에 docker image를 빠르게 생성할 수 있다.</p>
<h2 id="build">[build]</h2>
<p>docker build -f Dockerfile -t dockersample .</p>
<ul>
<li>-f (file) [PATH/docker file name]</li>
<li>-t (tag) [docker image name]</li>
<li>. (build context) 현재 경로</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/0a660681-2578-437e-b017-457e2d0e3f7e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/5d8393f9-1e66-459d-90fe-dfcd91ea337f/image.png" alt=""></p>
<p>Docker image가 생성된것을 확인할 수 있다.</p>
<h2 id="run">[run]</h2>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/0b166132-41d9-4246-8093-9fbc275185e9/image.png" alt=""></p>
<p>docker run -p 80:3000 --name dockerSample -d dockersample</p>
<ul>
<li>-p 80(host port):3000(guest port)로 host와 guest는 독립적인 port를 가지고 있기 때문에 host port 와 guest port를 연결시켜줘야 한다.</li>
<li>--name dockerSample 컨테이너 이름을 지정한다.</li>
<li>-d detached(백그라운드)로 실행한다.</li>
<li>dockersample 위에서 생성한 docker image를 실행한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/f61272d1-8917-4904-b42a-e6f820487c93/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/8d5b8433-ed3d-4711-9067-b360ebf31aa0/image.png" alt=""></p>
<p>서버가 실행되고 있는것을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/22e1953c-a530-4b1b-99fa-07430dda8d47/image.png" alt=""></p>
<p>docker logs dockerSample 로 해당 서버의 로그를 확인할 수 있다.</p>
<h2 id="docker-image-배포">[docker image 배포]</h2>
<p>Docker hub로 들어가서 Repository를 생성한다.
<a href="https://hub.docker.com/">https://hub.docker.com/</a> 
<img src="https://velog.velcdn.com/images/dev_choi3/post/b1bf09a1-f9fe-41c6-865d-576a46b1edad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/c922073e-8717-4a35-b083-fac40ba2e0b1/image.png" alt=""></p>
<p>docker image를 push 하기 위해서는 위 그림의 빨간박스처럼 docker image 이름을 매칭 시켜줘야 한다.</p>
<p>docker tag dockersample [yourId/repositoryName]:tagname</p>
<ul>
<li>docker image 명을 변경한다.
<img src="https://velog.velcdn.com/images/dev_choi3/post/a0e62cd7-1a8b-42b3-a272-89d1daf2ba91/image.png" alt=""></li>
</ul>
<p>docker push [yourId/repositoryName]:tagname</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/985e5534-8fcb-4241-9abe-55aadebe1ead/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/df5b0137-5e24-47fa-b2e0-add05c4d3029/image.png" alt=""></p>
<p>docker Hub에 생성했던 Repository에 docker image가 업로드된 것을 확인할 수 있다.</p>
<p>참조 : <a href="https://docs.docker.com/reference/dockerfile/">https://docs.docker.com/reference/dockerfile/</a></p>
<p>출처 : <a href="https://www.youtube.com/watch?v=LXJhA3VWXFA&amp;t=2s">https://www.youtube.com/watch?v=LXJhA3VWXFA&amp;t=2s</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker 설치]]></title>
            <link>https://velog.io/@dev_choi3/docker-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dev_choi3/docker-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Wed, 28 Feb 2024 16:05:37 GMT</pubDate>
            <description><![CDATA[<p>[docker 설치]
자신의 OS에 맞는 Docker Desktop를 설치하자. 
docker는 CLI로 사용할 수도 있지만 GUI로 구성된 플랫폼을 사용할 수 있다.
<a href="https://docs.docker.com/desktop/">https://docs.docker.com/desktop/</a> </p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/2f01460d-990b-4ae7-8aea-a2668e5efefc/image.png" alt=""></p>
<p>그리고 CLI 에서는 docker -v 로 docker가 재대로 설치되어 있는지 확인하자.
<img src="https://velog.velcdn.com/images/dev_choi3/post/e80838a0-0d5c-48f3-a179-f3ecb17d296e/image.png" alt=""></p>
<p>docker images : docker image의 리스트를 확인할 수 있다.
<img src="https://velog.velcdn.com/images/dev_choi3/post/9100aee3-5f07-4d86-b642-8f234c84c7d8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/f1e37911-71fc-4f0b-945d-747c22d262ad/image.png" alt=""></p>
<p>docker ps : 현재 실행되고 있는 컨테이너의 목록을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/dev_choi3/post/e99141e8-4a8a-4512-9561-9eb4c5a502b2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/4e7d5224-7122-4e0c-85c5-9882c3f895bd/image.png" alt=""></p>
<p>docker ps -a : 컨테이너의 모든 리스트를 확인할 수 있다.
<img src="https://velog.velcdn.com/images/dev_choi3/post/4ca7c074-88cb-4300-a6e6-4e4fd41b17b2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/dcdbff48-74d6-4d0d-9556-8e5f09371b02/image.png" alt=""></p>
<p>docker Docs : <a href="https://docs.docker.com/reference/">https://docs.docker.com/reference/</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker를 시작하기 전]]></title>
            <link>https://velog.io/@dev_choi3/Docker%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EC%A0%84</link>
            <guid>https://velog.io/@dev_choi3/Docker%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EC%A0%84</guid>
            <pubDate>Wed, 28 Feb 2024 14:48:58 GMT</pubDate>
            <description><![CDATA[<h1 id="docker의-배경">[Docker의 배경]</h1>
<p>Docker는 dotCloud기업의 내부 프로젝트로 솔로몬 하익스(Solomon Hykes)과 그의 팀에서 시작되어 2013년 오픈소스로 출시되었다.
당시에 클라우드 환경에서 애플리케이션을 배포하하는 일에 어려움이 있고, 관리하는 서버가 많아질수록 서버 관리에도 많은 리소스를 필요로 했다고 한다. 그리고 가상화 기술을 사용하더라도 많은 리소스를 필요로 하기에 이 문제들을 해결하기 위해서 기존 방식의 가상화 방식 OS를 전체를 가상화하는 대신 애플리케이션과 해당 종속성을 묶어 가상화하는 컨테이너로 LXC(LinuX Containers) 기반으로 개발하게 되었다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_choi3/post/cbaaa71e-1d0c-4d38-88b2-c4518423b913/image.png" alt=""></p>
<p>출처 : <a href="https://www.atlassian.com/microservices/cloud-computing/containers-vs-vms">https://www.atlassian.com/microservices/cloud-computing/containers-vs-vms</a></p>
<p>위에 그림처럼 Host OS에 여러개의 Guest OS가 올라갈 경우 Host의 cpu, memory등 물리적 리소스를 할당하기에 구성환경 자체가 무거워져 성능저하의 단점이 발생한다.
하지만 컨테이너의 경우 container Engine (docker 이외에도 LXD, LXC, OpenVZ)에 OS를 제외한 경량화된 컨테이너를 올려 필요한 만큼의 리소스를 할당하여 성능저하의 단점을 해결하고, 여러개의 프로그램을 설치해도 독립된 컨테이너이기 때문에 충돌로 인한 문제도 해결된다. 그리고 다른 서버로 옮기더라도 컨테이너의 환경이 유지되고, 일관성있는 환경을 사용할 수 있다.</p>
<h2 id="dockerdocker-image-container-docker-hub">[Docker,Docker Image, Container, Docker Hub]</h2>
<p>Docker</p>
<ul>
<li>컨테이너를 사용자가 쉽게 생성, 테스트, 배포할 수 있게 도와주는 소프트웨어 플랫폼</li>
</ul>
<p>Docker Image</p>
<ul>
<li>application, Bins, Libs 등 개발환경을 묶어 빌드하여 하나의 File을 생성한 것</li>
</ul>
<p>Container</p>
<ul>
<li>docker를 사용하여 docker image를 실행시켜 File에 묶여있는 개발환경으로 컨테이너 서버가 실행 됨</li>
</ul>
<p>Docker Hub</p>
<ul>
<li>본인의 Repository를 생성하여 로컬환경에서 생성한 docker image를 push하여 관리할 수 있는 저장소이며, 다른 유저들과 docker image를 공유할 수 있다.
<a href="https://hub.docker.com/">https://hub.docker.com/</a> 를 확인</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>