<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>남기고 싶은 것들</title>
    <link>https://simyeju.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 13 Jun 2026 06:24:41 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>펭귀니 :)</managingEditor>
    <image>
      <title>남기고 싶은 것들</title>
      <url>https://tistory1.daumcdn.net/tistory/2959966/attach/45424abbf0ca4b0c8cc36729fc4e1afc</url>
      <link>https://simyeju.tistory.com</link>
    </image>
    <item>
      <title>spring boot에서 euc-kr 요청 받기</title>
      <link>https://simyeju.tistory.com/138</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697101018303&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import java.nio.charset.Charset;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class CustomMessageConverterConfig implements WebMvcConfigurer {

  @Override
  public void configureMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters) {
    // 문자열 메시지 컨버터를 생성하고 EUC-KR 인코딩을 설정합니다.
    StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName(&quot;EUC-KR&quot;));
    converters.add(converter);
  }
}
 No newline at end of file&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697100999527&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class tmpController {

    @PostMapping(value = &quot;/v1/tmp&quot;, consumes = &quot;application/x-www-form-urlencoded; charset=euc-kr&quot;)
    public String request(@RequestBody MultiValueMap&amp;lt;String, String&amp;gt; request) {

        log.info(request.toString());

        return &quot;success&quot;;
    }

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/Spring Boot Framework</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/138</guid>
      <comments>https://simyeju.tistory.com/138#entry138comment</comments>
      <pubDate>Thu, 12 Oct 2023 17:58:30 +0900</pubDate>
    </item>
    <item>
      <title>판교] 송계옥 후기</title>
      <link>https://simyeju.tistory.com/136</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;판교 송게옥 후기라고 쓰고 부제는 송계옥보다 더 맛있는 얼그레이 하이볼을 소개하기...&lt;br /&gt;&lt;br /&gt;22.12.16 금요일 방문&lt;br /&gt;&lt;br /&gt;7시쯤 웨이팅을 걸러갔다.&lt;br /&gt;&lt;br /&gt;앞에 43팀정도 있었고, 저녁치고 늦은 시간이라 허수가 많지 않을까하는 생각에 냅다 기다렸다.&lt;br /&gt;&lt;br /&gt;1시간에 15팀정도 빠진다고 했는데, 8시반 넘어서 자리에 앉았다. 허수가 많긴 했다 :)&lt;br /&gt;&lt;br /&gt;여자 셋이서 가서 모둠 대랑 의성 마늘 볶음밥, 봄나물 퉁퉁장 된장찌개, 얼그레이 하이볼 3개를 시켰다.&lt;br /&gt;&lt;br /&gt;그램수로 봤을 때는 모둠 중도 괜찮을 거 같아서 모둠 중을 시키려하니 &lt;br /&gt;셋이면 대를 시켜야 맞을 거라고해서 대를 시켰다. 뼈 무게 때문인가보다.&lt;br /&gt;&lt;br /&gt;여러 테이블 당 한 분씩 붙어서 닭을 부위별로 설명하고 구워주시고 어울리는 소스를 말씀해주신다.&lt;br /&gt;&lt;br /&gt;개인적으로 닭구이는 그냥 닭구이였고, 얼그레이 하이볼은 시럽?맛이 많이 나서 기대한 것 치고는 그냥 그랬다.&lt;br /&gt;사이드는 볶음밥, 된장찌개 둘 다 너무 맛있었다.&lt;br /&gt;&lt;br /&gt;결론은 두 번 갈 생각나는 집은 아니었음&lt;br /&gt;&lt;br /&gt;&amp;gt; 마늘볶음밥과 된장찌개&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMFyMP/btrWbK9sRVF/5M0l8oUEqqhnAjO7wfeUX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMFyMP/btrWbK9sRVF/5M0l8oUEqqhnAjO7wfeUX0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMFyMP/btrWbK9sRVF/5M0l8oUEqqhnAjO7wfeUX0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMFyMP%2FbtrWbK9sRVF%2F5M0l8oUEqqhnAjO7wfeUX0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;1258&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt; 송계옥 얼그레이 하이볼&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfb88l/btrWedCq1Wt/T83KMruHo5fgj787gKUzw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfb88l/btrWedCq1Wt/T83KMruHo5fgj787gKUzw1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfb88l/btrWedCq1Wt/T83KMruHo5fgj787gKUzw1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfb88l%2FbtrWedCq1Wt%2FT83KMruHo5fgj787gKUzw1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;3024&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;송계옥을 가고 몇 주 뒤 방문한 빽스비어에도 얼그레이 하이볼을 판매하길래 먹어봤는데,&lt;br /&gt;개인적으로 송계옥보다 훨씬 맛있었음... 또 생각남...&lt;br /&gt;&lt;br /&gt;&amp;gt; 빽스비어 얼그레이 하이볼&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl5I5x/btrWefAgUqp/vBnLfIMwC00bFlxCCctbjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl5I5x/btrWefAgUqp/vBnLfIMwC00bFlxCCctbjk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl5I5x/btrWefAgUqp/vBnLfIMwC00bFlxCCctbjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl5I5x%2FbtrWefAgUqp%2FvBnLfIMwC00bFlxCCctbjk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;1388&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%84%B1%EB%82%A8%EC%8B%9C%20%EB%B6%84%EB%8B%B9%EA%B5%AC%20%EC%82%BC%ED%8F%89%EB%8F%99%20659%20%ED%8C%90%EA%B5%90%ED%9A%A8%EC%84%B1%ED%95%B4%EB%A7%81%ED%84%B4%ED%83%80%EC%9B%8C%201%EC%B8%B5%20102%2C%20103%ED%98%B8&amp;amp;addtype=1&amp;amp;confirmid=734876697&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A524820%2C%22mapCenterY%22%3A1082998%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A524823%2C%22y%22%3A1083002%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%2F%2Ft1.daumcdn.net%2Flocalimg%2Flocalimages%2F07%2F2012%2Fattach%2Fpc_img%2Fico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%86%A1%EA%B3%84%EC%98%A5%20%ED%8C%90%EA%B5%90%EC%A0%90%22%2C%22confirmid%22%3A734876697%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=524820&amp;amp;mapY=1082998&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4113565500&amp;amp;tel=031-705-7270&amp;amp;title=%EC%86%A1%EA%B3%84%EC%98%A5%20%ED%8C%90%EA%B5%90%EC%A0%90&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1674005090784&quot; id=&quot;maps_1674005090784&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%84%B1%EB%82%A8%EC%8B%9C%20%EB%B6%84%EB%8B%B9%EA%B5%AC%20%EC%82%BC%ED%8F%89%EB%8F%99%20659%20%ED%8C%90%EA%B5%90%ED%9A%A8%EC%84%B1%ED%95%B4%EB%A7%81%ED%84%B4%ED%83%80%EC%9B%8C%201%EC%B8%B5%20102%2C%20103%ED%98%B8&amp;amp;addtype=1&amp;amp;confirmid=734876697&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A524820%2C%22mapCenterY%22%3A1082998%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A524823%2C%22y%22%3A1083002%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%2F%2Ft1.daumcdn.net%2Flocalimg%2Flocalimages%2F07%2F2012%2Fattach%2Fpc_img%2Fico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%86%A1%EA%B3%84%EC%98%A5%20%ED%8C%90%EA%B5%90%EC%A0%90%22%2C%22confirmid%22%3A734876697%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=524820&amp;amp;mapY=1082998&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4113565500&amp;amp;tel=031-705-7270&amp;amp;title=%EC%86%A1%EA%B3%84%EC%98%A5%20%ED%8C%90%EA%B5%90%EC%A0%90&quot; data-maps-mapx=&quot;524820&quot; data-maps-mapy=&quot;1082998&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=524820%2C1082998&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A524823%2C1083002&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <category>Daily Life/Food</category>
      <category>내돈내산</category>
      <category>빽스비어</category>
      <category>송계옥판교</category>
      <category>얼그레이하이볼</category>
      <category>판교송계옥</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/136</guid>
      <comments>https://simyeju.tistory.com/136#entry136comment</comments>
      <pubDate>Sat, 14 Jan 2023 16:08:42 +0900</pubDate>
    </item>
    <item>
      <title>MySQL] utf8 vs utf8mb4</title>
      <link>https://simyeju.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;charset&lt;br /&gt;&lt;/b&gt;&lt;b&gt;utf8와 utf8mb4 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql에서 utf8은 최대 3바이트를 지원하고,&lt;br /&gt;utf8mb4는 4바이트의 이모지를 처리할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;collation&lt;br /&gt;&lt;/b&gt;&lt;b&gt;utf8_unicode_ci, utf8mb4_unicode_ci&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ci의 뜻은&amp;nbsp;case&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;-&lt;/span&gt;insensitive, &lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;대소문자 구분이 없다는 뜻&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;따라서, _bin을 쓰면 대소문자 구분이 가능하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/MySQL</category>
      <category>charset</category>
      <category>collation</category>
      <category>mysql</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/134</guid>
      <comments>https://simyeju.tistory.com/134#entry134comment</comments>
      <pubDate>Thu, 5 Jan 2023 13:20:19 +0900</pubDate>
    </item>
    <item>
      <title>MySQL] MySQL 퍼포먼스 최적화 (WHERE 조건 이해)</title>
      <link>https://simyeju.tistory.com/132</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. WHERE 조건 이해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;묵시적 형변환 함정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묵시적 형변환&lt;br /&gt;- 조건절의 데이터 타입이 다를 때 우선순위가 높은 타입으로 타입이 변환되는 것 &lt;br /&gt;- 우선순위 : 정수 타입 &amp;gt; 문자열 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묵시적 형변환이 일어나는 대상이 인덱스 필드라면...? 모든 데이터 형변환을 위해 테이블 풀스캔이 일어난다ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 WHERE절에는 칼럼 타입에 맞춰서 질의해야한다. 어플리케이션에서 질의 시 실수하기 좋으니 주의하자&lt;br /&gt;(우선순위가 정수형이 높으니 무조건 문자열로 질의하는 것도... 방법이라면 방법이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LIKE 검색 시 주의할 점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'%' 위치에 따라 다르게 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 자료는 인덱스 키 값 순서로 정렬, 관리되므로 중간 또는 뒷부분부터 검색하면 인덱스 의미가 없어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE 'xxx%'&lt;br /&gt;- 인덱스가 걸려있는 컬럼이면 인덱스를 사용해서 쿼리가 빠르게 처리된다.&lt;br /&gt;- 다만 옵티마이저가 데이터 분포도를 판단하여, 풀스캔이 빠르다고 판단하면 풀스캔이 일어날 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE '%xxx%'&lt;br /&gt;- 테이블 풀스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE '%xxx'&lt;br /&gt;- 테이블 풀스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot; 출처&quot; data-ke-size=&quot;size23&quot;&gt;  출처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;성동찬 지음, 『MySQL 퍼포먼스 최적화』, 한빛미디어(2013)&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/MySQL</category>
      <category>DB묵시적형변환</category>
      <category>LIKE검색</category>
      <category>mysql</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/132</guid>
      <comments>https://simyeju.tistory.com/132#entry132comment</comments>
      <pubDate>Sat, 19 Mar 2022 17:14:54 +0900</pubDate>
    </item>
    <item>
      <title>MySQL] MySQL 퍼포먼스 최적화 (쿼리 성능 최적화)</title>
      <link>https://simyeju.tistory.com/131</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 쿼리 성능 진단은 최적화의 기초&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQL을 실행하도록 DB에 명령을 내리면 DB는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;SQL 파싱, 옵티마이징을 거친 후 데이터를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리 실행 계획&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행할 쿼리 앞에 EXPLAIN [EXTENDED]을 붙여준다.&lt;br /&gt;DB가 데이터를 찾아가는 일련의 과정을 사람이 알아보기 쉽게 보여준다.&lt;br /&gt;성능 최적화가 가능하다.&lt;br /&gt;&lt;br /&gt;EXTENDED는 실제 DB에서 처리되는 최종 SQL 형태를 보여주는 명령어다.&lt;br /&gt;'EXPLAIN EXTENDED'로 출력하면, warning이 하나 떠 있다. 'SHOW WARNINGS\G'를 질의하면 DB가 내부적으로 이해한 최종 형태의 쿼리가 출력된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 302px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;ID&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;SELECT 아이디로 SELECT를 구분하는 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 112px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 112px;&quot;&gt;SELECT_TYPE&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 112px;&quot;&gt;SELECT에 대한 타입&lt;br /&gt;EX)&lt;br /&gt;SIMPLE - UNION이나 서브쿼리가 없는 단순 SELECT&lt;br /&gt;PRIMARY - 서브쿼리가 있을 때 가장 바깥에 있는 SELECT&lt;br /&gt;DERIVED - FROM절 안의 서브쿼리&lt;br /&gt;DEPENDENT SUBQUERY - 외부 쿼리와 상호 연관된 서브쿼리다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;TABLE&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;참조하는 테이블&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;TYPE&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;조인 혹은 조회 타입&lt;br /&gt;EX)&lt;br /&gt;system - 테이블에 단 한 개의 데이터만 있는 경우&lt;br /&gt;const - SELECT에서 PK 혹은 UK를 상수로 조회하는 경우로, 많아야 한 건의 데이터만 있음&lt;br /&gt;eq_ref - 조인할 때 PK 혹은 UK로 매칭하는 경우&lt;br /&gt;ref - 조인할 때 PK 혹은 UK가 아닌 Key로 매칭하는 경우&lt;br /&gt;ref_or_null - ref와 같지만 NULL이 추가되어 검색되는 경우&lt;br /&gt;index_merge - 두 개의 인덱스가 병합되어 검색이 이루어지는 경우&lt;br /&gt;unique_subquery - 다음과 같이 IN절 안의 서브쿼리에서 PK가 오는 특수한 경우&lt;br /&gt;index_subquery - unique_subquery와 비슷하나 PK가 아닌 일반 인덱스인 경우&lt;br /&gt;range - 특정 범위 내에서 인덱스를 사용하여 원하는 데이터를 추출.&lt;br /&gt;index - 인덱스 풀스캔&lt;br /&gt;all - 테이블 풀스캔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;POSSIBLE_KEYS&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;데이터를 조회할 때 DB에서 사용할 수 있는 인덱스 리스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;KEY&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;실제로 사용할 인덱스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;KEY_LEN&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;실제로 사용할 인덱스의 길이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;REF&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;KEY 안의 인덱스와 비교하는 칼럼(상수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;ROWS&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;쿼리 실행 시 조사하는 행 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;EXTRA&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;추가 정보&lt;br /&gt;Using Index - 커버링 인덱스, 인덱스 자료 구조를 이용해서 데이터를 추출&lt;br /&gt;Using Where - WHERE 조건으로 데이터를 추출, Type이 all과 index와 함께라면 좋지 않다.&lt;br /&gt;Using Filesort - 데이터 정렬이 필요한 경우&lt;br /&gt;Using Temporary - 쿼리 처리 시 내부적으로 Temporary Table이 사용되는 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿼리 프로파일링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 쿼리 실행 시 병목이 되는 부분을 찾아낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;SET PROFILING = 1;&lt;/u&gt;&lt;br /&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;SQL&lt;br /&gt;&lt;/span&gt;&lt;u&gt;SHOW PROFILE;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 중 확인하고 싶은 쿼리 번호를 실행하면 특정 쿼리에 대한 프로파일링 정보를 확인할 수 있다.&lt;br /&gt;&lt;u&gt;SHOW PROFILE FOR QUERY 3;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot; 출처&quot; data-ke-size=&quot;size23&quot;&gt;  출처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;성동찬 지음, 『MySQL 퍼포먼스 최적화』, 한빛미디어(2013)&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/MySQL</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/131</guid>
      <comments>https://simyeju.tistory.com/131#entry131comment</comments>
      <pubDate>Sat, 19 Mar 2022 16:56:28 +0900</pubDate>
    </item>
    <item>
      <title>MySQL] MySQL 퍼포먼스 최적화 (MySQL 구조)</title>
      <link>https://simyeju.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. MySQL의 특징&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MySQL은 전체적으로 어떻게 생겼나?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서는 MySQL을 '서버 엔진'과 '스토리지 엔진'으로 구분해서 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서버 엔진&lt;/b&gt;&lt;br /&gt;- 클라이언트의 요청을 받아 SQL을 처리하는 DB 자체의 기능적인 역할&lt;br /&gt;- SQL Interface, Parser, Optimizer, Cache&amp;amp;Buffers&lt;br /&gt;- 사용자와 MySQL 사이에서 발생하는 데이터 처리 프로세스의 대부분을 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스토리지 엔진&lt;/b&gt;&lt;br /&gt;- 서버 엔진이 필요한 데이터를 물리 장치에서 가져오는 역할&lt;br /&gt;- 물리적인 저장장치에서 데이터를 읽어오는 역할을 수행&lt;br /&gt;- 다른 DBMS와 다르게 스토리지 엔진이 플러그인 방식으로 동작&lt;br /&gt;&amp;nbsp;- 스토리지 엔진 종류 : InnoDB, MyISAM, MGR_MYISAM, BLACKHOLE, CSV, MEMORY, FEDERATED, ARCHIVE&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;MyISAM&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;InnoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;스토리지 제한&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;256TB&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;64TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;트랜잭션&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;No&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Locking 레벨&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Table&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;인덱스&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;B-Tree&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;B-Tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Cache&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Index&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Data/Index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;파티셔닝&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Yes&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Cluster Index&lt;br /&gt;(인덱스 순서로 데이터가 저장되어 있는 구조)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;No&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Foreign Key&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;No&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyISAM - 텍스트 전문을 검색하는 '풀텍스트 인덱싱', 지리 정보를 처리할 수 있는 '지오메트릭 스파셜 인덱싱' 등의 기능 제공&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 인덱스만 메모리에 올린다. 데이터는 디스크에서 바로 접근한다.&lt;br /&gt;InnoDB - 인덱스와 데이터까지 메모리에 적재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 엔진은 스토리지 엔진의 API를 호출하며, 실제 필요한 데이터를 요청하고 조작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MySQL은 데이터를 어떻게 처리할까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. MySQL은 모든 SQL을 단일 코어에서 처리한다.&lt;br /&gt;- 병렬 처리를 하지 않는다.&lt;br /&gt;2. 테이블 조인을 Nested Loop Join 알고리즘으로만 처리한다.&lt;br /&gt;- Nested Loop Join은 선행 테이블 A의 조건 검색 결과값 하나하나를 테이블 B와 비교하여 조인하는 방식&lt;br /&gt;- Block Nested Loop Join : 테이블 조인 시 필요한 데이터를 메모리에 일시적으로 저장하여 위의 방식보다 효율적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot; 출처&quot; data-ke-size=&quot;size23&quot;&gt;  출처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;성동찬 지음, 『MySQL 퍼포먼스 최적화』, 한빛미디어(2013)&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/MySQL</category>
      <category>DB최적화</category>
      <category>innodb</category>
      <category>myisam</category>
      <category>mysql</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/130</guid>
      <comments>https://simyeju.tistory.com/130#entry130comment</comments>
      <pubDate>Sat, 19 Mar 2022 16:16:05 +0900</pubDate>
    </item>
    <item>
      <title>2021 회고록</title>
      <link>https://simyeju.tistory.com/129</link>
      <description>&lt;h1&gt;2021 회고록&lt;/h1&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;올해는 작년과 같은 코로나 상황임에도 불구하고,&lt;br&gt;작년과 다르게 최대한 계절을 느끼며&lt;br&gt;일 년을 보내려고 노력했다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;이직을 했다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;신입으로 입사한 지 1년 2개월만에 퇴사를 하게 되었다. &lt;br&gt;사실 급하게 이직할 생각은 없었다.&lt;br&gt;공부를 하며 차근차근 준비할 예정이었는데,&lt;br&gt;현 직장에서 구직 플랫폼에 올려놓은 이력서를 보고 공고를 보내줘서 지원을 하게 되었다. &lt;br&gt;운이 좋게도 합격을 하여 노란피의 사람이 되었다 :) &lt;br&gt;좋은 사람들과 멋진 일을 함께 할 수 있음에 충분히 만족하고 있다.&lt;br&gt;많은 기여를 하고 싶은 곳이다.&lt;br&gt;아직은 마음처럼 머리가 따라주지 않지만......&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;엄청난 트래픽들을 맛봤다&lt;/h3&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;2월에 담당하고 있는 서비스에 트래픽이 급증하며 서버가 버티지를 못했다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;서버가 터졌을 때, 할 수 있는 많은 방법들을 배웠다.&lt;br&gt;스케일 업, 스케일 아웃, 병목 구간 탐색, 어떨 땐 큰 맘 먹고 구동 중인 서버 리스타트… &lt;br&gt;그리고 서버가 다시 안정화 되었을 때 치울 응가가 매우 많다는 것도 배웠다.&lt;br&gt;데이터 보정 작업, 쏟아지는 CS 건&lt;br&gt;머리가 많이 아팠지만, 운영 건을 처리하다보니 시스템에 대해서 빠르게 파악할 수 있었다. &lt;br&gt;트래픽이 몰리면, 평소에는 발생하지 않던 숨겨진 문제들도 보이더라.&lt;br&gt;그런 부분을 잡아 나가면서 시스템을 더 탄탄하게 만드는 경험을 했다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;이직 후, 11월에도 담당하고 있는 서비스에 트래픽이 몰리면서 내 인생 두번째 큰 장애를 경험했다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;시스템을 다 파악하지 못해서 할 수 있는건 테스트 뿐…&lt;br&gt;그리고 기도…  &lt;br&gt;덕분에(?) 새롭게 배우는 것들이 많아졌다.&lt;br&gt;내가 기여할 부분이 많아질 수 있는 기회도 주어졌다.&lt;br&gt;나만 잘하면 된다…!&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;재택 근무의 양면을 절실히 느끼는 중이다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이직 후 입사 첫 날 부터 재택 근무를 하게 되었다. &lt;br&gt;재택 사랑스러운데, 너무 힘들다.&lt;br&gt;장점과 단점이 너무 극명하다.&lt;br&gt;물론 개인 차도 크다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;은&lt;br&gt;출퇴근, 준비 시간, 체력 소모가 줄어든다.&lt;br&gt;점심 먹고 잠시 누울 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;은&lt;br&gt;혼잣말이 늘어 간다.&lt;br&gt;커뮤니케이션 비용이 많이 든다.&lt;br&gt;이직한 사람에게는 빠른 랜딩이 쉽지 않다.&lt;br&gt;혼자 생각하고, 혼자 판단해서 내 생각에 갇히게 된다.&lt;br&gt;자기 객관화가 어려워진다.&lt;br&gt;가끔은 사람들과 부대끼며 일하고 싶은데 그럴 수 없다.&lt;br&gt;집 밥 먹기가 힘들어지는 순간이 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;단점이 많아보이지만,&lt;br&gt;사실 장점이 강력해서 상쇄되는 기분이긴 하다. &lt;br&gt;아무튼 나에게 재택 근무는 너무 적응하기 힘든 근무 환경이었다. &lt;br&gt;재택 근무가 계속되는 이상&lt;br&gt;내가 좋아하는 공간이 될 수 있도록 방을 꾸며야 한다고 생각하여&lt;br&gt;최대한 내가 집중을 잘 할 수 있는 공간으로 만들어봤다. &lt;br&gt;여러 시도 끝에 찾은 방법은&lt;br&gt;형광등을 켜지 않고, 조명등만 켜서 책상 쪽을 밝게 하였다.&lt;br&gt;분위기가 은은해지고, 방의 다른 가구들을 잘 안보이게 하여 집중력을 높였다.&lt;br&gt;그리고 제자리를 못 찾고 있던 예쁜 소품들을 주변에 놓았다. &lt;br&gt;아직 손을 보고 싶은 곳이 많지만,&lt;br&gt;나름 만족하면서 일하는 중이다 :)&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;좋은 사람들은 얻었다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;전 직장에서 좋은 사람들을 얻었다.&lt;/p&gt;
