<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>moon-tree.log</title>
        <link>https://velog.io/</link>
        <description>Backend Developer </description>
        <lastBuildDate>Tue, 01 Aug 2023 10:07:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>moon-tree.log</title>
            <url>https://velog.velcdn.com/images/moon-tree/profile/acaead0b-fd72-4fcd-bef4-d4a33c543297/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. moon-tree.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/moon-tree" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[20230801]]></title>
            <link>https://velog.io/@moon-tree/20230801</link>
            <guid>https://velog.io/@moon-tree/20230801</guid>
            <pubDate>Tue, 01 Aug 2023 10:07:00 GMT</pubDate>
            <description><![CDATA[<p>◆ UNIX 개념</p>
<ul>
<li><p>UNIX는 멀티태스킹과 멀티유저를 지원하는 운영 체제로, 여러 사용자들이 동시에 작업을 수행할 수 있습니다. </p>
</li>
<li><p>또한, 높은 성능과 안전성을 제공하기 때문에, 금융권에서 많이 사용되는 운영체제 중 하나로 알고 있습니다.</p>
</li>
<li><p>(계층적 파일 시스템, 간편한 명령어를 통한 시스템 조작 등 다양한 특성을 가지고 있습니다. 
이러한 특성들 덕분에 금융권에서 UNIX를 운영 체제로 사용하는 것으로 알고 있습니다.)</p>
</li>
</ul>
<p>◆ 금융 전산 개발에서 UNIX의 사용 예시</p>
<ul>
<li>거래 처리: UNIX는 높은 성능과 안정성을 가지고 있어, 금융 서비스에서 많은 데이터를 처리하고 실시간으로 거래를 안정적으로 수행하기 위한 기반이 됩니다.</li>
<li>데이터베이스 관리: 금융 서비스는 거래 데이터, 고객 정보, 시장 데이터 등 다양한 데이터를 관리해야 합니다. UNIX 서버는 이러한 데이터를 안정적으로 처리하고 유지하기 위한 고성능의 데이터베이스 시스템을 지원합니다.</li>
<li>보안: 금융 서비스는 기밀 정보 및 데이터 보안에 많은 중요성을 두어야 합니다. UNIX는 강력한 보안 체계를 갖추고 있어, 금융 서비스의 데이터 보안 요구사항을 충족시키는 데 도움이 됩니다.</li>
<li>시스템 모니터링 및 유지 관리: UNIX는 시스템 리소스를 효과적으로 관리하고, 필요한 경우 신속하게 확장할 수 있는 운영 체제입니다. 이러한 특성은 금융 서비스의 빠르게 변화하는 요구사항에 적응할 수 있게 해줍니다.</li>
</ul>
<p>요약</p>
<ul>
<li>금융 전산 개발에서 UNIX는 높은 성능과 안정성을 제공하여 거래 처리, 데이터베이스 관리, 보안, 그리고 시스템 모니터링 및 유지 관리에 적합한 플랫폼입니다. 
이를 통해 금융 시스템은 안정하고 바르게 변화하는 요구사항에 맞춰 움직일 수 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230728]]></title>
            <link>https://velog.io/@moon-tree/20230728</link>
            <guid>https://velog.io/@moon-tree/20230728</guid>
            <pubDate>Fri, 28 Jul 2023 11:12:08 GMT</pubDate>
            <description><![CDATA[<p>Q : WEB와 WAS에 대해서 설명해주세요.
A :
◆ 웹(World Wide Web ,Web)</p>
<ul>
<li>웹 브라우저를 통해 접속하는 서비스를 의미합니다. </li>
<li>웹은 웹 브라우저를 사용하여 각종 콘텐츠, 문서, 동영상 등의 정보를 사용자에게 제공하며 서로 연결된 수많은 페이지들로 구성되어 있습니다. </li>
<li>웹 기술의 핵심 요소로는 HTML, CSS, JavaScript, 이미지, 멀티미디어 파일 등이 있습니다.</li>
</ul>
<p>◆ 웹 애플리케이션 서버(WAS, Web Application Server)</p>
<ul>
<li><p>웹 애플리케이션 서버는 클라이언트와 데이터베이스 사이에서 동작하는 애플리케이션을 실행하고 관리하는 서버입니다. </p>
</li>
<li><p>WAS는 웹 서버와 연동되어 복잡한 비즈니스 로직 처리를 담당하여 사용자의 요청에 대해 동적인 콘텐츠를 생성하고 데이터베이스에 접근하여 결과를 반환할 수 있습니다. </p>
</li>
<li><p>대표적인 WAS로는 Apache Tomcat, IBM WebSphere, Oracle WebLogic 등이 있습니다.</p>
</li>
<li><p>동적인 웹 애플리케이션을 실행하는 환경을 제공하는 소프트웨어입니다. </p>
</li>
<li><p>웹 서버와 달리, WAS는 데이터베이스와 같은 백엔드 시스템과 연결하여 데이터를 처리하고 애플리케이션 로직을 실행합니다. 
사용자의 요청을 받아들여 필요한 처리를 하고, 그 결과를 다시 웹 서버에 전달하여 동적인 웹 페이지를 생성하고 제공하는 역할을 합니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230725]]></title>
            <link>https://velog.io/@moon-tree/20230725</link>
            <guid>https://velog.io/@moon-tree/20230725</guid>
            <pubDate>Tue, 25 Jul 2023 10:21:50 GMT</pubDate>
            <description><![CDATA[<h2 id="♧-join">♧ join</h2>
<ul>
<li>데이터베이스에서 두 개 이상의 테이블을 특정 열(column)을 기준으로 합쳐서 관련된 정보를 조회하는 데 사용되는 방법입니다.</li>
<li>주요 조인 유형에는 <code>inner join</code>, <code>left join</code>, <code>right join</code> 등이 있습니다.</li>
</ul>
<h3 id="◆-inner-join">◆ inner join</h3>
<ul>
<li>두 테이블에서 <strong>기준 열(column)에 매칭되는 값이 있는 행(row)만을 합쳐</strong> 결과로 반환합니다.</li>
<li>양쪽 테이블에 <strong>모두 일치하는 값</strong>이 있는 데이터만 결과에 포함됩니다. </li>
<li>만약 기준 열에서 일치하는 값이 없는 경우 해당 행은 결과에 나타나지 않습니다.</li>
</ul>
<h3 id="◆-outer-join">◆ outer join</h3>
<ul>
<li><p>두 테이블의 결합 시, <strong>어느 한쪽의 테이블에 일치하는 데이터가 없어도 결과에 포함</strong>시키는 특징을 가지고 있습니다. </p>
</li>
<li><p><strong>일치하지 않는 데이터가 있을 경우</strong> 해당 필드에 <strong>null 값을 반환</strong>합니다.</p>
<h4 id="◆-left-join">◆ left join</h4>
<ul>
<li><strong>&#39;왼쪽 테이블&#39;의 모든 데이터(record)를 반환</strong>하며, 그 중에 &#39;오른쪽 테이블&#39;과 조건이 일치하는 데이터가 있으면 함께 반환됩니다.</li>
<li><strong>오른쪽 테이블에서 매칭되는 값이 없는 경우</strong> 해당 필드는 <strong>null로 처리</strong>됩니다.</li>
</ul>
<h4 id="◆-right-join">◆ right join</h4>
<ul>
<li><strong>&#39;오른쪽 테이블&#39;의 모든 데이터(record)를 반환</strong>하며, 그 중에 &#39;왼쪽 테이블&#39;과 조건이 일치하는 데이터가 있으면 함께 반환됩니다.</li>
<li><strong>왼쪽 테이블에서 매칭되는 값이 없는 경우</strong> 해당 필드는 <strong>null로 처리</strong>됩니다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230724]]></title>
            <link>https://velog.io/@moon-tree/20230724</link>
            <guid>https://velog.io/@moon-tree/20230724</guid>
            <pubDate>Mon, 24 Jul 2023 09:28:25 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-금융총량-아웃소싱finance-total-outsourcing">◆ 금융총량 아웃소싱(Finance Total Outsourcing)</h3>
