<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>pro-park-gation.log</title>
        <link>https://velog.io/</link>
        <description>@!@</description>
        <lastBuildDate>Tue, 03 May 2022 00:36:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>pro-park-gation.log</title>
            <url>https://images.velog.io/images/pro-park-gation/profile/88918596-2104-47e5-97ad-c399410a070d/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. pro-park-gation.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/pro-park-gation" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[220502-Logging(2)]]></title>
            <link>https://velog.io/@pro-park-gation/220502-Logging2</link>
            <guid>https://velog.io/@pro-park-gation/220502-Logging2</guid>
            <pubDate>Tue, 03 May 2022 00:36:16 GMT</pubDate>
            <description><![CDATA[<p>로깅 설정은 로깅 프레임워크 설정에 따르게 됨</p>
<p><img src="https://velog.velcdn.com/images/pro-park-gation/post/4ef292e2-1110-42f9-896c-ddabc6c52102/image.png" alt=""></p>
<p>src/test/resources 에 logback-test.xml 파일을 넣는데,
test code에서는 main의 코드를 import할 수 있고, src/main/java/resources도 classpath에 등록되어 사용 가능
-&gt; src/main/java/resources에도 logback-test.xml이 있으면 충돌</p>
<p>배포시엔 test폴더가 빠지므로, src/main/java/resources에 logback.groovy나 logback.xml을 넣는다
<img src="https://velog.velcdn.com/images/pro-park-gation/post/477e536f-6cea-415b-a61b-3abef85ac66d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/pro-park-gation/post/d27ad6b5-01d7-4087-927f-a9c9aaf8a99f/image.png" alt=""></p>
<p>appender : 어디에 출력? (ConsoleAppender, FileAppender, )
  encoder : 어떻게 출력?
root : level 설정(해당 level보다 같거나 위험한 로그 출력), classpath 상의 모든 logger level에 적용됨</p>
<ul>
<li>logger name에 다른 제약을 줘서 method, class, package 별로 다른 level 적용 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/pro-park-gation/post/31df1328-5138-428f-bbb3-399f6e5ccb62/image.png" alt=""></p>
<p>appender-ref 설정시 주의사항 : log 중첩 
additivity flag로 컨트롤
<img src="https://velog.velcdn.com/images/pro-park-gation/post/d513f76e-454a-4864-a70e-b2eb613406dc/image.png" alt=""></p>
<p>encoder pattern을 property로 등록
<img src="https://velog.velcdn.com/images/pro-park-gation/post/4919a5d9-9400-4b4c-b29d-06f98d40aae1/image.png" alt=""></p>
<p>로그백 프레임워크에선 로그 생성시 로깅 이벤트가 발생한다
로깅 이벤트를 문자열로 변환(layout pattern) 
문자열을 변환할 때, conversion word를 이용해서 logging event-&gt;문자열 변환을 한다
ex) d,date,  logger ,...</p>
<p><img src="https://velog.velcdn.com/images/pro-park-gation/post/a5a7b061-259c-4901-a58b-6b63b6a0e384/image.png" alt=""></p>
<p>appender를 만들어서 logger에 appender-ref로 추가
<img src="https://velog.velcdn.com/images/pro-park-gation/post/346a10e9-cf2b-492b-a6ac-7d3fdc8f29f9/image.png" alt=""></p>
<p>기동시마다 새 로그파일 생성(timestamp로)
보통 RollingFileAppender 자주 쓴다(장시간 구동되기 때문에 하나의 파일에 계속 append하면 파일이 커짐) - 1일 1파일
<img src="https://velog.velcdn.com/images/pro-park-gation/post/36d4ec79-33ef-40cb-8c52-0f9e0f7d33b1/image.png" alt=""></p>
<p>TimeBasedRollingPolicy는 Rollingpolicy와 TriggeringPolicy를 상속한 구상체</p>
<p>최신 로그(당일)는 logs/access.log 파일로, 그 이전의 로그는 fileNamePattern대로 로그파일이 생성된다
<img src="https://velog.velcdn.com/images/pro-park-gation/post/e068d99a-24a5-448d-ac8c-924d72559c88/image.png" alt=""></p>
<p>Conversion
ConversionRule을 이용하면 PatternLayout에서 본 것 처럼 d, date, msg 같은 conversion 문자열을 추가할 수 있음
ex) 색 지정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[220222-Markdown Presentation]]></title>
            <link>https://velog.io/@pro-park-gation/220222-Markdown-Presentation</link>
            <guid>https://velog.io/@pro-park-gation/220222-Markdown-Presentation</guid>
            <pubDate>Tue, 22 Feb 2022 15:54:47 GMT</pubDate>
            <description><![CDATA[<h1 id="1-markdown-presenation이란">1. Markdown Presenation이란?</h1>
<p>Markdown 문서로 presenation 슬라이드를 만들 수 있는 도구이다.</p>
<h1 id="2-변환-툴">2. 변환 툴</h1>
<p>웹버전</p>
<ul>
<li>remark </li>
<li>Cleaver</li>
</ul>
<p>VScode extention</p>
<ul>
<li>Marp for VS Code</li>
</ul>
<p>Marp Cli</p>
<ul>
<li><a href="https://github.com/marp-team/marp-cli">https://github.com/marp-team/marp-cli</a></li>
</ul>
<h1 id="3-주요-문법">3. 주요 문법</h1>
<h3 id="31-페이지-구분">3.1 페이지 구분</h3>
<pre><code>---</code></pre><h3 id="32-줄바꿈">3.2 줄바꿈</h3>
<pre><code>\</code></pre><h3 id="33-공백-문자-채우기">3.3 공백 문자 채우기</h3>
<pre><code>$~~~~~~~~~~~~$</code></pre><h3 id="34-테마-설정예시">3.4 테마 설정(예시)</h3>
<pre><code>---
theme: gaia
_class: lead
paginate: true
backgroundColor: #fff
marp: true
backgroundImage: url(&#39;https://marp.app/assets/hero-background.jpg&#39;)
---</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[220222-Markdown]]></title>
            <link>https://velog.io/@pro-park-gation/220222-Markdown</link>
            <guid>https://velog.io/@pro-park-gation/220222-Markdown</guid>
            <pubDate>Tue, 22 Feb 2022 15:04:00 GMT</pubDate>
            <description><![CDATA[<h1 id="1-markdown-이란">1. Markdown 이란?</h1>
<h3 id="11-정의">1.1 정의</h3>
<p>Markdown은 일반 텍스트 기반의 경량 마크업 언어</p>
<h3 id="12-사용례">1.2 사용례</h3>
<ul>
<li>소프트웨어와 함께 배포되는 Readme 파일</li>
</ul>
<hr>
<h1 id="2-문법">2. 문법</h1>
<h3 id="21-제목">2.1 제목</h3>
<p>Markdown은 6가지 수준의 제목을 지원한다.</p>
<p>#(1~6개)를 사용하여 제목 레벨을 나타낼 수 있다.</p>
<h4 id="사용-방법">사용 방법</h4>
<pre><code># 첫번째 레벨입니다. (H1)

## 두번째 레벨입니다. (H2)

...

###### 여섯번째 레벨입니다. (H6)</code></pre><h4 id="실행-결과">실행 결과</h4>
<h1 id="첫번째-레벨입니다-h1">첫번째 레벨입니다. (H1)</h1>
<h2 id="두번째-레벨입니다-h2">두번째 레벨입니다. (H2)</h2>
<p>...</p>
<h6 id="여섯번째-레벨입니다-h6">여섯번째 레벨입니다. (H6)</h6>
<hr>
<h3 id="22-텍스트-강조">2.2 텍스트 강조</h3>
<h4 id="221-bold체">2.2.1 bold체</h4>
<h4 id="사용-방법-1">사용 방법</h4>
<pre><code>텍스트를 **두껍게** 표시하여 강조합니다.
텍스트를 __두껍게__ 표시하여 강조합니다.
</code></pre><h4 id="실행-결과-1">실행 결과</h4>
<p>텍스트를 <strong>두껍게</strong> 표시하여 강조합니다.
텍스트를 <strong>두껍게</strong> 표시하여 강조합니다.</p>
<h4 id="222-italic체">2.2.2 italic체</h4>
<h4 id="사용-방법-2">사용 방법</h4>
<pre><code>텍스트를 기울림체로 표시하려면 
*텍스트*
_텍스트_
와 같이 텍스트 양 끝에 *또는 _를 입력합니다.</code></pre><h4 id="실행-결과-2">실행 결과</h4>
<p>텍스트를 기울림체로 표시하려면 
<em>텍스트</em>
<em>텍스트</em>
와 같이 텍스트 양 끝에 *또는 _를 입력합니다.</p>
<h4 id="223-밑줄">2.2.3 밑줄</h4>
<h4 id="사용-방법-3">사용 방법</h4>
<pre><code>텍스트에 밑줄을 그으려면 강조할 텍스트 사이에 &lt;u&gt;텍스트&lt;/u&gt;를 넣어 사용합니다.</code></pre><h4 id="실행-결과-3">실행 결과</h4>
<p>텍스트에 밑줄을 그으려면 강조할 텍스트 사이에 <u>텍스트</u>를 넣어 사용합니다. </p>
<hr>
<h3 id="23-취소선">2.3 취소선</h3>
<h4 id="사용-방법-4">사용 방법</h4>
<pre><code>텍스트에 취소선을 넣으려면 텍스트 양 끝에 ~~텍스트~~를 입력합니다.</code></pre><h4 id="실행-결과-4">실행 결과</h4>
<p>텍스트에 취소선을 넣으려면 텍스트 양 끝에 <del>텍스트</del>를 입력합니다.</p>
<hr>
<h3 id="24-인용구">2.4 인용구</h3>
<h4 id="사용-방법-5">사용 방법</h4>
<pre><code>인용문구는 문장 시작에 &gt;를 입력하고 작성합니다.</code></pre><h4 id="실행-결과-5">실행 결과</h4>
<blockquote>
<p>인용문구는 문장 시작에 &gt;를 입력하고 작성합니다.</p>
</blockquote>
<hr>
<h3 id="25-코드-블럭">2.5 코드 블럭</h3>
<p>프로그램 소스코드에 포함된 기호로 인해 소스코드가 올바르게 표현되지 않을 수 있습니다. 
소스코드 양 끝을 </p>
<pre><code>```소스코드```</code></pre><p>로 감싸면 소스코드를 표현할 수 있습니다.</p>
<p>여는 ` 뒤에 언어를 적으면 해당 언어의 문법으로 표현해줍니다.</p>
<pre><code>```java 소스코드```</code></pre><h4 id="사용-방법-6">사용 방법</h4>
<pre><code>```java
public class Example{
    public static void main(String args[]{
    }
} ```</code></pre><h4 id="실행-결과-6">실행 결과</h4>
<pre><code class="language-java">public class Example{
    public static void main(String args[]{
    }
} </code></pre>
<hr>
<h3 id="26-하이퍼링크">2.6 하이퍼링크</h3>
<p>http(s):// 주소를 입력해도 링크가 생성됩니다.
링크를 텍스트로 변환하려면 <code>[텍스트](주소)</code>로 작성합니다.</p>
<h4 id="사용-방법-7">사용 방법</h4>
<pre><code>[네이버](https://naver.com/)</code></pre><h4 id="실행-결과-7">실행 결과</h4>
<p><a href="https://naver.com/">네이버</a></p>
<hr>
<h3 id="27-리스트">2.7 리스트</h3>
<p>리스트는 순서가 있는 리스트와 순서가 없는 리스트, 체크 리스트가 있습니다.</p>
<h4 id="271-순서-있는-리스트">2.7.1 순서 있는 리스트</h4>
<h4 id="사용-방법-8">사용 방법</h4>
<pre><code>1. 순서
2. 있는
3. 리스트</code></pre><h4 id="실행-결과-8">실행 결과</h4>
<ol>
<li>순서</li>
<li>있는 </li>
<li>리스트</li>
</ol>
<h4 id="272-순서-없는-리스트">2.7.2 순서 없는 리스트</h4>
<ul>
<li>순서 없는 리스트는 -,+,* 기호를 사용하여 표현합니다.</li>
<li>순서 없는 리스트는 띄어쓰기 2번을 통해 depth를 표현할 수 있습니다.<h4 id="사용-방법-9">사용 방법</h4>
```</li>
<li>1-1 level<ul>
<li>2-1 level<ul>
<li>3-1 level</li>
</ul>
</li>
</ul>
</li>
<li>1-2 level</li>
<li>1-3 level<ul>
<li>2-1 level</li>
<li>2-2 level</li>
</ul>
</li>
</ul>
<pre><code>
#### 실행 결과
- 1-1 level
  + 2-1 level
    * 3-1 level
- 1-2 level
- 1-3 level
  + 2-1 level
  + 2-2 level


### 2.7.3 체크 리스트

#### 사용 방법</code></pre><ul>
<li><input checked="" disabled="" type="checkbox"> 1번 선택지</li>
<li><input disabled="" type="checkbox"> 2번 선택지</li>
<li><input disabled="" type="checkbox"> 3번 선택지
```<h4 id="실행-결과-9">실행 결과</h4>
</li>
<li><input checked="" disabled="" type="checkbox"> 1번 선택지</li>
<li><input disabled="" type="checkbox"> 2번 선택지</li>
<li><input disabled="" type="checkbox"> 3번 선택지</li>
</ul>
<hr>
<h3 id="28-테이블">2.8 테이블</h3>
<h4 id="사용-방법-10">사용 방법</h4>
<pre><code>구분 1 | 구분 2 | 구분 3|
------|------|------|
1-1   |2-1   | 3-1  |
1-2   |2-2   | 3-2  |
1-3   |2-3   | 3-3  |
</code></pre><h4 id="실행-결과-10">실행 결과</h4>
<table>
<thead>
<tr>
<th>구분 1</th>
<th>구분 2</th>
<th>구분 3</th>
</tr>
</thead>
<tbody><tr>
<td>1-1</td>
<td>2-1</td>
<td>3-1</td>
</tr>
<tr>
<td>1-2</td>
<td>2-2</td>
<td>3-2</td>
</tr>
<tr>
<td>1-3</td>
<td>2-3</td>
<td>3-3</td>
</tr>
</tbody></table>
<hr>
<h3 id="28-문서-내부-링크-이동">2.8 문서 내부 링크 이동</h3>
<p>문서 내부에 이동 가능한 링크를 만들 수 있습니다. </p>
<h4 id="사용-방법-11">사용 방법</h4>
<pre><code>[보여지는 텍스트](#이동할-위치)</code></pre><h4 id="실행-결과-11">실행 결과</h4>
<p><a href="#2-%EB%AC%B8%EB%B2%95">2. 문법</a></p>
<h4 id="주의할-점">주의할 점</h4>
<p><code>(#이동할-위치)</code> 에는 다음 주의사항이 있습니다.</p>
<ul>
<li>알파벳의 경우 소문자만 가능</li>
<li>띄어쓰기는 <code>-</code> 로 구분 </li>
<li>(확인 필요) 문자 중간에 <code>.,</code> 등의 기호가 있다면 생략해야 함<pre><code>[2.1 제목](#21-제목)</code></pre><a href="#21-%EC%A0%9C%EB%AA%A9">2.1 제목</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211230]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211230</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211230</guid>
            <pubDate>Thu, 30 Dec 2021 15:00:33 GMT</pubDate>
            <description><![CDATA[<h3 id="파이썬의-자료형">파이썬의 자료형</h3>
<p>파이썬의 자료형은 모두 reference type이다.
primitive type은 없음.
= 연산자는 새로운 객체의 id를 참조하도록 함.</p>
<h3 id="파이썬-얕은-복사-vs-깊은-복사">파이썬 얕은 복사 vs 깊은 복사</h3>
<p>얕은 복사 : 같은 참조값을 가짐
깊은 복사 : 객체의 값(ex. 리스트의 values)의 복사본</p>
<h3 id="파이썬--vs-is">파이썬 == vs is</h3>
<p>== : 값 비교
is : 참조하는 reference id 비교</p>
<p>참고) None은 null로 값이 정의되지 않음 -&gt; is로만 비교가능</p>
<h3 id="파이썬의-list--배열--연결리스트">파이썬의 list : 배열 + 연결리스트</h3>
<p>요소(연결리스트)에 대한 포인터 목록을 배열 형태로 관리함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211223]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211223</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211223</guid>
            <pubDate>Fri, 24 Dec 2021 14:01:26 GMT</pubDate>
            <description><![CDATA[<h3 id="sql-dialect">SQL dialect</h3>
<p>표준 SQL인 ANSI SQL외에 DBMS마다 문법과 함수가 다른 경우가 있음
ANSI SQL을 지키지 않는 특정 벤더별 문법을 dialect라고 함.</p>
<p>JPA는 hibernate의 도움을 받아 DBMS에 맞는 쿼리를 생성함.
hibernate는 약 40개 이상의 diaelct를 지원함.</p>
<p>자체 지원 함수를 호출하는 경우는 벤더별 dialect를 상속받아서 custom dialect를 구현하면 됨
<a href="https://055055.tistory.com/83">JPA dialect</a>
<a href="https://goodgid.github.io/What-is-Dialect/">JPA에서 말하는 Dialect(방언)이란?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211221]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211221</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211221</guid>
            <pubDate>Tue, 21 Dec 2021 08:30:34 GMT</pubDate>
            <description><![CDATA[<h3 id="querydslrepositorysupport">QueryDslRepositorySupport</h3>
<p>검색 필터 조회(QueryDSL)에 pageable 객체를 적용하여 페이징, 정렬 처리
spring framework.data.jpa.repository.support 패키지의 QueryDslRepositorySupport 
사용
<a href="https://jessyt.tistory.com/55">Querydsl에 pageable을 적용</a></p>
<p>QueryDSL의 OrderSpecifier를 정의하는 방법도 있음
<a href="https://uchupura.tistory.com/7">OrderSpecifier</a></p>
<h3 id="spring-pageable-1부터-시작">spring pageable 1부터 시작</h3>
<p><a href="https://treasurebear.tistory.com/59">page 1부터 시작하기</a>
<a href="http://devstory.ibksplatform.com/2020/03/spring-boot-pageable.html">Pageable 커스터마이징하기</a></p>
<h3 id="https-적용">HTTPS 적용</h3>
<h3 id="3주간의-프로젝트-마무리">3주간의 프로젝트 마무리</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211220]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211220</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211220</guid>
            <pubDate>Mon, 20 Dec 2021 10:36:17 GMT</pubDate>
            <description><![CDATA[<h3 id="h2와-mysql에서의-distinct--orderby">H2와 MySQL에서의 Distinct + Orderby</h3>
<h3 id="검색-필터---querydsl-http-get-request-body---param-변경">검색 필터 - QueryDSL, HTTP GET Request Body -&gt; Param 변경</h3>
<p>elastic search get body 등으로 검색해서 검색 필터 api의 HTTP method를 Get으로 해줄 당위성을 찾은 것 같았는데
프론트에서 사용하는 lib에서 HTTP Get의 Body 사용을 권장하지 않는다고 함.
Request Param 여러개를 받고 controller에서 Request Dto로 변환후 이전처럼 사용함.</p>
<h3 id="서버--http---https로의-변환">서버 : HTTP -&gt; HTTPS로의 변환</h3>
<p>ssl 인증서 - 임시로 
jar 실행시 nohup sudo ~ (443 포트 때문에?)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211218]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211218</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211218</guid>
            <pubDate>Sat, 18 Dec 2021 13:27:52 GMT</pubDate>
            <description><![CDATA[<h3 id="서버-시간">서버 시간</h3>
<ul>
<li>도커, EC2 등으로 서버 사용시 서버 시간 확인하고 적절한 기준시로 변경</li>
</ul>
<h3 id="fk-제약-조건---on-delete">FK 제약 조건 - On Delete</h3>
<p>부모가 삭제될 때, 자식이 가진 FK는</p>
<ul>
<li>On Delete <ul>
<li>Cascade</li>
<li>Null</li>
</ul>
</li>
</ul>
<p>삭제가 잘 안된다면 FK 제약 조건을 설정했는지, 또는 올바른 제약 조건인지 확인해야함.</p>
<h3 id="null-체크와-null-pointer-exception---query-dsl">null 체크와 null pointer exception - query dsl</h3>
<p>아래 코드에서 Integer 타입 매개변수를 null 체크하며 BooleanExpression을 생성하는데,</p>
<p>5번째 line에서 minPrice를 써야할 곳에 maxPrice를 썼다.
line 5에서 maxPrice는 null이어서 </p>
<p>SearchFilterRequest(Dto)의 maxPrice에 값이 없을 경우 NPE가 발생한다.</p>
<p>개발자의 실수가 여기서 드러난다. 
null 체크를 한다고 했지만 컴파일 에러가 없는 코드이고,
maxPrice가 null인 경우에 에러 발생을 알게 된다.</p>
<p>이런 경우 때문에 test code를 꼭 작성하고, 꼼꼼히 작성해야 하는 것 같다.</p>
<p><img src="https://images.velog.io/images/pro-park-gation/post/6b650f94-0d70-4650-85c9-655d9ea9f99a/image.png" alt=""></p>
<h4 id=""></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211217]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211217</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211217</guid>
            <pubDate>Fri, 17 Dec 2021 16:53:52 GMT</pubDate>
            <description><![CDATA[<h3 id="페이징-관련">페이징 관련</h3>
<ul>
<li>application.yaml에 ddl:auto로 해서
pageable 쿼리가 어떻게 발생하는지 찾아서 custom jpql 작성함</li>
</ul>
<h3 id="git-pr-제목">git pr 제목</h3>
<ul>
<li>제목 끝에 #이슈번호 를 누르면 링크가 생성됨</li>
</ul>
<h3 id="jpa-prepare-statment">jpa prepare statment</h3>
<p>?번호 로 쓰고, jpa 메소드 매개변수와 순서대로 매핑됨</p>
<h3 id="shortcurcuit">shortcurcuit</h3>
<p>&amp;&amp; ||  vs &amp; |</p>
<h3 id="querydsl-bean-설정-파일">QueryDSL Bean 설정 파일</h3>
<p>QueryDSL에서 사용하는 JPAQueryFactory는 스프링 빈이 아니라서 이것을 bean으로 등록하는 @Configuration 파일을 생성해야 함</p>
<p>관련 에러
Consider defining a bean of type &#39;com.querydsl.jpa.impl.JPAQueryFactory&#39; in your configuration.</p>
<h3 id="querydsl-gradle-설정">QueryDSL gradle 설정</h3>
<p>gradle 5 vs 6에 따라서 다름
혼재된 자료가 많아서 고생 꽤나함</p>
<p><a href="https://otrodevym.tistory.com/entry/spring-boot-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-6-querydslJPA-%EC%84%A4%EC%A0%95-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%86%8C%EC%8A%A4">querydsl 1</a> : gralde이 이전 버전용</p>
<p><a href="https://www.popit.kr/querydsl%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-repository-%ED%99%95%EC%9E%A5%ED%95%98%EA%B8%B0/">querydsl 2</a>  클래스, 인터페이스 관계도를 바탕으로 잘 설명돼있음</p>
<p><a href="https://prodo-developer.tistory.com/12">QuerydslRepositorySupport</a></p>
<p><a href="https://jojoldu.tistory.com/538">QueryDSL Gralde 설정</a></p>
<h3 id="get에서-modelattribute-받기">Get에서 @ModelAttribute 받기</h3>
<p>multipart/form-data (application/json 노노)</p>
<p>setter로 데이터 -&gt; 객체 로 역직렬화 한다고 함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211212]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211212</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211212</guid>
            <pubDate>Sun, 12 Dec 2021 09:45:57 GMT</pubDate>
            <description><![CDATA[<h3 id="프로세스-background-실행">프로세스 background 실행</h3>
<ul>
<li>foreground vs background<ul>
<li>foreground-background는 single processor에서 multi-process를 스케줄링 할 때 사용됨</li>
<li>forground : </li>
<li>background</li>
</ul>
</li>
<li>&amp; : 프로세스를 background에서 실행</li>
<li>nohup : 터미널이 종료되거나 사용자가 로그아웃해도 background에서 실행(&amp;를 같이 써야함)</li>
<li>demon / service ?
<a href="https://jhnyang.tistory.com/395">foreground, background</a></li>
</ul>
<h3 id="spring---request-parameter-타입">Spring - Request parameter 타입</h3>
<p>primitive vs wrapper</p>
<ul>
<li><p>@Validation 등으로 null에 대한 예외처리를 하면 primitive로 해도 될까?</p>
<ul>
<li>ex) Long 타입은 값 비교시 .longValue()을 호출해야한다.</li>
<li>annotaion으로 null을 걸러주면 primitive를 쓸 수 있지 않을까?</li>
</ul>
</li>
<li><p>번외로, RequestBody로 null을 받은 경우엔 (RequestBody 자체에 validator가 없을경우에)</p>
<ul>
<li>Dto의 primitive type 필드는 기본값(?) int, long은 0</li>
<li>reference/wrapper type 필드는 null
로 들어옴
<a href="https://www.freeism.co.kr/wp/archives/2331">Controller에서 primitive type과 wrapper type의 변형과 유효성검사</a></li>
</ul>
</li>
</ul>
<h3 id="transactional-전파-레벨">@Transactional 전파 레벨</h3>
<p><a href="https://jsonobject.tistory.com/467">Spring @Transactional 전파 레벨</a></p>
<h3 id="자바스프링-부트-프로젝트-buildgradle">자바:스프링 부트 프로젝트 build(gradle)</h3>
<h3 id="gradle-빌드시-could-not-find-toolsjar-please-check-that--contains-a-valid-jdk-installation">gradle 빌드시 Could not find tools.jar. Please check that .... contains a valid JDK installation.</h3>
<ul>
<li><p>상황</p>
<ul>
<li>환경변수에 jre 1.8버전이 매칭되어있고, jdk는 없는상황</li>
<li>프로젝트 Java 버전은 11로 설정된 상황</li>
</ul>
</li>
<li><p>해결</p>
<ul>
<li>환경변수에 jdk11을 설정하지 않고 빌드하는 법<ul>
<li>프로젝트 최상위에 gradle.properties 파일을 생성하고 
org.gradle.java.home={jdk 11버전의 절대경로} 추가</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="원격서버에-파일-업로드--filezilla">원격서버에 파일 업로드 : FileZilla</h3>
<p>git에서 프로젝트를 pull해서 gradle로 빌드하는데 잘 되지 않았음
EC2에 jar 파일을 업로드해서 배포하기로 함
FileZilla 라는 프로그램을 사용해서 sftp(ssh file transfer protocol)로 ec2에 접속하여 파일 업로드</p>
<p>EC2는 인바운드 규칙에서 ssh 포트(22)를 개방
FileZilla에서</p>
<ul>
<li>host : ec2 ip</li>
<li>port : 22</li>
<li>protocol : sftp</li>
<li>logon 유형 : pem.key</li>
<li>User : ubuntu</li>
<li>key file : pem.key 
입력하여 접속</li>
</ul>
<h3 id="게시글과-이미지-업로드">게시글과 이미지 업로드</h3>
<p>게시물 업로드시 이미지가 저장되고 문자열이 저장되는데, 문자열 저장(아티클 내용)이 실패하면 이미지만 있게됨
배치작업으로 당일 등록된 아티클과 당일 등록된 이미지를 대조하여 아티클에 속하지 않는 이미지 url(이미지)는 삭제하도록 하면 저장공간 낭비를 없앨 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211210]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211210-sa4ivelw</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211210-sa4ivelw</guid>
            <pubDate>Fri, 10 Dec 2021 05:12:02 GMT</pubDate>
            <description><![CDATA[<h3 id="ec2에-mysql-설치후-접속-안되는-현상">EC2에 MySQL 설치후 접속 안되는 현상</h3>
<ul>
<li><p>상황 : EC2 인바운드 tcp 3306 설정, MySQL 실행중인데 intellij에서 ec2주소:3306으로 접속이 안됨</p>
</li>
<li><p>해결 : mysql 설정파일에서 bind 주소 127.0.0.1 -&gt; 0.0.0.0으로 수정
<a href="https://mirae-kim.tistory.com/73">지식 창고/IT 지식
[AWS] AWS EC2에 mysql 설치하기 (ubuntu)</a></p>
</li>
</ul>
<h3 id="spring-response-json에서-boolean의-is가-생략되는-문제">[Spring] Response json에서 boolean의 is가 생략되는 문제</h3>
<p>변수 type을 boolean -&gt; Boolean 으로 변경
<a href="https://gimquokka.github.io/spring/Spring_Jackson_is_%EC%83%9D%EB%9E%B5%EB%AC%B8%EC%A0%9C/">[Spring] Response json에서 boolean의 is가 생략되는 문제</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211209]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211209</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211209</guid>
            <pubDate>Thu, 09 Dec 2021 07:07:06 GMT</pubDate>
            <description><![CDATA[<h3 id="jpa-hibernate-인덱스-설정">jpa hibernate 인덱스 설정</h3>
<p>@Column에 name을 명시적으로 주지 않은 categoryCode필드(category_code)가 인덱스에 안걸림
-&gt; name을 명시적으로 주면 db 컬럼명을 걸어줘야 하고
-&gt; name을 명시적으로 주지 않으면 필드명인듯</p>
<h3 id="column의-name과-referencecolumnname">@Column의 name과 referenceColumnName</h3>
<ul>
<li><p>name : 해당 FK가 저장될 column 명을 명시적으로 지정.</p>
<ul>
<li>name 지정하지 않으면 {entity의 필드명}_{참조하는 테이블의 PK명}</li>
</ul>
</li>
<li><p>referenceColumnName: </p>
</li>
</ul>
<h3 id="lombok-생성자-annotaion">Lombok 생성자 annotaion</h3>
<p><a href="https://lkhlkh23.tistory.com/159">Lombok 너무 편리하기 때문에 주의해야 한다. (Lombok 주의점)</a></p>
<h3 id="char-vs-varchar">Char vs Varchar</h3>
<p><a href="https://mozi.tistory.com/229">[DBA] 데이터타입 CHAR 와 VARCHAR 중 어느것을 써야할까?</a></p>
<h3 id="jpql에서-limit-사용하는-방법">JPQL에서 Limit 사용하는 방법</h3>
<p>findFirst[By][OrderBy][Desc/Asc]
findTop개수[By][OrderBy][Desc/Asc]
<a href="https://www-swpro-com.tistory.com/46">https://www-swpro-com.tistory.com/46</a></p>
<h3 id="jpa-exists-쿼리">JPA exists 쿼리</h3>
<p><a href="https://jojoldu.tistory.com/516">JPA exists 쿼리 성능 개선</a></p>
<h3 id="jpa-column---insertable-updateable-columndefinition">JPA column - insertable, updateable, columnDefinition</h3>
<h3 id="jpa가-column명을-정의하는-방법--joincolumn의-동작방식">JPA가 column명을 정의하는 방법 / Joincolumn의 동작방식</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211208]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211208</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211208</guid>
            <pubDate>Wed, 08 Dec 2021 05:53:04 GMT</pubDate>
            <description><![CDATA[<h3 id="spring-예외-관련---restcontrolleradvice">Spring 예외 관련 - @RestControllerAdvice</h3>
<p>예외 발생(MethodArgumentException) 했는데 response가 만든 class가 아닌 default message로 옮
-&gt; 예외 처리하는 클래스가 @ControllerAdvice로 되어있음 : 프로젝트의 controller는 @RestController임
-&gt; @RestControllerAdvice 로 해야됨</p>
<h3 id="s3-access-controller-list-에러">s3 access controller list 에러</h3>
<ul>
<li>acl 해제해서 아래와 같아야함</li>
</ul>
<p><img src="https://images.velog.io/images/pro-park-gation/post/f1126e71-0a94-451f-a4b1-d2890f97b23e/image.png" alt=""></p>
<p>+관련 : S3 access point란? (알아보기)
<a href="https://aws.amazon.com/ko/s3/features/access-points/">Amazon S3 액세스 포인트</a></p>
<h3 id="ec2-spring-boot-project-build가-잘-안될때">EC2 spring boot project build가 잘 안될때</h3>
<p>현상 : 80%에서 거의 멈춤
hot fix : test 패키지를 제외하고 빌드 (./gradlew clean build -x test)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211207]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211207</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211207</guid>
            <pubDate>Tue, 07 Dec 2021 15:31:39 GMT</pubDate>
            <description><![CDATA[<p><a href="https://jforj.tistory.com/90">[JPA] @Query, 직접 쿼리 작성</a></p>
<p><a href="http://daplus.net/java-%EC%8A%A4%ED%94%84%EB%A7%81-jparepository%EC%9D%98-like-%EC%BF%BC%EB%A6%AC/">[java] 스프링 JpaRepository의 % Like % 쿼리
</a>
Containing</p>
<p>Json LocalDateTime : @JsonFormat</p>
<p><a href="https://djunnni.gitbook.io/springboot/2019-09-05">Spring Data JPA 를 이용한 쿼리 연습
</a></p>
<p>JPA limit : page</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211204]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211204</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211204</guid>
            <pubDate>Sat, 04 Dec 2021 14:36:29 GMT</pubDate>
            <description><![CDATA[<h2 id="1-inner-static-class">1. inner static class</h2>
<p><a href="https://fsd-jinss.tistory.com/141">Static inner class를 쓰는이유는 무엇일까?</a></p>
<p><a href="https://siyoon210.tistory.com/141">내부(inner) class와 내부(inner) static class 차이</a></p>
<h2 id="2-spring-entity">2. spring @Entity</h2>
<ul>
<li>@Id<ul>
<li>@GenerateValue : 사용하는 DB의 dialect 설정에 따른 키 생성 전략이 적용됨</li>
</ul>
</li>
</ul>
<p>createDate나 count 등의 column에 자주 사용되는 속성</p>
<ul>
<li>insertable</li>
<li>updatable<ul>
<li>hibernate가 UPDATE SQL을 생성할 때 제외할 column을 지정하는 속성</li>
</ul>
</li>
<li>columnDefinition<ul>
<li>date의 경우 &quot;date default sysdate&quot;</li>
<li>&quot;number default 0&quot;
등이 가능</li>
</ul>
</li>
</ul>
<h2 id="3-dto-layer">3. Dto layer</h2>
<p><a href="https://1-7171771.tistory.com/153">DTO, 어디까지 사용해야 할까?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[StayB 클론코딩 회고2 - 211115]]></title>
            <link>https://velog.io/@pro-park-gation/StayB-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9-%ED%9A%8C%EA%B3%A02-211115</link>
            <guid>https://velog.io/@pro-park-gation/StayB-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9-%ED%9A%8C%EA%B3%A02-211115</guid>
            <pubDate>Mon, 15 Nov 2021 14:11:22 GMT</pubDate>
            <description><![CDATA[<p>팀원의 QueryDSL 파트 작업에 대한 질문-답변 내용</p>
<h3 id="q1-modelattribute-사용-이유">Q1) ModelAttribute 사용 이유</h3>
<p>QueryParameter 여러개를 Get 방식으로 받는 쿼리여서 RequestBody는 안됨.
QueryParameter의 개수가 동적이어서 RequestParam 방식도 안됨.
RequestParam 조합마다 endpoint를 만드는 것은 지양해야 할 방법.
결론 : QueryDSL 장점 2인 동적 쿼리에 적합한 것이 ModelAttribute이다.</p>
<p><a href="https://madplay.github.io/post/introduction-to-querydsl">Querydsl: 소개와 사용법</a></p>
<p>참고로 ModelAttribute는 @Controller - data를 view에 mapping 하기 위해 사용하기도 한다.
<a href="https://velog.io/@jsj3282/%EC%8A%A4%ED%94%84%EB%A7%81-MVC-%ED%99%9C%EC%9A%A926-%EB%AA%A8%EB%8D%B8-ModelAttribute-%EB%98%90-%EB%8B%A4%EB%A5%B8-%EC%82%AC%EC%9A%A9%EB%B2%95">ModelAttribute의 여러가지 사용법</a></p>
<h3 id="q2-querydsl-사용-이유">Q2) QueryDSL 사용 이유</h3>
<p>조건이 많은 검색인 경우 custom query(native query - @Query)를 만드는 것보다, QueryDSL을 사용하는 것이 좋다.</p>
<ul>
<li>장점 1. 조건이 많은 쿼리문을 직접 작성하면 문법적 오류가 발생할 확률이 높아지는데 이를 방지(컴파일 타임에서 알게됨)</li>
<li>장점 2. 동적 쿼리<ul>
<li>전달되는 파라미터가 없어서 where절에 null이 들어가면 해당 조건은 생략된다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java-5 : 객체 지향 설계 5원칙 SOLID]]></title>
            <link>https://velog.io/@pro-park-gation/Java-5-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84-5%EC%9B%90%EC%B9%99-SOLID</link>
            <guid>https://velog.io/@pro-park-gation/Java-5-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84-5%EC%9B%90%EC%B9%99-SOLID</guid>
            <pubDate>Fri, 12 Nov 2021 09:10:22 GMT</pubDate>
            <description><![CDATA[<h2 id="1-srp단일-책임-원칙--어떤-클래스를-변경해야-하는-이유는-오직-하나뿐이어야-한다">1. SRP(단일 책임 원칙) : 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.</h2>
<p>클래스는 단 한개의 책임을 가져야 한다.
-&gt; 클래스가 가진 여러 책임별로 변경 사항이 생길 수 있다. 
-&gt; 클래스가 하나의 책임을 가지면 변경되는 이유는 그 책임의 내용이 변경되어서 이다.</p>
<p>책임의 단위는 변화되는 부분과 관련이 있다.
Class의 변수/메소드를 사용하는 사용자(Class 외부)마다 다른 의미로 사용하거나(변수), 다른 메소드를 사용한다면 단일 책임에 원칙에 위배될 확률이 크다.</p>
<p>ex) Domain Class(model)가 정보 반환(getter), 정보 저장(save), 정보 출력(print)의 역할을 한다면,
정보 저장은 저장 매체에 따라서</p>
<ul>
<li>saveDB</li>
<li>saveMemory
정보 출력은 출력 매체에 따라서 코드가 변경된다.</li>
<li>printScreen</li>
<li>printConsole</li>
</ul>
<p>SRP 원칙은 변수, 클래스, 패키지, 모듈, 데이터베이스 테이블가지 적용할 수 있는 원칙</p>
<p>두가지 알려진 방법</p>
<p>1) 클래스에서 변화가 있는 부분은 sub class로, 변화가 없는 부분(공통)은 super class로 
2) 클래스 일부를 extract하여 멤버로 </p>
<h2 id="2-ocp개방-폐쇄-원칙--자신의-확장에는-열려-있고-주변의-변경에-대해서는-닫혀-있어야-한다">2. OCP(개방 폐쇄 원칙) : 자신의 확장에는 열려 있고, 주변의 변경에 대해서는 닫혀 있어야 한다.</h2>
<ul>
<li><p>주변 변경에 닫혀 있다
한 클래스가 사용하는 다른 클래스의 인스턴스가 여러 종류일 때, 인스턴스마다 다른 사용법이 필요</p>
<ul>
<li>참조 대상인 클래스가 추상체(상위 클래스, 인터페이스)를 제공하면 사용자는 구현체가 달라져도 변화가 없음</li>
</ul>
</li>
<li><p>자신의 확장</p>
<ul>
<li>자신의 추상체가 있으면 확장(다른 구현체)에는 무리가 없음</li>
</ul>
</li>
</ul>
<p>예제</p>
<ul>
<li>JDBC 인터페이스<ul>
<li>DB를 사용하는 자바 app은 DB 종류에 상관없이 JDBC 인터페이스가 제공하는 메서드만 호출</li>
</ul>
</li>
<li>자바<ul>
<li>자바 프로그래머는 JVM 덕분에 프로그램이 동작할 환경(os..)에 영향받지 않음</li>
</ul>
</li>
</ul>
<p><strong>변화하는 부분을 추상화(상위 클래스/인터페이스)하자</strong></p>
<h2 id="3-lsp리스코프-치환-원칙--서브-타입은-언제나-자신의-기반-타입으로-교체할-수-있어야-한다">3. LSP(리스코프 치환 원칙) : 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.</h2>
<p>상위 타입이 풍부해야 하위 타입의 인스턴스를 상위형 참조 변수에 대입해 그 역할을 할 수 있다.</p>
<ul>
<li><p>상위 타입이 풍부하지 않으면 형변환을 자주 해야됨</p>
</li>
<li><p>또는 if ( 하위 A instance of 상위) 같은 로직이 필요해져서 코드가 복잡해짐  </p>
<ul>
<li>여기서는 개방 폐쇄 원칙도 위반하게 됨(하위 타입이 많아지고 그 변경이 사용자에게 영향을 미치면 사용자는 외부 변경에 닫혀있지 않게됨)</li>
</ul>
</li>
<li><p>예시</p>
<ul>
<li>자바 Collection에서 상위 타입만으로 manipulation 하는 것에 무리가 없다</li>
</ul>
</li>
</ul>
<h2 id="4-isp인터페이스-분리-원칙--클라이언트는-자신이-사용하지-않는-메서드에-의존-관계를-맺으면-안된다">4. ISP(인터페이스 분리 원칙) : 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.</h2>
<ul>
<li>클라이언트가 관심있는 기능만 공개할 것<ul>
<li>사용해선 안되는 기능을 이용하면 안됨</li>
<li>관심없는 기능이 변해도 영향을 받으면 안됨</li>
</ul>
</li>
</ul>
<pre><code class="language-java">// ISP를 만족하지 않는다. 
interface Printer { 
    copyDocument(); 
    printDocument(document: Document); 
    stapleDocument(document: Document, tray: Number); 
} 

// 사용되지 않는 메서드를 구현하고 있다.
class SimplePrinter implements Printer { 
    public copyDocument() {} // 사용 하지 않음 
    public printDocument(document: Document) { 
        console.log(&quot;simple copy&quot;, document); 
    } 
    public stapleDocument(document: Document, tray: Number) {} // 사용 하지 않음 
}
</code></pre>
<pre><code class="language-java">// ISP를 만족한다. 
interface Printer { 
    printDocument(document: Document); 
} 

interface Stapler { 
    stapleDocument(document: Document, tray: number); } 

interface Copier { 
    copyDocument(); 
} 

class SimplePrinter implements Printer { 
    public printDocument(document: Document) {} 
} 

class SuperPrinter implements Printer, Stapler, Copier { 
    public copyDocument() {} 
    public printDocument(document: Document) {} 
    public stapleDocument(document: Document, tray: number) {} 
}</code></pre>
<h2 id="5-dip역전-의존-원칙--자신보다-변하기-쉬운-것에-의존하지-말것">5. DIP(역전 의존 원칙) : 자신보다 변하기 쉬운 것에 의존하지 말것.</h2>
<p>자신보다 변하기 쉬운 것에 의존하던 것
-&gt; 추상화된 <strong>인터페이스</strong>나 <strong>상위 클래스</strong>를 두어 변하기 쉬운 것의(구상체) 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.</p>
<p>User - Pay(추상체) - samsung/kakao/naver(구현체)</p>
<h2 id="느낀점">느낀점</h2>
<p>이게 다 유지보수를 잘 하려는 의도에서 생긴 원칙 같다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211109]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211109</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211109</guid>
            <pubDate>Tue, 09 Nov 2021 17:18:02 GMT</pubDate>
            <description><![CDATA[<h3 id="1-abstrac-class-vs-interface">1. Abstrac Class vs Interface</h3>
<h3 id="2-java--멤버-메소드는-heap-영역이-아니라-static-영역에-있다">2. Java : 멤버 메소드는 heap 영역이 아니라 static 영역에 있다</h3>
<ul>
<li>멤버 메소드는 멤버 변수의 값 이외에 객체마다 다른 것이 없다</li>
<li>객체 생성마다 heap에 로드되면 낭비
-&gt; static 영역에 static 메소드 처럼 로드하고, 메서드의 parameter로 this를 넘겨준다
-&gt; 메모리 사용량 절약</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java-4 : 자바가 확장한 객체 지향]]></title>
            <link>https://velog.io/@pro-park-gation/Java-4-%EC%9E%90%EB%B0%94%EA%B0%80-%ED%99%95%EC%9E%A5%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5</link>
            <guid>https://velog.io/@pro-park-gation/Java-4-%EC%9E%90%EB%B0%94%EA%B0%80-%ED%99%95%EC%9E%A5%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5</guid>
            <pubDate>Tue, 09 Nov 2021 08:49:08 GMT</pubDate>
            <description><![CDATA[<h3 id="1-abstract-키워드">1. Abstract 키워드</h3>
<ul>
<li>추상 메서드와 추상 클래스를 선언할 때 사용하는 키워드</li>
<li>추상 메서드 : 구현부가 없는 메서드</li>
<li>추상 클래스 : 추상 메서드를 1개이상 가지는 클래스</li>
</ul>
<h3 id="2-추상-클래스">2. 추상 클래스</h3>
<ul>
<li>추상 클래스로 부터는 인스턴스를 생성할 수 없다.</li>
<li>추상 클래스를 상속한 클래스는 추상 메서드를 반드시 오버라이딩 해야한다.</li>
</ul>
<h3 id="3-생성자">3. 생성자</h3>
<ul>
<li>new 클래스()로 클래스의 인스턴스를 생성한다.</li>
<li>생성자의 다른 이름은 &quot;객체 생성자 메서드&quot;이다.(반환형은 void)</li>
<li>기본 생성자<ul>
<li>자바 컴파일러는 클래스에 생성자가 없으면 기본 생성자(noargconstruct)를 만들어줌</li>
<li>기본 생성자가 호출되면 인스턴스 변수들은 각자의 기본값으로 초기화됨(int:0, String:&quot;&quot;, Class: null)</li>
<li>프로그래머가 생성자를 만들어주면(생성자 오버로딩) 기본 생성자를 만들지 않음</li>
</ul>
</li>
<li>상속 관계에서 자식 클래스의 생성자에서는 <strong>부모클래스의 생성자</strong>가 가장 먼저 호출된다.</li>
</ul>
<h3 id="4-static-블록">4. static 블록</h3>
<ul>
<li>객체 생성자가 있다면, 클래스 생성자도 있다</li>
<li>static {} 블록은 클래스가 <strong>처음</strong> 사용되는 시점에 메모리의 스태틱 영역에 로드된다<ul>
<li>보통 프로그램 실행시 클래스 정보가 로드된다고 알려져 있는데 이는 잘못된 정보</li>
<li>클래스(static)영역의 자원은 프로그램이 종료될 때 반환되므로, 최대한 늦게 로드하는 것이 이득</li>
</ul>
</li>
<li>클래스가 사용(로드)되는 시점<ul>
<li>클래스 변수가 사용될 때</li>
<li>클래스 메소드가 사용될 때</li>
<li>클래스 인스턴스가 생성될 때</li>
</ul>
</li>
<li>static 블록에서 사용할 수 있는 멤버는 static 멤버(static 블록이 로드되는 시점에는 객체 멤버는 메모리상에 없다)</li>
<li>static 변수와 마찬가지로, 모든 클래스가 공유하는 영역이므로 클래스가 최초 로드되는 시점에 한번만 실행된다</li>
<li>사용예<ul>
<li>@BeforeClass (JUnit 4), @BeforeAll (JUnit 5)
test실행전에 공통적으로 수행해야 하는 작업</li>
</ul>
</li>
<li>참고 : 인스턴스 블록 {} <ul>
<li>인스턴스가 생성될 때마다 {} 내용이 실행됨</li>
<li>생성자 실행 전에 실행됨<h3 id="5-final-키워드">5. final 키워드</h3>
</li>
</ul>
</li>
<li>final Class<ul>
<li>상속의 대상이 되지 않는 Class</li>
<li>해당 Class를 확장(extends) 할 수 없음</li>
</ul>
</li>
<li>final Variable<ul>
<li>상수 : 불변 값을 갖는 변수 </li>
<li>최초 1회만 초기화 가능</li>
<li>인스턴스 변수는 선언후 생성자에서 초기화 가능</li>
</ul>
</li>
<li>final Method<ul>
<li>override를 허용하지 않는 메서드</li>
</ul>
</li>
</ul>
<h3 id="6-instanceof-연산자">6. instanceof 연산자</h3>
<ul>
<li>객체가 특정 클래스(인터페이스)의 인스턴스인지 확인</li>
<li><code>참조변수 instanceof 클래스(인터페이스)</code>
참조변수의 타입이 결정하는 것이 아니라, 실제 객체의 타입(new 연산자를 적용한 클래스/인터페이스)이 결정한다</li>
<li>주의점<ul>
<li>instanceof연산자를 많이 사용하는 코드는 LSP(리스코프 치환원칙)을 어기고 있는지 확인해봐야 한다</li>
</ul>
</li>
</ul>
<h3 id="7-package-키워드">7. package 키워드</h3>
<ul>
<li>이름공간 namespace<ul>
<li>하나의 프로젝트의 같은 이름의 클래스가 여러개 있으면 충돌 발생</li>
<li>c++의 namespace 처럼 이름공간을 나누어서 충돌을 피하게 함</li>
</ul>
</li>
</ul>
<h3 id="8-interface와-implements">8. interface와 implements</h3>
<ul>
<li>인터페이스는 기본적으로 public abstract method와 public static final 변수만 가진다</li>
<li>public abtract/public static final 은 컴파일러가 자동으로 추가해줘서 생략이 가능함</li>
<li>자바8 이후<ul>
<li>구현부가 있는 default 메소드를 가질 수 있다</li>
<li>staic 메소드를 가질 수 있다</li>
<li>Lambda<ul>
<li>빅데이터와 병렬성을 위해 등장</li>
<li>변수에 함수를 저장</li>
<li>변수는 메소드의 인자, 반환값으로도 사용 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="9-this-키워드">9. this 키워드</h3>
<ul>
<li>객체 자신을 지칭하는 키워드</li>
<li>this로 같은 이름의 지역변수와 인스턴스 변수를 구분할 수 있음</li>
</ul>
<h3 id="10-super-키워드">10. super 키워드</h3>
<ul>
<li>상위 클래스의 인스턴스를 지칭하는 키워드</li>
<li>super.super 형태는 불가</li>
</ul>
<h3 id="11-인스턴스-메소드에-대한-오해">11. 인스턴스 메소드에 대한 오해</h3>
<ul>
<li>객체 정보는 매 객체 생성마다 heap영역에 할당하는 것으로 알고 있는데,</li>
<li>인스턴스 메소드는 static 영역에 로드된다 </li>
<li>그래서 인스턴스 메소드 호출시, 
객체 변수.메서드 (X)
클래스명.메서드(O)
의 형태가 된다</li>
<li>JVM 내부에선, static 영역에 로드되는 인스턴스 메서드에 this를 파라미터로 넘긴다</li>
</ul>
<p>이렇게 되는 이유는 인스턴스 메소드는 인스턴스 메소드를 호출하는 객체의 인스턴스 변수의 값이 다를뿐, 메서드 자체가 달라지는 것이 아니므로 static 영역에 보유하면 메모리를 절약할 수 있다.</p>
<h3 id="12-import-키워드">12. import 키워드</h3>
<ul>
<li>다른 패키지의 클래스를 사용하기 위한 키워드</li>
<li>컴파일타임에 컴파일러가 import된 클래스의 패키지를 알아내서, 모든 클래스이름 앞에 패키지명을 붙여줌</li>
<li>import 패키지명.*; 은 패키지에 속하는 모든 클래스를 패키지명 없이 사용 가능<ul>
<li>클래스이름을 지정하는 것보다 컴파일 타임이 약간 더 걸리지만, 
실행상의 성능 차이는 없다</li>
<li>.*로 import 해도 하위 패키지의 클래스를 import 하는 것은 아니다</li>
</ul>
</li>
<li>static import<ul>
<li>다른 패키지의 클래스의 static 멤버를 사용할 때, 클래스명 생략 가능</li>
<li>Math.random() / random() </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL-211108]]></title>
            <link>https://velog.io/@pro-park-gation/TIL-211108</link>
            <guid>https://velog.io/@pro-park-gation/TIL-211108</guid>
            <pubDate>Mon, 08 Nov 2021 16:25:30 GMT</pubDate>
            <description><![CDATA[<h2 id="1-querydsl">1. QueryDSL</h2>
<ul>
<li>팀프로젝트를 pull해보니 <pre><code class="language-java">import static 패키지~~.Q(엔티티명). ;</code></pre>
가 새로 생겼는데, import를 하지 못한다. 팀원의 작업인데 설명을 듣지 못한부분이라 알아보는 중에 QueryDSL 관련 import문인것을 알았고, QueryDSL관련 의존성 설치를 하면 되겠다고 생각했다.
Reload Project해도 안돼서 그냥 그 밑의 generate Sources and Update Folders하니 import가 됐다.</li>
</ul>
<h2 id="2-ec2-rds-세팅">2. EC2, RDS 세팅</h2>
<ul>
<li>EC2와 RDS를 같은 VPC에 두면 두 instance간 통신을 위해 통신 규칙(보안)설정을 따로 안해도 되는 것 같다. (ECS의 vpc를 RDS가 사용하도록 설정 필요)</li>
<li>EC2에서 ssh는 작업할 local의 ip, http/s는 모든 Ip를 열어주었고</li>
<li>DB는 로컬에서 확인하기 위해 MySQL로 내 local만 열어줬다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>