<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>도내 No.1 개발자 양자</title>
    <link>https://yangjaya.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 28 Jul 2026 13:03:08 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>양자양자</managingEditor>
    <item>
      <title>[Java] NPE를 관리 할 수 있는 Optional 클래스에 대하여</title>
      <link>https://yangjaya.tistory.com/entry/Java-NPE%EB%A5%BC-%EA%B4%80%EB%A6%AC-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-Optional-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Java.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eQ4k9w/btsGQ7xlcS0/3IxjKcwNJKpJfTQlogys2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eQ4k9w/btsGQ7xlcS0/3IxjKcwNJKpJfTQlogys2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eQ4k9w/btsGQ7xlcS0/3IxjKcwNJKpJfTQlogys2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeQ4k9w%2FbtsGQ7xlcS0%2F3IxjKcwNJKpJfTQlogys2k%2Fimg.png&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;600&quot; height=&quot;600&quot; data-filename=&quot;edited_Java.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;자바8의 핵심기능 중 하나인 Optional 클래스에 대하여 알아보자&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;기존에 NPE에 대한 소개를 했었는데 Optional을 사용하여 복잡한 조건 없이 오브젝트에 대한 null을 관리 할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #575757; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Optional&amp;lt;T&amp;gt; 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)기 때문이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #575757; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있으며 null을 관리 할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. Optional&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1-1. Optional 클래스에 진입하면 static에 EMPTY로 빈 객체를 생성, 공유 하고있다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1-2. T로 클래스를 래핑하여 빈 값에 대한 처리와 리턴을 하고 있다.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCchPK/btsGQ5TXhJj/QREu915TPl0gZNPv8w0tJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCchPK/btsGQ5TXhJj/QREu915TPl0gZNPv8w0tJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCchPK/btsGQ5TXhJj/QREu915TPl0gZNPv8w0tJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCchPK%2FbtsGQ5TXhJj%2FQREu915TPl0gZNPv8w0tJ1%2Fimg.png&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;700&quot; height=&quot;367&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;2. 활용&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2-1. Optional의 간단한 예제를 진행한다. 더 많은 함수 활용은 DOCS를 참고하자.&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1713855918911&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void test(){
	//ofNullable()함수로 NPE 가능성이 있는 함수를 생성하여 Optional에 담는다.
    Optional&amp;lt;String&amp;gt; optional = Optional.ofNullable(get값이있을수도없을수도());
    //값이 없다면 orElse로 일종의 null 처리가 가능하다.
    String id = optional.orElse(&quot;tempId&quot;);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2-2. Spring에서 많이 사용하는 JPA의 경우를 예로 들어보자.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4nMl0/btsGPqq5VFy/rvbzpYhkK1NAjvpat8u2m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4nMl0/btsGPqq5VFy/rvbzpYhkK1NAjvpat8u2m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4nMl0/btsGPqq5VFy/rvbzpYhkK1NAjvpat8u2m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4nMl0%2FbtsGPqq5VFy%2FrvbzpYhkK1NAjvpat8u2m0%2Fimg.png&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;616&quot; height=&quot;147&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1713856090402&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void test2(){
	//Entity객체를 JPA쿼리하면 리턴이 Entity가 아니라 Optional이다.
    Optional&amp;lt;Entity&amp;gt; optional = EntityRepository.findById(1L);
    //isPresent()함수로 null 여부를 확인한다. 쿼리 결과가 없기때문에 return;
    if(!optional.isPresent()){
      return;
    }
    //있다면 Entity로 반환한다.
    Entity ent = optional.get();
    ...
    ...
    ...
  }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;3. 한계&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3-1. null을 별도의 클래스에 맡기다니 너무 편리하고 파격적으로 느껴질 수 있지만. Optional에도 한계는 존재한다. 실제 위의 샘플 코드는 실무에서 저런식으로 작성되지 않으며 클린하지 못한 코드이다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3-2. Optional은 NPE발생 가능에 따라 리턴이 없음을 명확히 하기위헤 메소드의 반환 타입으로 사용되도록 매우 제한적이다. &lt;span style=&quot;color: #ee2323;&quot;&gt;첨부한 oracle-optional링크를 꼭 읽어보기 바란다.&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3-3. 한계의 예&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NPE는 회피 가능하지만 실제 값에 대한 보증은 하지 않기 때문에 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;NoSuchElementException 가능성&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;T를 포장한 래퍼 클래스기 때문에 메모리할당이 필요하고 Optional에서 한번더 접근해야하기 때문에 접근 비용이 발생한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;isPresent()같은 함수의 무분별한 사용을 하게되면 코드 가독성을 떨어트린다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. 결론&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;좋아 보이는 기능도 대충 구글링을 통해 함수나 찾아보고 무분별한 사용하기 이전에 DOCS를 참고하여 해당 클래스의 의도와 정확한 사용을 이해한 후에 반영해야. 좋은 기능을 100퍼센트 활용 할 수 있을것이다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;여러 뎁스의 if(null !=)에 대한 편의 제공이 되었을때 우리는 어떻게 사용할 것인가.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://www.oracle.com/technical-resources/articles/java/java8-optional.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.oracle.com/technical-resources/articles/java/java8-optional.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713856826237&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!&quot; data-og-description=&quot;Make your code more readable and protect it against null pointer exceptions. A wise man once said you are not a real Java programmer until you've dealt with a null pointer exception. Joking aside, the null reference is the source of many problems because i&quot; data-og-host=&quot;www.oracle.com&quot; data-og-source-url=&quot;https://www.oracle.com/technical-resources/articles/java/java8-optional.html&quot; data-og-url=&quot;https://www.oracle.com/technical-resources/articles/java/java8-optional.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.oracle.com/technical-resources/articles/java/java8-optional.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.oracle.com/technical-resources/articles/java/java8-optional.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Make your code more readable and protect it against null pointer exceptions. A wise man once said you are not a real Java programmer until you've dealt with a null pointer exception. Joking aside, the null reference is the source of many problems because i&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713854921036&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Optional (Java Platform SE 8 )&quot; data-og-description=&quot;A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orEl&quot; data-og-host=&quot;docs.oracle.com&quot; data-og-source-url=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&quot; data-og-url=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Optional (Java Platform SE 8 )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orEl&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713857414816&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] NPE(NullPointerException)에 대하여(String NPE)&quot; data-og-description=&quot;1. NPE 1-1. NPE는 null로 인하여 발생하는 Runtime Exception이다. 1-2. null 유발에 대한 고찰 개발하다 보면 객체의 null에 대한 가능성을 고려해야 하는 경우가 생긴다. 예제 코드로 이러한 경우를 확인하&quot; data-og-host=&quot;yangjaya.tistory.com&quot; data-og-source-url=&quot;https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE&quot; data-og-url=&quot;https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/phrIs/hyVVxTTFSO/uCz1JhbxPfGady56pZcYOK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/cY4UkJ/hyVS3z8sos/uu6TBPyUas9FCCz5PhsoO1/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/caWRrc/hyVVw8vZEE/aKAKagfGzA7hSqIzsnePA0/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600&quot;&gt;&lt;a href=&quot;https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/phrIs/hyVVxTTFSO/uCz1JhbxPfGady56pZcYOK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/cY4UkJ/hyVS3z8sos/uu6TBPyUas9FCCz5PhsoO1/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/caWRrc/hyVVw8vZEE/aKAKagfGzA7hSqIzsnePA0/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Java] NPE(NullPointerException)에 대하여(String NPE)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. NPE 1-1. NPE는 null로 인하여 발생하는 Runtime Exception이다. 1-2. null 유발에 대한 고찰 개발하다 보면 객체의 null에 대한 가능성을 고려해야 하는 경우가 생긴다. 예제 코드로 이러한 경우를 확인하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yangjaya.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java</category>
      <category>Java</category>
      <category>Java Optioanl</category>
      <category>java optional</category>
      <category>java8</category>
      <category>NPE</category>
      <category>null</category>
      <category>optional</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/18</guid>
      <comments>https://yangjaya.tistory.com/entry/Java-NPE%EB%A5%BC-%EA%B4%80%EB%A6%AC-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-Optional-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC#entry18comment</comments>
      <pubDate>Tue, 23 Apr 2024 16:35:55 +0900</pubDate>
    </item>
    <item>
      <title>[Etc] ActiveX의 대체재를 찾아라, node.js[child_process]</title>
      <link>https://yangjaya.tistory.com/entry/Etc-ActiveX%EC%9D%98-%EB%8C%80%EC%B2%B4%EC%9E%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EB%9D%BC-nodejschildprocess</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsAfKR/btsGRArLjYj/7qjJKssVMQkZIYtaurQVOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsAfKR/btsGRArLjYj/7qjJKssVMQkZIYtaurQVOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsAfKR/btsGRArLjYj/7qjJKssVMQkZIYtaurQVOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsAfKR%2FbtsGRArLjYj%2F7qjJKssVMQkZIYtaurQVOk%2Fimg.png&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;500&quot; height=&quot;500&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IE EOS 이슈와 함께 ActiveX의 사용도 당연히 못하게된 상황에서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존에 브라우저에서 클라이언트의 exe를 호출하던 기능을 못 사용하게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서버에서 클라이언트 PC의 제어는 당연히 불가능 했기 때문에 해결방법을 찾아야 했다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;1. 양자의 사고&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;1-1. 서버는 클라이언트PC를 제어를 하지 못한다.&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;1-2. 클라이언트 개발자로부터 웹 소켓을 사용한 SSO 연동 테스트 모듈을 제공할 때 node.js를 사용했다는 점&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;1-3. npm을 사용해 보면서 Node.js가 다양한 일을 할 수 있구나 정도의 생각을 가지고 있었음&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;1-4. 스크립트는 애초에 클라이언트 사이드 언어인데 Node.js가 exe 제어를 할 수 있다면 활용할 수 있지 않을까?&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;1-5. 실제 Node.js에는 exe를 실행 시켜줄 수 있는 기능이 존재하였다.&lt;/h3&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;2. 설계&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;2-1. 1차, 호출에 대한 구조&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWG9HW/btsGNZ1aOqn/UYExsVDea0nCmfZ75Nfpfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWG9HW/btsGNZ1aOqn/UYExsVDea0nCmfZ75Nfpfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWG9HW/btsGNZ1aOqn/UYExsVDea0nCmfZ75Nfpfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWG9HW%2FbtsGNZ1aOqn%2FUYExsVDea0nCmfZ75Nfpfk%2Fimg.png&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;796&quot; height=&quot;261&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;2-2. 2차, 실제 모듈 구조&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQTqC/btsGOdZjWIm/myUMuIktSuJSRWwd0Z9blK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQTqC/btsGOdZjWIm/myUMuIktSuJSRWwd0Z9blK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQTqC/btsGOdZjWIm/myUMuIktSuJSRWwd0Z9blK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQTqC%2FbtsGOdZjWIm%2FmyUMuIktSuJSRWwd0Z9blK%2Fimg.png&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;711&quot; height=&quot;323&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;3. 동작&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 클라이언트가 설치, 실행과 동시에 node.js로 로컬서버를 open한다.&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3-2. 웹 스크립트에서 이벤트가 발생하면 로컬서버를 호출한다.&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3-3. 로컬서버가 실행시켜줘.exe를 실행한다.&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;4. node.js의 활용&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4-1. npm&amp;nbsp;child_process&lt;/h3&gt;