<ol>
<li>금융 기관이 그들의 전체 금융 업무 프로세스 중 일부 또는 전부를 외부 전문 회사에 위탁하는 것을 의미합니다. </li>
<li>이러한 아웃소싱은 주로 기업의 핵심 역량에 집중하고, 비용 절감, 업무 효율성, 업무 효율성 향상 및 전문 기술력 확보를 목표로 합니다.</li>
</ol>
<blockquote>
</blockquote>
<p>금융총량 아웃소싱의 주요 분야는 다음과 같습니다:</p>
<blockquote>
</blockquote>
<ul>
<li>IT 아웃소싱 : 금융 기관의 정보 기술 솔루션, 시스템 구축 및 유지 보수, 네트워크 관리 등의 IT 관련 업무를 외부 전문 회사에 위탁합니다.<blockquote>
</blockquote>
</li>
<li>운영 및 처리(Operation and Processing) 아웃소싱 : 일상적인 업무 프로세스와 관련한 작업(예: 대출 처리, 신용카드 발급 등)을 외부 회사에 맡깁니다.<blockquote>
</blockquote>
</li>
<li>고객 서비스 아웃소싱 : 고객 지원, 인바운드 및 아웃바운드 콜센터 서비스, 이메일 지원 등과 같은 고객 서비스 업무를 외부 회사에 위탁합니다.<blockquote>
</blockquote>
</li>
<li>리스크 관리 및 준법 아웃소싱 : 금융 리스크 분석, 모니터링, 평가와 같은 업무를 외부 전문 회사가 담당합니다. 또한 조직의 규정 준수 업무를 외부 회사에 맡길 수도 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230722]]></title>
            <link>https://velog.io/@moon-tree/20230722</link>
            <guid>https://velog.io/@moon-tree/20230722</guid>
            <pubDate>Sat, 22 Jul 2023 11:25:07 GMT</pubDate>
            <description><![CDATA[<p>Q : 객체 지향에서 다형성(Polymorphism)이란 무엇인지 설명하시오.
A : </p>
<ul>
<li>같은 이름의 메서드나 인터페이스를 사용하더라도, 서로 다른 클래스의 객체에 따라 다른 동작을 수행하게 하는 기능입니다. </li>
<li>이를 통해 코드의 유연성과 확장성을 향상시키며, 새로운 클래스 추가나 수정이 용이하게 됩니다.</li>
</ul>
<blockquote>
<p>###
코드 예시</p>
</blockquote>
<ul>
<li>기본 클래스 &quot;Animal&quot;<pre><code class="language-java">public class Animal {
  public void makeSound() {
      System.out.println(&quot;동물의 울음 소리&quot;);
  }
}</code></pre>
<blockquote>
</blockquote>
</li>
<li>Animal을 상속받은 Cat과 Dog 하위 클래스</li>
<li>각 클래스에서는 makeSound() 메서드를 오버라이드(재정의)합니다.<pre><code class="language-java">public class Cat extends Animal {
  public void makeSound() {
      System.out.println(&quot;고양이의 울음 소리&quot;);
  }
}
&gt;
public class Dog extends Animal {
  public void makeSound() {
      System.out.println(&quot;강아지의 울음 소리&quot;);
  }
}</code></pre>
<blockquote>
</blockquote>
</li>
<li>다형성을 사용하여 동물들이 울음 소리를 출력하는 메인 클래스를 생성<pre><code class="language-java">public class Main {
  public static void main(String[] args) {
      Animal myAnimal = new Animal();
      Animal myCat = new Cat();
      Animal myDog = new Dog();
&gt;
      myAnimal.makeSound();
      myCat.makeSound();
      myDog.makeSound();
  }
}</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230721]]></title>
            <link>https://velog.io/@moon-tree/20230721</link>
            <guid>https://velog.io/@moon-tree/20230721</guid>
            <pubDate>Fri, 21 Jul 2023 12:50:09 GMT</pubDate>
            <description><![CDATA[<p>Q : 객체 지향에서 상속이란 무엇인지 설명하시오.
A :</p>
<ul>
<li>상속은 한 클래스의 속성과 메소드를 다른 클래스가 물려받는 기능을 말합니다.</li>
<li>상속을 사용하면 기존의 코드를 재사용하여 중복을 줄이고 프로그램의 구조를 간결하게 만들 수 있습니다.</li>
<li>학교에서 선생님과 학생을 예시로 들어보겠습니다. 
선생님과 학생 모두 이름, 나이, 성별과 같은 공통된 특성을 가지고 있습니다. 
이러한 공통된 특성을 &quot;사람&quot;이라는 클래스로 묶을 수 있습니다. 
이제 &quot;선생님&quot; 클래스와 &quot;학생&quot; 클래스를 만들 때, &quot;사람&quot; 클래스의 특성을 그대로 물려받게 할 수 있는 것을 상속이라고 할 수 있습니다.</li>
</ul>
<ol>
<li>재사용: 상속을 통해 기반 클래스의 속성과 메소드를 그대로 사용하거나 확장하여 코드의 중복을 줄일 수 있습니다.</li>
<li>확장성: 파생 클래스는 기반 클래스의 기능을 수정하거나 추가하여 새로운 기능을 쉽게 구현할 수 있습니다.</li>
<li>유지보수: 기반 클래스의 변경이 파생 클래스에도 자동적으로 반영되므로, 전체적인 유지보수가 용이해집니다.</li>
<li>계층 구조: 클래스간의 계층 구조를 만들어서 관련성이 있는 클래스들을 쉽게 이해하고 관리할 수 있습니다.</li>
</ol>
<hr>
<p>Q : 객체 지향에서 추상화(Abstraction)란 무엇인지 설명하시오.
A : </p>
<ul>
<li><p>현실 세계의 객체를 간단한 개념이나 모델로 일반화시키는 과정을 말합니다.</p>
</li>
<li><p>이 과정에서 불필요한 세부 정보를 제거하고 필요한 핵심 특징만을 남겨놓아 프로그램이 더 쉽게 이해할 수 있도록 도와줍니다.
(- 이를 바탕으로 클래스와 인터페이스를 설계합니다.)</p>
</li>
<li><p>추상화는 코드의 중복을 줄이고 가독성을 높이며, 소프트웨어 유지보수와 확장성을 향상시키는 데 도움이 됩니다.</p>
</li>
<li><p>추상화를 사용하는 대표적인 예시 중 하나는 그림 그리기 프로그램입니다.
사용자가 그림판 소프트웨어를 사용하여 모양, 색상, 굵기 등을 선택하게 되면, 프로그램은 그것을 추상화하여 픽셀 단위의 데이터로 변환하고, 사용자가 화면에 그림을 그리면 그것을 다시 추상화하여 저장합니다. 
이러한 추상화 과정을 거쳐, 사용자는 복잡한 그림을 그리는 데에도 쉽게 접근할 수 있게 됩니다.</p>
</li>
</ul>
<hr>
<p>Q : 객체 지향에서 캡슐화(Encapsulation)란 무엇인지 설명하시오.
A :</p>
<ul>
<li>객체의 속성(변수)과 메서드(함수)를 하나로 묶고, 객체의 내부 구현을 외부에 감추는 것을 말합니다.
(- 객체를 마치 캡슐 안에 감추듯이 구현 내용을 숨기고, 객체의 인터페이스를 통해 상호작용함으로써 보다 안정적이고 유지보수가 용이한 코드를 만들 수 있게 해줍니다.)
(- 이는 마치 사용자가 자동차의 조작 부분만 다루고, 자동차 엔진이나 기타 내부 부품들은 건드리지 않는 것과 같은 원리입니다.)</li>
</ul>
<p>(- 이렇게 캡슐화를 통해 객체가 다른 객체와 독립적으로 작동하게 함으로써 코드의 유지보수와 확장성이 용이해집니다.)</p>
<ul>
<li>캡슐화를 구현하기 위해 클래스의 멤버 변수를 private 또는 protected로 선언하고, 외부에서 이 변수들에 접근할 수 있는 getter와 setter 메서드를 제공합니다. 이 방법을 통해 객체 내의 데이터와 기능을 묶고, 객체와 객체 사이의 결합도를 낮추어 코드의 유지 관리가 쉬운 구조를 만들어 줍니다.</li>
</ul>
<hr>
<p>Q : 추상화와 캡슐화의 차이점이 무엇인가요?
A :</p>
<ul>
<li>추상화는 불필요한 부분을 제거하고, 복잡한 것을 단순화하여 이해하기 쉽게 만들어주는 역할을 합니다.</li>
<li>캡슐화는 객체 내부의 구현 내용을 외부에서 접근하지 못하도록 감추는 것을 말합니다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230719]]></title>
            <link>https://velog.io/@moon-tree/20230719</link>
            <guid>https://velog.io/@moon-tree/20230719</guid>
            <pubDate>Wed, 19 Jul 2023 12:46:54 GMT</pubDate>
            <description><![CDATA[<p>Q : 객체(Object)란 무엇인지 예를 들어서 설명하시오.
A : </p>
<ul>
<li><p>객체란, 현실 세계의 사물이나 개념을 프로그램 언어로 나타낸 것을 말합니다.</p>
</li>
<li><p>예를 들어, 자동차 객체는 색상과 모델명과 같은 데이터 속성을 가지고 있으며, 가속과 방향 전환과 같은 동작을 수행할 수 있는 기능을 포함하고 있습니다.
(- 자바에서는 이러한 객체의 속성(Attribute)을 필드(field)라고 하며, 동작을 메소드(method)라고 합니다.)</p>
</li>
<li><p>객체는 모델링을 통해 현실 세계의 개념을 추상화하여 프로그래밍에서 사용할 수 있는 형태로 표현됩니다.</p>
</li>
</ul>
<p>◆ 멤버 필드(field)</p>
<ul>
<li>멤버 필드는 다른 말로 멤버 변수, 인스턴스 변수라고도 부릅니다.</li>
<li>말 그대로 인스턴스의 구성 데이터를 저장하는 역할을 수행합니다.</li>
</ul>
<hr>
<p>Q : 객체지향 프로그래밍(OOP, Object Oriented Programming)이란?
A : </p>
<ul>
<li>컴퓨터 프로그래밍 방식 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.</li>
</ul>
<ul>
<li>객체지향 프로그래밍(OOP)이란, 현실 세계의 사물이나 개념을 프로그램의 구성 요소로 모델링하는 것을 말합니다.</li>
<li>예를 들어, 자동차를 객체로 모델링해보겠습니다. 
(자동차 클래스에는 속성으로 색상, 모델, 연식을 저장하는 변수들이 있을 수 있고, 동작으로는 주행을 위한 가속, 감속, 방향 전환 등의 메서드들이 있을 수 있습니다.)</li>
</ul>
<p>객체지향 프로그래밍에서는 자동차를 하나의 클래스로 정의하고, 클래스를 기반으로 여러 개의 자동차 객체를 생성합니다. 각각의 자동차 객체는 색상과 연식을 저장하는 변수들이 있을 수 있고, 가속과 방향 전환 등의 메서드들이 있을 수 있습니다.</p>
<p>이렇게 객체지향 프로그래밍을 활용하면 자동차에 관련된 여러 기능을 모듈화하여 재사용할 수 있고, 자동차 객체끼리의 상호작용이 자연스럽게 이루어집니다. (또한, 코드의 가독성과 유지보수성이 향상되며, 프로그램의 확장성도 용이해집니다.)</p>
<blockquote>
</blockquote>
<p>ex)
// 자동차 클래스 정의
class Car {
    String color;
    int year;</p>
<blockquote>
</blockquote>
<pre><code>void accelerate() {
    // 가속 로직 구현
}</code></pre><blockquote>
</blockquote>
<pre><code>void changeDirection() {
    // 방향 전환 로직 구현
}</code></pre><p>}</p>
<blockquote>
</blockquote>
<p>// 자동차 객체 생성
Car car1 = new Car();
car1.color = &quot;Red&quot;;
car1.year = 2022;</p>
<blockquote>
</blockquote>
<p>Car car2 = new Car();
car2.color = &quot;Blue&quot;;
car2.year = 2020;</p>
<blockquote>
</blockquote>
<p>// 자동차 객체의 메서드 호출
car1.accelerate();
car2.changeDirection();</p>
<p>◆ 모델링</p>
<ul>
<li>모델링은 현실 세계의 객체를 속성과 동작으로 추상화하여 소프트웨어 객체의 필드와 메소드로 정의하는 과정을 말합니다. 
(이를 통해 현실 세계의 개념과 동작을 소프트웨어적으로 표현하고 구현할 수 있습니다.)</li>
</ul>
<hr>
<p>Q : 객체 지향 언어에 대하여 설명하시오.
A :</p>
<ul>
<li><p>현실 세계의 객체를 모델링하여 프로그램을 구축하는 방식입니다.</p>
</li>
<li><p>예를 들어, 게임 개발을 위해 객체 지향 언어를 사용해보겠습니다.
게임에는 여러 종류의 캐릭터가 있을 수 있습니다. 
이를 객체 지향 언어로 구현한다면, 캐릭터를 하나의 클래스로 정의하고, 이 클래스를 기반으로 다수의 캐릭터 객체를 생성할 수 있습니다. 
각 캐릭터 객체는 공격력, 방어력과 체력 등의 속성을 나타내는 변수를 가지고 있고, 이동, 공격, 획복 등의 동작을 수행하는 메서드를 가지고 있습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230717]]></title>
            <link>https://velog.io/@moon-tree/20230717</link>
            <guid>https://velog.io/@moon-tree/20230717</guid>
            <pubDate>Mon, 17 Jul 2023 08:19:36 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-추상-클래스abstract-class">◆ 추상 클래스(abstract class)</h3>