&lt;p&gt;일단 동기들,&lt;br&gt;&lt;strong&gt;동기 사랑 나라 사랑&lt;/strong&gt;이라는 명목 아래에 여행도 가고 꾸준히 연락하며 재밌게 지내고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;또 전 직장 팀원들&lt;br&gt;다른 팀이었지만, 꾸준히 연락하는 사람들까지 &lt;br&gt;돌아보니 감사한 한 해이다.&lt;br&gt;2022년도 돌아봤을 때 행복하고 감사한 한 해가 될 수 있었으면 한다.&lt;br&gt;내가 아는 사람 다 건강하고 행복했으면&lt;/p&gt;</description>
      <category>Daily Life/Diary</category>
      <category>2021</category>
      <category>2021회고록</category>
      <category>2022</category>
      <category>회고록</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/129</guid>
      <comments>https://simyeju.tistory.com/129#entry129comment</comments>
      <pubDate>Sat, 1 Jan 2022 01:39:25 +0900</pubDate>
    </item>
    <item>
      <title>JPA] JPA가 제공하는 간단한 CRUD를 알아보자</title>
      <link>https://simyeju.tistory.com/128</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;출처&lt;br&gt;자바 ORM 표준 JPA 프로그래밍 - 김영한&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;개요&lt;/h2&gt;
