<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jayden_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 31 May 2023 02:40:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jayden_.log</title>
            <url>https://velog.velcdn.com/images/jayden_/profile/c1012196-90bc-4c7a-afef-557ead032aab/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jayden_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jayden_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Diagram 문제]]></title>
            <link>https://velog.io/@jayden_/Diagram-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@jayden_/Diagram-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Wed, 31 May 2023 02:40:02 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">ex1)
public class A{
    private B b
}

public class B{
    private String f1;
    private int f2;
}
</code></pre>
<pre><code class="language-java">ex2)

public class Test1{
    private Test2 t2;

    public Test3 method1(){
        return new Test3;
    }
}

public class Test2{
    private int f1;
}

public class Test3{
    private String str;
    public String getStr();
        return str;
}

    public void setStr(String str){
        this.str = str;
    }
</code></pre>
<pre><code class="language-java">ex3)

public abstract class Parent{
    public void parentMethod1(){}
    protected abstract void print();
}

public class Child extends Parent{
    private String name;
    public void childMethod(){}
    protected void print(){}
}</code></pre>
<pre><code class="language-java">ex4)

public abstract class Shape{
    public void draw(){}
    public void erase(){}
    public int getLength(){
        return length;
    }
    protected abstract double getArea();
}

public class Triangle extends Shape implements Resizable{
    public boolean isEquilateral(){}
    protected double getAtrea(){}
    public void resize(){}
}

public interface Resizable{
    public abstract void resize();
}

public class Rectangle extends Shape implements Resizable{
    public boolean isSquare()
    protected double getAtrea(){}
    public void resize(){}
}
</code></pre>
<pre><code class="language-java">ex5)

public class ClassRoom{
    private Student std;
    private ClassRoom(Student std){
        this.std = std;
    }
}

public class Student{
    private String name;
    private int age;
}</code></pre>
<pre><code class="language-java">ex6)

public class Library{
    private Book book;

    public Library(){
        this.book = new Book;
    }
}

public class Book{
    private String title;
    private String author;
}</code></pre>
<pre><code class="language-java">ex7)

public class Shop{
    private Projuct product;
    private Employee emp;

    public Shop(Projuct p){
        this.product = p;
        this.emp = new Employee();
    }
}

public class Employee{
    private String name;
}

public class Product{
    private String pName;
    private int price;
}
</code></pre>
<pre><code class="language-java">ex8)

public abstract class Coffee{
    public String beans;
}

public class CafeLatte extends Coffee{
    private String temperature;
    private int price;

    public void drink(){
        Option opt = new Option();
    }
}

public class Option{
    private int shot;
    private Stirng ice;
    pricate int syrup;
}

public class Cafe[
    private String name;
    private String address;
    private CafeLatte latte;

    public Cafe(CafeLatte latte){
        this.latte = latte;
    }
}

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JavaScript) DOM은 무엇인가? DOM - Node와 Element 이해하기]]></title>
            <link>https://velog.io/@jayden_/JavaScript-DOM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-DOM-Node%EC%99%80-Element-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jayden_/JavaScript-DOM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-DOM-Node%EC%99%80-Element-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 13 Apr 2023 18:27:23 GMT</pubDate>
            <description><![CDATA[<h2 id="dom이란">DOM이란?</h2>
<ul>
<li>HTML(웹문서, 웹페이지) 문서를 객체 기반으로 표현한 것<pre><code>  -&gt; HTML 문서에 작성된 내용을 트리구조(계층형으로 표현)로 나타냈을 때 각각의 태그, TEXT, COMMENT 등을 Node라고 한다.</code></pre></li>
</ul>
<pre><code class="language-html">&lt;h1&gt;Node 확인하기&lt;/h1&gt;
    &lt;ul id=&quot;test&quot;&gt;
      &lt;!-- Node 확인 테스트 주석입니다. --&gt;

      &lt;li id=&quot;li1&quot;&gt;1번&lt;/li&gt;
      &lt;li class=&quot;cls&quot;&gt;2번&lt;/li&gt;
      &lt;!-- 중간 주석 --&gt;
      &lt;li style=&quot;background-color: yellow&quot;&gt;3번&lt;/li&gt;
      &lt;li&gt;
        &lt;a href=&quot;#&quot;&gt;4번&lt;/a&gt;
      &lt;/li&gt;
    &lt;/ul&gt;</code></pre>
<h3 id="node-확인하기">Node 확인하기</h3>
<pre><code class="language-javascript">document.getElementById(&#39;btn1&#39;).addEventListener(&#39;click&#39;, () =&gt; {
  // #test의 모든 자식 노드를 얻어오기
  // - 요소.childNodes : 요소의 자식 노드를 모두 반환(NodeList)
  const list = document.getElementById(&#39;test&#39;).childNodes;

  console.log(list);</code></pre>
<p>결과
<img src="https://velog.velcdn.com/images/jayden_/post/c86f46e4-1250-41fc-b449-66431c53bd0e/image.png" alt="">
html의 코드를 list 변수에 담아 콘솔창에서 확인해보면 배열 형태로 나와있는 것을 확인할 수 있다.</p>
<h3>Node 탐색 방법</h3>

<p>1) 부모 노드 탐색 : parentNode</p>
<p>2) 첫 번째 자식 노드 탐색 : firstChild</p>
<p>3) 마지막 자식 노드 탐색 : lastChild</p>
<p>4) 원하는 위치(인덱스)에 존재하는 자식 노드 탐색
              : childNodes[index]
5) 이전 형제 노드 탐색 : previousSibling
6) 다음 형제 노드 탐색 : nextSibling
</pre></p>
<li id="li1">1번</li>
<li class="cls">2번</li>

<li style="background-color: violet">3번</li>
<li>
<a href="#">4번</a>
</li>
</ul>
<button id="btn1">확인하기</button>