<ol>
<li><strong>클래스 내 abstract로 정의된 경우</strong>를 말합니다.</li>
<li><strong>직접 객체 생성이 불가능</strong>합니다.
1) 대신 하위 클래스에서 추상 클래스를 상속받아야만 인스턴스를 생성할 수 있습니다.</li>
<li><strong>추상 메서드를 가질 수 있습니다.</strong>
1) 추상 클래스가 추상 메서드를 가지면 하위 클래스에서는 해당 메서드를 반드시 구현해야 합니다. 
2) 이를 통해 하위 클래스들이 일관된 동작을 보장할 수 있습니다.</li>
</ol>
<ul>
<li>상속을 위한 상위 클래스 입니다.</li>
<li>추상 클래스는 상속 받는 클래스들의 공통적인 특징과 동작을 제공하며, 기능 확장을 위해 사용합니다.</li>
</ul>
<h3 id="◆-인터페이스interface">◆ 인터페이스(interface)</h3>
<ul>
<li><p>클래스가 가져야 하는 메서드의 형식을 정의하는 역할을 합니다. 
인터페이스는 클래스와는 달리 다중 상속을 지원하며, 클래스가 여러 개의 인터페이스를 동시에 구현할 수 있습니다.</p>
</li>
<li><p><strong>java 7버전까지 모든 메서드가 추상 메소드로만 이루어져 있어야 합니다. 그러나, java 8버전부터는 Lambda 표현식을 활용해서 인터페이스에 default 메소드와 static 메소드를 추가할 수 있게 되었습니다.</strong></p>
<ul>
<li>default 메소드는 인터페이스에 기본적인 구현을 제공하는 메소드로, 구현 클래스에서 이를 재정의하지 않아도 되며 선택적으로 사용할 수 있습니다. </li>
<li>static 메소드는 인터페이스 수준에서 정적 메소드를 제공하는 것으로, 인터페이스명을 통해 직접 호출할 수 있습니다.</li>
</ul>
</li>
<li><p><strong>생성자를 가질 수 없습니다.</strong></p>
</li>
</ul>
<blockquote>
<p>###</p>
</blockquote>
<ul>
<li><strong>추상 클래스는 extents로 한 개만 상속이 가능하고, 인터페이스는 implement와 콤마로 여러 개 상속이 가능합니다.</strong><ul>
<li>추상 클래스는 다중상속이 불가능 하지만, 인터페이스는 다중상속이 가능합니다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230715]]></title>
            <link>https://velog.io/@moon-tree/20230715</link>
            <guid>https://velog.io/@moon-tree/20230715</guid>
            <pubDate>Sat, 15 Jul 2023 12:29:01 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-stringbuffer">◆ StringBuffer</h3>
