<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bejjang-i</title>
        <link>https://velog.io/</link>
        <description>하루는 개발만 하기에는 너무 길다.</description>
        <lastBuildDate>Sun, 03 Jul 2022 11:36:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bejjang-i</title>
            <url>https://images.velog.io/images/rg_na/profile/eef14f27-c940-492a-826d-ba2acace7efe/mwka16037116.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bejjang-i. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/rg_na" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[코틀린 고급 문법]]></title>
            <link>https://velog.io/@rg_na/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B3%A0%EA%B8%89-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@rg_na/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B3%A0%EA%B8%89-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sun, 03 Jul 2022 11:36:23 GMT</pubDate>
            <description><![CDATA[<h1 id="data-class">data class</h1>
<pre><code>data class Ticket(val companyName : String, val name : String, var dat : String, var seat : Int)

fun main() {
    val ticketA = Ticket(&quot;koreaAir&quot;, &quot;nana&quot;, &quot;2022-07-04&quot;,06)
}</code></pre><p>toString(), hashCode(), equals(), copy() 컴파일러가 자동으로 생성해 준다.</p>
<h1 id="companion">companion</h1>
<pre><code>class Book private constructor (val id:Int, val name:String){
    companion object BookFactory : IdPro{
        override fun getId() : Int {
            return 33
        }
        val myBook = &quot;New name&quot;
        fun create() = Book(getId(),myBook)
    }
}

interface IdPro{
    fun getId() : Int
}

fun main() {
    var book = Book.create()
    println(&quot;${book.id} ${book.name}&quot;)

}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Lamda]]></title>
            <link>https://velog.io/@rg_na/Lamda</link>
            <guid>https://velog.io/@rg_na/Lamda</guid>
            <pubDate>Sun, 03 Jul 2022 11:18:07 GMT</pubDate>
            <description><![CDATA[<h1 id="람다란lamda">람다란?(Lamda)</h1>
<blockquote>
<p>람다식은 우리가 마치 value처럼 다룰 수 있는 익명 함수이다.</p>
</blockquote>
<p>1) 메소드의 파라미터로 넘겨줄 수 있다.
2) return 값으로 사용할 수 있다.</p>
<h2 id="람다의-기본-정의">람다의 기본 정의</h2>
<blockquote>
<p>val lamdaName : Type = {argumentList -&gt; codeBody}</p>
</blockquote>
<h1 id="람다-기본-문법">람다 기본 문법</h1>
<pre><code>//기본 형식
val square : (Int) -&gt; (Int) = {number -&gt; number*number}
//자료형 선언 
val square = {number : Int -&gt; number*number}
//에러
val square = {number -&gt; number*number}