&lt;pre id=&quot;code_1713836953164&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;//자바로 치면 라이브러리 import
const { spawn } = require('child_process');
//실행함수(실행할 exe, args)
spawn('note.exe', ['first arg']);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;5. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;본문 예제에서의 실행시켜줘.exe의 스팩은 알지 못하며 클라이언트의 영역이였기 때문에 메모장으로 간단한 예제 구현 까지 진행하였다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나는 클라이언트 제어를 위해 Node.js를 활용하였는데 Node.js가 &quot;확&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;장성 있는 네트워크 애플리케이션과 서버 사이드 개발에 사용되는 소프트웨어 플랫폼&quot; 이라는 위키를 보고 거꾸로 사용한건 아닌지 고민하며&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;node.js 고수의 답변을 기다려 본다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/child_process&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/package/child_process&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713836823069&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;child_process&quot; data-og-description=&quot;This package name is not currently in use, but was formerly occupied by another package. To avoid malicious use, npm is hanging on to the package name, but loosely, and we'll probably give it to you if you want it.. Latest version: 1.0.2, last published: 8&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/child_process&quot; data-og-url=&quot;https://www.npmjs.com/package/child_process&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cCJgqw/hyVVGQMMHY/EKx481gkjYmCnFY7Gvp2mK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/child_process&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/child_process&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cCJgqw/hyVVGQMMHY/EKx481gkjYmCnFY7Gvp2mK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;child_process&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This package name is not currently in use, but was formerly occupied by another package. To avoid malicious use, npm is hanging on to the package name, but loosely, and we'll probably give it to you if you want it.. Latest version: 1.0.2, last published: 8&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Etc</category>
      <category>ActiveX</category>
      <category>child_process</category>
      <category>It</category>
      <category>Java</category>
      <category>java8</category>
      <category>Node.js</category>
      <category>개발</category>
      <category>액티브x</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/17</guid>
      <comments>https://yangjaya.tistory.com/entry/Etc-ActiveX%EC%9D%98-%EB%8C%80%EC%B2%B4%EC%9E%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EB%9D%BC-nodejschildprocess#entry17comment</comments>
      <pubDate>Tue, 23 Apr 2024 10:50:43 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP] WEB개발에서 쿼리 스트링(Query String)과 폼 바디(Form-Body)의 차이</title>
      <link>https://yangjaya.tistory.com/entry/HTTP-WEB%EA%B0%9C%EB%B0%9C%EC%97%90%EC%84%9C-%EC%BF%BC%EB%A6%AC-%EC%8A%A4%ED%8A%B8%EB%A7%81Query-String%EA%B3%BC-%ED%8F%BC-%EB%B0%94%EB%94%94Form-Body%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEJqvz/btsA3y15lAp/vX8OOhWvJA1NZzk0oJBJn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEJqvz/btsA3y15lAp/vX8OOhWvJA1NZzk0oJBJn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEJqvz/btsA3y15lAp/vX8OOhWvJA1NZzk0oJBJn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEJqvz%2FbtsA3y15lAp%2FvX8OOhWvJA1NZzk0oJBJn1%2Fimg.png&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;600&quot; height=&quot;478&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;b&gt;이 포스팅으로 HTTP Method와 데이터의 형식에 대한 기본을 이해할 수 있기를 바란다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'HTTP', 'HTTP Method', 'GET', 'POST', 'Query String', 'form'&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.Query String&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. 정의 : URL을 사용하여 서버로 데이터를 보내는 방식&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. 사용 : 통상 GET 메서드와 사용된다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EX) &quot;https://api.example.com/search?query=제목+쿼리&amp;amp;page=1&quot;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3. 형식 : 키-값 구조 [?key1=value1&amp;amp;key2=value2]&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-4. 한계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL에 노출되기 때문에 보안 및 기밀성에 위배되지 않는 데이터만 사용한다.&lt;/li&gt;