<ul>
<li>가변적인 문자열을 처리하기 위한 클래스입니다.</li>
<li>문자열을 변경 가능한 버퍼에 저장하고, 필요에 따라 추가, 수정, 삭제 등의 작업을 수행할 수 있습니다.</li>
<li>문자열의 크기를 동적으로 조정할 수 있으며, 문자열을 효율적으로 변경할 수 있도록 설계되어 있습니다.</li>
<li><strong>멀티스레드 환경에서 동기화(synchronization)를 지원하</strong>므로, 여러 스레드에서 동시에 접근하는 경우 안전하게 사용할 수 있습니다.</li>
<li>하지만 동기화를 위한 추가적인 오버헤드가 발생하므로, <strong>단일 스레드 환경에서는 StringBuilder보다 성능이 떨어질 수 있습니다.</strong></li>
</ul>
<h3 id="◆-stringbuilder">◆ StringBuilder</h3>
<ul>
<li>가변적인 문자열을 처리하기 위한 클래스입니다.</li>
<li>StringBuffer와 마찬가지로 문자열을 변경 가능한 버퍼에 저장하고, 추가, 수정, 삭제 등의 작업을 수행할 수 있습니다.</li>
<li>StringBuffer와의 <strong>가장 큰 차이점은 동기화를 지원하지 않는다는 점</strong>입니다.</li>
<li>따라서 <strong>멀티스레드 환경이 아니라면 StringBuilder를 사용하는 것이 성능상 유리합니다.</strong></li>
<li>단일 스레드 환경에서 더 빠른 속도를 제공하며, 동기화에 따른 오버헤드가 없어 가벼운 작업에 적합합니다.</li>
</ul>
<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-stringbuffer와-stringbuilder의-차이점">◆ StringBuffer와 StringBuilder의 차이점</h3>
<blockquote>
</blockquote>
<ol>
<li>동기화(Synchronization)</li>
</ol>
<ul>
<li>StringBuffer는 멀티스레드 환경에서 동기화를 지원합니다. 
즉, 여러 스레드가 동시에 접근해도 안전하게 사용할 수 있습니다.</li>
<li>StringBuilder는 동기화를 지원하지 않습니다. 
따라서 단일 스레드 환경에서 사용할 때 더 빠른 성능을 제공합니다.<blockquote>
</blockquote>
</li>
</ul>
<ol start="2">
<li>성능</li>
</ol>
<ul>
<li>StringBuffer는 동기화를 지원하므로 스레드 안전성을 보장하기 위해 추가적인 오버헤드가 발생할 수 있습니다. 
따라서 단일 스레드 환경에서는 StringBuilder보다 성능이 떨어질 수 있습니다.</li>
<li>StringBuilder는 동기화를 지원하지 않기 때문에 동기화 관련 오버헤드가 없습니다. 
이로 인해 단일 스레드 환경에서 빠른 속도를 제공합니다.<blockquote>
</blockquote>
</li>
</ul>
<ol start="3">
<li>변경 가능성</li>
</ol>
<ul>
<li>두 클래스 모두 문자열을 변경 가능한 버퍼에 저장하고 수정할 수 있습니다. 
따라서 문자열을 추가, 수정, 삭제하는 작업을 수행할 수 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230714]]></title>
            <link>https://velog.io/@moon-tree/20230714</link>
            <guid>https://velog.io/@moon-tree/20230714</guid>
            <pubDate>Fri, 14 Jul 2023 09:03:03 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-pg-payment-gateway">◆ PG (Payment Gateway)</h3>