&lt;p&gt;JPA는 ssafy때 프로젝트에서 적용해봤다.&lt;br&gt;JPA를 다시 적용해보려니 내가 알고 있는 지식들이 머릿속에서 듬성듬성 떨어져있는 기분이고, 하나의 흐름으로 연결되지 않는 느낌이라 답답하더라.&lt;br&gt;더 이상 구글링으로 연명해나갈 수 없어!라고 생각하고, 돌이 들어있는 항아리에 모래를 붓고자 책을 펼쳤다!&lt;/p&gt;
&lt;p&gt;함께 JPA와 친해져봐여 :)&lt;/p&gt;
&lt;h2&gt;저장 기능&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;persist(student)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;객체를 데이터베이스에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;조회 기능&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;find(Student.class, studentId)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;객체 하나를 데이터베이스에서 조회한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;수정 기능&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Student s = find(Student.class, studentId)  
s.setAge(&amp;quot;12&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;JPA는 별도의 수정 메소드를 제공하지 않는다.&lt;/li&gt;
&lt;li&gt;대신 객체 조회 후 값을 변경하면 트랜잭션을 커밋할 때 적절하게 update해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;연관된 객체 조회&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Student s = find(Student.class, studentId)  
s.getTeacher()&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Student에 Teacher이라는 객체가 매핑되어있으면, Student조회 시 연관된 Teacher도 조회가 가능하다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/JPA</category>
      <category>jpa</category>
      <category>ORM</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/128</guid>
      <comments>https://simyeju.tistory.com/128#entry128comment</comments>
      <pubDate>Sun, 14 Nov 2021 16:39:15 +0900</pubDate>
    </item>
    <item>
      <title>TDD를 알아보자!</title>
      <link>https://simyeju.tistory.com/126</link>
      <description>&lt;p&gt;이 글을 쓰는 이유는...&lt;br&gt;그냥 내가 TDD와 어떻게 친해지게 됐는지 나중에는 생각이 나지 않을 것 같아서&lt;br&gt;기록하기 위해 남긴다.&lt;/p&gt;
&lt;p&gt;TDD와 또 친해지고자 하는 사람에게 도움이 된다면야 너무 좋고&lt;/p&gt;
&lt;h2&gt;TDD를 언젠가부터 들어왔고, 제대로 알아보고 싶은 마음이 있었다.&lt;/h2&gt;
&lt;p&gt;사실 TDD를 알아보고자 했던 마음에는 테스트에 대해 잘 알고 싶다라는 마음이 선행되긴했다.&lt;br&gt;&amp;#39;테스트를 잘 하고 싶다. 테스트 코드를 잘 짜고 싶다.&amp;#39;에서 시작한 마음이 TDD까지 오게 되었다.&lt;/p&gt;
&lt;p&gt;둘은 분명 상관관계가 있으니 큰 목표를 TDD로 잡고 테스트에 대해 알아보고자 한다.&lt;/p&gt;
&lt;h2&gt;공부하기 전에 내가 알고 있던 TDD의 모든 것&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;TDD란 테스트 주도 개발이며,
개발하기 전에 테스트 코드 먼저 작성하는 개발 방식이고
mock이란게 있다.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;정도만 알고 있었다.&lt;/p&gt;
&lt;p&gt;제대로 알고자 하니 너무 막막했다.&lt;br&gt;냅다 책부터 사서 펼쳐볼까 했지만, 책을 펼치더라도 내가 TDD에 대해 감각적으로 알고 있는 것들이 우선적으로 있으면 좋겠다는 생각이 들었다.&lt;br&gt;TDD에 관심이 있어 책을 구매했던 아는 사람한테 TDD에 대해 좀 아냐고 물어봤다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;나도 잘 모르지만 이 영상 한 번 봐봐&lt;br&gt;&lt;a href=&quot;https://youtu.be/3LMmPXoGI9Q&quot;&gt;https://youtu.be/3LMmPXoGI9Q&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;하며 영상 하나를 추천 받았다.&lt;/p&gt;
&lt;p&gt;위 영상은 매우 짧아서 부담 없었고, 가볍게 테스트란 무엇인가, 왜 해야하는가를 들을 수 있었다.&lt;/p&gt;
&lt;p&gt;영상을 다 보니, 추천 영상에 우아한테크세미나에서 자바지기님의 TDD 강의가 뜨더라&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=bIeqAlmNRrA&quot;&gt;https://www.youtube.com/watch?v=bIeqAlmNRrA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;홀린 듯이 눌러서 보는 중이다!&lt;/p&gt;
&lt;h2&gt;보고난 후&lt;/h2&gt;
&lt;p&gt;내가 강의를 들으면서 이해한 TDD,&lt;br&gt;그니까 테스트 코드를 먼저 작성하기 전에 우선적으로 되어야 하는게&lt;br&gt;요구사항이 명확해야한다.&lt;/p&gt;
&lt;p&gt;그 명확한 요구사항을 코드로 표현하는 것이 &lt;strong&gt;테스트 코드&lt;/strong&gt;고,&lt;br&gt;그 다음에 요구사항을 실현할 수 있는 비즈니스 로직을 작성하는 것이 TDD의 핵심인 듯 하다.&lt;/p&gt;
&lt;p&gt;먼저 단위테스트(Unit Test)를 해보자!&lt;br&gt;처음엔 Input과 output이 명확한 걸로 해야 쉽다.&lt;/p&gt;
&lt;p&gt;유닛테스트가 익숙해지면&lt;br&gt;그 다음 TDD를 진행해보자!&lt;br&gt;단, 웹, 모바일UI나 DB에 의존관게를 가지지 않는 요구사항으로 연습하자.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test Fails 첫번째 실패하는 테스트를 만들고&lt;/li&gt;
&lt;li&gt;Test Passes 테스트를 하고&lt;/li&gt;
&lt;li&gt;Refactor 리팩토링하고&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;영상에는 이런 기술적인 얘기 외에도 개발할 때 조직내에서 가져야할 마음가짐에 대해서도 알려준다.&lt;/p&gt;
&lt;p&gt;좋은 세미나였다 :)&lt;/p&gt;</description>
      <category>개발/TDD</category>
      <category>tdd</category>
      <category>테스트주도개발</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/126</guid>
      <comments>https://simyeju.tistory.com/126#entry126comment</comments>
      <pubDate>Mon, 25 Oct 2021 01:17:02 +0900</pubDate>
    </item>
    <item>
      <title>Play Framework 2.3.x ] Java - 1.1 Actions, Controllers and Results 번역</title>
      <link>https://simyeju.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;업무상 Play Framework를 사용하게 되었다.&lt;br /&gt;따라서, 2.3.x 버전의 Documents를 번역해보고자 한다 :)&lt;br /&gt;오류가 있다면 언제든지 알려주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크 : &lt;a href=&quot;https://www.playframework.com/documentation/2.3.x/JavaActions&quot;&gt;https://www.playframework.com/documentation/2.3.x/JavaActions&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Play for Java Developers
 ㄴ Main Concepts
  ㄴ 1. HTTP programming
   ㄴ 1.1 Actions, Controllers and Results&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Actions, Controllers and Results&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;What is an Action?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Play application이 받은 대부분의 요청은 &lt;code&gt;Action&lt;/code&gt;에 의해 처리된다.&lt;br /&gt;action은 기본적으로 request 파라미터를 처리하고, 클라이언트에게 결과를 생성하는 자바 메소드다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;public static Result index() {
    return ok(&quot;Got request &quot; + request() + &quot;!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action은 웹 클라이언트에게 HTTP 응답을 표현하는 &lt;code&gt;play.mvc.Result&lt;/code&gt;값을 반환시킨다. 예를 들어, &lt;code&gt;ok&lt;/code&gt;는 textp/plain response body를 포함하는 200 OK를 구성한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Controllers&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;controller는 일부 action 메소드를 그룹화하는 &lt;code&gt;play.mvc.Controller&lt;/code&gt;를 확장하는 클래스 그 이상 그 이하도 아니다.&lt;/p&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;package controllers;

import play.*;
import play.mvc.*;

public class Application extends Controller {

    public static Result index() {
        return ok(&quot;It works!&quot;);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 볼 수 있듯이, action을 정의하기 위한 제일 간단한 방법은 &lt;code&gt;Result&lt;/code&gt;를 반환하는 인자없는 static 메소드로 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action 메소드는 인자도 가질 수 있다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public static Result index(String name) {
    return ok(&quot;Hello &quot; + name);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 인자는 &lt;code&gt;Router&lt;/code&gt;나 request URL에 value로 채워진다. 인자 값은 URL path나 URL 쿼리 스트링에서 얻어진다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Results&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 클라이언트에 보낼 HTTP 헤더와 바디의 구성을 status code로 하여 HTTP result를 간단하게 시작해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 results는 &lt;code&gt;play.mvc.Result&lt;/code&gt;에 의해 정의되고, &lt;code&gt;play.mvc.Results&lt;/code&gt; 클래스는 &lt;code&gt;ok&lt;/code&gt;메소드와 같은 표준 HTTP results를 사용할 수 있는 몇몇의 helpers를 제공한다.&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;public static Result index() {
    return ok(&quot;Hello world!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 몇개의 다양한 results의 예제들이 있다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Result ok = ok(&quot;Hello world!&quot;);
Result notFound = notFound();
Result pageNotFound = notFound(&quot;&amp;lt;h1&amp;gt;Page not found&amp;lt;/h1&amp;gt;&quot;).as(&quot;text/html&quot;);
Result badRequest = badRequest(views.html.form.render(formWithErrors));
Result oops = internalServerError(&quot;Oops&quot;);
Result anyStatus = status(488, &quot;Strange response type&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 helpers은 모두 &lt;code&gt;play.mvc.Results&lt;/code&gt; 클래스 안에서 찾을 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Redirects are simple results too&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저를 새로운 URL로 리다이렉팅하는 것은 간단한 result의 종류이다. 그러나, 이러한 result 타입은 response body를 가지지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redirect results를 생성하는 몇개의 helpers:&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;public static Result index() {
    return redirect(&quot;/user/home&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;303 SEE_OTHER&lt;/code&gt; 응답 형식을 사용하기 위한 기본값이다. 보다 구체적인 status code도 지정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;public static Result index() {
    return temporaryRedirect(&quot;/user/home&quot;);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/Play Framework</category>
      <category>play framework</category>
      <category>playframework</category>
      <category>플레이프레임워크</category>
      <author>펭귀니 :)</author>
      <guid isPermaLink="true">https://simyeju.tistory.com/124</guid>
      <comments>https://simyeju.tistory.com/124#entry124comment</comments>
      <pubDate>Sun, 26 Sep 2021 20:13:31 +0900</pubDate>
    </item>
  </channel>
</rss>