<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>naked_thunder.log</title>
        <link>https://velog.io/</link>
        <description>물음표 살인마</description>
        <lastBuildDate>Fri, 25 Aug 2023 05:29:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. naked_thunder.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/naked_thunder" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[구동오류] cannot find symbol]]></title>
            <link>https://velog.io/@naked_thunder/%EA%B5%AC%EB%8F%99%EC%98%A4%EB%A5%98-cannot-find-symbol</link>
            <guid>https://velog.io/@naked_thunder/%EA%B5%AC%EB%8F%99%EC%98%A4%EB%A5%98-cannot-find-symbol</guid>
            <pubDate>Fri, 25 Aug 2023 05:29:34 GMT</pubDate>
            <description><![CDATA[<p>bo소스를 구동하는데 cannot find symbol &#39;retry&#39; 이렇게 오류발생
구글링으로는 캐시를 지워라 빌드를 다시해라 등 문제들이 있었지만, 내 상황에 적합하지않는 상황이였다. </p>
<p>내 프로젝트는 bo랑 api 프로젝트를 같이 띄어놓고 사용중이였는데, 
브랜치가 다른 상황이였다. 그래서 났던 오류로 build.gradle 를 할때 api쪽 모듈에서 나는 오류였다. 브랜치를 확인해보니 다른 브랜치를 바라보고 있었다. 
브랜치버전이 맞지않아서 나는 오류였다. 다시 pull받아서 사용하니 cannot find symbol
에러가 사라졌다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 3. OPEN API 사용하기 ] 자바에서 특일정보 open api사용하기 ]]></title>
            <link>https://velog.io/@naked_thunder/3.-OPEN-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-%ED%8A%B9%EC%9D%BC%EC%A0%95%EB%B3%B4-open-api%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naked_thunder/3.-OPEN-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-%ED%8A%B9%EC%9D%BC%EC%A0%95%EB%B3%B4-open-api%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 15 Aug 2023 04:04:10 GMT</pubDate>
            <description><![CDATA[<p>포스트맨에서 확인해보았을 때, 필요했던 준비물들은
URL, params, api key값 이였다. 고대로 가져와서 java에서 사용해보자 </p>
<p>첫번째로 메서드안에서 작업을 하자. return 값은 어떻게 받아올지 아직 모르겠으니, string으로하고 나중에 변경하자 </p>
<pre><code>private final String url = &quot;http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo&quot;

private String getHolidays() {
    String serviceKey = env.getProperty(&quot;holiday.apiKey&quot;);

    String currentYear = new SimpleDateFormat(&quot;yyyy&quot;).format(new Date());
    String currentMonth = new SimpleDateFormat(&quot;MM&quot;).format(new Date());

    URI requestURI = new URI(url + &quot;?ServiceKey=&quot; + serviceKey + &quot;&amp;solYear=&quot; + currentYear + &quot;&amp;solMonth=&quot; + currentMonth + &quot;&amp;_type=&quot; + &quot;json&quot;);

    String holidayDate = restTemplate.getForObject(requestURI, String.class);

    Map&lt;String, Object&gt; jsonMap = JSONUtils.readValue(holidayDate, Map.class);


}</code></pre><ol>
<li>일단 필요한 url은 변수로 생성해주었고, </li>
<li>service key값도 직접 코드에 넣는 것 보다는 application.yml 배치 공통파일에서 값을 넣어줘서 key로 불러와서 value를 부르는 형식으로 값을 넣어준다. </li>
<li>필요한 파라미터인 year, month값도 현재 년도와 월 값들은 원하는 형식으로 불러와 </li>
<li>requestURI 변수에다가 파라미터를 넘겨 </li>
<li>restTemplate.getForObject()에 url, responseType 을 넘겨주었다. 
이렇게 했을시에 정상작동하는 것을 보았다. </li>
</ol>
<ul>
<li>아쉬운 점은 responseType에 대한 DTO를 만들지 못했다는 점이다. 
responseType을 String.class 로 하여 공휴일 return 값을 문자열로 받겠다는 뜻인데, DTO로 했을경우 DTO클래스를 넣어주면, 자동으로 맵핑되어 값을 더 깔끔하게 받는 장점이 있다. </li>
</ul>
<ol start="6">
<li>결과값이 문자열이니 사용하기쉽게 json형태로 형변환해주자 (jsonMap)<pre><code>{
 &quot;response&quot;: {
     &quot;header&quot;: {
         &quot;resultCode&quot;: &quot;00&quot;,
         &quot;resultMsg&quot;: &quot;NORMAL SERVICE.&quot;
     },
     &quot;body&quot;: {
         &quot;items&quot;: {
             &quot;item&quot;: {
                 &quot;dateKind&quot;: &quot;01&quot;,
                 &quot;dateName&quot;: &quot;광복절&quot;,
                 &quot;isHoliday&quot;: &quot;Y&quot;,
                 &quot;locdate&quot;: 20230815,
                 &quot;seq&quot;: 1
             }
         },
         &quot;numOfRows&quot;: 10,
         &quot;pageNo&quot;: 1,
         &quot;totalCount&quot;: 1
     }
 }
}</code></pre>결과 값 json형태 (내가 DTO를 안만든이유) </li>
</ol>
<p>이어서</p>
<pre><code>Map&lt;String, Object&gt; response = jsonMap.get(&quot;response&quot;);
Map&lt;String, Object&gt; body = jsonMap.get(&quot;body&quot;);

if (body.get(&quot;items&quot;).toString() == &quot;&quot;) {
    return new ArrayList&lt;&gt;();
}

Map&lt;String, Object&gt; items = (Map&lt;String, Object&gt;) body.get(&quot;items&quot;);
Object item = items.get(&quot;item&quot;);

   if (item instanceof Map) {
      itemList = new ArrayList&lt;&gt;();
      itemList.add((Map&lt;String, Object&gt;) item);
   } else if (item instanceof List) {
      itemList = (List&lt;Map&lt;String, Object&gt;&gt;) item;
   } else {
      itemList = new ArrayList&lt;&gt;();
  }
     return itemList;</code></pre><p>response, body 값 까지는 불변이다. 
items에는 item을 담는데 item 안에 월에대한 값들이 담긴다. 
예를들어 2023년도 기준으로 8월은 15일(광복절), 9월 28, 29, 30일(추석), 11월 공휴일 없음 이렇게 담긴다. </p>
<p>*<em>11월 공휴일이 없는 달 *</em>
공휴일이 없는 11월인 경우에는 item이 없다보니 items == &quot;&quot; 로 반환한다. 
그래서 공휴일이 없는 날에는 String &quot;&quot; 값을 List로 변환하지 못해 
클래스 캐스팅 오류발생한다. 
*<em>8월 공휴일이 한개인 달 *</em>
공휴일이 한개일대는 response, body처럼 Map&lt;String, Object&gt; item 으로 반환한다. 
*<em>9월 공휴일이 여러개인 달 *</em>
9월에는 추석이 있어 여러개인 공휴일일때는 List로 반환을 한다. List&lt;Map&lt;String, Object&gt;&gt; 를 사용해서 반환해줘야한다. </p>
<p>그래서 이런 가변적인 return 값 자료형때문에 Object인 Java에서 최상위 클래스를 사용하여 다양한 객체유형에 맞춰 받아줄 수 있게 유연하게 데이터 클래스를 처리할 수 있게 Object를 사용했다. 
그리고 instanceof 연산자를 사용하여 객체유형에 따라 조건을 맞춰 값을 return하였다. </p>
<p>이렇게 함으로써 공휴일의 유무조건에 따라 사용하는 법을 살펴보았다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SoarLint] field can be converted to a local variable]]></title>
            <link>https://velog.io/@naked_thunder/SoarLint-field-can-be-converted-to-a-local-variable</link>
            <guid>https://velog.io/@naked_thunder/SoarLint-field-can-be-converted-to-a-local-variable</guid>
            <pubDate>Tue, 15 Aug 2023 03:45:50 GMT</pubDate>
            <description><![CDATA[<p>전역적으로 사용하는게 아닌 특정 메서드에서만 사용하는 멤버변수 field variable를 
메서드 안에서 옮겨서 사용하라는 SoarLint의 경고였다. </p>
<ul>
<li>메모리 낭비랑 관련있나? 나도 궁금하긴했다. 사용하면서 이거를 밖에다가 선언하는건지, 아니면 메서드 안에서 사용하는 변수인지....</li>
<li>밖으로 빼놓는 이유는 깨끗해보이기 때문이였는데;; 모르고 사용했다간 전역변수로 사용함으로써 메모리를 더 잡아먹는 상황이될수도😷</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[성능] 로컬에서 구동시간 줄이기 ]]></title>
            <link>https://velog.io/@naked_thunder/%EC%84%B1%EB%8A%A5-%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C-%EA%B5%AC%EB%8F%99%EC%8B%9C%EA%B0%84-%EC%A4%84%EC%9D%B4%EA%B8%B0</link>
            <guid>https://velog.io/@naked_thunder/%EC%84%B1%EB%8A%A5-%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C-%EA%B5%AC%EB%8F%99%EC%8B%9C%EA%B0%84-%EC%A4%84%EC%9D%B4%EA%B8%B0</guid>
            <pubDate>Tue, 08 Aug 2023 00:13:16 GMT</pubDate>
            <description><![CDATA[<p><strong>프로젝트 구동시킬때 3분 걸렸...🤦‍♂️</strong>
로컬에서 구동시킬 때 프로젝트를 띄우기까지 3분정도 소요됬던거를 AA파트에서 2분으로 줄여주셨다. 기존에 작업하면서 특히 간단한거 수정할 때, 그리고 확인해야할 때 너무 오랜시간 잡아먹었다. (한번에 해결되는게 아니었기때문이지롱🤷‍♀️) </p>
<p>이런거를 개선할려는 AA파트에게 🙌</p>
<p><strong>일분일초가 소중햇🌞</strong>
기존에 엘라스틱서치에서 구동할때 30초씩 잡아놓고 있었다. 
우리 프로젝트상 2개씩 돌아가고있는 상황이여서 60초가 소요되고있었다. 
그런데 로컬에서는 엘라스틱서치 사용량 비중이 높지않아서 AA파트 판단에 3초로 줄이셨다. local환경에서 해당되는 것이므로 env환경이 &quot;local&quot;일때 connectionTimeout = &quot;3s&quot;를 설정하셨다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링 빈 충돌] BeanDefinitionStoreException]]></title>
            <link>https://velog.io/@naked_thunder/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88-%EC%B6%A9%EB%8F%8C-BeanDefinitionStoreException</link>
            <guid>https://velog.io/@naked_thunder/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88-%EC%B6%A9%EB%8F%8C-BeanDefinitionStoreException</guid>
            <pubDate>Mon, 07 Aug 2023 23:53:53 GMT</pubDate>
            <description><![CDATA[<p><strong>개발작업</strong></p>
<ol>
<li>파일추가</li>
<li>build.gradle spring Retry 라이브러리 추가 </li>
</ol>
<p>*<em>오류메세지 *</em></p>
<pre><code>org.springframework.beans.factory.BeanDefinitionStoreException: 
Failed to parse configuration class [net.g1project.ecp.web.batch.EcpBatchApp]; 
nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: 
Annotation-specified bean name &#39;restTemplateConfiguration&#39; for bean class 
[..충돌나는 위치..] conflicts with existing, 
non-compatible bean definition of same name and class
[..여기랑 위치랑 동일하다는 내용..]
</code></pre><p>RestTemplateConfiguration 동일한 이름의 파일이 중복되어 있어 충돌이 발생하는 이유 </p>
<p><strong>nested exception</strong> </p>
<ul>
<li>컴파일상으로는 문제없다가 구동시킬 때 에러발생 </li>
</ul>
<p><strong>gradle.build 라이브러리 추가</strong></p>
<pre><code>compile &#39;org.springframework.retry:spring-retry:1.3.4&#39;</code></pre><p>spring Retry 라이브러리를 추가해서 재시도 및 실패 처리 관련 기능을 제공하는데 사용하는 라이브러리 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 2. OPEN API 사용하기 ] API 인증키 인코딩 VS 디코딩 그리고 RestTemplate]]></title>
            <link>https://velog.io/@naked_thunder/RestTemplate-API%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naked_thunder/RestTemplate-API%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 04 Aug 2023 00:30:41 GMT</pubDate>
            <description><![CDATA[<h2 id="할말이-많은-intro">할말이 많은 INTRO</h2>
<p><img src="https://velog.velcdn.com/images/naked_thunder/post/a10fdc81-3432-4ba3-ad55-d024d8772fe5/image.png" alt="">
<a href="https://velog.io/@naked_thunder/%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A7%A8-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%8F%AC%ED%83%88-%ED%8A%B9%EC%9D%BC-%EC%A0%95%EB%B3%B4-OPEN-API-%EC%82%AC%EC%9A%A9%EB%B2%95">[ 1. OPEN API 사용하기 ] 공공데이터포탈 특일 정보 OPEN API 사용법 with Postman</a>
앞글에서 데이터포털에서 특일정보 open API 연동을 했고, Postman을 통해 데이터를 받아오는 것을 확인했다. 이때 필수파라미터들을 넘겨주었는데, ServiceKey의 값을 인코딩된 키로 넘겨주었다. 
<img src="https://velog.velcdn.com/images/naked_thunder/post/5db483ac-0cee-425b-9175-11f6f6424dd3/image.png" alt=""></p>
<p>(인증키를 발급해주었을때 왜 인증키가 인코딩 키, 디코딩 키로 나누어져있는지 의심이 들었지만, 모든걸 알려고하면 피곤해져서....제껴버렸는데..)</p>
<p>그렇게 앞에서 포스트맨 API연동했을때  인코딩으로 된 인증키로 성공을했고, 
자바에서 API를 호출했을때도 인코딩으로 넘겨주었다. 
그런데 <strong>SERVICEKEY IS NOT REGISTERED</strong> 라고 오류가 떴다. (인증키의 배신)
자바에서 사용한 URL을 포스트맨에 넘기니 정상적으로 데이터를 받고 있었다 
<img src="https://velog.velcdn.com/images/naked_thunder/post/33cacd4a-1ae1-4051-bcb9-ec9d2885b53e/image.jpg" alt="">
(댕~)</p>
<p>느낌이 싸하여 인증키가 2개였던게 생각이 나더니.....
자바에서 ServiceKey를 디코딩으로된 인증키를 넘기니 잘 넘어갔다. 
<img src="https://velog.velcdn.com/images/naked_thunder/post/c8ee85f7-fca8-4b4d-bbb2-1680bb620efd/image.png" alt=""></p>
<pre><code>{&quot;response&quot;:{&quot;header&quot;:{&quot;resultCode&quot;:&quot;00&quot;,&quot;resultMsg&quot;:&quot;NORMAL SERVICE.&quot;},&quot;body&quot;:{&quot;items&quot;:{&quot;item&quot;:{&quot;dateKind&quot;:&quot;01&quot;,&quot;dateName&quot;:&quot;ê´ë³µì &quot;,&quot;isHoliday&quot;:&quot;Y&quot;,&quot;locdate&quot;:20230815,&quot;seq&quot;:1}},&quot;numOfRows&quot;:10,&quot;pageNo&quot;:1,&quot;totalCount&quot;:1}}}</code></pre><p>(사진이 너무 작으니  text로 보여드림)</p>
<p>데이터는 잘 받아진게 확인되나 현재 내가 작업한 API연동 작업을 필요한것만 넘긴 상황이여서 한글이 깨지는 상태이다 ㅎㅎ</p>
<p><strong>[add 0823] api ServiceKey 인코딩, 디코딩 발급되는 이유</strong></p>
<p>실제 개발을 할 경우에는 API 환경,호출 조건이 동일하지않다. 나도 개발하면서 경험한건데, ServiceKey를 String으로 넘기는 경우에는 encoding을 자동으로 해줌으로 Decoding 일반 인증키를 value값으로 넣어야한다. Encoding 일반 인증키를 사용할 경우 Encoding 된 값을 한번더 Encoding 처리를 함으로써, 제공한 인증키값과 값이 달라지게된다. 
그렇다고 모든 상황에서 Encoding 일반 인증키 값을 사용하는 것도 아니다. 
포스트맨 같은 API테스트 툴에서는 Encoding값으로 넘겨줘야 테슽를 할 수 있다. 이렇게 인증키가 적용되는 방식이 다르므로 Encoding/Decoding 인증키를 제공해준거였다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 1. OPEN API 사용하기 ] 공공데이터포탈 특일 정보 OPEN API 사용법 with Postman]]></title>
            <link>https://velog.io/@naked_thunder/%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A7%A8-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%8F%AC%ED%83%88-%ED%8A%B9%EC%9D%BC-%EC%A0%95%EB%B3%B4-OPEN-API-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@naked_thunder/%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A7%A8-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%8F%AC%ED%83%88-%ED%8A%B9%EC%9D%BC-%EC%A0%95%EB%B3%B4-OPEN-API-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Thu, 03 Aug 2023 01:36:27 GMT</pubDate>
            <description><![CDATA[<p>공공데이터포털에서 포스트맨을통해 특일 정보 API를 받아보자 </p>
<p><img src="https://velog.velcdn.com/images/naked_thunder/post/4b5af12d-e295-43d7-ab0c-cab2ea34882f/image.png" alt="">
New 버튼을 클릭해서 오픈API 정보들을 입력해보자 
<img src="https://velog.velcdn.com/images/naked_thunder/post/a2be2051-d747-4cff-93d0-9da2a57a4a79/image.png" alt="">
나는 공휴일정보를 등록할거다 </p>
<pre><code>http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/</code></pre><p>이렇게는 기본적으로 제공이되고 원하는 공휴일종류에 맞춰 파라미터를 추가해서 원하는 공휴일을 조히할 수 있다. (/getRestDeInfo 추가)</p>
<p><img src="https://velog.velcdn.com/images/naked_thunder/post/da3c7e47-28f0-4fa2-b814-85b77e886152/image.png" alt=""></p>
<p>참고문서에 있는 URL만 긁어서 포스트맨 URL칸에 입력만해도 자동으로 파라미터가 추가된다. </p>
<p><img src="https://velog.velcdn.com/images/naked_thunder/post/f9d8b106-328c-49a3-82f5-d4f5302483a1/image.png" alt="">
send 버튼을 날려보자
등록된 서비스키가 없다한다. 서비스키는 어디서 받을 수 있을까? </p>
<p><img src="https://velog.velcdn.com/images/naked_thunder/post/66673960-82cf-4ad5-a570-95a80e66436d/image.png" alt=""></p>
<p>신청 후에도 인증키가 보여지지만, 마이페이지에 들어가면 개인 API인증키가 발급되어있다. 서비스키를 다시 긁어다가 ServiceKey value에 등록하자. </p>
<p><img src="https://velog.velcdn.com/images/naked_thunder/post/240247df-104f-4cbf-b597-3ab7ffcde87f/image.png" alt="">
파라미터에 _type json을 추가하면 JSON타입으로 데이터를 받아볼 수 있다~ </p>
<p>얏호 완료다
이제 개발하자 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WEB과 WAS에 대하여 ]]></title>
            <link>https://velog.io/@naked_thunder/WEB%EA%B3%BC-WAS%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@naked_thunder/WEB%EA%B3%BC-WAS%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Wed, 02 Aug 2023 00:48:23 GMT</pubDate>
            <description><![CDATA[<p>들었던 내용으로 정리하자면, 
WEB은 정적인 파일을 처리해주고, WAS는 동적인 파일을 처리해준다.</p>
<h4 id="간다한-구조로는">간다한 구조로는</h4>
<p>HTTP 통신규약 request요처잉 들어면 WEB서버에서는 
정적처리 Html, CSS 파일들은 처리가 가능하나
login같이 컨트롤러, 서비스, DB를 거쳐야하는 동적처리는 WAS에서 처리는 WEB서버에서 요청을 받고 동적처리를 해야한다. </p>
<h3 id="web서버와-was-구조를-가져가야하는-이유">WEB서버와 WAS 구조를 가져가야하는 이유</h3>
<p>효율적인 사용이다. </p>
<ol>
<li>캐싱</li>
<li>보안</li>
<li>로드 밸런싱 
이거에 대해서는 추가로 알아보고 정리하겠다^^;</li>
</ol>
<h3 id="실무에서-일어났던-사례">실무에서 일어났던 사례</h3>
<p>JS파일요청이 들어오면 web Server -&gt; WAS 응답하는 구조로 되어있는데, WAS에서 세션체크하면서 js까지 세션을 해야하는데 HTML응답으로 내려가졌다. 브라우저는 js인줄알았는데 HTML파일이됨..
해결은 flush를 통해 다시 파일을 내렸지만..여튼 그랬다..
자세하게 알지못하는 내가밉다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ API ] API사용 방법들에대한  장단점]]></title>
            <link>https://velog.io/@naked_thunder/API-API%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95%EB%93%A4%EC%97%90%EB%8C%80%ED%95%9C-%EC%9E%A5%EB%8B%A8%EC%A0%90</link>
            <guid>https://velog.io/@naked_thunder/API-API%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95%EB%93%A4%EC%97%90%EB%8C%80%ED%95%9C-%EC%9E%A5%EB%8B%A8%EC%A0%90</guid>
            <pubDate>Wed, 02 Aug 2023 00:19:18 GMT</pubDate>
            <description><![CDATA[<h3 id="공공데이터포털-특일-정보-api">공공데이터포털 특일 정보 API</h3>
<p><a href="https://www.data.go.kr/data/15012690/openapi.do">https://www.data.go.kr/data/15012690/openapi.do</a></p>
<h3 id="업무에서-공공-api를-사용할때">업무에서 공공 API를 사용할때</h3>
<ul>
<li>공공데이터포털에서 API받아서 사용할때 계정을 개인개정으로 하면안됨. 
계정이 완료 된 경우 본인이 없거나할때도 서비스는 사용해야하므로 개인개정은 사용하지말 것 </li>
<li>공공데이터포털의 특일 정보 API를 받아서 사용 국경일정보, 공휴일정보, 기념일정보를 제공하는 API이다. </li>
<li>서비스키(인증키), Rest Template으로 사용한다. </li>
</ul>
<h3 id="api를-사용-후-관리">API를 사용 후 관리</h3>
<ul>
<li>요건: 공휴일을 가져오는 것</li>
<li>방법1: API 직접호출해서 가져온다. </li>
<li>방법2: API받아오고 DB에 넣어준다. </li>
</ul>
<p>방법마다 장단점의 차이는 있겠지만, 첫번쨰 API를 직접호출하는 경우에는 쉽고 간단하게 해결한다. 그러나 공공API서비스에 의존하기때문에 그쪽에서 오류가 나면, 우리 서비스에도 오류가 나게된다. </p>
<p>두번째, DB에 넣어준다. DB를 넣는거는 간단한 테이블이라해도 설계와 생성에서 공수가 든다. 일정이 넉넉하다면 괜찮겠지만 dev, stg, prd DB에 신청/승인/반영해야한다. 그러나 장점은 한번받아놓으면,
외부에서 오류가 생겼을때 내부디비에는 데이터가 있으므로 외부에서 생긴오류로 우리쪽까지는 영향을 받지않게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[꼼꼼히 테스트 힘들고 지쳐도 물어보기 ]]></title>
            <link>https://velog.io/@naked_thunder/%EA%BC%BC%EA%BC%BC%ED%9E%88-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9E%98%EB%93%A4%EA%B3%A0-%EC%A7%80%EC%B3%90%EB%8F%84-%EB%AC%BC%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@naked_thunder/%EA%BC%BC%EA%BC%BC%ED%9E%88-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9E%98%EB%93%A4%EA%B3%A0-%EC%A7%80%EC%B3%90%EB%8F%84-%EB%AC%BC%EC%96%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 26 Jul 2023 04:45:23 GMT</pubDate>
            <description><![CDATA[<p>오늘은 운영배포 나가는 날이다. 
저번주에 개발을 마치고 스테이징에서 UAT만 남은 상황이였고, UAT 이후에 버그일감도 
간단했어서 버그 수정후에 따로 테스트하지 않았다. (사실은 더 보고싶지않았다.) </p>
<p>당연히 UAT들어가기전까지 개발일정 이였을때는 반복작업처럼 테스트를 했어서 지겨운 상태였다. 반복되는것을 다시 보고 꼼꼼히 테스트하는거는 어나더 레벨인 것 같다. </p>
<p>오늘 배포날이 되서 생각해보니, 왜 과거의 나는 테스트를 고딴식으로밖에 못했는지 후회가 들었다🦍</p>
<p>진짜 일을할때는 특히 개발할때는 내 모든거를 갈아넣을 것 처럼 불싸질러야하는 것 같다. 이정도면 되겠지하고, 넘기는 자세를 고쳐야겠다.
이정도면 됐지하는 마음에 그리고 시간나서 눈누난나했던 내 자신도 미워지고....
과거의 나를 미워하면 뭐해<del>🧚‍♀️ 여기까지만 나를 미워하도록하자</del> </p>
<p>앞으로는 개발할때 더 꼼꼼히보기, 영향도 체크하기, 테스트도 다양하게해보며
더 열심히하는 것 뿐이다👌
RIDE OR DIE</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 프로젝트 구조 ] 멀티 프로젝트란?]]></title>
            <link>https://velog.io/@naked_thunder/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@naked_thunder/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Tue, 25 Jul 2023 06:11:11 GMT</pubDate>
            <description><![CDATA[<p>*<em>👀 목차 *</em></p>
<ul>
<li>인트로</li>
<li>멀티 프로젝트란?</li>
<li>[TIL] 빌드 시 에러: cannot find symbol</li>
<li>[TIL] 빌드 시 에러: cannot find symbol</li>
</ul>
<h4 id="인트로">인트로</h4>
<p>우리회사는 이커머스 서비스 프로젝트를 운영하는 회사이다. 
프로젝트 구조는 멀티 프로젝트 구조로 되어있다. 
웹 서비스같이 대규모인 어플리케이션에서는 멀티 프로젝트구조가 쉽고 효율적으로 관리하기위해 사용된다.  </p>
<h4 id="멀티-프로젝트란">멀티 프로젝트란?</h4>
<p>하나의 Main 이라는 &quot;루트 프로젝트&quot;안에 여러개의 하위프로젝트 &quot;서브 프로젝트 or 라이브러리&quot; 구조이다. 
하위 프로젝트는 독립적을 개발 및 테스트가 가능하고 서로 다른 프로젝트를 의존할 수 있다. 
빌드툴은 Gradle를 사용하고 있으며, Gradle은 이런 멀티 프로젝트 빌드를 지원한다. (Maven도 가능) </p>
<h4 id="📌📌📌-today-what-i-learnt">📌📌📌 TODAY WHAT I LEARNT</h4>
<ul>
<li>하위 프로젝트를 라이브러리라고 부른다.</li>
<li>하위 프로젝트도 의존관계가 아닐때 호출을 하면 빌드시 오류가 난다. </li>
</ul>
<p><strong>[TIL] 빌드 시 에러: cannot find symbol</strong>
ServiceImpl 비즈니스단에서 OrderUtils 파일을 사용하기위해 import했고 빌드를 하니 cannot find symbol 이라고 뜨면서 OrderUtils import를 찾지 못한다했다. 
컴파일오류도 안뜨고, import 도 잘 들어가있는데 왜요?
내가 작업하고 있는 ServiceImpl은 sales 하위 프로젝트였고, OrderUtils 는 order 하위 프로젝트였다. 
그래도 프로젝트도 의존할 수 있는데..하면서 sales 프로젝트의 build.gradle 파일을 열어보니 공통냄새나는 프로젝트만 의존하고 있었다. 하하 로컬에서 슬쩍 &#39;order&#39; 프로젝트를 하니 성공적으로 빌드를 할 수 있었다. 그러나 어떠한 사이드이펙트가 올지몰라 내 로컬에서만 확인해보았다. </p>
<pre><code>// sales 서브 프로젝트 build.gradle
dependecies{
    compile project(&#39;index&#39;)
    compile project(&#39;common&#39;)
}</code></pre><h4 id="til-서브-프로젝트--라이브러리-vs-찐-라이브러리">[TIL] 서브 프로젝트 = 라이브러리 VS 찐 라이브러리</h4>
<p>내가 생각한 찐 라이브러리는 외부에 공개되어서 내 프로젝트에 추가해서 사용하거나 확장할때 사용하는 라이브러리다. </p>
<p>멀티 프로젝트에서 사용하는 서브 프로젝트도 라이브러리라고 부르던데?!
멀티 프로젝트 구조에서 하위 프로젝트를 라이브러리라고 부르는건 개발내에서 사용하는 용어로써, &quot;독립적으로 빌드되고 다른 프로젝트에서 사용되는 코드 모음을 의미한다&quot; </p>
<p>이렇게 상황에 따라 라이브러리라고 부르는걸 배웠다. </p>
<h3 id="🐟-🐟-🐟-🐟-🐟-🐟-🐟">🐟 🐟 🐟 🐟 🐟 🐟 🐟</h3>
<p>자 이제 sales프로젝트에서 의존성관계이지 않은이상 orderUtils를 사용하지 못하는걸 알았으니! 개발하러 가자~😉</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 이론 ] DI 의존관계 3가지]]></title>
            <link>https://velog.io/@naked_thunder/%EC%9D%B4%EB%A1%A0-DI-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-3%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@naked_thunder/%EC%9D%B4%EB%A1%A0-DI-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-3%EA%B0%80%EC%A7%80</guid>
            <pubDate>Mon, 26 Jun 2023 00:15:10 GMT</pubDate>
            <description><![CDATA[<p>*<em>DI 의존관계란? *</em>
의존관계란 객체간의 결합도를 낮추는 방법 중 하나이다. 
한 객체가 다른 객체에 의존하거나 결합도가 높을때 객체간의 의존성도 높아져 해당 객체에대해 변경이 발생할때 다른 객체에도 영향을 미칠 가능성이 높다. DI를 사용하여 객체간의 결합도를 낮출 수 있다. </p>
<ul>
<li>느슨한 결합과, 유연성과 재사용성, 단위 테스트 용이성이 있다.</li>
</ul>
<p><strong>의존성 주입 DI 3가지</strong> </p>
<ol>
<li>생성자 주입</li>
<li>세터 주입</li>
<li>필드 주입 </li>
</ol>
<p><strong>생성자 주입</strong>
: 생성자 주입을 통해 필요로 하는 의존객체를 주입한다. </p>
<ul>
<li>명시적인 의존성: 의존하는 객체를 생성자를 통해 필요한 의존객체를 매개변수로 넘겨 주입하는 명확하게 보여준다. </li>
<li>불변성: 생성자 주입은 객체를 생성하는 시점에 의존성이 설정되므로, 이후에 의존성을 변경하기 어려움이 있다.  </li>
<li>테스트 용이성: TDD에서 Mock객체를 사용할때 테스트가 가능하다. </li>
</ul>
<p><strong>세터 주입</strong>
의존하는 객체를 setter메서드를 통해 주입하는 방식이다. 
(세터 주입은 정확하지않아 나중에 정리하겠다)</p>
<p><strong>필드 주입</strong>
말그대로 의존하는 객체를 필드에 직접 주입하는 방식이다. 
사용하기 매우 쉽고, 간결하다. 그러나 필드 주입은 추천하지 않는 방식이다 그 이유는 첫번째, TDD 테스트 제약이 있다. 필드 주입은 해당 클래스 필드에 직접적으로 의존하는데 TDD에서는 Mock객체를 사용하기에 대체하기 어렵다.<br>두번째, 필드에 직접적으로 선언하다보니 의존하는 객체에 직접적으로 결합되기 떄문에 결합도가 높아진다. </p>
<blockquote>
<p>이전 프로젝트는 생성자 주입을 통해 의존관계를 설정했다면, 이번 프로젝트에서는 필드주입을 통해 의존관계를 설정하길래 개념 및 활용에 대해 알아보았다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ DI 의존관계 ] 생성자 주입, 필드 주입 ]]></title>
            <link>https://velog.io/@naked_thunder/spring-DI-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%A3%BC%EC%9E%85-3%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@naked_thunder/spring-DI-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%A3%BC%EC%9E%85-3%EA%B0%80%EC%A7%80</guid>
            <pubDate>Sun, 25 Jun 2023 12:31:43 GMT</pubDate>
            <description><![CDATA[<h3 id="di-의존관계-주입-3가지">DI 의존관계 주입 3가지</h3>
<p>의존관계 주입에는 3가지가 있지만 2가지인 생성자 주입과 필드주입에 대해 알아보겠다. </p>
<ul>
<li>생성자 주입 </li>
<li>필드 주입 </li>
<li>세터 주입</li>
</ul>
<h3 id="생성자-주입">생성자 주입</h3>
<pre><code>//AppConfig.java 
@Bean
public MemberService memberService() {
    return new MemberServiceImpl(memberRepository());
}</code></pre><pre><code>//MemberServiceImpl
private final MemberRepository memberRepository;

public MemberServiceImpl(MemberRepository memberRepository) {
    this.memberRepository = memberRepository; 
}
</code></pre><ol>
<li>AppConfig 파일에서 memberSerivce()메서드를 호출하면서 결과값으로 MemberServiceImpl() 생성자를 호출한다.</li>
<li>memberRepository 메서드를 호출하여 MemberRepository 객체를 MemberServiceImpl의 생성자에 전달하여 의존성을 주입한다.</li>
</ol>
<p>*<em>생성자 주입의 장점 *</em></p>
<ul>
<li>불변성: 생성자 주입은 클래스의 인스턴스를 생성하는 시점에 의존성이 설정되므로 이후에 의존성을 변경하려면 새로운 인스턴스를 생성해야하므로 변경이 어렵다. </li>
<li>테스트 용이성: 생성자 주입은 TDD시에 생성자 주입을 통해 테스트가 가능하다. (필드주입은 안됨) 
테스트 시 Mock(가짜) 객체를 사용하는데, 이때 생성자를 통해 전달이 가능하다. </li>
<li>명시적인 의존성: 클래스가 어떤 의존성을 필요료 하는지 명확하게 보여준다. 넣지않을 경우에는 컴파일오류가 발생한 것을 확인할 수 있다. </li>
</ul>
<h3 id="필드-주입">필드 주입</h3>
<pre><code>//AppConfig.java
@Bean 
public MemberService memberService() {
    return new MemberServiceImpl();
}</code></pre><pre><code>//MemberServiceImpl.java 
@Autowired
MemberRepository memberRepository</code></pre><ol>
<li>AppConfig 파일에서 memberService()를 호출하면 return 값으로 MemberServiceImpl()을 호출하여 MemberServiceImpl 인스턴스를 생성한다. @Bean 어노테이션을 통해 메서드를 빈으로 등록하고 있다. (@Bean은 따로 정리하겠음)</li>
<li>MemberServiceImpl 에서는 @Autowired를 통해 memberRository를 필드주입을 해준다. </li>
</ol>
<p><strong>필드 주입의 장점</strong></p>
<ul>
<li>편리성: @Bean, @Autowired 어노테이션을 통해 말 그대로 필드에 주입함으로써 의존관계 설정완료</li>
</ul>
<p><strong>필드 주입 단점</strong>
<img src="https://velog.velcdn.com/images/naked_thunder/post/54d1ab14-9bc0-41c9-8308-df769b3477e0/image.png" alt="">(this.memberRepository가 NPE 오류발생)</p>
<ul>
<li>TDD 테스트 제약: 필드 주입은 객체 인스턴스를 생성할 때, 해당 필드에 의존성을 주입한다. 
테스트코드에서는 Mock 가짜객체를 대체하여 사용하는데 필드주입은 해당 필드에 의존성이 주입된된다. 스프링 컨테이너가 없으므로 자동으로 의존관계가 이루어지지 않는다.</li>
</ul>
<p><strong>생성자 주입과 비교</strong></p>
<ol>
<li>생성자 주입의 명확성</li>
</ol>
<ul>
<li>의존관계를 찾아보면 생성자 주입 사용을 추천한다. 그 이유는 생성자 주입은 의존성을 생성자의 매개변수로 명시적으로 전달하는 방식이여서, 누락되거나 할때 컴파일오류가 발생하여 고치기가 쉽다. 반면에 필드주입은 필드에 직접 명시함으로써 생성자 주입처럼 명확하게 의존성을 매개변수로 표현하지 않는다. 자동으로 의존성을 주입하기 때문에 편리하지만, 의존성에 있어 명확하지 않다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 경험정리 ] 웹과 TOKEN]]></title>
            <link>https://velog.io/@naked_thunder/TOKEN-%EC%9B%B9%EA%B3%BC-TOKEN</link>
            <guid>https://velog.io/@naked_thunder/TOKEN-%EC%9B%B9%EA%B3%BC-TOKEN</guid>
            <pubDate>Wed, 21 Jun 2023 04:09:32 GMT</pubDate>
            <description><![CDATA[<p><strong>이슈 1</strong>
화면이 정상적으로 열리지않아 다른 화면들도 확인해보니
특정 등급인 경우에 보이는 화면과 내용이 보이지않고 일반회원일때 노출되는 화면이 보이는 케이스였다. </p>
<p><strong>접근 1</strong></p>
<ul>
<li>고객의 로그인 로그내역을 확인하니 오류발생화면이 생성되기 1시간 전까지 활동내역이 있으나, 그 이후 한시간 동안은 활동내역이 안찍혀있음</li>
<li>우리 홈 페이지에서 로그인했을 시 토큰이 생성되고 1시간 이후에는 토큰이 만료되는 상황</li>
<li>로그내역으로 보았을때 1시간 이상 소요된 상황이므로, 고객의 상태는 토큰이 만료된 로그아웃 상태이므로 일반등급의 화면으로 노출될 수 있음 </li>
</ul>
<p><strong>이슈 2</strong>
로그아웃이 되었다면 해당 페이지가 열리지 않아야하는데 열리는 상황인데
마이페이지가 보였다는건 로그아웃이 아닌 해당 정보소실? </p>
<p><strong>접근 2</strong>
사이트를 확인해보니 하단에 있는 마이페이지 클릭 시 로그인창 거치지않고, 
바로 로그인이 됨. 접근1말처럼 로그아웃이 되었더라면, 로그인화면을 거치고 마이페이지가 노출되어야하는데 마이페이지 버튼 클릭 시 로그인창을 거치지않고 로그인이 바로됨 </p>
<p><strong>접근3</strong>
상품상세, 장바구니 페이지는 웹뷰로 띄워지나 APP에서 웹뷰를 띄울떄 항상 TOKEN을 갱신해서 
웹에 전달하면서 띄우게됨 </p>
<ul>
<li>APP에서 TOKEN을 제대로 전달하지 못했거나, 웹 에서 TOKEN 값을 제대로 받지 못한 상황으로 보임 </li>
<li>APP은 로그인 상태, 웹은 비로그인 상태로 전달되어야 할 파라미터가 누락되어 오류가 발생 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[컴퓨터 구조] 컴퓨터 4가지 핵심 부품 ]]></title>
            <link>https://velog.io/@naked_thunder/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-4%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC-%EB%B6%80%ED%92%88</link>
            <guid>https://velog.io/@naked_thunder/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-4%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC-%EB%B6%80%ED%92%88</guid>
            <pubDate>Mon, 19 Jun 2023 00:00:04 GMT</pubDate>
            <description><![CDATA[<p>*<em>컴퓨터구조 4가지 핵심 부품 *</em></p>
<ol>
<li>RAM</li>
<li>CPU</li>
<li>보조기억장치</li>
<li>입출력장치 </li>
</ol>
<p>핵심부품을 보기에 앞서 왜 컴퓨터가 0과 1로 정보를 표현하는지 알아보고가자 </p>
<h3 id="컴퓨터의-이진법">컴퓨터의 이진법</h3>
<p>흔히들 컴퓨터세상에서 정보를 표현하는데는 0과1로 정보를 표현한다. 그러나 휴면이 살고있는 세상에서는 일반적으로 십진법으로 표현하고 있다. </p>
<p>컴퓨터 0과 1로 정보를 표현하는데, 이것을 이진법(Binary)이라고 한다. 전기의 켜짐과 꺼짐 on off 처럼 0과 1로 구성된 비트로 데이터를 저장하고, 프로세서는 0과 1로 구성된 이진 코드를 처리하여 계산과 다른 작업을 수행한다. 
이진표기법을 통해 숫자, 문자, 이미지, 동영상등 다양한 형태의 데이터를 표현한다. </p>
<h3 id="그럼-왜-이진법일까">그럼 왜 이진법일까?</h3>
<p>컴퓨터가 0과 1로 정보를 표현하는 컴퓨터 시스템이 전기 신호를 사용하여 정보를 처리하기 때문이다. 전압의 켜짐과 꺼짐을 나태내며 이를 0과 1로 표현한다. </p>
<ul>
<li>전기 신호의 물리적 특성</li>
<li>신호의 안정성과 정확성</li>
<li>전기 회로의 단순성 </li>
<li>확장성과 호환성</li>
</ul>
<p>위에 특징들처럼 전기 신호는 컴퓨터 시스템에서 정보 처리에 주로 사용되며,
전기 회로와 전자 기술은 현태 컴퓨팅의 핵심요소이다.  </p>
<p>컴퓨터의 핵심요소를 다시 살펴보자 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[resultsettable지우기 ]]></title>
            <link>https://velog.io/@naked_thunder/resultsettable%EC%A7%80%EC%9A%B0%EA%B8%B0</link>
            <guid>https://velog.io/@naked_thunder/resultsettable%EC%A7%80%EC%9A%B0%EA%B8%B0</guid>
            <pubDate>Tue, 06 Dec 2022 06:24:43 GMT</pubDate>
            <description><![CDATA[<h4 id="원인">원인</h4>
<p>콘솔에 resultsettable로 찍혀 너무 오랫동안 구동되는 상황 </p>
<h4 id="해결">해결</h4>
<pre><code>        1. logback-spring.xml을 복사한다. 
        2. logback-local.xml로 이름을 변경해준다.(복사본)
            - local로 이름이 들어가면 자동으로 gitignore가됨(spring.xml에서도 할 수 있지만
            풀받을때마다 충돌나서 바꿔줘야하므로 간접적인 방법을 선택)
        3. logback-local.xml에서 resultsettable을 찾아서 level=DEBUG를 WARN으로 
        수정
            - WARN이 DEBUG보다 높은 레벨이여서 콘솔에 찍히지않는다나..
        4. application.yml로 돌아가 아래를 추가해준다. 
            - logging.config치고 
                logging:
                    config: classpath:logback-local.xml

        그러면 여기를 logback-local을 볼께!가 되고 resultsettable은 WARN이므로 콘솔에 
        더이상 많이 쥬류류류륙 안찍힌다. 
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ TIL ] IntelliJ plugin ]]></title>
            <link>https://velog.io/@naked_thunder/WIL</link>
            <guid>https://velog.io/@naked_thunder/WIL</guid>
            <pubDate>Wed, 02 Nov 2022 00:43:49 GMT</pubDate>
            <description><![CDATA[<p>*<em>plugin 코드 범인색출 *</em></p>
<ul>
<li>intellj: gittoolbox</li>
<li>vscode: gitlense</li>
</ul>
<p><strong>sonarLint</strong></p>
<ul>
<li>코드리뷰 선생님</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ JavaScript 참고서 ] 데이터 타입]]></title>
            <link>https://velog.io/@naked_thunder/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@naked_thunder/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Wed, 26 Oct 2022 07:20:06 GMT</pubDate>
            <description><![CDATA[<h4 id="1-variable">1. variable</h4>
<pre><code> 변수는 데이터를 저장하는 컨테이너로(보관함) var, let, const가 있다. </code></pre><h4 id="2-blockscope">2. blockScope</h4>
<ul>
<li>ES6표준에서 let, const를 도입하면서 js에서 사용가능 
  { } 블록단위내에서 (if-else, while, for 그리고 try-catch) 유효 범위를 갖게 하는 스코프이다. </li>
<li>var를 통해 변수를 블록스코프안에서 사용하면 전역 스코프, 함수 스코프로 인식되어 접근이 가능 그러나 let을 통해 선언하면 해당 블로내에서만 접근 가능해서 출력 안됨 </li>
</ul>
<pre><code>{let jess=&quot;안녕&quot;}
        console.log(jess)
        //안녕
        {let je=&quot;안녕&quot;}
        console.log(je)
        //Uncaught ReferenceError: je is not defined at &lt;anonymous&gt;:2:13</code></pre><h4 id="3-var를-쓰면-안되는-이유">3. var를 쓰면 안되는 이유</h4>
<p>: var는 ES6전에 사용한 변수이다.<br>    1. var선언하기 전에 값을 할당해 할당전에도 값이 출력됨
    2. 중복선언이 가능 -&gt; var hoisting때문 </p>
<ul>
<li>var hoisting: 변수의 선언부를 Scope최상단으로 올림 </li>
<li>js는 Function-scoped이므로,코드 전체의 최상단이 아닌 &quot;함수 내부의 최상단&quot;으로 이동 <ol start="3">
<li>블럭스콥이 없음 철저히 무시함 </li>
</ol>
</li>
</ul>
<h4 id="-function-scoped란">* Function-scoped란</h4>
<pre><code>    함수 내에서 선언된 변수는 함수 내에서만 유효함. 함수 외부에서는 참조할 수 없다. 
    - 함수 내부에서 선언한 변수는 지역변수 
    - 함수 외부에서 선언한 변수는 전역변수 </code></pre><h4 id="-block-level-scope">* Block-level-scope</h4>
<pre><code>    대부분 프로그래밍은 block을 사용 , js는 function-scope사용
    - 모든 코드 블록 (if, while, try-catch 등) 선언된 변수는 코드 블록내에서만 유효
    - 블록 외부에서는 참조할 수 없다. 
    - 블록 내부에서 선언한 변수는 지역변수다. </code></pre><p>참고
<a href="https://hoondev.tistory.com/101">https://hoondev.tistory.com/101</a>    </p>
<h4 id="4-let-constants">4. let, constants</h4>
<pre><code>var키워드의 단점을 보완하기위해 등장 
- 차이: immutable, mutable 
let
    - 재할당이 가능 -&gt; mutable
const
    - 재할당이 불가능 -&gt; immutable
    - 값을 한번 할당하면 값이 절대 바뀌지 않으므로 상수 
    - 보안에 좋음 (해커가 값을 변경방지)</code></pre><p>참고 
<a href="https://poiemaweb.com/es6-block-scope">https://poiemaweb.com/es6-block-scope</a></p>
<h4 id="5-variable-type">5. variable type</h4>
<ul>
<li>primitive, single item: number, string, boolean, null, undefined, symbol
  :기본 값으로 객체를 제외한 변경할 수 없는 값을 정의하는 더이상 나눠지지 않는 한가지 타입<ul>
<li>Null: 하나의 값 null만 있음 (텅텅 비어있는, 아무것도 아니야!)</li>
<li>undefined: 하나의 값 undefined만 있음 (선언은 되었지만 값이 할당되지 않음)</li>
<li>Boolean: true , false 있으며 삼항 연산자, if~else, while 등 같이 조건부 연산에 사용<ul>
<li>false: 0, null, undefined, NaN, ‘’,  3&lt;1</li>
<li>true: any other value</li>
</ul>
</li>
<li>Number: <ul>
<li>infinity : 1/0</li>
<li>-infinity : -1/0</li>
<li>NaN: 숫자가 아님 : ‘hello’/2</li>
</ul>
</li>
<li>BigInt: </li>
<li>String: 백틱이용하게되면 간편하게 string 만들 수 있음</li>
</ul>
</li>
<li>object: box container<ul>
<li>싱글을 묶어서 한단위로 관리</li>
</ul>
</li>
<li>function, first-class function<ul>
<li>펑션도 다른 데이터타입처럼 할당이 가능하고 , 인자, 리턴으로도 가능하다.    </li>
</ul>
</li>
</ul>
<h4 id="6-symbol">6. symbol</h4>
<ul>
<li>고유한 식별자, 우선순위를 주고 싶을때, 동일한…?<h4 id="7-dynamic-typing">7. dynamic typing</h4>
: RUN타임때 타입이 정해져서 유연하지만 위험하기도하다. </li>
<li>타입이 할당해줌에 따라 타입이 변함</li>
</ul>
<h4 id="8-호이스팅이-진행과정">8. 호이스팅이 진행과정</h4>
<h4 id="-변수는-3단계에-걸쳐-생성-">[ 변수는 3단계에 걸쳐 생성 ]</h4>
<ul>
<li>선언 단계: 변수객체에 등록되며, 이 객체는 스코프가 참조하는 대상이 된다. </li>
<li>초기화 단계: 변수객체에 등록된 변수를 위한 공간을 메모리에 확보하면서 변수는 undefined상태</li>
<li>할당 단계: undefined로 초기화된 변수에 실제 값을 해당 </li>
</ul>
<h4 id="-변수-호이스팅-과정-">[ 변수 호이스팅 과정 ]</h4>
<p>이때 var로 선언된 변수는 선언단계/초기단계로 이루어지며, 
스코프에 변수를 등록(선언 단계) &gt; 메모리에 변수를 위한 공간 확보 &gt; undefined 초기화 한다. 
-&gt; 그러므로 접근해도 &quot;error&quot;대신 &quot;undefined&quot;를 반환 그리고 변수에 할당문에 도달해야 값이 할당됨</p>
<h4 id="-let-">[ let ]</h4>
<p>let키워드로 선언된 변수는 선언단계/초기단계로 &quot;분리&quot;되어 진행. </p>
<ul>
<li>선언단계: 스코프에 변수를 등록</li>
<li>초기화 단계: 변수 선언문에 도달할때 이루어짐 </li>
<li><blockquote>
<p>초기화 이전에 변수에 접근하면 에러발생 &quot;변수를 위한 메모리 공간이 아직 확보되지 않았기 때문&quot;</p>
</blockquote>
</li>
</ul>
<pre><code>console.log(bal);
    let bal;
        //Uncaught ReferenceError: bal is not defined at &lt;anonymous&gt;:1:13
    console.log(ball);
    var ball;
        //undefined</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ JavaScript 참고서 ] 배열함수]]></title>
            <link>https://velog.io/@naked_thunder/JavaScript-%EC%B0%B8%EA%B3%A0%EC%84%9C-%EB%B0%B0%EC%97%B4%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@naked_thunder/JavaScript-%EC%B0%B8%EA%B3%A0%EC%84%9C-%EB%B0%B0%EC%97%B4%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 24 Oct 2022 00:25:30 GMT</pubDate>
            <description><![CDATA[<h3 id="join">join()</h3>
<p>: 배열요소를 문자열로 변환 </p>
<pre><code>const fruit = [&#39;철수&#39;, &#39;영희&#39;, &#39;상훈&#39;];
const stringFruit = fruit.join();
console.log(stringFruit) //문자열로 뽑아낸다. 
</code></pre><p>.join(&#39; &lt;3 &#39;) seperator를 넣어주면 구분자로 들어간다.</p>
<ul>
<li>expected output: 철수 &lt;3 영희 &lt;3 상훈</li>
</ul>
<h3 id="split">split()</h3>
<p>: 문자열을 배열로 변환</p>
<pre><code>    const name = &#39;고등어솥밥,참치캔,방어회&#39;;
    const nameSplit = name.split(&#39;,&#39;);
    const nameIdx = nameSplit[2]
    console.log(nameIdx)</code></pre><p>문자열을 &#39;,&#39; 구분자로 맞춰 배열로 반환해준다. 그리고 index로 값을 접근할 수 있다. </p>
<ul>
<li>expected output: 방어회</li>
</ul>
<h3 id="reverse">reverse()</h3>
<p>: 배열을 뒤집어서 반전상태로 전환해줌 , 문자열을 x undefined </p>
<pre><code>const lyrics = [&#39;박&#39;,&#39;미&#39;,&#39;애&#39;];
const result = lyrics.reverse();
console.log(result)</code></pre><ul>
<li>복사본이 만들어지지 않음 </li>
<li>expected output: [&#39;애&#39;, &#39;미&#39;, &#39;박&#39;]</li>
</ul>
<h3 id="splice">splice()</h3>
<p>: 배열의 내용을 변경시킴, 복사본X</p>
<pre><code>const months = [&#39;Jan&#39;, &#39;March&#39;, &#39;April&#39;, &#39;June&#39;];
months.splice(1, 0, &#39;Feb&#39;);
// inserts at index 1
console.log(months);
// expected output: Array [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;June&quot;]
months.splice(4, 1, &#39;May&#39;);
// replaces 1 element at index 4
console.log(months);
// expected output: Array [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;]</code></pre><h3 id="slice">slice()</h3>
<p>: 배열에서 원하는 부분을 return </p>
<pre><code>const fruits = [&#39;Banana&#39;, &#39;Orange&#39;, &#39;Lemon&#39;, &#39;Apple&#39;, &#39;Mango&#39;];
const citrus = fruits.slice(1,4);
console.log(citrus)</code></pre><ul>
<li>start: 0부터 시작 index </li>
<li>expected output:[&#39;Orange&#39;, &#39;Lemon&#39;, &#39;Apple&#39;]</li>
</ul>
<h4 id="참고자료">참고자료</h4>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/join">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/join</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 환경설정 ] java.exe finished with non-zero exit value 1]]></title>
            <link>https://velog.io/@naked_thunder/%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95-java.exe-finished-with-non-zero-exit-value-1</link>
            <guid>https://velog.io/@naked_thunder/%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95-java.exe-finished-with-non-zero-exit-value-1</guid>
            <pubDate>Fri, 21 Oct 2022 04:39:43 GMT</pubDate>
            <description><![CDATA[<h3 id="오류-메세지-javaexe-finished-with-non-zero-exit-value-1">오류 메세지: java.exe finished with non-zero exit value 1</h3>
<p>인텔리제이에서 소스클론 이후 구동했을시에 나오는 메세지 오류였다. 
jdk설정, setting &gt; gradle 위치, Build and run, Gradle을 설정해 준 상태임에도 동일한 오류였다. 
알고보니 탐색기에서 내 이름 부분이 &quot;<strong>공백문자</strong>&quot;로 인해 인식이 되지않았던 거였다..
예를들어,Ms Park이라고하자 경로안에 공백문자로 인해 인식 X하지 못하므로 </p>
<ul>
<li>오류 원인: C:\Users\Ms Park.gradle </li>
</ul>
<ol>
<li>탐색기 그래들 위치 변경</li>
</ol>
<ul>
<li>C:\Users\Ms Park.gradle </li>
<li><blockquote>
<p>내 경로안에 공백문자로 인해 인식 불가X, 이동후 이 폴더는 삭제! 인텔리제이에서 여기를 바라봄</p>
</blockquote>
</li>
<li>C:.gradle (경로 수정)</li>
</ul>
<ol start="2">
<li>인텔리제이 </li>
</ol>
<ul>
<li>캐시날리기 Invalidate Caches</li>
<li>경로 설정: Settings &gt; Build,E... &gt; Build Tools &gt; Gradle 
  에서 &quot;Gradle user home: 수정한 C:.gradle 바라보게 한다. </li>
</ul>
<p>그 외로 C:\Users\Ms Park\로 시작하는 경로는 사용하지않고 C드라이브로 바로 바라보게해노니 정상작동하였다. 🤗</p>
]]></description>
        </item>
    </channel>
</rss>