<ul>
<li>PG는 Payment Gateway의 약자로 (결제를 위한 관문) <strong>전자결제서비스</strong>를 의미합니다.</li>
<li><strong>온라인 결제</strong></li>
<li>카드사와 직접 계약하기 어려운 온라인 플랫폼 또는 <strong>쇼핑몰을 대신해서 결제 업무를 대신해 주는 역할</strong>을 합니다.<ul>
<li>쇼핑몰 또는 앱에서 결제하기 버튼을 클릭 했을 시, 결제 창 또는 결제 모듈을 말합니다.</li>
<li>결제 수단 : 신용카드, 간편 결제, 계좌이체, 무통장입금, 휴대폰 결제 등</li>
</ul>
</li>
<li>PG사를 통해서 여러 카드사와 한 번에 거래하고, PG사와 계약한 정산일에 <strong>전체 매출액을 한 번에 정산 받습니다.</strong></li>
<li>PG사의 정산 시스템은 카드사마다 매출 금액 지급일이 달라 겪을 수 있는 혼란을 없애고, 현금흐름을 쉽게 파악할 수 있게 해줍니다.</li>
<li>PG사는 카드사에게 수수료를 내고, <strong>가맹점에게 낮은 수수료를 받습니다.</strong></li>
<li>ex) NHN KCP, KG이니시스, 토스페이먼츠, 나이스페이먼츠, 코페이</li>
</ul>
<hr>
<h3 id="◆-van-value-added-network">◆ VAN (Value Added Network)</h3>
<ul>
<li>VAN은 Value Added Network의 약자로 카드사와 가맹점의 통신을 연결하는 <strong>부가가치 통신망</strong>을 의미합니다.</li>
<li><strong>오프라인 결제</strong>(카드 단말기, POS 단말기, 키오스크)</li>
<li>가맹점은 VAN사를 통해서 카드사에게 안전하고 정확하게 <strong>결제 정보를 연결하는 역할</strong>을 합니다.</li>
<li>하지만, POS 단말기나 매출 장부 서비스 등 추가 서비스를 사용하지 않는다면, VAN사가 <strong>매출 정산의 서비스를 제공하지 않습니다.</strong><ul>
<li>여러 카드사에서 발생한 매출액을 각각 다른 날짜에 입금받아야 합니다.</li>
</ul>
</li>
<li>만약 VAN사가 없다면?<ul>
<li>가맹점마다 쓸 수 있는 카드가 다르기 때문에 각 카드사와 결제 계약을 맺고 사용해야 합니다. </li>
</ul>
</li>
<li>VAN사는 <strong>가맹점에게 수수료를 받지 않고,</strong> 카드사로부터 VAN 전산망 사용료를 받습니다.</li>
<li>ex) NHN KCP, 나이스정보통신, 한국정보통신, 코페이</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230707]]></title>
            <link>https://velog.io/@moon-tree/20230707</link>
            <guid>https://velog.io/@moon-tree/20230707</guid>
            <pubDate>Fri, 07 Jul 2023 12:46:43 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-오버로딩overloading">◆ 오버로딩(Overloading)</h3>
<ul>
<li>한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 의미합니다.</li>
<li><strong>동일한 기능을 하는 메서드들에게 같은 이름을 부여</strong>함으로써 코드의 일관성을 제공합니다.</li>
<li>매개변수의 유형과 개수를 달리하여 같은 이름의 메서드가 다양한 상황에서 사용될 수 있게 함으로써 가독성을 향상시킵니다.</li>
</ul>
<blockquote>
<p>#</p>
</blockquote>
<ol>
<li><strong>메서드의 이름은 같아야</strong> 합니다.</li>
<li><strong>매개변수의 타입이나 개수가 달라야</strong> 합니다.</li>
<li><strong>반환 타입</strong>과 <strong>접근 제어자</strong>는 메서드를 오버로딩하는데 <strong>영향을 주지 않습니다.</strong><blockquote>
</blockquote>
</li>
</ol>
<ul>
<li>오버로딩(Overloading) 예시<pre><code class="language-java">public class OverloadingExample {
  void display(int a) {
      System.out.println(&quot;int a : &quot; + a);
  }
&gt;
  void display(int a, int b) {
      System.out.println(&quot;int a : &quot; + a + &quot;, int b : &quot; + b);
  }
&gt;
  void display(double a) {
      System.out.println(&quot;double a : &quot; + a);
  }
}</code></pre>
</li>
</ul>
<hr>
<h3 id="◆-오버라이딩overriding">◆ 오버라이딩(Overriding)</h3>
<ul>
<li>자식 클래스가 부모 클래스로부터 상속받은 메서드를 재정의하는 것을 말합니다.
  ⊙ <strong>자식 클래스가 부모 클래스의 메서드를 상속받아서 다른 기능을 사용하고자 할 경우</strong>에 사용합니다.</li>
<li>부모 클래스의 메서드는 숨겨지게 되고 새로 정의한 자식 클래스의 메서드가 호출됩니다.</li>
</ul>
<blockquote>
<p>#</p>
</blockquote>
<ol>
<li><strong>메서드의 이름이 같아야</strong> 합니다.</li>
<li>메서드의 <strong>파라미터가 같아야</strong> 합니다.</li>
<li>메서드의 <strong>리턴 타입이 같아야</strong> 합니다.</li>
<li>부모 클래스의 메서드보다 <strong>자식 클래스의 메서드 접근제한이 동일 하거나 넓어야</strong> 한다.<blockquote>
</blockquote>
</li>
</ol>
<ul>
<li>오버라이딩(Overriding) 예시<pre><code class="language-java">class Animal {
  void sound(){
      System.out.println(&quot;Animal의 소리&quot;);
  }
}
&gt;
class Dog extends Animal {
  // Overriding method
  @Override
  void sound(){
      System.out.println(&quot;Dog의 소리&quot;);
  }
}
&gt;
public class Main {
  public static void main(String[] args) {
      Animal myAnimal = new Animal();  // Animal 객체 생성
      Animal myDog = new Dog();  // Dog 객체 생성, 여기서 &#39;Dog&#39;는 &#39;Animal&#39;을 상속받은 클래스입니다.
      myAnimal.sound();  // Animal의 소리 출력
      myDog.sound();  // Dog의 소리 출력
  }
}</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230706]]></title>
            <link>https://velog.io/@moon-tree/20230706</link>
            <guid>https://velog.io/@moon-tree/20230706</guid>
            <pubDate>Thu, 06 Jul 2023 12:27:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-1-mvc-패턴이란">◆ 1. MVC 패턴이란</h3>