fun main() {
    println(square(12))
}</code></pre><p>코틀린은 자동으로 자료형 추론이 가능하나, 한 쪽에는 무조건 써줘야 한다.</p>
<pre><code>val namgeAge = {name : String, age:Int -&gt;
&quot;my name ${name} I&#39;m ${age}&quot;}

fun main() {
    println(namgeAge(&quot;gyoung&quot;,21))
}</code></pre><p>람다는 무조건 맨 마지막 줄이 return된다.</p>
<pre><code>//람다의 return
val calcul : (Int) -&gt; String = {
    when(it){
        in 0..40 -&gt; &quot;fail&quot;
        in 41..70 -&gt; &quot;pass&quot;
        in 71..100 -&gt; &quot;perfect&quot;
        else -&gt; &quot;Error!&quot;
    }
}</code></pre><p>여기서 else가 없다면 에러가 난다. 위에 람다식은 무조건 String을 반환해야 하기 때문에 0~100사이 값이 아닌 값을 넣게 되면 else문을 실행해 String을 반환해야 한다.</p>
<pre><code>fun a(lamda : (Double) -&gt; Boolean) : Boolean {
    return lamda(5.2343)
}

fun main() {  
    val lamda = {number : Double -&gt;
    number == 4.123123
    }
    println(a(lamda))
    println(a({it&gt;3.22})) // a {it&gt;3.22}
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[코틀린 문법]]></title>
            <link>https://velog.io/@rg_na/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@rg_na/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sat, 02 Jul 2022 06:36:07 GMT</pubDate>
            <description><![CDATA[<h1 id="람다식">람다식</h1>
<blockquote>
<p>이름이 없어도 함수 역할을 하는 익명 함수의 하나의 형태이다.
화살표 표기법을 사용하고 고차 함수에서 인자로 넘기거나 결과값으로 반환 등을 할 수 있다.
&lt; 사용 예시 &gt;
{ 변수1 : 타입, 변수2 : 타입 -&gt; 변수1 + 변수 2 }</p>
</blockquote>
<p>(타입, 타입) -&gt; 반환형 타입 </p>
<pre><code>//이름이 없는 함수 형태
{ x , y -&gt; x + y }

//기본 람다식 구성
val sum : (Int, Int) -&gt; Int = { x : Int, y : Int -&gt; x + y }

//선언 자료형 생략
val sum = { x : Int, y : Int -&gt; x + y }

//매개변수 자료형 생략
val sum : (Int, Int) -&gt; Int = { x , y -&gt; x + y }

//에러.. 자료형 추론 불가
val sum = { x , y -&gt; x + y }

println(sum(3,5)) //8
</code></pre><p>선언 자료형과 매개변수 자료형 한 쪽이 선언이 되었다면 다른 한 쪽은 생략이 가능하다.
x, y 가 람다식의 매개변수이고, x+y가 람다식의 처리 내용이다. 처리 내용이 여러 줄인 경우 마지막 표현식이 반환된다.</p>
<h1 id="고차함수">고차함수</h1>
<blockquote>
<p>고차함수는 함수를 인수로 취하거나 혹은 결과로 반환하는 함수를 고차함수라고 한다.</p>
</blockquote>
<pre><code>fun sum( a : Int, b : Int, p : (Int, Int) -&gt; Int){
    println(&quot;$a, $b -&gt; ${p(a, b)}&quot;)
}

//기본 호출
sum(2 , 4, {a : Int, b : Int -&gt; a+b}) //2,4 -&gt; 6

//람다 함수가 맨 마지막에 있다면 뺄 수 있다.
sum(5, 1) {a : Int, b : Int -&gt; a+b} //5,1 -&gt; 6

//고차 함수에 타입이 정의되어있는 경우 타입 생략 가능
sum(3,3) {a,b -&gt; a+b} //3,3 -&gt; 6</code></pre><p>sum 함수는 a,b와 두 개의 Int 인자를 받아 하나의 Int 반환값을 내는 함수를 인자로 받아 이를 출력한다.</p>
<pre><code>fun sum(a : Int, b : Int) = a+b

//main
sum(5,3,::sum)
println(&quot;$a, $b -&gt; ${p(a, b)}&quot;) // 5,3 -&gt; 8</code></pre><p>람다함수가 아닌 일반함수를 인자로 넣으려면 일반 함수 앞에 ::를 붙여 사용한다.</p>
<pre><code>fun sum(a : Int, p: (Int) -&gt; Int){
    println($a -&gt; ${p(a)}&quot;)
}

//main
Square(3) {it * it} //square 3 -&gt; 9</code></pre><p>고차함수의 인자가 하나인 경우 it을 사용해 간단하게 사용할 수 있다.</p>
<h1 id="인터페이스">인터페이스</h1>
<p>클래스와 인스턴스에 대한 개념부터 본다면 클래스는 객체가 갖는 속성이나 메서드를 하나의 캡슐로 만들어주는 역할을 한다. 클래스로부터 만들어진 인스턴스 객체가 기능을 실행하도록 하려면 그 객체의 메서드를 호출해야 한다. 객체를 사용할 때에는 다른 곳에서 해당 인스턴스 객체를 호출할 수 만 있다면 그 객체가 가진 모든 캡슐 안의 기능들(속성, 메서드)를 사용할 수 있다. 이 캡슐안의 기능들을 사용하기 위해, 캡슐에 접근하는 방법을 인터페이스라고 볼 수 있다.</p>
<h1 id="추상클래스">추상클래스</h1>
<p>추상클래스는 아직 구현되지 않고 선언만 된 추상메서드를 가지고 있는 클래스이다. 추상클래스는 메서드가 구현되지 않아서 이 클래스를 직접 객체로 만들 수 없다. 반드시 상속을 받는 자식 클래스가 있어야 한다. 추상클래스는 상속을 통해 생성될 자식 클래스에서 메서드 오버라이딩에 강제성을 부여하기 위해 사용된다.</p>
<h1 id="용어">용어</h1>
<h2 id="프로퍼티">프로퍼티</h2>
<pre><code>class Person {
    var name: String = &quot;Jordan&quot;
    val age: Int = 20
}</code></pre><p>위 코드에서 name, age를 프로퍼티라고 부른다. 변수처럼 보이지만 이미 접근자라고 부르는 getter/setter와 같은 함수가 내장되어 있기 때문에 프로퍼티라고 부른다</p>
<h2 id="매개변수">매개변수</h2>
<pre><code>fun sum(a : Int, b : Int)</code></pre><p>a,b가 매개변수이다.</p>
<h2 id="인자">인자</h2>
<pre><code>sum(3,6)</code></pre><p>3,6이 인자이다.</p>
<h1 id="const">const</h1>
<p>const는 함수나 어떤 클래스의 생성자에게도 결코 할달 될 수 없고 오직 문자열이나 기본 자료형으로 할당되어야 한다.때문에 const 로 선언을 하면 클래스의 프로퍼티나 지역변수로 할당 할 수 없게 된다. 일반적으로 companion object 안에 상수로 선언하게 된다.</p>
<h1 id="상속">상속</h1>
<p>상속하는 클래스를 부모클래스(Super Class)라고 하고 상속을 받는 클래스를 자식클래스(Sub Class)라고 한다. 부모클래스를 상속받은 자식클래스는 부모의 변수나 메서드를 자기 것 처럼 사용할 수 있다.</p>
<pre><code>open class Super{
    var superNum = 5;

    fun superMethod() { 
        println(&quot;Super Class Method $superNum&quot;)
    }
}

class Sub : Super {
    var subNum = 1;

    //부모클래스를 호출하는 생성자를 꼭 만들어 줘야함
    constructor() : super()

    fun subMethod() {
        println(&quot;Sub Class Method $subNum&quot;)
    }
}</code></pre><p>부모클래스에는 open 키워드를 사용해줘야 한다. 자식클래스에서 부모클래스를 호출하는 생성자를 꼭 만들어줘야한다. 부모클래스를 호출하는 방법은 super() 메서드를 사용하면 된다.</p>
<h1 id="daodata-access-object">DAO(Data Access Object)</h1>
<p>repository package</p>
<ol>
<li>실제로 DB에 접근하는 객체이다.</li>
</ol>
<h1 id="dtodata-transfer-object">DTO(Data Transfer Object)</h1>
<p>dto package</p>
<ol>
<li>계층간 데이터 교환을 위한 객체이다.</li>
</ol>
<p>-DB에서 데이터를 얻어 Service나 Controller등으로 보낼 때 사용하는 객체를 말한다.
-&gt; DB의 데이터가 Presentation Logic Tier로 넘어오게 될 때는 DTO의 모습으로 변해서 오고가는 것이다.</p>
<h2 id="vovalue-object">VO(Value Object)</h2>
<p>DTO와 동일한 개념이지만 read only속성을 갖는다.</p>
<h1 id="entity-class">Entity Class</h1>
<p>domain package
실제 DB의 테이블과 매칭될 클래스</p>
<ol>
<li>@Entity, @Column, @Id 등을 이용한다.</li>
</ol>
<h1 id="list">List</h1>
<p>list는 값을 바꿀 수 있는 가변형 mutableListOf()와 값을 바꿀 수 없는 불변형 listOf()로 나눠진다.</p>
<pre><code>//가변형 list
val str : List&lt;String&gt; = mutableListOf(&quot;one&quot;, &quot;two&quot; ,&quot;three&quot; ,&quot;four&quot; ,&quot;five&quot;)

//불변형 list
val num : List&lt;Int&gt; = listOf(1,2,3,4,5) </code></pre><h2 id="요소에-접근하기">요소에 접근하기</h2>
<pre><code>val str = listOf(&quot;one&quot;, &quot;two&quot; ,&quot;three&quot; ,&quot;four&quot; ,&quot;five&quot;)

for(strNumber in str.indices)
    println(&quot;str[$strNumber] = ${str[strNumber]}&quot;)
//str[0] = one
//str[1] = two
//str[2] = three
//str[3] = four
//str[4] = five</code></pre><h2 id="가변형-list---arraylistof">가변형 list - arrayListOf()</h2>
<pre><code>//arrayList선언
val str : ArrayList&lt;String&gt; = arrayListOf(&quot;one&quot;, &quot;two&quot; ,&quot;three&quot; ,&quot;four&quot; ,&quot;five&quot;)

str.add(&quot;six&quot;) //추가
str.remove(&quot;three&quot;) //삭제

printle(str)
//[one, two, four, five, six]</code></pre><p>가변형 헬퍼 함수를 사용하면 요소를 추가/삭제할 수 있는 list를 선언할 수 있고 반환형은 자바의 ArrayList이다.</p>
<h2 id="가변형-list---mutablelistof">가변형 list - mutableListOf()</h2>
<pre><code>val str : mutableList&lt;String&gt; = mutableListOf(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;)
str.add(&quot;e&quot;) //추가
str.removeAt(2) //두 번째 요소 삭제
srt[1] = &quot;w&quot; //1번 요소 변경
println(str)
//[a, w, d, e]</code></pre><h2 id="list-기본-함수">list 기본 함수</h2>
<p>size() -  리스트의 사이즈(갯수)를 반환
get(index) - 해당 인덱스 요소를 가져옴
indexOf(Element) - 해당 요소의 인덱스 번호를 반환
contains(Element) - 해당 요소를 확인 후 있으면 true 없으면 false 반환
isEmpty() - 리스트가 비어있으면 true 아니면 false 반환</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kotiln 기초]]></title>
            <link>https://velog.io/@rg_na/Kotiln-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@rg_na/Kotiln-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Mon, 27 Jun 2022 08:16:18 GMT</pubDate>
            <description><![CDATA[<h1 id="kotiln이란">Kotiln이란?</h1>
<p>자바가 사용되고 있는 모든 용도에 적합하면서도 간결하고, 생산적이며 안전한 대체 언어를 제공
장점
간결하고 실용적
자바 코드와의 상호운용
대부분의 자바 프로젝트에서 코틀린 사용 가능(안드로이드, 서버 개발)
자바와 비슷한 성능
안전성(null체크, 타입 검사와 캐스트)</p>
<h1 id="코틀린-기본-문법">코틀린 기본 문법</h1>
<h2 id="변수-선언-방법">변수 선언 방법</h2>
<p>1.즉시 대입(타입 선언)</p>
<pre><code>val a:Int = 1</code></pre><p>2.즉시 대입(타입 체크)</p>
<pre><code>val a = 1</code></pre><ol start="3">
<li>선언 후 초기화<pre><code>val a:Int 
a = 1</code></pre><blockquote>
<p>선언 후 나중에 초기화해야 할 때에는 타입을 static하게 정해놓고 사용해야 한다.</p>
</blockquote>
</li>
</ol>
<h2 id="함수-선언-방법">함수 선언 방법</h2>
<ol>
<li>기본 함수 선언<pre><code>fun sum1(a : Int, b: Int) : Int// 리턴 타입 {
 return a+b //리턴 값
}</code></pre></li>
<li>괄호, return type, return 생략<pre><code>fun sum2(a : Int, b: Int) = a+b</code></pre></li>
<li>아무 리턴값을 반환 하지 않는다는 표현은 :Unit 으로 함수 리턴타입을 붙일 수도 있고, 생략이 가능하다<pre><code>fun printSum(a: Int, b: Int): Unit {
 println(&quot;sum of $a and $b is ${a + b}&quot;)
}
</code></pre></li>
</ol>
<p>fun printSumNoUnit(a: Int, b: Int) {
    println(&quot;sum of $a and $b is ${a + b}&quot;)
}</p>
<pre><code>
## 문자열 템플릿</code></pre><p>fun string_template() {
    var a = 1
    val s1 = &quot;a is $a&quot;
    println(s1) //a is 1</p>
<pre><code>a = 2
val s2 = &quot;${s1.replace(&quot;is&quot;, &quot;was&quot;)}, but now is $a&quot; 
println(s2) //a was 1, but now is 2</code></pre><p>}</p>
<pre><code>변수 a는 문자열안에서 $기호를 붙여 값을 대입하여 사용할 수 있다. 또한 ${} 안에서 문자열 s1는 자신의 인스턴스 메소드를 사용할 수 있다.

## 조건식
1. 기본 조건식</code></pre><p>fun maxOf(a: Int, b: Int): Int {
    if (a &gt; b) {
        return a
    } else {
        return b
    }
}</p>
<pre><code>2. return문 생략 조건식</code></pre><p>fun maxf2(a: Int, b: Int) = if(a&gt;b) a else b</p>
<pre><code>if(a&gt;b) return a
else return b

## null값과 null체크
엘비스 연산자 ?:</code></pre><p>class Elvis{
  var na : String? = null</p>
<p>  fun elvis(){
      var name1 : String = na ?: &quot;NA&quot;
    //na는 현재 null 이기 때문에 name1에는 NA가 들어간다.
    var name2 : String = na ?: return
    //na는 현재 null 이기 때문에 함수 자체를 return 시킨다.
    var name3 : String = na ?: throw NullPointerException()
    //na는 현재 null 이기 때문에 NullPointerException 예외가 발생한다.</p>
<p>```</p>
<blockquote>
<p>var 변수 이름 : 변수 타입 = true ?: false</p>
</blockquote>
<p>${str?.length ?: -1}
str이 null이라면 -1 반환 아니라면 length 반환
if(str != null) str.length else -1
와 똑같은 문장이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[map()함수]]></title>
            <link>https://velog.io/@rg_na/map%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@rg_na/map%ED%95%A8%EC%88%98</guid>
            <pubDate>Fri, 10 Jun 2022 14:52:12 GMT</pubDate>
            <description><![CDATA[<h1 id="map">map()</h1>
<p>map()함수는 흔히 사용하는 for문과 비슷하다.
각 배열의 요소를 돌면서 인자로 전달된 함수를 사용하여 처리된 새로운 결과를 새로운 배열에 담다 반환하는 함수이다.</p>
<blockquote>
<p>cosnt result = array.map((index) =&gt; index * 2);</p>
</blockquote>
<p>array는 map()함수로 돌릴 배열
index는 map()함수로 돌린 배열의 요소값
result는 map()함수 내에서 처리된 값들을 배열로 저장</p>
<pre><code>const array = [1,2,3,4,5];
cosnt result = array.map((index) =&gt; index * 2);
console.log(result); -&gt; 2,4,6,8,10</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[React.js 기본]]></title>
            <link>https://velog.io/@rg_na/React.js-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@rg_na/React.js-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Fri, 10 Jun 2022 14:39:37 GMT</pubDate>
            <description><![CDATA[<h1 id="jsx-기본-문법">JSX 기본 문법</h1>
<ol>
<li><p>무조건 태그를 닫아줘야 한다. <code>&lt;div&gt;&lt;/div&gt;</code> 혹은 셀프 클로징 태그<code>&lt;/input&gt;</code>를 사용한다.</p>
</li>
<li><p>두개 이상의 엘리먼트는 무조건 하나의 엘리멘트로 감싸져있어야 한다. div 태그도 좋지만 <code>&lt;Fragment&gt;</code> 태그를 사용하면 불필요한 div태그를 줄일 수 있다.</p>
</li>
<li><p>JSX내부에서 자바스크립트 값을 사용할때에는 { } 로 감싸준다. </p>
</li>
<li><p>Let, const 는 scope가 블럭 단위로 되어있고, var는 함수 단위다.
 const - 한번 선언 후 고정적인 값
 let - 유동적인 값</p>
</li>
<li><p>조건부 렌더링</p>
</li>
</ol>
<ul>
<li>{ 조건 ? True : false }</li>
<li>{ 조건  &amp;&amp; true }</li>
</ul>
<ol start="6">
<li>스타일 적용 -&gt; 객체 형태로 적용 , 카멜케이스(ex. background-color -&gt; backgroundColor)</li>
<li>JSX 내부 주석 { /* 주석 */ } 으로 감싸주기, 태그 내부에서도 //로 주석 처리 가능</li>
</ol>
<h1 id="props--state">Props / State</h1>
<h3 id="props">Props</h3>
<p>부모 컴포넌트가 자식 컴포넌트에게 값을 전달해 줄 때 사용한다. 
함수형 -&gt; 초기 마운트 속도가 미세하게 빠름, 메모리 자원도 적게 사용함</p>
<h3 id="state">State</h3>
<p>컴포넌트 안에 있으면서, 내부에서 변경할 수 있다 -&gt; setState() 사용[ 사용하지 않으면 리렌더링이 일어나지 않아서 값이 안바뀜!]</p>
<h1 id="lifecycle">lifecycle</h1>
<h3 id="mounting컴포넌트가-브라우저에-나올-때">Mounting(컴포넌트가 브라우저에 나올 때)</h3>
<p>Constructor
    생성자 함수로 만든 컴포넌트가 브라우저에 나올 때 가장 먼저 실행되는 함수
    초기 설정, 미리 작업해야하는 일이 있을 때 사용
getDerivedStateFromProps
    porps를 state에 동기화 해야할 때
    Updating과정에서도 props가 바뀔 때 실행된다
Render
    DOM, 내부 태그 전달 값 등을 정의
ComponentDidMount
    외부 라이브러리 같은 걸 가져와야할 때 사용
    컴포넌트가 나타날 때 시간 주기?
    이벤트 리스닝할 때</p>
<h3 id="updating컴포넌트의-propsstate가-바뀌었을-때">Updating(컴포넌트의 props/state가 바뀌었을 때)</h3>
<p>getDerivedStateFromProps
shouldComponentUpdate
    최적화 할 때
    부모가 렌더링 되면 자식도 렌더 함수가 실행되는데 이 때 자원 낭비를 막기 위해서 렌더를 막을 수 있다
    true/false를 반환할 수 있다. -&gt; 렌더를 막을 수 있다.
Render
getSnapshotBeforeUpdate
    렌더링 후 결과가 브라우저에 반영되기 바로 직전에 호출
    디자인적인 요소들, 사전에 가져와야 할 데이터들을 사용할 때
componentDidUpdate<br>    컴포넌트가 업데이트 되었을 때 호출됨
    state가 바뀌었을 때 과거 데이터와 새로운 데이터를 비교할 때 사용할 수 있다.</p>
<h3 id="unmounting컴포넌트가-브라우저에서-사라질-때">Unmounting(컴포넌트가 브라우저에서 사라질 때)</h3>
<p>componentWillUnmount
    컴포넌트가 사라지는 과정에서 호출
    리스너를 삭제할 때 사용가능</p>
<blockquote>
<p>Key는 고유 번호같은 느낌, 데이터를 추가/삭제할 때 효율적으로 사용 할 수 있음</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[<v-if>]]></title>
            <link>https://velog.io/@rg_na/v-if</link>
            <guid>https://velog.io/@rg_na/v-if</guid>
            <pubDate>Fri, 06 Aug 2021 09:09:54 GMT</pubDate>
            <description><![CDATA[<p><code>&lt;v-if&gt;</code> 조건문 </p>
<pre><code>&lt;div v-if=&quot;data == 1&quot;&gt;
내가 보여요
&lt;div&gt;</code></pre><p>data가 1일때만 <code>내가 보여요</code>라는 문구가 보여진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SecurityUtils]]></title>
            <link>https://velog.io/@rg_na/SecurityUtils</link>
            <guid>https://velog.io/@rg_na/SecurityUtils</guid>
            <pubDate>Fri, 06 Aug 2021 05:45:11 GMT</pubDate>
            <description><![CDATA[<p>Spring Security에서는 SecurityContextHolder를 제공해 현재 세션의 사용자 정보를 가져올 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Async - Await]]></title>
            <link>https://velog.io/@rg_na/Async-Await</link>
            <guid>https://velog.io/@rg_na/Async-Await</guid>
            <pubDate>Fri, 06 Aug 2021 05:16:10 GMT</pubDate>
            <description><![CDATA[<h1 id="async---await">Async - Await</h1>
<p><code>비동기 처리 패턴</code> 
<code>async</code>현재 사용할 함수를 비동기로 처리하겠다는 선언자. 
<code>await</code>는 비동기로 순차 처리하기 위해서 수행할 API에 붙이는 선언자.</p>
<pre><code>async testFunction() {
    const response = await axios.get(&#39;api/test&#39;)
    console.log(response)
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Method/ Computed]]></title>
            <link>https://velog.io/@rg_na/Method-Computed</link>
            <guid>https://velog.io/@rg_na/Method-Computed</guid>
            <pubDate>Fri, 06 Aug 2021 05:10:43 GMT</pubDate>
            <description><![CDATA[<h1 id="method">Method</h1>
<p>렌더링이 일어날 때마다 항상 함수를 실행한다.</p>
<h1 id="computed">Computed</h1>
<p>호출하는 부분을 감시하고 있다가 값이 변경되면 다시 계산하고 자동으로 캐싱해주는 <code>&#39;끝내주는 반응형&#39;</code>이다. 
computed에 정의하는 익명함수는 반드시 값을 리턴하도록 작성되야한다. </p>
<blockquote>
<p>계산해야하는 목표 데이터를 정의 하는 ‘선언형’ 프로그래밍 방식. 저장된 결과(캐싱)를 반환하므로 종속 대상의 변경이 일어나기 전까지 호출 되지 않는다.</p>
</blockquote>
<h2 id="method와-computed-의-차이">Method와 Computed 의 차이</h2>
<p>computed는 data속성에 변화가 있을 때 자동으로 다시 연산을 한다.</p>
<p><code>computed</code>에서 사용하고 있는 data속성인 message라는 프로퍼티가 변화가 있을때만 다시 연산을하고 한번 연산한 값을 캐싱 해놓았다가 필요한 부분에 다시 재 사용한다.
<strong>같은 페이지내에서 같은 연산을 여러번 반복해야 할 경우에 성능면에서 효율적으로 사용할 수 있다.</strong></p>
<p>반면 <code>methods</code>는 캐싱이라는 개념이 없기 때문에 매번 재 렌더링된다.
캐싱 효과가 필요하다면 <code>computed</code>를 사용하고 캐싱이 필요없다면 <code>methods</code>를 사용하도록 하자.</p>
<blockquote>
<ol>
<li>template에서 호출시 ()를 적지 않아야 된다.</li>
<li>return 값이 반드시 존재해야한다.</li>
<li>파라메터를 받을 수 없다.</li>
</ol>
</blockquote>
<p>Method를 사용해야 할 때.</p>
<blockquote>
<ol>
<li>파라메터를 받아서 호출해야할 때 - data를 사용하지 않는다는 정책을 취한다면 computed로는 아예 불가능하다.</li>
<li>함수 안에서 다른 값을 바꿔줘야할 때 - computed에서는 다른 값을 바꾸는건 정책위반이다. (불가능한건 아니다.) 이 경우 methods를 사용한다.</li>
</ol>
</blockquote>
<p><a href="https://sunny921.github.io/posts/vuejs-computed-method/">참고1</a>
<a href="http://hong.adfeel.info/frontend/%EA%B3%84%EC%82%B0%EB%90%9C-%EC%86%8D%EC%84%B1computed-%EA%B0%90%EC%8B%9C%EC%9E%90watch/">참고2</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP 상태 코드]]></title>
            <link>https://velog.io/@rg_na/HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@rg_na/HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Mon, 02 Aug 2021 14:04:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>1xx(정보) *<em>: 요청을 받았으며 프로세스를 계속 진행.
*</em>2xx(성공) *<em>: 요청을 성공적으로 받았으며 인식 후 수용.
*</em>3xx(리다이렉션) *<em>: 요청 완료를 위해 추가 작업 조치 필요.
*</em>4xx(클라이언트 오류)</strong> : 요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.
*<em>5xx(서버 오류) *</em>: 서버가 명백히 유효한 요청에 대한 충족을 실패했습니다.</p>
</blockquote>
<h1 id="1xx--information-responses">1XX : Information responses</h1>
<blockquote>
<p>상태 코드가 &#39;1&#39;로 시작하는 경우는 서버가 요청을 받았으며, 서버에 연결된 클라이언트는 작업을 계속 진행하라는 의미.</p>
</blockquote>
<h2 id="100-countinue">100 Countinue</h2>
<p>진행중. 무시해도 무방함.</p>
<h2 id="101-switching-protocol">101 Switching Protocol</h2>
<p>클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답에 들어간다.
서버에서 프로토콜을 변경할 것임을 알려줍니다. 
해당 코드는 Websocket 프로토콜 전환 시에 사용된다.</p>
<h2 id="102-processingwebdav">102 Processing(WebDAV)</h2>
<p>서버가 요청을 수신하였으며 이를 처리하고 있지만, 아직 제대로 된 응답을 알려줄 수 없음.</p>
<h1 id="2xx--successful-responses">2XX : Successful responses</h1>
<h2 id="200-ok">200 OK</h2>
<p>요청이 성공적.</p>
<h2 id="201-created">201 Created</h2>
<p>요청이 성공적.
그 결과로 새로운 리소스가 생성되었음.
일반적으로 POST요청 또는 일부 PUT요청 이후 따라온다.</p>
<h2 id="202-accepted">202 Accepted</h2>
<p>요청을 수신했지만 행동할 수 없음.
이것은 다른 프로세스에서 처리 또는 서버가 요청을 다루고 있거나 배치 프로세스를 하고 있는 경우를 위해 만들어졌다.</p>
<h2 id="204-no-content">204 No Content</h2>
<p>요청에 대해서 보내줄 수 있는 콘텐츠가 없지만, 헤더는 의미있을 수 있다.</p>
<h1 id="4xx--client-error-responses">4XX : Client error responses</h1>
<h2 id="400-bad-request">400 Bad Request</h2>
<p>잘못된 문법으로 인하여 서버가 요청하여 이해할 수 없음을 의미.</p>
<h2 id="401-unauthorized">401 Unauthorized</h2>
<p>&#39;비인증(unauthenticated)&#39;를 의미. 
클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야한다.</p>
<h2 id="403-forbidden">403 Forbidden</h2>
<p>클라이언트는 콘텐츠에 접근할 권리를 가지고 있지 않다. 
예를 들어, 그들은 미승인이어서 서버는 거절을 위한 적절한 응답을 보냅니다. 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있다.</p>
<h2 id="404-not-found">404 Not Found</h2>
<p>서버는 요청받은 리소스를 찾을 수 없다.</p>
<h2 id="405-method-not-allowed">405 Method Not Allowed</h2>
<p>요청한 메소드는 서버에서 알고 있지만, 제거되었고 사용할 수 없다.
예를 들어, 어떤 API에서 리소스를 삭제하는 것을 금지할 수 있습니다. 필수적인 메소드인 GET과 HEAD는 제거될 수 없으며, 이 에러 코드를 리턴할 수 없습니다.</p>
<h1 id="5xx--server-error-reponses">5XX : Server error reponses</h1>
<h2 id="500-internal-server-error">500 Internal Server Error</h2>
<p>웹 사이트 서버에 문제가 있음을 의미하지만 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없음.</p>
<p><a href="https://www.whatap.io/ko/blog/40/">참고 사이트</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FormData()]]></title>
            <link>https://velog.io/@rg_na/FormData</link>
            <guid>https://velog.io/@rg_na/FormData</guid>
            <pubDate>Mon, 02 Aug 2021 13:47:03 GMT</pubDate>
            <description><![CDATA[<h2 id="formdata">FormData()</h2>
<pre><code>const formdata = new FormData();

formData.append(&#39;name&#39;,&#39;data.facilityItem.name&#39;);
formData.append(&#39;address&#39;,&#39;data.facilityItem.address&#39;);
formData.append(&#39;phoneNo&#39;,&#39;data.facilityItem.phoneNo&#39;);
</code></pre><p>append() 메소드로 key-value 값을 하나씩 추가해주면 된다.
<a href="https://2ham-s.tistory.com/307">참고 사이트</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[getter / setter]]></title>
            <link>https://velog.io/@rg_na/getter-setter</link>
            <guid>https://velog.io/@rg_na/getter-setter</guid>
            <pubDate>Sun, 01 Aug 2021 07:04:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>private 변수를 외부에서 접근하게 하려면 public 메서드를 제공한다.
값을 얻는  get() 메서드를 getter, 값을 지정하는 set() 메서드를 setter라고 한다.
<strong>외부 클래스에서 private 멤버 변수에 직접 접근할 수 없지만, public메서드인  setter를 활용하여 값을 대입할 수 있다.</strong></p>
</blockquote>
<h2 id="get-method">get() method</h2>
<p>저장된 멤버변수의 값을 불러올 때 사용하는 메소드이다. 
매개변수 X, 반환 값 O
<img src="https://images.velog.io/images/rg_na/post/64dfd7af-af18-480c-821c-78da4fa4e04c/image.png" alt="">
<strong>※get()메소드 반환값의 자료형과 멤버변수의 자료형이 같아야 한다.</strong></p>
<h2 id="set-method">set() method</h2>
<p>데이터를 멤버변수에 저장하는 메소드이다.
매개변수 O, 반환 값 X
<img src="https://images.velog.io/images/rg_na/post/73846b94-e6a4-449a-b74a-ce3e0e513fd9/image.png" alt="">
<strong>※외부에서 접근이 가능해야하기 때문에 public작성, 반환값이 없기 때문에 void로 작성한다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[접근 제어자]]></title>
            <link>https://velog.io/@rg_na/%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4%EC%9E%90</link>
            <guid>https://velog.io/@rg_na/%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4%EC%9E%90</guid>
            <pubDate>Sun, 01 Aug 2021 06:59:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/rg_na/post/918218ab-5c4b-4993-a5ab-69fecae8b4cc/image.png" alt="상속 표">
접근 제어자가 사용될 수 있는 곳은 클래스, 멤버변수, 메서드, 생성자 이다.</p>
<blockquote>
<p>외부로부터 데이터를 보호하고, 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서 사용한다.</p>
</blockquote>
<h3 id="public">public</h3>
<p>접근 제한이 전혀 없다</p>
<h3 id="protected">protected</h3>
<p>같은 패키지 내에서만 가능하다.
다른 패키지의 자손 클래스에서 접근이 가능하다(상속 시 가능)</p>
<h3 id="default">default</h3>
<p>같은 패키지 내에서만 접근이 가능하다.</p>
<h3 id="private">private</h3>
<p>같은 클래스 내에서만 접근이 가능하다.</p>
<hr>
<p>접근 범위가 넓은 쪽에서 -&gt; 좁은 쪽으로 나열한다면
public -&gt; protected -&gt; (default) -&gt; private</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[상속]]></title>
            <link>https://velog.io/@rg_na/%EC%83%81%EC%86%8D</link>
            <guid>https://velog.io/@rg_na/%EC%83%81%EC%86%8D</guid>
            <pubDate>Sun, 01 Aug 2021 06:50:54 GMT</pubDate>
            <description><![CDATA[<h1 id="extends">extends</h1>
<p>-일반 클래스와 abstract 클래스 상속에 사용된다.</p>
<blockquote>
<p>-부모의 메소드를 그대로 사용할 수 있고, 오버라이딩 할 필요 없이 부모에 구현 돼 있는 것을 직접 사용 가능하다.(상속)</p>
</blockquote>
<p>-클래스 한 개만 상속 받을 수 있다.
-자신 클래스의 부모 클래스의 기능을 사용한다.</p>
<h1 id="implements">implements</h1>
<p>-interface 상속에 사용된다</p>
<blockquote>
<p>-부모의 메소드를 반드시 오버라이딩(재정의)해야한다.</p>
</blockquote>
<p>-여러개 사용이 가능하다.
-implements한 클래스는 implemens의 내용을 다 사용해야 한다.</p>
<p>상속 조건</p>
<blockquote>
<p>class -&gt; class = extends
interface -&gt; interface = extends
class -&gt; interface = implements
interface -&gt; class = implements(X)</p>
</blockquote>
<p>참고
<a href="https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4">자바 extends, implements 차이</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Annotation]]></title>
            <link>https://velog.io/@rg_na/Annotation</link>
            <guid>https://velog.io/@rg_na/Annotation</guid>
            <pubDate>Sun, 01 Aug 2021 06:47:24 GMT</pubDate>
            <description><![CDATA[<h1 id="annotation-type-정의">Annotation Type 정의</h1>
<p>어노테이션은 <strong>엘리먼트(Element)</strong>라는 것을 멤버로 가질 수 있다. Element는 타입과 이름으로 구성되며 디폴트값을 가질 수 있다. Element의 이름 뒤에는 메서드를 작성하는 것처럼 <strong>뒤에 ()</strong>를 꼭 붙여야 한다.</p>
<blockquote>
<p>@Entity(tableName = &quot;vehicles&quot;)</p>
</blockquote>
<p>기본 Element는 value이며 해당 값은 @어노테이션(값)으로 바로 사용 가능하다.</p>
<h1 id="transactional">@Transactional</h1>
<p>@Transactional이 적용되는 메소드를 하나의 트랜잭션으로 묶어주는 역할이다.</p>
<blockquote>
<p>2개 이상의 쿼리를 하나의 커넥션으로 묶어 DB에 전송하고, 이 과정에서 에러가 발생할 경우 자동으로 모든 과정을 Rollback합니다.</p>
</blockquote>
<p>클래스 위에 @Transactional이 붙어있으면, 클래스에 속한 모든 메소드에 각각 @Transactional이 적용된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Http Method]]></title>
            <link>https://velog.io/@rg_na/Http-Method</link>
            <guid>https://velog.io/@rg_na/Http-Method</guid>
            <pubDate>Sun, 01 Aug 2021 06:39:02 GMT</pubDate>
            <description><![CDATA[<h1 id="get">GET</h1>
<p>-특정 리소스의 표시를 요청한다. <img src="https://images.velog.io/images/rg_na/post/b9294812-b995-4679-b9dd-7c7b8d8a5784/1F68F327-96CC-4034-A7E9-2D2EEC6A1D57_1_201_a.jpeg" alt="">GET을 사용하는 요청은 오직 데이터를 받기만 한다. 
-GET을 사용할 때는 서버에 어떠한 수정도 있으면 안된다.(수정이 없기 때문에 GET Method = safe Methods라고 할 수 있다).</p>
<h1 id="post">POST</h1>
<p>-특정 리소스에 엔티티를 제출할 때 사용한다.
-새로운 리소스를 생성하거나 독립적인 명령(Controller)를 실행할 때 사용한다.
-정상적으로 생성된 경우 201(Create) HTTP응답 코드를 리턴한다.</p>
<h1 id="put">PUT</h1>
<p>-현재 존재하는 리소스의 전체적인 업데이트를 하는 경우에 사용한다.(만약, 리소스가 존재하지 않는다면 POST의 생성로직으로 새로 만들어도 되며 그렇지 않아도 된다.)
-정상적으로 Update되었다면 200(OK) HTTP응답 코드를 리턴한다.</p>
<h1 id="delete">DELETE</h1>
<p>-리소스를 삭제하는데 사용된다. 성공적으로 리소스를 삭제했다면, 응답 상태를 body에 담고 있다가 200(OK)으로, 그렇지 않을 경우 202(Accepted)또는 204(No Content)로 응답한다. 그리고 해당 리소스가 없다면 404(Not Found)로 응답해야 합니다.</p>
<h1 id="patch">PATCH</h1>
<p>-부분 리소스의 업데이트의 경우 사용한다.
-PUT의 경우는 전체적인 업데이트, PATCH의 경우 부분적인 업데이트이다.
※PHP, 톰캣,Django등등 많은 곳에서 지원하지 않는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Overloading / Overriding 차이]]></title>
            <link>https://velog.io/@rg_na/Overloading-Overriding-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@rg_na/Overloading-Overriding-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Sun, 01 Aug 2021 06:29:55 GMT</pubDate>
            <description><![CDATA[<h1 id="overloading">Overloading</h1>
<p>조건</p>
<blockquote>
<p>1.메서드 이름이 같아야 한다
2.매개변수의 개수 또는 타입이 달라야 한다.</p>
</blockquote>
<p>서로 다른 이름으로 만들지 않아도 되어서 사용하는 쪽에서 부담이 적다.</p>
<h1 id="overriding">Overriding</h1>
<p>조건</p>
<blockquote>
<p>1.자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 이름이 같아야 한다.
2.자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 매개변수가 같아야 한다.
3.자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 반환 타입이 같아야 한다.</p>
</blockquote>
<h1 id="차이점">차이점</h1>
<p>오버라이딩 - 기존에 없는 새로운 메서드를 추가하는 것
오버로딩 - 조상으로부터 상속받은 메서드의 내용을 변경하는 것</p>
<pre><code>class Parent{
    void parentMethod() {}
}
class Child extends Parent{
    void parentMethod() {} //오버라이딩
    void parentMethod(int i) {}  //오버로딩
}</code></pre>]]></description>
        </item>
    </channel>
</rss>