<script>document.getElementById('btn1').addEventListener('click', () => {
  // #test의 모든 자식 노드를 얻어오기
  // - 요소.childNodes : 요소의 자식 노드를 모두 반환(NodeList)
  const list = document.getElementById('test').childNodes;
});
</script>]]></description>
        </item>
        <item>
            <title><![CDATA[(JavaScript) 팝업창으로 값 전달하고 받아오기 (opener 함수의 이해)]]></title>
            <link>https://velog.io/@jayden_/JavaScript-%ED%8C%9D%EC%97%85%EC%B0%BD%EC%9C%BC%EB%A1%9C-%EA%B0%92-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B3%A0-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0-opener-%ED%95%A8%EC%88%98%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@jayden_/JavaScript-%ED%8C%9D%EC%97%85%EC%B0%BD%EC%9C%BC%EB%A1%9C-%EA%B0%92-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B3%A0-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0-opener-%ED%95%A8%EC%88%98%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Thu, 13 Apr 2023 17:08:07 GMT</pubDate>
            <description><![CDATA[<p>처음 이벤트가 발생하기 전 창을 부모창,
팝업창 띄우기로 열린 새로운 창을 자식창이라고 한다.</p>
<p>부모창 -&gt; 자식창에 값을 전달할 수 있다(==자식이 opener 함수 호출로 부모창의 값을 가져올 수 있다)</p>
<pre><code class="language-javascript">팝업창으로 전달 : 
&lt;input type=&quot;text&quot; id=&quot;parentInput&quot; /&gt;&lt;button id=&quot;sendPopup&quot;&gt;전달하기&lt;/button&gt;

팝업창에서 받아온 값 : 
&lt;input type=&quot;text&quot; id=&quot;result&quot; readonly /&gt;</code></pre>
<p> 팝업창으로 전달 : <input type="text" id="parentInput" /><button id="sendPopup">전달하기</button>
팝업창에서 받아온 값 : <input type="text" id="result" readonly /></p>
<p>위 코드에서 input태그에 <code>id=&quot;parentInput&quot;</code>
input값을 팝업창으로 전달하는 button에는 <code>id=&quot;sendPopup&quot;</code>로 정해주었다.</p>
<p>아래 코드는 팝업창을 생성하는 javaScript코드이다.</p>
<pre><code class="language-javascript">const sendPopup = document.getElementById(&#39;sendPopup&#39;);

sendPopup.addEventListener(&#39;click&#39;, () =&gt; {
  window.open(&#39;팝업.html&#39;, &#39;팝업창&#39;, &#39;width=500, height=500&#39;);
});</code></pre>
<p>위의 코드를 해석하면, 먼저 <code>sendPopup</code>변수에 button을 저장하였고,
<code>addEventListener</code>로 <code>click</code>을 하면 <code>window.open()</code>함수를 호출할 수 있게 했다.
window.open() 함수는 팝업창을 열리게 하는 window 객체의 함수이며</p>
<p>문법은 아래와 같다.</p>
<pre><code class="language-javascript">var ret = window.open(url, name, specs, replace);</code></pre>
<p>자세한 내용은 다음 게시글에 정리하겠다.</p>
<p>이렇게 생성된 팝업창은 다음과 같다.</p>
<h4>부모로 부터 전달 받은 값 : <span id="message"></span></h4>

<p>부모창으로 전달 : <input type="text" id="childInput" /><button id="sendParent">전달하고 창닫기</button></p>
<pre><code class="language-html">부모로 부터 전달 받은 값 : &lt;span id=&quot;message&quot;&gt;&lt;/span&gt;

부모창으로 전달 : &lt;input type=&quot;text&quot; id=&quot;childInput&quot; /&gt;
&lt;button id=&quot;sendParent&quot;&gt;전달하고 창닫기&lt;/button&gt;</code></pre>
<p>부모창에서 전달 받은 값이 나타나는 span태그와 부모창으로 전달할 text타입의 input태그에 각각 <code>id=&quot;message&quot;</code>, <code>id=&quot;childInput&quot;</code>로 id를 지정해 주었다.</p>
<pre><code class="language-javascript">    // 부모 창에 작성된 #parentInput의 값 얻어오기
    // opener == 부모창
    const parentValue =     opener.document.getElementById(&#39;parentInput&#39;).value; 
    // input이기 때문에 value 나머지는 innerText
    // #message에 부모로 부터 얻어온 값 출력하기
    document.querySelector(&#39;#message&#39;).innerText = parentValue;

    // 부모창으로 값 전달하기
    const childInput = document.getElementById(&#39;childInput&#39;);
    const sendParent = document.getElementById(&#39;sendParent&#39;);

    sendParent.addEventListener(&#39;click&#39;, () =&gt; {
    // 부모창의 #result ( input 태그 )에
    // #childInput에 작성된 값 대입
    opener.document.getElementById(&#39;result&#39;).value = childInput.value;

    window.close();

});</code></pre>
<p>부모 창에 작성된 #parentInput의 값을 얻어오고 opener.을 통해 부모창의 값을 불러올 수 있다.
#message에 부모로 부터 얻어온 값 출력하고, 
부모창으로 값을 전달하기 위해 input태그와 button에 각각 <code>&#39;childInput&#39;</code>, <code>&#39;sendParent&#39;</code>id를 지정해주었고,
부모창의 #result (input 태그)에 #childInput에 작성된 값을 대입연산자를 사용하여 값을 대입해주었다.</p>
<pre><code class="language-javascript">sendParent.addEventListener(&#39;click&#39;, () =&gt; {
        // 부모창의 #result ( input 태그 )에
        // #childInput에 작성된 값 대입
opener.document.getElementById(&#39;result&#39;).value = childInput.value;

window.close(); //열린 팝업창(자식창) 닫기

});</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(HTML) form 태그]]></title>
            <link>https://velog.io/@jayden_/HTML-form-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@jayden_/HTML-form-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Mon, 10 Apr 2023 16:50:42 GMT</pubDate>
            <description><![CDATA[<h2 id="span-stylecolorvioletform-태그span"><span style="color:violet"><em>form 태그</em></span></h2>
<blockquote>
</blockquote>
<p> 서버 또는 지정된 페이지로 입력된 값을 제출하는 형태를 나타내는 태그</p>
<h3 id="--block-형식">- block 형식</h3>
<h4 id="속성">속성</h4>
<ul>
<li>action : 내부 input에 작성된 값을 제출할 경로 또는 주소를 작성</li>
<li>method(방식) : 서버 또는 페이지로 데이터를 제출하는 방식을 지정 <pre><code>          (GET, POST, PUT, DELETE)</code></pre></li>
<li>name : form 태그의 이름을 지정(Javascript에서 사용)</li>
<li>target : action 주소로 제출 시<pre><code>          결과가 현재/새 탭에 열리도록 지정</code></pre></li>
</ul>
 <form action="result.html" method="get" target="_blank">
아이디 : <input type="text" name="inputId" /> <br />

<p>이름 : <input type="text" name="inputName" /> <br /></p>
<p><button type="submit">제출하기</button></p>
</form>

<pre><code>&lt;!-- result.html로 get방식 제출, 결과는 새탭에서 확인 --&gt;

&lt;form action=&quot;result.html&quot; method=&quot;get&quot; target=&quot;_blank&quot;&gt;

아이디 : &lt;input type=&quot;text&quot; name=&quot;inputId&quot; /&gt; &lt;br /&gt;
이름 : &lt;input type=&quot;text&quot; name=&quot;inputName&quot; /&gt; &lt;br /&gt;
&lt;button type=&quot;submit&quot;&gt;제출하기&lt;/button&gt;

&lt;/form&gt;

&lt;!-- action 미작성 시 현재 페이지로 제출 --&gt;</code></pre><ul>
<li><p>fieldset 태그 : form 태그 내부에 구역을 구분하는 용도의 태그</p>
</li>
<li><p>legend 태그 : fieldset에 제목을 붙이는 태그</p>
</li>
<li><p>required 속성 : input 태그를 필수로 입력하게 만드는 속성</p>
</li>
</ul>
<h3 id="예시"><em>예시</em></h3>
<form>
  <fieldset>
<legend>필수 입력 정보</legend>

<p>이름 : <input type="text" name="inputName" required /> <br /></p>
<p>팀 선택 :
<label for="A">A팀</label>
<input type="radio" name="team" id="A" value="A" required />
    /
<label for="B">B팀</label>
<input type="radio" name="team" id="B" value="B" required /></p>
</fieldset>

<br />

<fieldset>
<legend>추가 개인 정보</legend>

<p>이메일 : <input type="email" name="inputEmail" /> <br />
나이 : <input type="number" min="0" max="150" /> <br />
주소 : <input type="text" size="30" /></p>
</fieldset>

<br />
<button>제출</button>
<button type="reset">초기화</button>
</form>


<h3 id="예시코드"><em>예시코드</em></h3>
<pre><code>&lt;form&gt;
      &lt;fieldset&gt;
        &lt;legend&gt;필수 입력 정보&lt;/legend&gt;

        이름 : &lt;input type=&quot;text&quot; name=&quot;inputName&quot; required /&gt; &lt;br /&gt;

        팀 선택 :
        &lt;label for=&quot;A&quot;&gt;A팀&lt;/label&gt;
        &lt;input type=&quot;radio&quot; name=&quot;team&quot; id=&quot;A&quot; value=&quot;A&quot; required /&gt;
        /
        &lt;label for=&quot;B&quot;&gt;B팀&lt;/label&gt;
        &lt;input type=&quot;radio&quot; name=&quot;team&quot; id=&quot;B&quot; value=&quot;B&quot; required /&gt;
      &lt;/fieldset&gt;
      &lt;br /&gt;

      &lt;fieldset&gt;
        &lt;legend&gt;추가 개인 정보&lt;/legend&gt;

        이메일 : &lt;input type=&quot;email&quot; name=&quot;inputEmail&quot; /&gt; &lt;br /&gt;
        나이 : &lt;input type=&quot;number&quot; min=&quot;0&quot; max=&quot;150&quot; /&gt; &lt;br /&gt;
        주소 : &lt;input type=&quot;text&quot; size=&quot;30&quot; /&gt;
      &lt;/fieldset&gt;

      &lt;br /&gt;
      &lt;button&gt;제출&lt;/button&gt;
      &lt;button type=&quot;reset&quot;&gt;초기화&lt;/button&gt;
    &lt;/form&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[(HTML) 입력 관련 태그]]></title>
            <link>https://velog.io/@jayden_/HTML-%EC%9E%85%EB%A0%A5-%EA%B4%80%EB%A0%A8-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@jayden_/HTML-%EC%9E%85%EB%A0%A5-%EA%B4%80%EB%A0%A8-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Mon, 10 Apr 2023 16:40:36 GMT</pubDate>
            <description><![CDATA[<h1 id="input-태그">input 태그</h1>
<h4 id="웹-문서에서-사용자가-입력할-수-있는-양식을-제공하는-태그">웹 문서에서 사용자가 입력할 수 있는 양식을 제공하는 태그</h4>
<h2 id="text와-관련된-태그">text와 관련된 태그</h2>
<h4 id="text-관련-태그에서-사용-가능한-속성">text 관련 태그에서 사용 가능한 속성</h4>
<ul>
<li>size : 입력 상자의 크기</li>
<li>maxlength :  입력 가능한 text의 최대 길이 설정</li>
<li>placeholder : 입력 상자에 작성되어야 할 내용을 설명</li>
<li>value : 입력 상자에 기본적으로 작성되어 있는 값(내용) 설정</li>
</ul>
<pre><code class="language-html">input type=&quot;text&quot;

- 한 줄 짜리 문자열(텍스트)를 입력할 수 있는 입력 상자
        - input 태그의 기본값으로 type 속성 미작성 시 자동으로 지정됨.

* 모든 input태그는 inline 형식이다!</code></pre>
<h3 id="input-typetext텍스트">input type=&quot;text&quot;<em>텍스트</em></h3>
<input type="text" />

<pre><code class="language-html">input type=&quot;password&quot;


- 비밀번호 입력상자
        - 입력되는 텍스를 가려줌

&lt;input type=&quot;password&quot; size=&quot;30&quot; maxlength=&quot;10&quot; placeholder=&quot;비밀번호&quot;&gt;</code></pre>
<h3 id="input-typepassword"><em>input type=&quot;password&quot;</em></h3>
<input type="password" size="30" maxlength="10" placeholder="비밀번호">

<h4 id="url-email-tel은-일반적으로-사용하게되면-typetext와-다를게-없다">url, email, tel은 일반적으로 사용하게되면 type=&quot;text&quot;와 다를게 없다.</h4>
<p>하지만, form태그 내부에 작성하게되면 입력된 값이 url,email,tel에 맞는 값인지 간단히 유효성 검사를 진행해준다.</p>
<h3 id="typeurl--주소url-입력-상자br">type=&quot;url&quot; : 주소(url) 입력 상자<br></h3>
<input type="url" size="50" value="https://">

<h3 id="typeemail--이메일-입력-상자br">type=&quot;email&quot; : 이메일 입력 상자<br></h3>
<input type="email" size="30" maxlength="30" placeholder="이메일 입력">

<h3 id="typetel--전화번호-입력-상자br">type=&quot;tel&quot; : 전화번호 입력 상자<br></h3>
<input type="tel" size="15" maxlength="15" value="010-">

<h3 id="typeurl--주소url-입력-상자br-1">type=&quot;url&quot; : 주소(url) 입력 상자<br></h3>
<input type="url" size="50" value="https://">

<h3 id="typeemail--이메일-입력-상자br-1">type=&quot;email&quot; : 이메일 입력 상자<br></h3>
<input type="email" size="30" maxlength="30" placeholder="이메일 입력">

<h3 id="typetel--전화번호-입력-상자br-1">type=&quot;tel&quot; : 전화번호 입력 상자<br></h3>
<input type="tel" size="15" maxlength="15" value="010-">


<h2 id="숫자-관련-태그">숫자 관련 태그</h2>
<h4 id="숫자-관련-태그에서-사용-가능한-속성">숫자 관련 태그에서 사용 가능한 속성</h4>
<ul>
<li>min : 최소값</li>
<li>max : 최대값</li>
<li>step : 증가/감소량 지정</li>
<li>placeholder : 입력될 값에 대한 설명(number만 가능)</li>
<li>value : 기본값 지정</li>
</ul>
<h3 id="input-typenumber"><em>input type=&quot;number&quot;</em></h3>
<pre><code>- 숫자와 숫자 관련된 표기만 작성 가능한 입력 상자
- 브라우저에 따라 스핀박스(위,아래 화살표)가 표시되기도 함</code></pre><p><img src="https://velog.velcdn.com/images/jayden_/post/a0ba864e-9f98-4f53-a933-9eeddd66700a/image.png" alt=""><img src="https://velog.velcdn.com/images/jayden_/post/40a41ce3-ecff-4ac6-b891-00aee7f2f18b/image.png" alt=""></p>
<p> <input
      type="number"
      min="0"
      max="100"
      step="5"
      placeholder="5점 단위로 입력"
    /></p>
<pre><code class="language-html">점수 입력 :
    &lt;input
      type=&quot;number&quot;
      min=&quot;0&quot;
      max=&quot;100&quot;
      step=&quot;5&quot;
      placeholder=&quot;5점 단위로 입력&quot;
    /&gt;</code></pre>
<h3 id="input-typerange"><em>input type=&quot;range&quot;</em></h3>
<ul>
<li>슬라이드 바를 이용해서 숫자를 지정 - 현재 지정된 숫자를 바로 확인하는게
  불가능 -&gt; 제출되는 페이지/Java 클래스 또는 Javascript를 이용해 확인</li>
</ul>
<p><input
      type="range"
      name="r"
      id="a"
      min="0"
      max="100"
      step="10"
      value="70"
    /></p>
<h2 id="날짜시간-관련-type">날짜/시간 관련 type</h2>
<p><input type="date" /><br>
<input type="month" /><br>
<input type="week" /><br>
<input type="time" /><br><br><input type="datetime" /><br>
<input type="datetime-local" /></p>
<pre><code class="language-html">&lt;input type=&quot;date&quot; /&gt;
&lt;input type=&quot;month&quot; /&gt;
&lt;input type=&quot;week&quot; /&gt;
&lt;input type=&quot;time&quot; /&gt;    
&lt;input type=&quot;datetime&quot; /&gt;
&lt;input type=&quot;datetime-local&quot; /&gt;</code></pre>
<h2 id="typeradio--typecheckbox--label-태그">type=&quot;radio&quot; / type=&quot;checkbox&quot; + label 태그</h2>
<ul>
<li><p>radio, checkbox 는
단독 사용 보단, 여러 관련된 값을 묶어서 처리하는 용도의 input type</p>
</li>
<li><p>radio : 여러 선택지 중 하나만 선택</p>
</li>
<li><p>checkbox : 여러 선택지 중 필요한 모두를 선택</p>
</li>
</ul>
<h3 id="속성">속성</h3>
<ul>
<li><p>value : 해당 요소를 선택했을 때 제출되는 값</p>
</li>
<li><p>id : 문서 내에서 해당 요소를 구분하기 위한 식별값</p>
<pre><code>          (중복 있으면 안됨,  label 태그와 같이 사용할 예정)</code></pre></li>
<li><p>name : 관련된 것들의 묶음 이름 + 제출되었을 때 key 값</p>
</li>
<li><p>checked : 해당 속성이 작성된 요소를 선택함 (기본값 설정)</p>
</li>
</ul>
<h3 id="input-typeradio-예시코드">input type=&quot;radio&quot; <em>예시코드</em></h3>
<form>
  <label for="aTeam">A팀</label> :
  <input type="radio" name="team" value="a" id="aTeam" /> <br />
  <label for="bTeam">B팀</label> :
  <input type="radio" name="team" value="b" id="bTeam" checked /> <br />
  <label for="cTeam">C팀</label> :
  <input type="radio" name="team" value="c" id="cTeam" /> <br />
  <button>제출</button><br>
  <label for="aTeam">A팀 누르기</label>

<h3 id="_--코드_">_  코드_</h3>
<pre><code class="language-html">    &lt;label for=&quot;aTeam&quot;&gt;A팀&lt;/label&gt; :
    &lt;input type=&quot;radio&quot; name=&quot;team&quot; value=&quot;a&quot; id=&quot;aTeam&quot; /&gt; &lt;br /&gt;
    &lt;label for=&quot;bTeam&quot;&gt;B팀&lt;/label&gt; :
    &lt;input type=&quot;radio&quot; name=&quot;team&quot; value=&quot;b&quot; id=&quot;bTeam&quot; checked /&gt; &lt;br /&gt;
    &lt;label for=&quot;cTeam&quot;&gt;C팀&lt;/label&gt; :
    &lt;input type=&quot;radio&quot; name=&quot;team&quot; value=&quot;c&quot; id=&quot;cTeam&quot; /&gt; &lt;br /&gt;
    &lt;button&gt;제출&lt;/button&gt;</code></pre>
<h3 id="input-typecheckbox-예시코드">input type=&quot;checkbox&quot; <em>예시코드</em></h3>
<p>  <label for="java">Java</label>
      <input
        type="checkbox"
        name="skill"
        id="java"
        value="자바"
        checked
      /></p>
<p>   <label for="db">DB</label>
      <input type="checkbox" name="skill" id="db" value="디비" checked /><br /></p>
<p>  <label for="html">HTML</label>
      <input type="checkbox" name="skill" id="html" value="HTML5" /><br /></p>
<pre><code class="language-html">&lt;label for=&quot;java&quot;&gt;Java&lt;/label&gt;
      &lt;input
        type=&quot;checkbox&quot;
        name=&quot;skill&quot;
        id=&quot;java&quot;
        value=&quot;자바&quot;
        checked
      /&gt;&lt;br /&gt;

&lt;label for=&quot;db&quot;&gt;DB&lt;/label&gt;
&lt;input type=&quot;checkbox&quot; 
         name=&quot;skill&quot; 
         id=&quot;db&quot; 
         value=&quot;디비&quot; 
         checked /&gt;&lt;br /&gt;

&lt;label for=&quot;html&quot;&gt;HTML&lt;/label&gt;
&lt;input type=&quot;checkbox&quot; 
         name=&quot;skill&quot; 
         id=&quot;html&quot; 
         value=&quot;HTML5&quot; /&gt;&lt;br /&gt;

      &lt;button&gt;제출&lt;/button&gt;</code></pre>
<h2 id="이름이-input이-아닌-변형된-input-태그">이름이 input이 아닌 변형된 input 태그</h2>
<h3 id="button-태그"><em>button 태그</em></h3>
<ul>
<li>버튼을 만드는 용도`의 태그<ul>
<li>단독으로 사용되기 보단, form와 함께 사용하는 경우가 많음</li>
</ul>
</li>
</ul>
<h4 id="type-속성-값">type 속성 값</h4>
<ul>
<li>submit : 제출 버튼(기본값)</li>
<li>reset : form태그 내부 모든 input 태그의 값을 초기화</li>
<li>button : 기능이 지정되지 않은 버튼(모양만 버튼)</li>
<li><blockquote>
<p>JavaScript를 이용해서 기능을 추가해줄 수 있다.</p>
</blockquote>
</li>
</ul>
<p>이름 : <input type="text" name="name" /> <br />
나이 : <input type="number" name="age" /> <br />
이메일 : <input type="email" name="email" /> <br /></p>
<p>  <button type="submit">submit</button>
      <button type="reset">reset</button>
      <button type="button" onclick="alert('버튼 클릭됨')">button</button></p>
<pre><code class="language-h">  이름 : &lt;input type=&quot;text&quot; name=&quot;name&quot; /&gt; &lt;br /&gt;
  나이 : &lt;input type=&quot;number&quot; name=&quot;age&quot; /&gt; &lt;br /&gt;
  이메일 : &lt;input type=&quot;email&quot; name=&quot;email&quot; /&gt; &lt;br /&gt;

  &lt;button type=&quot;submit&quot;&gt;submit&lt;/button&gt;
  &lt;button type=&quot;reset&quot;&gt;reset&lt;/button&gt;
  &lt;button type=&quot;button&quot; onclick=&quot;alert(&#39;버튼 클릭됨&#39;)&quot;&gt;button&lt;/button&gt;</code></pre>
<h3 id="_--textarea-태그_">_  textarea 태그_</h3>
<ul>
<li><p>input type=&quot;text&quot;의 한계(1줄만 작성함)를 해결한 태그</p>
</li>
<li><p>여러 줄 작성 가능</p>
</li>
</ul>
<h4 id="속성-1">속성</h4>
<ul>
<li><p>rows : 행의 개수(몇 줄)</p>
</li>
<li><p>cols : 열의 개수(한 줄에 들어갈 글자 개수)</p>
<p><textarea cols="80" rows="3"></textarea></p>
<pre><code class="language-html">&lt;textarea cols=&quot;80&quot; rows=&quot;3&quot;&gt;&lt;/textarea&gt;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JDBC) DAO 작성 예제]]></title>
            <link>https://velog.io/@jayden_/JDBC-DAO-%EC%9E%91%EC%84%B1-%EC%98%88%EC%A0%9C</link>
            <guid>https://velog.io/@jayden_/JDBC-DAO-%EC%9E%91%EC%84%B1-%EC%98%88%EC%A0%9C</guid>
            <pubDate>Tue, 04 Apr 2023 15:10:52 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">package edu.kh.jdbc.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import edu.kh.jdbc.dto.Employee1;

//DAO (Data Access Object) : 데이터에 접근하기 위한 객체 
//  === DB 연결 역할 객체
public class SelectDepartmentTitleDAO {



    /** 부서명으로 사원 조회
     * 
     * @param departmentTitle
     * @return empList
     */

    public List&lt;Employee1&gt; select(String departmentTitle) {

        // 조회 결과를 저장하고 반환할 때 사용할 List를 생성
        List&lt;Employee1&gt; empList = new ArrayList&lt;&gt;();   //타입 추론  
                                                    // 이걸 만드는 동시에 반환값을 void 에서 List&lt;Employee1&gt;로 바꿔주기!!!


        // 1단계 : JDBC 객체 참조 변수 선언
        Connection conn = null;      // DB 연결 정보를 저장, Statement 통로 
        Statement stmt = null;        // SQL 수행, 결과 반환
        ResultSet rs = null;        // SELECT 수행 결과 저장용 객체

        // 2단계 : 참조변수에 알맞는 값 대입

        try {
            Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
            // 메모리에 드라이버 객체 로드

            String type = &quot;jdbc:oracle:thin:@&quot;; // 드라이버 종류
            String ip = &quot;115.90.212.22&quot;;
            String port = &quot;:9000&quot;; // 컴퓨터 내 응용프로그램 번호 
            String dbName = &quot;:XE&quot;;
            String user = &quot;kh_kkw&quot;;
            String pw = &quot;oracle_kkw123A&quot;;

            // DriverManager를 이용해 Connection 생성하여 얻어오기
            conn = DriverManager.getConnection(type+ip+port+dbName, user, pw);
                                                //  url

            // SQL 작성
             String condition = null;

             if(departmentTitle.toLowerCase().equals(&quot;null&quot;)) { // null이 입력된 경우
                condition = &quot;WHERE DEPT_TITLE IS NULL &quot;;
             }else {
                condition = &quot;WHERE DEPT_TITLE = &#39;&quot; + departmentTitle + &quot;&#39;&quot;;
             }

             // SQL 작성
             String sql =  &quot;SELECT EMP_ID, EMP_NAME, SALARY, DEPT_TITLE &quot;
                      + &quot;FROM EMPLOYEE &quot;
                      + &quot;LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID) &quot;
                      + condition
//                      + &quot;WHERE DEPT_TITLE = &#39;&quot; + departmentTitle + &quot;&#39;&quot;
                      + &quot; ORDER BY EMP_ID&quot;;
            stmt = conn.createStatement(); // Statement 객체 생성

            rs = stmt.executeQuery(sql);  // SELECT 수행 후 결과 반환 받기 


            while(rs.next()) {// 커서를 1행씩 이동
                              // 다음 행이 없을 때 까지

    //            String empId = rs.getString(&quot;EMP_ID&quot;);
                String empId = rs.getString(1);
                String empName = rs.getString(2);
                int salary = rs.getInt(3);
                String title = rs.getString(4);

                // 조회된 컬럼 값을 Employee1 객체에 저장
                Employee1 emp = new Employee1(empId, empName, salary, title);

                // 컬럼 값이 저장된 객체를 empList에 추가
                empList.add(emp);


            }


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 4단계 : 
            try {
                if( rs !=null) rs.close();
                if( stmt !=null) rs.close();
                if( conn !=null) rs.close();


            }catch(SQLException e) {
                e.printStackTrace();
            }
        }


        return empList;  // 조회 결과가 담긴 empList 반환



    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JDBC) JDBC 기본코드의 이해]]></title>
            <link>https://velog.io/@jayden_/JDBC-JDBC-%EA%B8%B0%EB%B3%B8%EC%BD%94%EB%93%9C%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@jayden_/JDBC-JDBC-%EA%B8%B0%EB%B3%B8%EC%BD%94%EB%93%9C%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Tue, 04 Apr 2023 14:24:40 GMT</pubDate>
            <description><![CDATA[<h2 id="span-stylecolorolivedrab1단계--jdbc-객체-참조-변수-선언-span"><span style="color:olivedrab">1단계 : JDBC 객체 참조 변수 선언 </span></h2>
<pre><code class="language-java">Connection conn = null;</code></pre>
<ul>
<li><p><code>DB연결 정보를 담는 객체</code>, 이 정보를 이용해 Java-DB 연결 통로 생성
Connection을 상속 받아 구현한 자식 객체가 대입될 예정</p>
</li>
<li><p>DBMS 이름, 타입, IP, PORT, 계정명, 비밀번호 저장
DBeaver의 계정 접속 방법 추가와 유사함</p>
</li>
<li><p>왜 Connection은 인터페이스일까??
DBMS마다 연결 정보, 방법이 다르기 때문에</p>
<pre><code> 상속을 받아 공통된 부분을 DBMS 마다 알맞게 구현하고
 구현된 객체를 Java에서 참조해서 사용</code></pre></li>
</ul>
<pre><code class="language-java">Statement stmt = null;</code></pre>
<ul>
<li>sql을 DB에 전달해 수행하고 (<code>DBMS로 작성한 쿼리문을 실행</code>)<pre><code>  결과(`ResultSet 또는 DML 성공 행의 개수`)를 반환 받는데 사용되는 객체</code></pre></li>
</ul>
<pre><code class="language-java">ResultSet rs = null;</code></pre>
<ul>
<li><p>SELECT 수행 결과를 저장하는 객체</p>
</li>
<li><p>조회 결과의 집합을 나타냄 
테이블 모양으로 반환됨
<code>ResultSet 객체를 이용해서 1행씩 접근</code>
<code>더 이상 접근할 행이 없을 경우 false 반환</code></p>
<h2 id="span-stylecolorolivedrab2단계--1단계에서-선언한-참조-변수에-알맞은-객체-대입span"><span style="color:olivedrab">2단계 : 1단계에서 선언한 참조 변수에 알맞은 객체 대입</span></h2>
</li>
</ul>
<ol>
<li>DB 연결에 필요한 Oracle JDBC Driver 객체를 메모리에 로드하기 </li>
</ol>
<p>-&gt; OracleDriver.class를 객체로 만들어두기 </p>
<pre><code class="language-java">Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);

-&gt; () 작성된 경로에 존재하는 클래스를 이용해 객체를 생성
-&gt; 메모리에 객체가 생성되고 Connection을 이용한 DB 연결시 
   이를 자동으로 참조한다.</code></pre>
<ol start="2">
<li>DB 연결 정보를 담은 Connection 객체 생성</li>
</ol>
<p>-&gt; DriverManager를 이용해서 생성함!</p>
<pre><code class="language-java">**DB 연결을 위한 정보를 변수에 저장**
tring type = &quot;jdbc:oracle:thin:@&quot;; // 드라이버 종류

String ip = &quot;115.90.212.**&quot;;                        
String port = &quot;:**00&quot;; // 컴퓨터 내 응용프로그램 번호 
String dbName = &quot;:**&quot;;
String user = &quot;**_***&quot;;
String pw = &quot;oracle_**&quot;;</code></pre>
<pre><code class="language-java">**DriverManager 객체**

- 메모리에 로드된 JDBC드라이버 객체를 이용해 DB에 접근하고 
작성된 정보를 이용해 DB와 연결 가능한 
Connection 객체를 만들어 얻어오는 역할을 하는 객체

// Connection (통로) 생성 -&gt; SQLException 발생 가능성이 있음
conn = DriverManager.getConnection(type+ip+port+dbName,user,pw);</code></pre>
<h2 id="span-stylecolorolivedrab3단계--sql-작성-및-작성한-쿼리문-실행--결과-반환받기span"><span style="color:olivedrab">3단계 : SQL 작성 및 작성한 쿼리문 실행 &amp; 결과 반환받기</span></h2>
<pre><code class="language-java">String sql = &quot;SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE FROM EMPLOYEE&quot;;

            // 4. Statement 객체 생성
            // -&gt; DB에 SQL 전달 후 수행 -&gt; 결과를 반환 받음
            // ---&gt; Connection 내부에 생성되어 DB와 통신하는 역할
            stmt = conn.createStatement();

            // 5. Statement 객체를 통해 SQL(SELECT)을 수행하고
            //       결과(ResultSet)를 반환 받아와서 저장(rs)
            rs = stmt.executeQuery(sql);

            // executeQuery() : SELECT문을 수행하는 메서드
            //                    결과로 ResultSet 반환

            // 3단계 : SQL 수행 결과로 반환 받은 ResultSet을
            // 첫 번째 행부터 1행씩 접근하여 컬럼 값을 얻어와 출력

            while(rs.next()) {
                // 조건식의 결과가 true일때 수행(반복)

                // rs.next()
                // - ResultSet 객체는 조회 결과를 한번에 테이블로 다루는 것이 아닌 
                //   커서라는 것을 이용해서 1행씩만 접근
                // - 커서를 다음 행으로 이동 후
                //   행이 존재하면 true, 없으면 false 반환

                // ** 현재 접근한 행의 컬럼 값을 얻어와 출력 **
                // rs.get자료형(컬럼명|컬럼순서);

                // [Java]            [DB]
                // Strong             CHAR, VARCHAR2
                // int, long        NUMBER(정수만)
                // float, double    NUMBER(실수만)
                // java.sql.Date    DATE    

                String empId = rs.getString(&quot;EMP_ID&quot;);
                // 현재 커서가 접근한 행의 &quot;EMP_ID&quot; 컬럼의 값을 얻어와ㅓㅅ
                // String으로 반환한다.

                String empName = rs.getString(&quot;EMP_NAME&quot;);

                int salary = rs.getInt(&quot;SALARY&quot;);

                Date hireDate =  rs.getDate(&quot;HIRE_DATE&quot;);

                System.out.printf(&quot;사번 : %s / 이름 : %s / 급여 : %d / 입사일 : %s \n&quot;, empId,empName,salary,hireDate.toString());
            }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JDBC) DAO 클래스 작성, 설명]]></title>
            <link>https://velog.io/@jayden_/JDBC-DAO-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9E%91%EC%84%B1-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@jayden_/JDBC-DAO-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9E%91%EC%84%B1-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Thu, 30 Mar 2023 17:36:26 GMT</pubDate>
            <description><![CDATA[<h2 id="span-stylecolorolivedrabdao-클래스란-span"><span style="color:olivedrab">DAO 클래스란? </span></h2>
<p>Data Access Object 의 줄임말로, <code>데이터베이스와의 상호작용을 담당하는 클래스이다.</code></p>
<p>보통 DAO 클래스는 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 수행하는 메소드들을 정의하고, 해당 메소드들을 사용하여 데이터베이스와의 상호작용을 처리합니다.</p>
<p>이러한 구조는 애플리케이션의 로직과 데이터베이스의 구조를 분리시켜서 유지보수를 쉽게 만들어주는 장점이 있습니다.</p>
<h3 id="span-stylecolorolivedrabdao-클래스-필드-작성법span"><span style="color:olivedrab">DAO 클래스 필드 작성법</span></h3>
<ol>
<li>JDBC 객체 참조 변수 생성</li>
</ol>
<pre><code class="language-java">    // 필드
    // JDBC 객체 참조 변수 
    private Statement stmt; // SQL 수행, 결과 반환
    private PreparedStatement pstmt; // placeholder를 포함한 SQL 세팅/수행
    private ResultSet rs; // SELECT 수행 결과 저장</code></pre>
<ol start="2">
<li><p>Properties 객체 참조변수 생성</p>
<pre><code class="language-java">private Properties prop;

 // - Map&lt;String, String&gt; 형태
 // - XML 파일 입/출력 메서드를 제공</code></pre>
</li>
<li><p>DAO 기본 생성자 작성</p>
</li>
</ol>
<pre><code class="language-java">public MainDAO() { // 기본 생성자

        // DAO 객체가 생성될 때 XML 파일을 읽어와 Properties 객체에 저장
        try {
            prop = new Properties();
            prop.loadFromXML(new FileInputStream(&quot;main-sql.xml&quot;));
            // -&gt; Properties 객체에
            //    key:value 형식으로 xml내용이 저장됨

            // -&gt; prop.getProperty(&quot;key&quot;) 호출
            //   --&gt; value (SQL) 반환

        }catch (Exception e) {
            e.printStackTrace();
        }

    }</code></pre>
<h3 id="span-stylecolorolivedrabdao-기본생성자-생성-시-예외처리-하는-이유는-span"><span style="color:olivedrab">DAO 기본생성자 생성 시 예외처리 하는 이유는? </span></h3>
<p>DAO 객체가 생성될 때 XML 파일을 읽어와 Properties 객체에 저장하는 부분에서 IOException 등의 예외가 발생할 수 있기 때문이다.
만약 예외 처리를 하지 않으면, 파일을 읽어올 수 없는 경우 프로그램이 예외를 던지고 종료될 수 있습니다. 
따라서 예외 처리를 해주면, 파일을 읽어오지 못했을 경우 프로그램이 종료되지 않고 예외를 처리하여 문제를 해결할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JDBC) PreparedStatement]]></title>
            <link>https://velog.io/@jayden_/JDBC-PreparedStatement</link>
            <guid>https://velog.io/@jayden_/JDBC-PreparedStatement</guid>
            <pubDate>Thu, 30 Mar 2023 17:24:44 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>PreparedStatement는 JDBC API에서 제공하는 인터페이스 중 하나로, SQL 쿼리를 실행하기 위해 미리 컴파일된 객체입니다.</p>
</li>
<li><p>PreparedStatement는 SQL 문장을 먼저 컴파일하고, 그것을 나중에 나타날 값을 채우기 위해 사용됩니다. 이를 통해 동일한 SQL 문장을 여러 번 실행할 경우, 매번 문장을 컴파일하는 오버헤드를 줄일 수 있어서 성능을 향상시킬 수 있습니다.</p>
</li>
<li><p>PreparedStatement 객체는 Connection 객체의 prepareStatement() 메소드를 사용하여 생성합니다. 그리고 SQL 문장을 ? 기호로 표시하여 작성한 후, setXXX() 메소드를 사용하여 ?에 해당하는 값을 설정합니다. 여기서 XXX는 데이터 타입에 따라 setInt(), setString(), setDate() 등의 메소드가 제공됩니다.</p>
</li>
<li><p>PreparedStatement는 SQL 인젝션 공격을 방지하는데도 유용합니다. SQL 인젝션 공격은 악의적인 사용자가 입력 필드에 SQL 문을 삽입하여, 애플리케이션이 실행하는 SQL 쿼리를 조작하는 것을 의미합니다. PreparedStatement는 컴파일된 쿼리에 값만 채우기 때문에, 삽입된 SQL 문장이 실행되지 않도록 방지할 수 있습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JDBC) Service 클래스에서 로그인 서비스 만들기]]></title>
            <link>https://velog.io/@jayden_/JDBC-Service-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jayden_/JDBC-Service-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 30 Mar 2023 17:18:20 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">public class MainService {

    private MainDAO dao = new MainDAO();

    /** 로그인 서비스
     * @param memberId
     * @param memberPw
     * @return Member
     * @throws Exception
     */
          //반환
    public Member login(String memberId, String memberPw) throws Exception{

        // 1. Connection 생성
        Connection conn = getConnection();

        // 2. DAO 호출
        Member member = dao.login(conn, memberId, memberPw);

        // 3. Connection 반환
        close(conn);

        // 4. 결과 반환
        return member;
    }</code></pre>
<h3 id="jdbc-service-클래스에서-해야할-일">JDBC Service 클래스에서 해야할 일</h3>
<ol>
<li><p>DAO 객체 생성: Service 클래스에서는 DAO 객체를 생성하고, 이를 활용하여 데이터베이스와 상호작용합니다. DAO 객체는 보통 생성자를 통해 생성한다.</p>
</li>
<li><p>트랜잭션 관리: 여러 개의 DAO 메소드를 실행하는 경우, 이들 메소드를 하나의 트랜잭션으로 묶어서 실행해야 합니다. Service 클래스에서는 이러한 트랜잭션을 관리합니다.</p>
</li>
<li><p>비즈니스 로직 수행: Service 클래스에서는 DAO 객체를 사용하여 비즈니스 로직을 수행합니다. 이를 통해 데이터베이스에 저장된 데이터를 가져오고, 가공하여 필요한 정보를 생성하거나 변경하는 등의 작업을 수행합니다.</p>
</li>
<li><p>예외 처리: Service 클래스에서는 DAO 메소드에서 발생하는 예외를 적절하게 처리해야 합니다. 이를 통해 애플리케이션의 안정성을 유지할 수 있습니다. 보통 try-catch 구문을 사용하여 예외를 처리하며, 예외를 처리한 후 Service 메소드에서 예외를 반환합니다.(throws Exception)</p>
</li>
<li><p>결과 반환: Service 클래스에서는 DAO 메소드에서 반환된 결과를 가공하여 Controller나 다른 Service 클래스에서 사용할 수 있는 형태로 반환합니다. </p>
</li>
</ol>
<blockquote>
<p>이 코드에서는 DAO 클래스는 <code>Member</code> 정보를 데이터베이스에서 가져오는 역할을 수행합니다. 
login 메소드에서는 DAO 객체를 생성하고, 이를 통해 데이터베이스에서 memberId와 memberPw를 검증한 후, 해당 회원 정보를 담은 <code>Member</code> 객체를 반환합니다.</p>
</blockquote>
<ol>
<li><p>DAO 호출 </p>
<pre><code class="language-java">Member member = dao.login(conn, memberId, memberPw); </code></pre>
<p><code>memberId</code>, <code>memberPw</code> 값 전달 받음</p>
</li>
<li><p>Connection 반환 ( INSERT/UPDATE/DELETE) 같은 DML 작업이 아니라 SELECT 작업이기 때문에 트랜잭션 처리 필요없음. 
<code>close(conn);</code></p>
</li>
<li><p>결과 반환 
<code>return member;</code></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JDBC) JDBCTemplete 설명]]></title>
            <link>https://velog.io/@jayden_/JDBC-JDBCTemplete-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@jayden_/JDBC-JDBCTemplete-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Thu, 30 Mar 2023 15:59:56 GMT</pubDate>
            <description><![CDATA[<h3 id="jdbctemplate이란">JDBCTemplate이란?</h3>
<h4 id="jdbc-관련-작업을-위한-코드를-제공하는-클래스">JDBC 관련 작업을 위한 코드를 제공하는 클래스</h4>
<ul>
<li>DB 연결을 위한 Connection 생성 구문</li>
<li>JDBC 객체 자원 반환 구문(close)</li>
<li>commit, rollback 구문</li>
<li>auto commit 기능 off</li>
<li>어디서든 클래스명.메서드명 으로 호출 가능하도록
public static으로 작성한다.</li>
</ul>
<h3 id="필드작성">필드작성</h3>
<pre><code class="language-java">// 필드
    private static Connection conn = null;
    // 왜 static 필드?
    // - static 메서드가 참조 가능한 필드는 static 필드 밖에 없기 때문에</code></pre>
<pre><code class="language-java">public static Connection getConnection() {

        try {

            // 커넥션 객체가 없거나 닫혀있는 경우
            // -&gt; 새로운 연결(커넥션 다시 얻어오기)
            if(conn == null || conn.isClosed()) {

                // conn.isClosed() : 커넥션이 close 상태이면 true 반환

                Properties prop = new Properties();
                // Map&lt;String, String&gt; 형태, XML 파일 입출력 특화

                prop.loadFromXML(  new FileInputStream(&quot;driver.xml&quot;)  );
                // 스트림을 이용해서 driver.xml 파일을 읽어와 prop에 저장

                // prop에 저장된 값을 변수로 따로 저장
                String driver = prop.getProperty(&quot;driver&quot;);
                String url = prop.getProperty(&quot;url&quot;); // key값
                String user = prop.getProperty(&quot;user&quot;);//key값
                String pw = prop.getProperty(&quot;pw&quot;);//key값


                // Oracle JDBC Driver 객체 메모리 로드
                Class.forName(driver);

                // DriverManager를 이용해 Connection 얻어오기
                conn = DriverManager.getConnection(url, user, pw);

                // ** 자동 커밋 비활성화 ** //
                // -&gt; 왜? 개발자가 직접 트랜잭션을 제어하기 위해서
                conn.setAutoCommit(false);
            }

        }catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }

</code></pre>
<h2 id="getconnection-메서드란">getConnection() 메서드란?</h2>
<p>Connection 생성</p>
<pre><code class="language-java">Connection conn = getConnection();</code></pre>
<p>JDBCTemplete에서 커넥션이 기존에 없었거나 닫혀있었으면 
<code>Properties prop = new Properties();</code> 라는  <code>Map&lt;String,String&gt;</code> 형태의 객체를 </p>
<p>스트림을 이용해서 외부에 있는 <code>“driver.xml”</code> 파일을 읽어와서</p>
<pre><code class="language-java">prop.loadFromXML(  new FileInputStream(&quot;driver.xml&quot;)  );
</code></pre>
<pre><code class="language-java">** driver.xml에는 &lt;key,value&gt;형태로 세팅이 되어있다.**

    &lt;entry key=&quot;driver&quot;&gt;oracle.jdbc.driver.OracleDriver&lt;/entry&gt;
    &lt;entry key=&quot;url&quot;&gt;jdbc:oracle:thin:@115.9*.21*.22:9000:XE&lt;/entry&gt;
    &lt;entry key=&quot;user&quot;**_***&lt;/entry&gt;
    &lt;entry key=&quot;pw&quot;&gt;oracle_******&lt;/entry&gt;
</code></pre>
<p>prop에 저장한다.</p>
<pre><code class="language-java">String driver = prop.getProgerty(“driver”);
String url = prop.getProperty(“url”); 
String user = prop.getProperty(“user”);
String pw = prop.getProperty(“pw”);) 

**prop에 저장된 값을 변수로 따로 저장하는 과정**</code></pre>
<p>prop에 저장 후 새로운 connection 객체를 만들어서 </p>
<pre><code class="language-java">conn = DriverManager.getConnection(url, user, pw);</code></pre>
<p>conn 값을 반환하는 메서드이다.</p>
<pre><code class="language-java">return conn;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(Java) 인터페이스의 장점]]></title>
            <link>https://velog.io/@jayden_/Java-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%9D%98-%EC%9E%A5%EC%A0%90-65okhfn0</link>
            <guid>https://velog.io/@jayden_/Java-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%9D%98-%EC%9E%A5%EC%A0%90-65okhfn0</guid>
            <pubDate>Wed, 29 Mar 2023 00:44:30 GMT</pubDate>
            <description><![CDATA[<h2 id="인터페이스의-장점">인터페이스의 장점</h2>
<ul>
<li><p>개발 시간을 단축시킬 수 있다.
== 일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하기 때문에 메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문이다.</p>
</li>
<li><p>표준화가 가능하다.
== 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.</p>
</li>
<li><p>서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
== 서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.</p>
</li>
<li><p>독립적인 프로그래밍이 가능하다.
== 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성하는 것이 가능하다. 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[(Java) 인스턴스 변수 vs 매개 변수 ]]></title>
            <link>https://velog.io/@jayden_/Java-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98-vs-%EB%A7%A4%EA%B0%9C-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@jayden_/Java-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98-vs-%EB%A7%A4%EA%B0%9C-%EB%B3%80%EC%88%98</guid>
            <pubDate>Wed, 29 Mar 2023 00:36:19 GMT</pubDate>
            <description><![CDATA[<p>인스턴스 변수(instance variable)는 클래스 내부에서 선언되며, 해당 클래스의 인스턴스(객체)가 생성될 때마다 생성되는 변수입니다. 클래스의 모든 메서드에서 접근 가능하며, 인스턴스마다 값이 다를 수 있습니다.</p>
<p>매개변수(parameter)는 메서드가 호출될 때 전달되는 값입니다. 메서드의 정의부에서 매개변수가 선언되며, 메서드 내부에서만 접근 가능합니다. 매개변수는 메서드를 호출할 때 전달되는 값에 따라 다르게 동작할 수 있습니다.</p>
<p>예를 들어, 다음과 같은 클래스가 있다고 가정해봅시다.</p>
<pre><code class="language-java">public class Rectangle {
    int width;
    int height;

    public int calculateArea(int width, int height) {
        return width * height;
    }
}
</code></pre>
<p>이 클래스에는 width와 height라는 인스턴스 변수가 있습니다. 이 변수들은 해당 클래스의 인스턴스가 생성될 때마다 생성되는 변수입니다.</p>
<p>calculateArea 메서드는 매개변수 width와 height를 가지고 있습니다. 이 매개변수들은 메서드가 호출될 때 전달되는 값에 따라 다르게 동작합니다. 이 메서드는 매개변수로 전달된 width와 height를 이용하여 사각형의 넓이를 계산한 뒤 반환합니다.</p>
<p>즉, 인스턴스 변수는 클래스 내부에서 사용되며, 인스턴스마다 값이 다를 수 있습니다. 매개변수는 메서드 내부에서 사용되며, 해당 메서드가 호출될 때 전달된 값에 따라 동작합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(Javascript) str.indexOf(text)]]></title>
            <link>https://velog.io/@jayden_/Javascript-str.indexOftext</link>
            <guid>https://velog.io/@jayden_/Javascript-str.indexOftext</guid>
            <pubDate>Mon, 27 Mar 2023 15:02:50 GMT</pubDate>
            <description><![CDATA[<h3 id="strindexoftext--문자를-인수로-받아-몇-번째-위치하는지-알려주는-메서드">str.indexOf(text) : 문자를 인수로 받아 몇 번째 위치하는지 알려주는 메서드</h3>
<pre><code class="language-javascript">let desc = &#39;Hi, guys, Nice to meet you.&quot;;

desc.indexOf(&#39;to&#39;); // 14   **0부터 


만약 찾는 문자열이 없는 경우 -1 반환

desc.indexOf(&#39;man&#39;); // -1

**포함된 문자열이 여러개라도 맨 첫번째 문자열 위치만 반환</code></pre>
<pre><code class="language-javascript">if(desc.indexOf(&#39;Hi&#39;)){  //false -&gt; Hi는 해당 문장에서 맨 첫번째에 위치, 
                        //index[0]에 해당한다 -&gt; if문 조건에서 0은 false
      console.log(&#39;Hi가 포함된 문장입니다.&#39;); -&gt; 콘솔에 나타나지 않음
}

따라서 조건식에서 사용하려면 
if(desc.indexOf(&#39;Hi&#39;) &gt; -1){  
      console.log(&#39;Hi가 포함된 문장입니다.&#39;); -&gt; 콘솔에 나타나지 않음
}
-1보다 큰지 비교해야 한다.(-1보다 크다 == 해당 문자열을 포함하고 있다).</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(Javascript) NaN과 isNaN() 메서드]]></title>
            <link>https://velog.io/@jayden_/Javascript-NaN%EA%B3%BC-isNaN-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@jayden_/Javascript-NaN%EA%B3%BC-isNaN-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Mon, 27 Mar 2023 14:09:31 GMT</pubDate>
            <description><![CDATA[<h3 id="nan이란">NaN이란?</h3>
<p><code>NaN</code>은 &quot;Not a Number&quot;의 약자로, 자바스크립트에서 숫자가 아닌 값을 나타내는 특별한 값입니다. NaN은 숫자 타입입니다.</p>
<p>자바스크립트에서 숫자가 아닌 연산을 수행하면 NaN이 반환됩니다. 
예를 들어, 0을 0으로 나누는 경우나 문자열을 숫자로 변환할 수 없는 경우에 NaN이 반환됩니다.</p>
<p>자바스크립트에서 NaN은 다른 값과 동등성을 비교할 때 <code>항상 false를 반환</code>합니다. 
따라서, <code>NaN은 자기 자신과도 같지 않습니다.</code> 이러한 특성 때문에 isNaN() 함수를 사용하여 값이 NaN인지 확인할 수 있습니다.</p>
<pre><code class="language-javascript">예시

console.log(typeof NaN); // &quot;number&quot;

let result = 0 / 0;
console.log(result); // NaN
console.log(result == NaN); // false
console.log(isNaN(result)); // true

let str = &quot;Hello&quot;;
console.log(parseInt(str)); // NaN
</code></pre>
<h3 id="isnan-메서드">isNaN() 메서드</h3>
<p><code>isNaN()</code>은 자바스크립트 내장 함수로, 인수로 전달된 값이 NaN인지 확인하는 함수입니다. isNaN()은 전달된 값이 숫자인지 검사한 후, <em>값이 NaN이면 true를 반환하고</em>, 그렇지 않으면 false를 반환합니다.</p>
<p>주의할 점은, <code>isNaN()</code>은 전달된 값이 숫자가 아닌 경우, 값이 숫자로 변환될 수 있는지 여부에 따라서도 결과가 달라집니다. 만약 전달된 값이 문자열 &quot;hello&quot;와 같은 문자열이라면, isNaN()은 이 값을 숫자로 변환할 수 없으므로 true를 반환합니다. 
하지만 전달된 값이 문자열 &quot;123&quot;과 같은 숫자 형식의 문자열이라면, isNaN()은 이 값을 숫자로 변환할 수 있으므로 false를 반환합니다.</p>
<pre><code class="language-javascript">예시

console.log(isNaN(NaN)); // true
console.log(isNaN(123)); // false
console.log(isNaN(&quot;hello&quot;)); // true
console.log(isNaN(&quot;123&quot;)); // false
console.log(isNaN(&quot;&quot;)); // false (빈 문자열은 0으로 간주)
console.log(isNaN(true)); // false (true는 1로 간주)
console.log(isNaN(null)); // false (null은 0으로 간주)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(Javascript) Math. 메서드]]></title>
            <link>https://velog.io/@jayden_/Javascript-Math.-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@jayden_/Javascript-Math.-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Mon, 27 Mar 2023 14:01:00 GMT</pubDate>
            <description><![CDATA[<ol>
<li>Math.ceil() : 올림<pre><code class="language-javascript">let num1 = 5.1;
let num2 = 5.8;
</code></pre>
</li>
</ol>
<p>Math.ceil(num1); // 6
Math.ceil(num2); // 6</p>
<pre><code>2. Math.floor() : 내림
```javascript
Math.floor(num1); // 5
Math.floor(num2); // 5</code></pre><ol start="3">
<li><p>Math.round() : 반올림</p>
<pre><code class="language-javascript">Math.round(num1) // 5
Math.round(num2) // 6</code></pre>
</li>
<li><p>Math.max() / Math.min() : 괄호안의 인수들 중 각각 최대값, 최소값을 반환한다.</p>
</li>
</ol>
<pre><code class="language-javascript">Math.max(1,4,-1,5,10,9,5.54); // 10
Math.min(1,4,-1,5,10,9,5.54); // -1</code></pre>
<ol start="5">
<li>Math.abs() : 절대값<pre><code class="language-javascript">Math.abs(-1) // 1</code></pre>
</li>
</ol>
<p>6.Math.pow(n,m) : 제곱</p>
<pre><code class="language-javascript">Math.pow(2,10); // 1024</code></pre>
<ol start="7">
<li>Math.sqrt() : 제곱근<pre><code class="language-javascript">Math.sqrt(16) // 4</code></pre>
</li>
</ol>
<h3 id="소수점-자리수-표현-방법">소수점 자리수 표현 방법</h3>
<h4 id="1-mathround-활용">1. Math.round() 활용</h4>
<ul>
<li>요구사항 : 소수점 둘째자리 까지 표현(셋째 자리에서 반올림)<pre><code class="language-javascript">let userRate = 30.1234
</code></pre>
</li>
</ul>
<p>userRate * 100 // 3012.34</p>
<p>Math.round(userRate * 100) // 3012</p>
<p>Math.round(userRate * 100)/100 // 30.12</p>
<pre><code>#### 2. toFixed() 사용
- 요구사항 : 소수점 둘째자리 까지 표현(셋째 자리에서 반올림)
```javascript
let userRate = 30.1234

userRate.toFixed(2);  // 30.12
userRate.toFixed(0);  // 30
userRate.toFixed(6);  // 30.123400  -&gt; 초과되는 자릿수를 0으로 채워줌 

*** toFixed는 문자열을 반환한다. ***

따라서 반환받은 후에 Number를 활용해 숫자로 변환 후 사용하는 경우가 많다!!!

userRate.toFixed(2);             // 30.12(문자열)
Number(userRate.toFixed(2));    // 30.12(숫자)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[(Javascript) Symbol.for() : 전역 심볼]]></title>
            <link>https://velog.io/@jayden_/Javascript-Symbol.for-%EC%A0%84%EC%97%AD-%EC%8B%AC%EB%B3%BC</link>
            <guid>https://velog.io/@jayden_/Javascript-Symbol.for-%EC%A0%84%EC%97%AD-%EC%8B%AC%EB%B3%BC</guid>
            <pubDate>Mon, 27 Mar 2023 13:42:19 GMT</pubDate>
            <description><![CDATA[<p>Symbol 타입은 이름이 같더라도 모두 다른 존재로 인식한다.
그런데 가끔 전역변수처럼 이름이 같으면 같은 객체를 가리켜야 할 상황도 생긴다. 이럴때 사용하는 것이 <code>Symbol.for()</code>이다.</p>
<h3 id="symbolfor-특징"><code>Symbol.for()</code> 특징</h3>
<ul>
<li>하나의 심볼만 보장받을 수 있음(없으면 만들고, 있으면 가져온다)</li>
<li>Symbol 함수는 매번 다른 Symbol 값을 생성하지만, Symbol.for 메소드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유한다.</li>
</ul>
<pre><code class="language-javascript">const id1 = Symbol.for(&#39;id&#39;);
const id2 = Symbol.for(&#39;id&#39;);

id1 === id2;  // true

Symbol의 이름을 알고 싶을때는
Symbol.keyFor(id1) // &quot;id&quot;</code></pre>
<h3 id="숨겨진-symbol-key-보는-법">숨겨진 Symbol key 보는 법</h3>
<h4 id="1objectgetownpropertysymbols객체명">1.Object.getOwnPropertySymbols(객체명);</h4>
<pre><code class="language-javascript">const id = Symbol(&#39;id&#39;);

const user = {
  name : &#39;Mike&#39;,
  age : 30,
  [id] : &#39;myid&#39;
}    

Object.getOwnPropertySymbols(user);  

//출력
[Symbol(id)]
</code></pre>
<h4 id="2-reflectownkeysuser">2. Reflect.ownKeys(user);</h4>
<pre><code class="language-javascript">const id = Symbol(&#39;id&#39;);

const user = {
  name : &#39;Mike&#39;,
  age : 30,
  [id] : &#39;myid&#39;
}    

Reflect.ownKeys(user);

//출력
[&quot;name&quot;, &quot;age&quot;, Symbol(id)]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(Javascript) 자바스크립트 for문을 이용해서 배열에 요소 추가하기 ( .push() 메서드를 사용해서)]]></title>
            <link>https://velog.io/@jayden_/Javascript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-for%EB%AC%B8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%B0%B0%EC%97%B4%EC%97%90-%EC%9A%94%EC%86%8C-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0-.push-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C</link>
            <guid>https://velog.io/@jayden_/Javascript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-for%EB%AC%B8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%B0%B0%EC%97%B4%EC%97%90-%EC%9A%94%EC%86%8C-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0-.push-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C</guid>
            <pubDate>Sun, 26 Mar 2023 15:18:46 GMT</pubDate>
            <description><![CDATA[<h3 id="for문을-이용해서-배열에-요소-추가하기">for문을 이용해서 배열에 요소 추가하기</h3>
<pre><code class="language-javascript">const number = [];
// 빈 배열 &#39;number&#39; 선언
      for(let n=1; n&lt;=9; n +=1){
        number.push(n+1);
      }
// 반복문 for문을 사용해서 n을 1로 초기화하고, n이 9 이하일 때까지 반복한다.

// 이 반복 구문에서는 n+1 값을 배열 number에 추가한다.

// number.push(n+1);
// number에 n+1 값을 추가하고, push() 메서드를 사용해서 배열의 끝에 새로운 요소를 추가한다.

출력
[2,3,4,5,6,7,8,9,10]

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JavaScript) 자바스크립트 배열 추가 & 삭제 방법 (push, pop, splice)]]></title>
            <link>https://velog.io/@jayden_/JavaScript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B0%B0%EC%97%B4-%EC%B6%94%EA%B0%80-%EC%82%AD%EC%A0%9C-%EB%B0%A9%EB%B2%95-push-pop-splice</link>
            <guid>https://velog.io/@jayden_/JavaScript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B0%B0%EC%97%B4-%EC%B6%94%EA%B0%80-%EC%82%AD%EC%A0%9C-%EB%B0%A9%EB%B2%95-push-pop-splice</guid>
            <pubDate>Sun, 26 Mar 2023 15:11:23 GMT</pubDate>
            <description><![CDATA[<h3 id="자바스크립트-배열-추가-삭제-함수">자바스크립트 배열 추가, 삭제 함수</h3>
<pre><code class="language-javascript">배열 추가 : Array.push(), Array.unshift(), Array.splice()
배열 삭제 : Array.pop(), Array.shift(), Array.splice()</code></pre>
<h4 id="배열-요소를-추가하는-방법">배열 요소를 추가하는 방법</h4>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]
arr.push(&#39;d&#39;); // 배열의 끝에 요소를 추가</code></pre>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];

// arr = [&#39;d&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
arr.unshift(&#39;d&#39;); // 배열의 앞쪽에 요소를 추가</code></pre>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;d&#39;, &#39;c&#39;]
arr.splice(2, 0, &#39;d&#39;); // index 2 (&#39;c&#39;)의 위치에 요소를 추가

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;d&#39;, &#39;c&#39;, &#39;e&#39;, &#39;f&#39;]
arr.splice(4, 0, &#39;e&#39;, &#39;f&#39;); // index 4의 위치에 2개의 요소를 추가</code></pre>
<h4 id="배열-요소를-삭제하는-방법">배열 요소를 삭제하는 방법</h4>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;f&#39;];

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;]
arr.pop(); // 배열의 마지막 요소를 제거

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
var popped = arr.pop(); // 제거한 요소를 반환 받을 수 있음

// popped = &#39;e&#39;</code></pre>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;f&#39;];

// arr = [&#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;f&#39;]
arr.shift(); // 배열의 첫번째 요소를 제거

// arr = [&#39;c&#39;, &#39;e&#39;, &#39;f&#39;]
var shifted = arr.shift(); // 제거한 요소를 반환 받을 수 있음

// shifted = &#39;b&#39;</code></pre>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;f&#39;];

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;e&#39;, &#39;f&#39;]
arr.splice(2, 1); // index 2 부터 1개의 요소(&#39;c&#39;)를 제거

// arr = [&#39;a&#39;, &#39;f&#39;]
arr.splice(1, 2); // index 1 부터 2개의 요소(&#39;b&#39;, &#39;e&#39;)를 제거

// arr = [&#39;a&#39;]
removed = arr.splice(1, 1); // 제거한 요소를 반환 받을 수 있음

// removed = &#39;f&#39;</code></pre>
<pre><code class="language-javascript">var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;f&#39;];

// arr = [&quot;a&quot;, undefined, &quot;c&quot;, &quot;e&quot;, &quot;f&quot;]
delete arr[1]; // delete로 배열을 삭제할 경우 요소는 그대로 존재하며 값만 삭제 됨</code></pre>
<pre><code class="language-javascript">array.splice(&quot;시작위치&quot;, &quot;제거건수&quot;)

splice 함수는 원하는 위치에서 하나 이상의 요소를 제거 할 수 있다.



array.splice(&quot;시작위치&quot;, &quot;제거건수&quot;, [&quot;요소1&quot;, &quot;요소2&quot; ... ])

splice 함수는 요소를 제거 후 해당 위치에 새로운 요소를 추가할 수 있다.

</code></pre>
<h3 id="함수를-사용하지-않고-추가-삭제-하는-방법">함수를 사용하지 않고 추가, 삭제 하는 방법</h3>
<pre><code class="language-javascript">자바스크립트는 배열의 길이를 동적으로 변경할 수 있다

var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;];
arr[arr.length] = &#39;e&#39;; // 배열의 끝에 요소를 추가 

// arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
arr.length = arr.length - 1; // 배열의 크기를 하나 줄인다

// arr = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, undefined, undefined, &quot;g&quot;]
arr[5] = &#39;g&#39;; // index 5 에 요소를 추가, 빈요소([3],[4])는 undefined

배열 중간의 요소를 추가 하거나, 삭제할 경우 함수를 사용하는 것이 편리하다. </code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[(JavaScript) DOM & EVENT #1 노드에 접근하기]]></title>
            <link>https://velog.io/@jayden_/JavaScript-DOM-EVENT-1-%EB%85%B8%EB%93%9C%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jayden_/JavaScript-DOM-EVENT-1-%EB%85%B8%EB%93%9C%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 26 Mar 2023 09:33:51 GMT</pubDate>
            <description><![CDATA[<p>DOM (Document Object Model)은 HTML, XML 또는 XHTML 문서의 프로그래밍 인터페이스를 제공하며, 이 문서를 읽고 조작하는 방법을 제공합니다. JavaScript와 같은 스크립트 언어를 사용하여 DOM을 조작할 수 있으며, HTML 요소를 추가, 수정 및 삭제하고 스타일을 변경하는 등의 작업을 수행할 수 있습니다. DOM은 웹 페이지의 모든 콘텐츠를 객체로 나타내며, 문서 구조와 관계를 유지합니다.</p>
<p>DOM은 다음과 같은 계층 구조로 구성됩니다.</p>
<ul>
<li>Document: HTML 문서 전체를 나타냅니다.</li>
<li>Element: HTML 문서의 모든 HTML 요소를 나타냅니다.</li>
<li>Attribute: HTML 요소의 특성(attribute)을 나타냅니다.</li>
<li>Text: HTML 요소 내의 텍스트를 나타냅니다.</li>
<li>Event: 웹 페이지에서 발생하는 모든 이벤트를 나타냅니다.</li>
</ul>
<p>JavaScript를 사용하여 DOM 요소를 선택하고 조작할 수 있습니다. 가장 일반적인 방법은 <code>document.getElementById()</code>, <code>document.getElementsByClassName()</code> 및 <code>document.getElementsByTagName()</code>를 사용하는 것입니다.</p>
<p>이벤트는 사용자가 웹 페이지에서 수행하는 모든 상호 작용을 나타내며, 예를 들어 버튼 클릭, 마우스 이동, 키보드 입력 등이 있습니다. JavaScript를 사용하여 이벤트를 처리하고 반응할 수 있습니다.</p>
<p><code>addEventListener()</code> 메서드를 사용하여 이벤트를 등록하고 처리할 수 있습니다. 이 메서드는 이벤트 이름과 이벤트가 발생했을 때 실행할 함수를 지정합니다. 이벤트를 제거하려면 <code>removeEventListener()</code> 메서드를 사용합니다.</p>
<p><code>예를 들어</code>, 버튼을 클릭했을 때 메시지를 표시하는 코드는 다음과 같습니다.</p>
<pre><code class="language-javascript">&lt;button id=&quot;myButton&quot;&gt;Click me&lt;/button&gt;


const myButton = document.getElementById(&#39;myButton&#39;);

myButton.addEventListener(&#39;click&#39;, function() {
  alert(&#39;Button clicked!&#39;);
});
</code></pre>
<p>이 코드는 버튼 클릭 이벤트를 처리하고, 클릭할 때마다 &quot;Button clicked!&quot; 메시지가 표시됩니다.</p>
]]></description>
        </item>
    </channel>
</rss>