<p>1) Model-View-Controller 의 약어로 주로 GUI 기반의 애플리케이션 개발에 사용되는 소프트웨어 디자인 패턴입니다.
2) 사용자가 입력을 담당하는 View를 통해 요청을 보내면 해당 요청을 Controller가 받고, Controller는 Model을 통해 데이터를 가져오고, 해당 데이터를 바탕으로 출력을 담당하는 View를 제어해서 사용자에게 전달합니다.</p>
<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-2-스프링에서-각각에-해당하는-역할을-수행하는-객체-혹은-파일">◆ 2. 스프링에서 각각에 해당하는 역할을 수행하는 객체 혹은 파일</h3>
<blockquote>
</blockquote>
<p>1) Model</p>
<ul>
<li><strong>Controller에서 View로 전달하는 데이터셋</strong>을 의미합니다.<ul>
<li>데이터셋 : 특정한 작업을 위해서 데이터를 관련성 있게 모아놓은 것</li>
</ul>
</li>
<li>데이터베이스와 연동하여 사용자가 입출력한 데이터를 다룹니다.</li>
<li>서비스(Service) 클래스와 DAO(Data Access Object) 클래스도 비즈니스 로직을 처리하는 데 사용됩니다.<blockquote>
</blockquote>
2) View</li>
<li>뷰는 사용자에게 보여지는 <strong>화면</strong>을 담당하며, Model이 처리한 데이터를 사용자에게 표현하는 역할을 합니다.</li>
<li>JSP(JavaServer Pages)와 같은 템플릿 엔진을 통해 구현됩니다.<blockquote>
</blockquote>
3) Controller </li>
<li><strong>제어 장치</strong></li>
<li><strong>Model과 View 사이를 이어주는 인터페이스 역할</strong>을 합니다.<ul>
<li>즉, <strong>Model이 데이터를 어떻게 처리할지 알려주는 역할</strong>을 합니다.</li>
</ul>
</li>
<li>Controller는 사용자의 요청에 따라서 Model에 데이터를 의뢰하고, 데이터를 View에 반영해서 사용자에게 보여줍니다.</li>
<li>Controller.java 파일에서 @Controller 어노테이션이 클래스에 붙으면 스프링은 해당 클래스를 웹 요청을 처리하는 컨트롤러로 인식합니다.</li>
</ul>
<hr>
<p>Model은 Controller에서 View로 전달하는 데이터셋을 의미합니다. 
Controller는 Model이 데이터를 어떻게 처리할지 알려주는 역할을 합니다.
View는 사용자에게 데이터를 시각적으로 표현하는 역할을 합니다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/moon-tree/post/c5ad99a7-8505-4b6b-a796-f290fa3c19d6/image.svg" alt=""></p>
<h4 id="참고용-사이트--httpskowikipediaorg">참고용 사이트 : <a href="https://ko.wikipedia.org/">https://ko.wikipedia.org/</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230630]]></title>
            <link>https://velog.io/@moon-tree/20230630</link>
            <guid>https://velog.io/@moon-tree/20230630</guid>
            <pubDate>Fri, 30 Jun 2023 10:19:33 GMT</pubDate>
            <description><![CDATA[<h2 id="◆-scanner와-bufferedreader의-차이">◆ Scanner와 BufferedReader의 차이</h2>
<h3 id="◆-scanner">◆ Scanner</h3>
<ul>
<li>nextInt(), nextFloat(), nextLine() 등의 메서드를 사용하여 다양한 데이터 타입을 읽을 수 있습니다.</li>
<li>내부적으로 정규표현식을 사용하여 입력을 파싱하기 때문에, 공백, 탭, 줄 바꿈 등을 기본 구분자로 사용합니다. 따라서 여러 가지 유형의 입력 데이터를 쉽게 처리할 수 있습니다.</li>
<li>내부적인 파싱 로직 때문에 BufferedReader에 비해 <strong>느리다는 단점</strong>이 있습니다.</li>
<li>사용자 입력과 같은 작고 간단한 데이터를 처리하거나 <strong>입력의 구분자가 복잡한 경우</strong>, 또는 <strong>다양한 데이터 타입을 쉽게 파싱해야 하는 경우</strong> 사용하기에 적합합니다.</li>
</ul>
<h3 id="◆-bufferedreader">◆ BufferedReader</h3>
<ul>
<li>Scanner보다 빠르지만 사용하기는 더 복잡합니다. </li>
<li>문자열을 읽어들이는 readLine() 메소드를 제공하는데, 이 메소드는 문자열을 반환하므로 각 데이터 타입에 따라 직접 파싱해야 합니다.<ul>
<li>ex) 정수를 읽으려면 <code>Integer.parseInt()</code>를 사용해야 합니다.</li>
</ul>
</li>
<li>입력을 버퍼에 저장하고 한 번에 읽는 방식을 사용하므로 <strong>대량의 데이터를 빠르게 읽을 수</strong> 있습니다. 따라서 <strong>성능이 중요한 요구사항</strong>에 적합합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230624]]></title>
            <link>https://velog.io/@moon-tree/20230624</link>
            <guid>https://velog.io/@moon-tree/20230624</guid>
            <pubDate>Sat, 24 Jun 2023 09:20:01 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-oracle-db-덤프-파일-새로운-환경에서-import-하는-방법">◆ Oracle DB 덤프 파일 새로운 환경에서 import 하는 방법</h3>
<ol>
<li><p>SQL Command Line 시작</p>
</li>
<li><p>데이터 베이스에 연결</p>
<ul>
<li>conn username/password as sysdba</li>
</ul>
</li>
<li><p>사용자 생성 및 권한 부여</p>
<ul>
<li>CREATE USER username IDENTIFIED BY password;</li>
<li>GRANT ALL PRIVILEGES TO username;</li>
</ul>
<p>1) 사용자 조회</p>
<ul>
<li>SELECT * FROM ALL_USERS WHERE USERNAME = &#39;Your_Username&#39;;</li>
</ul>
</li>
<li><p>디렉토리 생성 및 권한 부여</p>
<ul>
<li>CREATE OR REPLACE DIRECTORY test_dir AS &#39;/test_dir_path&#39;;</li>
<li>GRANT READ, WRITE ON DIRECTORY test_dir TO username;</li>
</ul>
<p>1) 디렉토리 설정 조회</p>
<ul>
<li>SELECT * FROM ALL_DIRECTORIES;</li>
<li>SELECT * FROM ALL_DIRECTORIES WHERE DIRECTORY_NAME = &#39;Your_Directory_Name&#39;;</li>
<li>SELECT * FROM ALL_DIRECTORIES WHERE DIRECTORY_NAME = &#39;TEST_DIR&#39;;</li>
</ul>
</li>
<li><p>덤프 파일 임포트 &gt;&gt; cmd에서 실행</p>
<ul>
<li>impdp username/password DIRECTORY=test_dir DUMPFILE=dump_file_name.dmp FULL=YES</li>
<li>impdp kh11fd/kh11fd DIRECTORY=test_dir DUMPFILE=backup.dmp FULL=YES</li>
</ul>
<p>1) 덤프 파일을 DBA 권한으로 임포트 &gt;&gt; 해당 방법으로 import 한다.</p>
<ul>
<li>imp &#39;sys/password AS SYSDBA&#39; FILE=&#39;Your_Directory_Name&#39; FULL=YES</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 100일차]]></title>
            <link>https://velog.io/@moon-tree/TIL-100%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@moon-tree/TIL-100%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 18 May 2023 16:02:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-1-웹-서버와-웹-애플리케이션-서버의-공통점">◆ 1. 웹 서버와 웹 애플리케이션 서버의 공통점</h3>