&lt;li&gt;URL 문자열이기 때문에 많은 양의 데이터 처리에 부적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. form-body&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 정의 : &lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;HTTP request body에 요청 데이터를 전달 한다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;2-2. 사용 : 통상 POST 메서드와 사용된다.&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP Form&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1701221000578&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;https://api.example.com/user&quot; method=&quot;POST&quot;&amp;gt;
  &amp;lt;label for=&quot;username&quot;&amp;gt;Username:&amp;lt;/label&amp;gt;
  &amp;lt;input type=&quot;text&quot; id=&quot;username&quot; name=&quot;username&quot;&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;label for=&quot;password&quot;&amp;gt;Password:&amp;lt;/label&amp;gt;
  &amp;lt;input type=&quot;password&quot; id=&quot;password&quot; name=&quot;password&quot;&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;input type=&quot;submit&quot; value=&quot;Submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;2-3. 형식 : URL-Encoded or JSON&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL-Encoded&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1701221118637&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Content-Type: application/x-www-form-urlencoded

username=yangJa&amp;amp;password=yangJaPwd&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1701221168673&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Content-Type: application/json

{
  &quot;username&quot;: &quot;yangJa&quot;,
  &quot;password&quot;: &quot;yangJaPwd&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 장점 : 더 나은 보안을 제공 받을 수 있고 많은 양의 데이터 처리가 가능하다.&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP에 대한 심화나 RESTful API를 경험하였으면 HTTP Method나 데이터 처리에 대한 정확한 사용 및 고민을 해보게 된다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그에 앞서 클라이언트 서버간 웹통신을 하게 될 경우 데이터 양식 사용에 대한 기본과 간단한 예제를 확인하였다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/GET&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/GET&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701233256119&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;GET - HTTP | MDN&quot; data-og-description=&quot;HTTP GET 메서드는 특정한 리소스를 가져오도록 요청합니다. GET 요청은 데이터를 가져올 때만 사용해야 합니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/GET&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/GET&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/B6Avk/hyUE8IittI/ITGQTekvpOvTzd8rTkKl01/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/GET&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/GET&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/B6Avk/hyUE8IittI/ITGQTekvpOvTzd8rTkKl01/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GET - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP GET 메서드는 특정한 리소스를 가져오도록 요청합니다. GET 요청은 데이터를 가져올 때만 사용해야 합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701233271498&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;POST - HTTP | MDN&quot; data-og-description=&quot;HTTP POST 메서드는 서버로 데이터를 전송합니다. 요청 본문의 유형은 Content-Type 헤더로 나타냅니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8GPDU/hyUFcYfwm8/DNtYdu8gX52Y5J2Er8Yk31/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8GPDU/hyUFcYfwm8/DNtYdu8gX52Y5J2Er8Yk31/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;POST - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP POST 메서드는 서버로 데이터를 전송합니다. 요청 본문의 유형은 Content-Type 헤더로 나타냅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>HTTP</category>
      <category>Form</category>
      <category>form-body</category>
      <category>Get</category>
      <category>http</category>
      <category>http method</category>
      <category>post</category>
      <category>Querystring</category>
      <category>서버통신</category>
      <category>웹개발</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/16</guid>
      <comments>https://yangjaya.tistory.com/entry/HTTP-WEB%EA%B0%9C%EB%B0%9C%EC%97%90%EC%84%9C-%EC%BF%BC%EB%A6%AC-%EC%8A%A4%ED%8A%B8%EB%A7%81Query-String%EA%B3%BC-%ED%8F%BC-%EB%B0%94%EB%94%94Form-Body%EC%9D%98-%EC%B0%A8%EC%9D%B4#entry16comment</comments>
      <pubDate>Wed, 29 Nov 2023 10:35:21 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 자바 AtomicLong의 사용과 멀티 스레드</title>
      <link>https://yangjaya.tistory.com/entry/Java-%EC%9E%90%EB%B0%94-AtomicLong%EC%9D%98-%EC%82%AC%EC%9A%A9%EA%B3%BC-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Java.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKFnma/btsASSzpPXs/VwGkDSmnJEaMIIMp5p73o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKFnma/btsASSzpPXs/VwGkDSmnJEaMIIMp5p73o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKFnma/btsASSzpPXs/VwGkDSmnJEaMIIMp5p73o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKFnma%2FbtsASSzpPXs%2FVwGkDSmnJEaMIIMp5p73o0%2Fimg.png&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;600&quot; height=&quot;600&quot; data-filename=&quot;edited_Java.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;간단하게 표현하자면 멀티 스레드 환경에서 long을 리턴하는 API를 개발해야하는 경우가 있었다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AtomicLong은 Java의 Number클래스를 상속하고 있으며 long을 리턴하게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티 스레드 환경 메모리 참조를 하게 될경우 synchronized없이 Thread-safe한 활용을 확인해보자.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 멀티 스레드&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tb88y/btsASewfLHy/LlmLZdiLThsaijGMBdwcuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tb88y/btsASewfLHy/LlmLZdiLThsaijGMBdwcuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tb88y/btsASewfLHy/LlmLZdiLThsaijGMBdwcuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftb88y%2FbtsASewfLHy%2FLlmLZdiLThsaijGMBdwcuk%2Fimg.png&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;500&quot; height=&quot;500&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그림과 같이 멀티 스레드 환경에서 공통의 API를 호출 하고 서버는 메모리 참조하여 long을 리턴해야하 하는 케이스가 발생 하였다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700998414549&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//메모리에 long을 선언한다.
public static long rtn = 0L;
//API는 메모리 long을 +1 하여 리턴한다.
public long API(){
	return rtn++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이때 해당 함수와 같이 일반 long을 활용하여 리턴할 경우 같은 메모리 주소를 참조하여 1,2,3,4 리턴이 아닌 1,2,2,3 같이 동시성 문제를 야기 할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Atomic&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이때 Java의 Atomic 클래스는 synchronized보다 적은 비용으로 동시성을 보장한다.&lt;/span&gt;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3. 실습&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이번 실습은 Atomic 클래스 중 AtomicLong을 활용한다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-1. AtomicLong 생성 및 기본 값 세팅&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1700998780512&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//생성
AtomicLong aLong = new AtomicLong();
//값 세팅
aLong.set(1);
//값 가져오기
aLong.get();
//생성과 동시에 값 세팅
AtomicLong aLong2 = new AtomicLong(10);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 기본적인 더하기 빼기 및 리턴 함수 활용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #242729; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getAndIncrement() : 리턴 후 1증가&lt;/li&gt;
&lt;li&gt;incrementAndGet() : 1증가 후 리턴&lt;/li&gt;
&lt;li&gt;getAndDecrement() : 리턴 후 1감소&lt;/li&gt;
&lt;li&gt;decrementAndGet() : 1감소 후 리턴&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1700998983851&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AtomicLong aLong = new AtomicLong(1);
aLong.getAndIncrement();//rtn : 1, aLong : 2
aLong.incrementAndGet();//rtn : 3, aLong : 3
aLong.getAndDecrement();//rtn : 3, aLong : 2
aLong.decrementAndGet();//rtn : 1, aLong : 1&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;보통 API나 비즈니스 처리를 개발하다 보면 DB를 쿼리해서 유일 값을 리턴한다던가 메모리 참조한 리턴을 활용하는 경우가 많지는 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이럴 때 Atomic 클래스를 활용하면 자바의 고유 기능으로 별도의 처리 없이 효과적인 스레드 작업이 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.atomic.atomiclong?view=xamarin-android-sdk-13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.atomic.atomiclong?view=xamarin-android-sdk-13&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701045503238&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;AtomicLong 클래스 (Java.Util.Concurrent.Atomic)&quot; data-og-description=&quot;long 원자성으로 업데이트할 수 있는 값입니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.atomic.atomiclong?view=xamarin-android-sdk-13&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.atomic.atomiclong?view=xamarin-android-sdk-13&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ry0S5/hyUE7WuTjL/Qun97bgJjOD7VEnjJ1ULU1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.atomic.atomiclong?view=xamarin-android-sdk-13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.atomic.atomiclong?view=xamarin-android-sdk-13&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ry0S5/hyUE7WuTjL/Qun97bgJjOD7VEnjJ1ULU1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AtomicLong 클래스 (Java.Util.Concurrent.Atomic)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;long 원자성으로 업데이트할 수 있는 값입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java</category>
      <category>Atomic</category>
      <category>AtomicLong</category>
      <category>Java</category>
      <category>java8</category>
      <category>동시성</category>
      <category>멀티 스레드</category>
      <category>메모리</category>
      <category>메모리참조</category>
      <category>자바</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/15</guid>
      <comments>https://yangjaya.tistory.com/entry/Java-%EC%9E%90%EB%B0%94-AtomicLong%EC%9D%98-%EC%82%AC%EC%9A%A9%EA%B3%BC-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C#entry15comment</comments>
      <pubDate>Sun, 26 Nov 2023 20:50:41 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 자바 LocalDatetime, LocalDate, LocalTime 시간 API</title>
      <link>https://yangjaya.tistory.com/entry/Java%EC%9E%90%EB%B0%94-LocalDatetime-LocalDate-LocalTime-8%EB%B2%84%EC%A0%84%EC%9D%98-%EC%8B%9C%EA%B0%84-API</link>
      <description>&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_3.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PnrmS/btsASS7amlE/IUkIGYKUHtavVipSjBBdM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PnrmS/btsASS7amlE/IUkIGYKUHtavVipSjBBdM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PnrmS/btsASS7amlE/IUkIGYKUHtavVipSjBBdM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPnrmS%2FbtsASS7amlE%2FIUkIGYKUHtavVipSjBBdM1%2Fimg.png&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;573&quot; height=&quot;573&quot; data-filename=&quot;edited_3.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p 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;&lt;b&gt; Java 8은 날짜 및 시간 작업을 처리하기 위한 강력하고 유연한 API를 포함하는 패키지를 도입했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존의 날짜 관련 클래스의 단점을 많이 보완 가능한 유용한 API입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 포스팅에서는 &quot;LocalDateTime&quot; 위주의 실습과, API에 대해 자세히 알아보고, 기능을 살펴봅니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;java.time&quot;&amp;nbsp; &quot;LocalDate&quot; &quot;LocalTime&quot; &quot;LocalDateTime&quot;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. LocalDateTime&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LocalDateTime은 `java.time`패키지의 일부로 표준 시간대가 없는 날짜, 시간을 표현 할 수 있다.&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 실습&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. LocalDateTime 생성 및 값 가져오기&lt;/h3&gt;
&lt;pre id=&quot;code_1700975386336&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//현재 날짜와 시간을 나타내는 개체
LocalDateTime currentDateTime = LocalDateTime.now();
//특정날짜(현재 블로그 작성 시간)로 만드는 개체
LocalDateTime specificDateTime = LocalDateTime.of(2023, 11, 26, 14, 30);
//직관적인 함수명으로 쉽게 값들을 얻어올 수 있다.
int year = date.getYear(); // 년도
Month month = date.getMonth(); // 월
int day = date.getDayOfMonth(); // 일&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. LocalDateTime의 시간 변경&lt;/h3&gt;
&lt;pre id=&quot;code_1700975507769&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//현재+7일+3시간
LocalDateTime futureDateTime = currentDateTime.plusDays(7).plusHours(3);
//현재-3개월-15분
LocalDateTime pastDateTime = currentDateTime.minusMonths(3).minusMinutes(15);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. LocalDateTime의 포맷 변경 및 데이터 파싱&lt;/h3&gt;
&lt;pre id=&quot;code_1700975682830&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//yyyy-MM-dd HH:mm:ss형식의 포맷을 생성한다.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm:ss&quot;);
//현재 시간을 포매팅한 문자열을 생성한다.
String formattedDateTime = currentDateTime.format(formatter);
//특정 날짜 문자열을 포매터를 사용하여 LocalDateTime으로 파싱한다.
LocalDateTime parsedDateTime = LocalDateTime.parse(&quot;2023-11-26 14:30:00&quot;, formatter);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;개발자라면 유창한 영어 실력이 아니더라도 알 수 있을 정도의 쉬운 함수들로 실습을 해보았다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이처럼 Java 8버전 이상의 패키지에서 날짜 및 시간 구성 요소를 다루기 쉽게 복잡도를 낮추었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;'java.time'패키지를 조금만 이해한다면 유연하고 간단한 날짜 처리 및 VO, Entity 등 데이터 오브젝트를 설계할 때 많은 도움을 얻을 수 있다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Java</category>
      <category>Java</category>
      <category>java.time</category>
      <category>java8</category>
      <category>LocalDate</category>
      <category>LocalDateTime</category>
      <category>localtime</category>
      <category>자바</category>
      <category>자바8</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/14</guid>
      <comments>https://yangjaya.tistory.com/entry/Java%EC%9E%90%EB%B0%94-LocalDatetime-LocalDate-LocalTime-8%EB%B2%84%EC%A0%84%EC%9D%98-%EC%8B%9C%EA%B0%84-API#entry14comment</comments>
      <pubDate>Sun, 26 Nov 2023 14:21:54 +0900</pubDate>
    </item>
    <item>
      <title>[Java] NPE(NullPointerException)에 대하여(String NPE)</title>
      <link>https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4Wz8/btsAZ83lQ0U/K9VH3TeqSGtPzcryhTkHx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4Wz8/btsAZ83lQ0U/K9VH3TeqSGtPzcryhTkHx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4Wz8/btsAZ83lQ0U/K9VH3TeqSGtPzcryhTkHx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4Wz8%2FbtsAZ83lQ0U%2FK9VH3TeqSGtPzcryhTkHx1%2Fimg.png&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;600&quot; height=&quot;600&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. NPE&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. NPE는 null로 인하여 발생하는 Runtime Exception이다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. null 유발에 대한 고찰&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개발하다 보면 객체의 null에 대한 가능성을 고려해야 하는 경우가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예제 코드로 이러한 경우를 확인하고 해결 방법을 생각해 보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null의 발생 경우는 매우 광범위 하고 전부를 다룰 수 없기 때문에 이번 실습은 String 위주로 진행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. NPE 유발&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열 이나 오브젝트 등에서 null의 가능성을 배제한 함수 호출을 한다.&lt;/li&gt;
&lt;li&gt;null에는 toString()이라는 함수가 존재하지 않으며 NPE를 유발한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695969020118&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Case.1
String[] arrStr = new String[2];
arrStr[0] = &quot;arr1&quot;;
arrStr[1].toString(); //null.toString();

//Case.2
Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;();
map.put(&quot;id&quot;, &quot;admin&quot;);
map.put(&quot;pwd&quot;, null);
map.get(&quot;pwd&quot;); //null.toString();
map.get(&quot;name&quot;); //null.toString();

//Case.3
public Object getObj(){
	Object obj = null;
	return obj;
}
Object obj = getObj();
obj.toString(); //null.toString();&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. NPE 예방&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null 가능성을 배제할 수 있는 구조를 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695969792795&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//obj에 null의 가능성이 존재
//Case.1 : null.equals() NPE 유발 가능성 발생
if(obj.toString().equals(&quot;str&quot;)){
	return false;
}
//Case.2 : &quot;str&quot;은 문자열로 equals() 함수 사용이 가능
//obj.toString()에 NPE가능성이 존재하지만 equals()의 NPE 배제의 예제
if(&quot;str&quot;.equals(obj.toString())){
	return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null을 피할 수 있는 함수의 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695970148552&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;obj.String(); //null.toString();
//null처리된 String객체의 함수 활용하여 위 Case.2의 문제를 해결
if(&quot;str&quot;.equals(String.valueOf(obj))){
	return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;try-catch의 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exception(예외)는 에러가 아니다. NPE의 발생을 로그나 메시지처리로 핸들링해 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1695970333517&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try{
	obj.toString();
} catch(NullPointerException npe){
	&quot;NPE예외를 핸들링 해보자&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.결론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. String외에도 배열, File 등 객체를 생성할 때 모종의 이유로 null인 상태에서 함수 사용 등 참조하면 NPE를 발생시킬 수 있다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. NPE의 예방은 null을 피하기 위한 노력, 코딩 습관이라고도 할 수 있으니 예제 외에도 NPE를 피할 방법을 계속해서 고민하자.&lt;/h3&gt;</description>
      <category>Java</category>
      <category>Java</category>
      <category>NPE</category>
      <category>null</category>
      <category>NullPointerException</category>
      <category>NULL처리</category>
      <category>예외처리</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/13</guid>
      <comments>https://yangjaya.tistory.com/entry/Java-NPENullPointerException%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACString-NPE#entry13comment</comments>
      <pubDate>Fri, 29 Sep 2023 16:06:39 +0900</pubDate>
    </item>
    <item>
      <title>[Java]Map(HashMap)의 전체 데이터를 출력하는 방법</title>
      <link>https://yangjaya.tistory.com/entry/JavaMap%EC%9D%98-%EC%A0%84%EC%B2%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Map.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qqahY/btszDBkl7yq/q6Eh8e8RODyh2FI20kaDlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qqahY/btszDBkl7yq/q6Eh8e8RODyh2FI20kaDlk/img.png&quot; data-alt=&quot;Map&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qqahY/btszDBkl7yq/q6Eh8e8RODyh2FI20kaDlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqqahY%2FbtszDBkl7yq%2Fq6Eh8e8RODyh2FI20kaDlk%2Fimg.png&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;588&quot; height=&quot;588&quot; data-filename=&quot;edited_Map.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Map&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Map은 key-value 방식을 사용하여 대응관계를 쉽게 표현 할 수 있는 자료형이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Map은&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt; 리스트나 배열처럼 순차적으로(sequential) 요솟값을 구하지 않고 키(key)를 이용해 값(value)을 얻는다&lt;/span&gt;.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Map은 배열처럼 순차적인 데이터 처리를 하지 않고 순서를 유지하지 않는다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB의 pk같이 key는 중복을 허용하지 않지만 value는 중복이 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. HashMap으로 생성한 Map의 모든 값을 출력.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. 여러가지 함수를 사용하여 실습.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;entrySet()&lt;/li&gt;
&lt;li&gt;keySet(), get()&lt;/li&gt;
&lt;li&gt;values()&lt;/li&gt;
&lt;li&gt;forEach() ※Java 8버전 이상 사용가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 실습&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 비즈니스 처리에 사용될 Map&lt;/h3&gt;
&lt;pre id=&quot;code_1695962600205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;Integer, String&amp;gt; map = new HashMap&amp;lt;Integer, String&amp;gt;();
map.put(1, &quot;val1&quot;);
map.put(2, &quot;val2&quot;);	
map.put(3, &quot;val3&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. entrySet()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;entrySet() 함수로 Entry를 리턴 받아 getkey(), getValue() 함수를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1695962762238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (Entry&amp;lt;Integer, String&amp;gt; entrySet : map.entrySet()) {	
	System.out.println(&quot;key=&quot;entrySet.getKey() + &quot; :: value=&quot; + entrySet.getValue());	
}

// result
// key=1 :: value=val1
// key=2 :: value=val2
// key=3 :: value=val3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. keySet(), get()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keySet() 함수로 모든 키를 Set으로 리턴받아 Map에서 get()으로 찾는다.&lt;/p&gt;
&lt;pre id=&quot;code_1695963024377&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (Integer key : map.keySet()) {	
	System.out.println(&quot;key=&quot;key + &quot; :: value=&quot; + map.get(key));	
}

// result
// key=1 :: value=val1
// key=2 :: value=val2
// key=3 :: value=val3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. values()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;value만 필요한 경우 values() 함수로 Collection을 리턴 받는다.&lt;/p&gt;
&lt;pre id=&quot;code_1695963253006&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Collection&amp;lt;String&amp;gt; values = map.values();
System.out.println(values);

// result
// [val1,val2,val3]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-5. forEach()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map을 순차 탐색하여 key, value를 받는다. 람다 활용&lt;/p&gt;
&lt;pre id=&quot;code_1695963360909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;map.forEach((key, value) -&amp;gt; {	
	System.out.println(&quot;key=&quot;key + &quot; :: value=&quot; + map.get(key));	
});

// result
// key=1 :: value=val1
// key=2 :: value=val2
// key=3 :: value=val3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정형화된 class의 매개변수나 리턴값은 내용을 유추할 수 있으나 Map은 그렇지 못한 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이럴 때 Map의 전체 데이터를 출력해 보자&lt;/p&gt;</description>
      <category>Java</category>
      <category>HashMap</category>
      <category>Java</category>
      <category>MAP</category>
      <category>개발</category>
      <category>맵</category>
      <category>자바</category>
      <category>해쉬맵</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/12</guid>
      <comments>https://yangjaya.tistory.com/entry/JavaMap%EC%9D%98-%EC%A0%84%EC%B2%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry12comment</comments>
      <pubDate>Fri, 29 Sep 2023 14:02:03 +0900</pubDate>
    </item>
    <item>
      <title>[Java]자바 스트림(Stream API)과 for 그리고 배열(Array) 처리</title>
      <link>https://yangjaya.tistory.com/entry/Java%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%8A%B8%EB%A6%BCStream-API%EA%B3%BC-for-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%B0%B0%EC%97%B4Array-%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Stream &amp;amp;amp;amp;amp;amp;amp; Array.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I40sC/btsAThsefTc/a9k6j4fUlbkhfS0bzdncr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I40sC/btsAThsefTc/a9k6j4fUlbkhfS0bzdncr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I40sC/btsAThsefTc/a9k6j4fUlbkhfS0bzdncr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI40sC%2FbtsAThsefTc%2Fa9k6j4fUlbkhfS0bzdncr1%2Fimg.png&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;668&quot; height=&quot;668&quot; data-filename=&quot;edited_Stream &amp;amp;amp;amp;amp;amp; Array.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자바 Stream API는 배열 또는 컬렉션 인스턴스에 함수를 조합하여 필터링, 가공 등을 통하여 결과를 얻을 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한 람다를 사용하여 가독성 증가 및 간결하게 표현 가능하다. for 또는 foreach가 아닌 함수형 처리가 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. 자바 8 이후 Stream API를 통한 배열처리가 가능하다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. 실습과 예제 코드로 배열의 처리 방법을 비교해보자.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 요구사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 사용자별 등급(Grade), 비용(Cost) 존재&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 사용자 배열을 등급에 따라 비용에 할인을 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 실습&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 비즈니스 처리에 사용될 클래스&lt;/h3&gt;
&lt;pre id=&quot;code_1695881793195&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@Setter
public class Member {
    private Long id;
    private String name;
    private Grade grade;
    private int cost;

    public Member(Long id, String name, Grade grade, int cost) {
        this.id = id;
        this.name = name;
        this.grade = grade;
        this.cost = cost;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1695882484579&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public enum Grade {
    BASIC
    , VIP
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1695994330579&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Member&amp;gt; memberList = new ArrayList&amp;lt;&amp;gt;();
memberList.add(new Member(1L,&quot;memberBASIC&quot;, Grade.BASIC, 15000));
memberList.add(new Member(2L,&quot;memberVIP&quot;, Grade.VIP, 15000));&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3-2. for을 사용&lt;/h3&gt;
&lt;pre id=&quot;code_1695882605870&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        for (int i = 0; i &amp;lt; memberList.size(); i++) {
            Member member = memberList.get(i);
            if(Grade.VIP.equals(member.getGrade())){
                member.setCost((int) (member.getCost()*0.5));
                memberList.set(i,member);
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. stream을 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용한 함수보다 더 많은 stream 함수가 있으니 API 문서를 참고하여 활용해 보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695883350964&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        memberList.stream()
                .filter(m-&amp;gt;Grade.VIP.equals(m.getGrade()))
                .forEach(m-&amp;gt;m.setCost((int) (m.getCost()*0.5)));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 결론&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4-1. for의 강점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;for문은 단순 인덱스 기반&lt;/li&gt;
&lt;li&gt;stream보다 빠르고 오버헤드 발생이 없다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. stream의 강점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stream의 제공 함수들의 활용으로 가독성이 좋아진다.&lt;/li&gt;
&lt;li&gt;함수형 프로그램으로 전환이 용이하다.&lt;/li&gt;
&lt;li&gt;코딩 스타일의 일관성을 가질수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. 생각&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개발하다 보면 뭐가 정답이라는게 모호한 경우가 많다.이럴 때 가장 보편적인 선택 방법은 장점이 단점보다 강세일 때라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그냥 사용하고 마는 것이 아닌 각 클래스 및 함수를 타고 들어가 기능과 정의를 확인하고 상황에 맞는 개발을 할 수 있도록 노력하자.&lt;/p&gt;</description>
      <category>Java</category>
      <category>array</category>
      <category>For</category>
      <category>Java</category>
      <category>JAVA 1.8</category>
      <category>list</category>
      <category>Stream</category>
      <category>배열</category>
      <category>스트림</category>
      <category>자바</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/11</guid>
      <comments>https://yangjaya.tistory.com/entry/Java%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%8A%B8%EB%A6%BCStream-API%EA%B3%BC-for-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%B0%B0%EC%97%B4Array-%EC%B2%98%EB%A6%AC#entry11comment</comments>
      <pubDate>Thu, 28 Sep 2023 15:59:45 +0900</pubDate>
    </item>
    <item>
      <title>YANGJA</title>
      <link>https://yangjaya.tistory.com/pages/YANGJA</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프로필&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이름 : 양진영&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;생년월일 : 91.09.19&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 자기소개&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 경력 : 23년 9월 기준 3년차 주니어 개발자&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 주력 기술&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BE-TECH : &lt;b&gt;Java&lt;/b&gt;, &lt;b&gt;Spring Boot&lt;/b&gt;, Spring, JPA, jsp&lt;/li&gt;
&lt;li&gt;FE-TECH : Javascript, html, jquery&lt;/li&gt;
&lt;li&gt;DB-TECH : &lt;b&gt;MSSQL, &lt;/b&gt;mysql&lt;/li&gt;
&lt;li&gt;ETC : &lt;b&gt;Window Server, Tomcat,&lt;/b&gt; SVN, Git(Bitbucket), Jenkins, Jira&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 경험 직무&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 솔루션 회사에서 주로 클라이언트 제품 제어를 위한 웹, API, 서블릿, 정책 결재 서버 등을 개발/유지보수&lt;/li&gt;
&lt;li&gt;대부분 윈도우 서버(OS), 자바(언어), Tomcat(WAS), 스프링부트(Frame Work)의 환경에서 개발&lt;/li&gt;
&lt;li&gt;리눅스나 MYSQL 등 기타 환경에 대하여는 고객사 환경에 따라 접해본 정도의 경험&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 경험 기술&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Spring Boot, jsp 기반 웹 서비스&lt;/li&gt;
&lt;li&gt;HttpServlet, API 등 데이터 처리 서비스&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-5. 소개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;안녕하십니까. 더 나은 개발자가 되기 위해 고민이 많은 시기의 주니어 &lt;/span&gt;개발자입니다&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;.&lt;/span&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;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;계기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3년 차&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; 자바 개발자로 동작만 하는 개발 혹은 구글이 알려주는 코드가 아닌 자기 주도적인 개발을 위해 블로그를 시작하였습니다.&lt;/span&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;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;목표&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;같은 내용의 개발이라도 지식의 깊이 혹은 &lt;/span&gt;활용할&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; 수 있는 범위의 차이를 벌릴 수 있는 개발자가 &lt;/span&gt;되는 것을&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; 목표로 학습하며 내용을 공유하려 합니다.&lt;/span&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;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;마치며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;잘못된 내용이 있을 수 있기 때문에 언제나 피드백은 환영하며 서로에게 도움이 되면 좋겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;감사합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/pages/YANGJA</guid>
      <pubDate>Wed, 27 Sep 2023 15:59:25 +0900</pubDate>
    </item>
    <item>
      <title>자바 8 Version(1.8) 정리</title>
      <link>https://yangjaya.tistory.com/entry/JAVA%EC%9E%90%EB%B0%94-8-Version18-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. 자바의 많은 버전 중 무료, 가장 많이 사용되는 버전&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;23년 9월 Java SE 21버전까지 출시 되었지만 가장 많이 사용하는 버전으로 8버전을 꼽는다.&lt;/li&gt;
&lt;li&gt;자바 공화국으로 불리는 대한민국 실무에서 실제 8버전 환경에서의 개발을 많이 접한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. LTS(Long Term Support) 버전&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오랜 기간 버그 픽스 등 패치를 지원하는 버전을 말한다.&lt;/li&gt;
&lt;li&gt;때문에 해당 버전으로 개발 후 오랜기간 자바 버전 패치 없이 지원이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. JAVA 8 의 핵심 기능 및 특징&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 8버전 자바에는 다음과 같은 핵심 기술과 특징이 포함된다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하기 내용은 자바 8버전의 핵심 기술로 예제와 함께 개별 단위로 익히도록 하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span&gt;Lambda&amp;nbsp;expression(람다 표현식)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Functional interface(함수형 인터페이스)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Default method(디폴트 메서드)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Stream(스트림)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Optional(옵셔널)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;새롭게 추가된 날짜 및 시간 API&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;CompletableFuture(컴플리터블&amp;nbsp;퓨처)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;JVM의 변화&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;Base64 Encode/ Decode를 위한 표준 API&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 마치며&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Oracle에서 제공하는 Java(Jdk) 8버전은 202 마이너 버전까지가 무상이다.&lt;/li&gt;
&lt;li&gt;오라클 자바 다운로드 링크 및 설치 가이드를 참고하여 자바를 설치해보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html&quot;&gt;Java Archive Downloads - Java SE 8 (oracle.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695796679561&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Java Archive Downloads - Java SE 8&quot; data-og-description=&quot;We&amp;rsquo;re sorry. We could not find a match for your search. We suggest you try the following to help find what you&amp;rsquo;re looking for: Check the spelling of your keyword search. Use synonyms for the keyword you typed, for example, try &amp;quot;application&amp;quot; instead of &quot; data-og-host=&quot;www.oracle.com&quot; data-og-source-url=&quot;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html&quot; data-og-url=&quot;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Java Archive Downloads - Java SE 8&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We&amp;rsquo;re sorry. We could not find a match for your search. We suggest you try the following to help find what you&amp;rsquo;re looking for: Check the spelling of your keyword search. Use synonyms for the keyword you typed, for example, try &quot;application&quot; instead of&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yangjaya.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%9E%90%EB%B0%94java%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.09.26 - [IT] - 윈도우 자바(java)설치 및 환경 변수 설정 가이드&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695796666907&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;윈도우 자바(java)설치 및 환경 변수 설정 가이드&quot; data-og-description=&quot;개발 혹은 서버 환경 구축을 위한 자바설치 가이드 오라클 무료버전 자바 설치 (1.8.202) 1. 자바 설치 가이드 https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html 오라클 1.8.202버전 jdk를 &quot; data-og-host=&quot;yangjaya.tistory.com&quot; data-og-source-url=&quot;https://yangjaya.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%9E%90%EB%B0%94java%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; data-og-url=&quot;https://yangjaya.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%9E%90%EB%B0%94java%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hfBXU/hyT2u6tYHm/AigemeXwOOMMf4przxtQDk/img.png?width=521&amp;amp;height=404&amp;amp;face=0_0_521_404,https://scrap.kakaocdn.net/dn/zBglR/hyT2E2jhsB/kZigoy6CcvPXorRmJKFov1/img.png?width=521&amp;amp;height=404&amp;amp;face=0_0_521_404,https://scrap.kakaocdn.net/dn/djohjk/hyT2wQMPLq/dNKaIjAw8bmrrw9rdDHaEK/img.png?width=617&amp;amp;height=589&amp;amp;face=0_0_617_589&quot;&gt;&lt;a href=&quot;https://yangjaya.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%9E%90%EB%B0%94java%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yangjaya.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%9E%90%EB%B0%94java%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hfBXU/hyT2u6tYHm/AigemeXwOOMMf4przxtQDk/img.png?width=521&amp;amp;height=404&amp;amp;face=0_0_521_404,https://scrap.kakaocdn.net/dn/zBglR/hyT2E2jhsB/kZigoy6CcvPXorRmJKFov1/img.png?width=521&amp;amp;height=404&amp;amp;face=0_0_521_404,https://scrap.kakaocdn.net/dn/djohjk/hyT2wQMPLq/dNKaIjAw8bmrrw9rdDHaEK/img.png?width=617&amp;amp;height=589&amp;amp;face=0_0_617_589');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;윈도우 자바(java)설치 및 환경 변수 설정 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발 혹은 서버 환경 구축을 위한 자바설치 가이드 오라클 무료버전 자바 설치 (1.8.202) 1. 자바 설치 가이드 https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html 오라클 1.8.202버전 jdk를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yangjaya.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java</category>
      <category>1.8</category>
      <category>1.8.202</category>
      <category>Java</category>
      <category>java1.8</category>
      <category>jdk</category>
      <category>jre</category>
      <category>Oracle</category>
      <category>오라클</category>
      <category>자바</category>
      <author>양자양자</author>
      <guid isPermaLink="true">https://yangjaya.tistory.com/7</guid>
      <comments>https://yangjaya.tistory.com/entry/JAVA%EC%9E%90%EB%B0%94-8-Version18-%EC%A0%95%EB%A6%AC#entry7comment</comments>
      <pubDate>Wed, 27 Sep 2023 15:47:43 +0900</pubDate>
    </item>
  </channel>
</rss>