<p>1) 클라이언트의 요청을 처리하고 그 결과를 클라이언트에게 반환하는 역할을 수행합니다. 
2)  HTTP 프로토콜을 기반으로 클라이언트와의 통신을 수행한다는 점이 있습니다.</p>
<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-2-웹-서버와-웹-애플리케이션-서버의-차이점">◆ 2. 웹 서버와 웹 애플리케이션 서버의 차이점</h3>
<h4 id="1-웹서버">1) 웹서버</h4>
<ul>
<li>(1) HTML, CSS, JavaScript 파일 또는 이미지와 같은 정적 파일들을 요청에 따라 클라이언트에게 전달하는 것이 주된 역할입니다.</li>
<li>(2) CGI(Common Gateway Interface)나 PHP 등의 서버 측 스크립트 언어를 이용해서 동적 콘텐츠를 처리하는 기능도 제공하지만 정적인 컨텐츠를 제공하는데 최적화되어 있습니다.</li>
<li>(3) WAS는 DB 조회, 다양한 로직을 수행하기 때문에 단순한 정적 컨텐츠는 Web Server에서 클라이언트한테 제공하는 것이 빠르고 좋습니다.</li>
<li>(4) SSL 대한 암복호화 처리에 Web Server를 사용하면 물리적으로 분리하여 보안을 강화시킵니다.</li>
<li>(5) 대용량 웹 어플리케이션의 경우, Web Server와 WAS를 분리하여 오류가 발생한 WAS를 사용하지 않고, 다른 WAS를 사용하게 만들어 무중단 운영을 가능하게 합니다.</li>
<li>(6) 상용화 프로그램 : Apache Server, Nignx<blockquote>
</blockquote>
<h4 id="2-웹-어플리케이션-서버">2) 웹 어플리케이션 서버</h4>
</li>
<li>(1) 서버 내 알고리즘, 비즈니스 로직, DB 조회 등 클라이언트 요청에 따라 동적인 컨텐츠를 제공합니다.</li>
<li>(2) Web Server 기능 뿐 아니라, 비즈니스 로직을 수행하는 컴포넌트를 실행하는 기능과, 트랜잭션 관리, 메시징, 쓰레드 처리 등과 같은 서버 측에서 필요한 여러 가지 기능을 제공합니다.</li>
<li>(3) 사용자의 요청에 따라 비즈니스 로직을 수행하고, 그 결과를 HTML, JSON 등의 형태로 만들어서 웹 서버에게 전달합니다. </li>
<li>(4) 상용화 프로그램 : Apache Tomcat, JBoss, WebSphere, WebLogic</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 99일차]]></title>
            <link>https://velog.io/@moon-tree/TIL-99%EC%9D%BC%EC%B0%A8-u50vojy2</link>
            <guid>https://velog.io/@moon-tree/TIL-99%EC%9D%BC%EC%B0%A8-u50vojy2</guid>
            <pubDate>Thu, 18 May 2023 16:02:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-형상관리software-configuration-management">◆ 형상관리(Software Configuration Management)</h3>
<ul>
<li>애플리케이션 설계부터 배포까지 추적할 수 있도록 관리하고 통제할 수 있는 서비스를 말합니다.</li>
<li>소프트웨어의 변경사항을 체계적으로 추적하고 통제하는 것입니다.</li>
<li>프로젝트의 일관성 유지, 변경의 추적, 버전 관리 등을 담당하며, 오류 수정, 새로운 기능 추가와 같은 변경사항을 제어하는 역할을 합니다.</li>
</ul>
<blockquote>
<h3 id="◆-spring-application을-개발할-때-사용할-수-있는-형상-관리-도구">◆ Spring Application을 개발할 때 사용할 수 있는 형상 관리 도구</h3>
</blockquote>
<h4 id="1-jenkins">1. Jenkins</h4>
<ul>
<li>아마존 EC2에 서버를 세팅하여 자동으로 웹서버로 이동할 수 있도록 구현하였습니다.</li>
<li>EC2는 아마존 웹 서비스(Amazon Web Services, AWS)에서 제공하는 클라우드 컴퓨팅 서비스입니다.</li>
<li>개발자가 코드를 저장소에 푸시할 때마다 자동으로 빌드와 테스트가 수행합니다.</li>
<li>CD 도구(Continuous Delivery : 코드 배포)의 일종입니다.</li>
<li>자바 기반의 무료 오픈소스 자동화 빌드 도구입니다.<blockquote>
</blockquote>
<h4 id="2-github">2. Github</h4>
</li>
<li>팀프로젝트에서 깃허브를 이용하여 이력 관리를 하였고, 충돌 시 PR을 통해서 처리하였습니다.</li>
<li>CI 도구(Continuous Integration : 코드 통합)의 일종입니다.</li>
<li>또한 여러 사람들이 동시에 같은 프로젝트에 참여하여 작업하는 것을 효과적으로 지원합니다.</li>
<li>로컬 관리와 중앙 관리가 모두 가능하여 장소에 구애받지 않고 협업을 가능하게 합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 98일차]]></title>
            <link>https://velog.io/@moon-tree/TIL-98%EC%9D%BC%EC%B0%A8-x5en2bo9</link>
            <guid>https://velog.io/@moon-tree/TIL-98%EC%9D%BC%EC%B0%A8-x5en2bo9</guid>
            <pubDate>Wed, 17 May 2023 10:38:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>###</p>
</blockquote>
<h3 id="◆-채팅방-메세지-전송-시-디자인-구현">◆ 채팅방 메세지 전송 시, 디자인 구현</h3>
<blockquote>
</blockquote>
<ol>
<li>checkSameTime(index) 메서드 : 이 메서드는 이전 메시지와 현재 메시지가 동일한 사용자에 의해 동일한 시간에 보내졌는지를 확인합니다. 만약 동일하다면, 이전 메시지와 현재 메시지 사이에 시간 표시나 프로필 이미지를 중복해서 표시하는 것을 방지하기 위해 true를 반환합니다.<blockquote>
</blockquote>
</li>
<li>calculateDisplay(index) 메서드 : 이 메서드는 현재 메시지와 다음 메시지가 동일한 사용자에 의해 동일한 시간에 보내졌는지를 확인합니다. 만약 다르다면, 메시지의 시간과 사용자 프로필을 화면에 표시하기 위해 true를 반환합니다.<blockquote>
</blockquote>
</li>
<li>checkMyMessage(index) 메서드 : 이 메서드는 현재 메시지가 로그인된 사용자가 보낸 메시지인지 확인합니다. 이를 통해 사용자의 메시지와 다른 사람의 메시지를 구분하여 표시할 수 있습니다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 97일차]]></title>
            <link>https://velog.io/@moon-tree/TIL-97%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@moon-tree/TIL-97%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 17 May 2023 10:38:05 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-메세지-알림-시도-전">◆ 메세지 알림 시도 전</h3>
<blockquote>
<p>###</p>
</blockquote>
<h4 id="메세지-알림">&lt;메세지 알림&gt;</h4>
<ol>
<li>db 기준 방에 참가한 인원 : 8명 / 사이트에 참여하지 않은 인원 : 2명(신경쓰지 않는다.)</li>
<li>대기실에는 있으나 채팅방에 접속 하지 않은 참가 인원(dm에 접속되어 있는 사람들 : 6명) : 2명 -&gt; DmRoomVO(-1(대기실)) Set에 존재</li>
<li>(웹소켓 채널)채팅방에 참가하고있는 인원 (채팅 하고 있는 사람들 : 4명) -&gt; DmRoomVO(roomNo)의 Set에 존재 </li>
<li>DB에서 전체 인원 반환(List<Long>)</li>
<li>4명한테 메세지를 보낸다면, 메세지를 받지 않은 4명이 남아있다.</li>
<li>메세지를 받지 않은 4명은 대기실에서 찾아야된다. -&gt; 2명은 대기실에서 탐색이 된다.</li>
<li>-&gt; 대기실에 존재하는 2명한테 채팅방 목록을 갱신할 데이터를 보내줘야 된다. (새 메시지가 왔다, 몇 개 왔다.)<ul>
<li>몇 개 왔다. = 메세지들의 시간 - 그 사람이 마지막으로 접속한 시간 &gt; 0 =&gt; 개수</li>
<li>개수 &gt; 0 새로운 메세지가 있다.</li>
</ul>
</li>
</ol>
<blockquote>
<h3 id=""></h3>
</blockquote>
<ul>
<li>시간 갱신
메세지 왔을때, 새로운 사람 들어왔을때, 나갔을때</li>
</ul>
<blockquote>
<p>###</p>
</blockquote>
<ul>
<li>읽지 않은 메세지 수 구하기 (MapOf(), SetOf())
//const newRoomInfo = {type:설정한 상수,rooNo:41, count:2}
//this.dmRoomList.MapOf()  roomNo가 41인걸 찾아서 index 반환
//this.dmRoomList.count = newRoomInfo.count
count(sum 메세지들의 시간&gt;참가자가 방에 접속한 마지막 시간 +1) as unread_Count<blockquote>
</blockquote>
</li>
<li>읽지 않은 메세지 수를 아래 memberInfoDto(객체)로 만들면 채팅방 이름에 숫자와 시간이 실시간으로 변경된다.</li>
</ul>
<blockquote>
<p>###</p>
</blockquote>
<ul>
<li>마지막 메세지 실시간 갱신</li>
<li>신규 채팅방 갱신</li>
</ul>
<ol>
<li>대기실에 없으면 생략</li>
<li>대기실에 있다. <blockquote>
</blockquote>
<pre><code class="language-java">MemberInfoDto memberInfoDto = ~repo.selectOne();
String newRoom = mapper.writeValueAsString(memberInfoDto);
TextMessage newRoomJson = new TextMessage(newRoom);
&gt;
객체 broadCast(newRoomJson)</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 96일차]]></title>
            <link>https://velog.io/@moon-tree/TIL-96%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@moon-tree/TIL-96%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 15 May 2023 11:34:13 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-메세지-전송-시-스크롤바-아래로-이동">◆ 메세지 전송 시, 스크롤바 아래로 이동</h3>
<blockquote>
<p>###</p>
</blockquote>
<h4 id="◆-모달창-스크롤바를-사용할-때-페이지-스크롤바를-움직이지-않게-하기">◆ 모달창 스크롤바를 사용할 때, 페이지 스크롤바를 움직이지 않게 하기</h4>
<ul>
<li>모달창을 닫을 때, ~style.overflow=&quot;hidden&quot;</li>
<li>모달창을 열 때, ~style.overflow=&quot;unset&quot;</li>
</ul>
<hr>
<blockquote>
<p>###</p>
</blockquote>
<h4 id="◆-스크롤바">◆ 스크롤바</h4>
<p>// 스크롤은 몇 % 위치에 있는가?를 알고 싶다면 
                   // - 전체 문서의 높이(document.body.clientHeight)
                   // - 현재 스크롤의 위치 (window.scrollY)
                   // - 브라우저의 높이 (window.innerHeight)</p>
<blockquote>
</blockquote>
<pre><code class="language-java">window.addEventListener(&quot;scroll&quot;, _.throttle(()=&gt;{
    const height = document.body.clientHeight - window.innerHeight;
    const current = window.scrollY
    const percent = (current / height) * 100
    //console.log(&quot;percent = &quot; + Math.round(percent));
    //data의 percent를 계산된 값으로 갱신
    this.percent = Math.round(percent);
},250));</code></pre>
<hr>
<blockquote>
<p>###</p>
</blockquote>
<h4 id="◆-채팅방-목록-스크롤바-hover시-표시">◆ 채팅방 목록 스크롤바 hover시 표시</h4>
<blockquote>
</blockquote>
<pre><code class="language-java">   .cardList-scroll{
           overflow-y: hidden;
           -ms-overflow-style: none;
    }
    .cardList-scroll:hover {
        overflow-y: auto;
    } 
    .cardList-scroll::-webkit-scrollbar {
        width: 6px; /* 스크롤바 너비 조절 */
        background-color: transparent; /* 스크롤바 배경색 설정 */
    }
    .cardList-scroll::-webkit-scrollbar-thumb {
        background-color: rgba(0, 0, 0, 0.3); /* 스크롤바 색상 설정 */
        border-radius: 3px; /* 스크롤바 모서리 둥글기 설정 */
    }
    .cardList-scroll::-webkit-scrollbar-thumb:hover {
        background-color: rgba(0, 0, 0, 0.6); /* 호버시 스크롤바 색상 변경 */
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 95일차]]></title>
            <link>https://velog.io/@moon-tree/TIL-95%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@moon-tree/TIL-95%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 14 May 2023 13:24:28 GMT</pubDate>
            <description><![CDATA[<h3 id="◆-나에게만-채팅방-이름-변경">◆ 나에게만 채팅방 이름 변경</h3>
<blockquote>
<h3 id=""></h3>
</blockquote>
<h4 id="◆-모두에게-채팅방-이름-변경-시도">◆ 모두에게 채팅방 이름 변경 시도</h4>
<ol>
<li>채팅방의 이름을 변경 시, 모든 사용자에게 적용하는 것은 별도의 테이블을 만들 필요는 없습니다. </li>
<li>dm_room 테이블에 있는 room_name 필드를 업데이트하면 됩니다. 사용자가 채팅방의 이름을 변경하려는 요청을 받으면, 해당 채팅방의 room_no를 기반으로 dm_room 테이블에서 해당 레코드를 찾아 room_name을 업데이트하면 됩니다.</li>
<li>Java 코드에서는 이를 위한 서비스 메서드를 작성할 수 있습니다. 이 메서드는 변경하려는 채팅방의 room_no와 새로운 이름을 인수로 받아 해당 채팅방의 이름을 변경할 수 있습니다.</li>
</ol>
<hr>
<blockquote>
<p>###</p>
</blockquote>
<h4 id="◆-나에게-채팅방-이름-변경-시도">◆ 나에게 채팅방 이름 변경 시도</h4>
<ol>
<li>DB에서 dm_room_rename 테이블을 생성합니다</li>
<li>회원이 모달창에서 변경할 채팅방 이름을 작성한 후, 수정을 클릭하면 changeRoomName() 메서드가 실행되도록 @click 이벤트를 설정합니다.</li>
<li>room_no와 member_no, room_rename의 값이 dm_room_rename 테이블에 insert 해줍니다.</li>
<li>다른 회원들에 채팅방 목록에는 기존의 채팅방 이름을 보여주고, 채팅방 이름을 변경한 회원의 채팅방 목록에는 변경된 채팅방 이름을 보여줍니다.</li>
<li>동일한 회원이 여러번 채팅방 이름을 변경할 수 있도록 repo, repoImpl, mapper에서 update를 추가하여 비동기로 실행될 수 있도록 코드를 작성합니다.</li>
<li>채팅방 이름을 변경한 회원이 채팅방에서 퇴장할 경우, dm_room_rename 테이블에 데이터가 삭제될 수 있도록 repo, repoImpl, mapper에서 delete를 추가하여 비동기로 실행될 수 있도록 코드를 작성합니다.</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>