<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>yoursyun</title>
    <link>https://yoursyun.tistory.com/</link>
    <description>가끔씩 쓰는 개발메모</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 15:45:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yoursyun</managingEditor>
    <image>
      <title>yoursyun</title>
      <url>https://tistory1.daumcdn.net/tistory/241765/attach/02f17426ae2f47dfa37a7a7db047bfba</url>
      <link>https://yoursyun.tistory.com</link>
    </image>
    <item>
      <title>nginx - centos9, redis - centos9, springboot3 - windows session clustering</title>
      <link>https://yoursyun.tistory.com/entry/nginx-centos9-redis-centos9-springboot3-windows-session-clustering</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. nginx, redis install in centos 9&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bash&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; dnf update -y &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; dnf install -y nginx &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; systemctl start nginx &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; systemctl enable nginx &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; firewall-cmd --permanent --add-service=http &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; firewall-cmd --permanent --add-service=https&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;dnf&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;redis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;systemctl&amp;nbsp;start&amp;nbsp;redis &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;systemctl enable redis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;firewall-cmd&amp;nbsp;--permanent&amp;nbsp;--add-port=6379/tcp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;firewall-cmd --reload&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;# sulinux가 활성화 되어 있다면 외부 host 와 통신이 안된다.&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;bash&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;setsebool -P httpd_can_network_connect 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;setsebool -P redis_enable_networking on&lt;/p&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. nginx setting ( bash vi /etc/nginx/nginx.conf )&lt;/h2&gt;
&lt;pre id=&quot;code_1741148801913&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http {
    upstream myapp1 {
        server 톰캣서버주소1:포트;
        server 톰캣서버주소2:포트;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bash&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; systemctl restart nginx&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. redis setting ( bash : vi /etc/redis/redis.conf )&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 기본 local 에서만 접근이 가능하도록 구성되어 있으므로, 이를 수정하여 특정 아이피가 접근가능하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bind 127.0.0.1 -::1&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 아래와 같이 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bind 127.0.0.1 111.111.111.111 (was 서버아이피)&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;bash&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;systemctl restart redis&lt;/p&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. SpringBoot setting&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle&lt;/p&gt;
&lt;pre class=&quot;clean&quot; style=&quot;background-color: #ffffe6; color: #000000;&quot;&gt;&lt;code&gt;// redis
implementation 'org.springframework.session:spring-session-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yml&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffe6; color: #000000;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;spring:
  data:
    redis:
      host: 레디스서버아이피
      port: 6379&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedisConfig.java&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffe6; color: #000000;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession // 세션을 Redis에 저장
public class RedisConfig {

    @Value(&quot;${spring.data.redis.host}&quot;)
    private String host;

    @Value(&quot;${spring.data.redis.port}&quot;)
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);
        return new LettuceConnectionFactory(config);
    }

    @Bean
    public RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate&amp;lt;String, Object&amp;gt; template = new RedisTemplate&amp;lt;&amp;gt;();
        template.setConnectionFactory(connectionFactory);

        return template;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User Repository 는 직렬화가 가능하도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private static final long serialVersionUID = 1L; 선언을 반드시 추가 한다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffe6; color: #000000;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

@Getter
@Setter
public class myMember implements Serializable {
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;    
}&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 호스트에서 레디스가 접근 거부 오류 발생시 아래 명령어를 통해 테스트 할수 있다. ( 6379 : 기본 포트 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis-cli download url ( for windows ) &lt;a href=&quot;https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100&lt;/a&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;bash&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis-cli -h 레디스서버아이피 -p 6379 ping&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PONG&lt;/p&gt;</description>
      <category>program/spring</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/199</guid>
      <comments>https://yoursyun.tistory.com/entry/nginx-centos9-redis-centos9-springboot3-windows-session-clustering#entry199comment</comments>
      <pubDate>Wed, 5 Mar 2025 13:56:44 +0900</pubDate>
    </item>
    <item>
      <title>To receive JSON with @RequestBody annotation, you must process Json.Stringfy.</title>
      <link>https://yoursyun.tistory.com/entry/To-receive-JSON-with-RequestBody-annotation-you-must-process-JsonStringfy</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;To&amp;nbsp;receive&amp;nbsp;JSON&amp;nbsp;with&amp;nbsp;@RequestBody&amp;nbsp;annotation,&amp;nbsp;you&amp;nbsp;must&amp;nbsp;process&amp;nbsp;Json.Stringfy.&lt;br /&gt;&lt;br /&gt;Create Javascript Object&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var jsonData = { name: &quot;John&quot;, age: &quot;19&quot; };&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;To Json.Stringfy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var jsonData = { &quot;name&quot;: &quot;John&quot;, &quot;age&quot;: &quot;19&quot; }; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>program/spring</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/198</guid>
      <comments>https://yoursyun.tistory.com/entry/To-receive-JSON-with-RequestBody-annotation-you-must-process-JsonStringfy#entry198comment</comments>
      <pubDate>Fri, 16 Aug 2024 13:43:04 +0900</pubDate>
    </item>
    <item>
      <title>StringBuilder 문자열 합치기</title>
      <link>https://yoursyun.tistory.com/entry/StringBuilder-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%95%A9%EC%B9%98%EA%B8%B0</link>
      <description>&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffe6; color: #080808;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// procedure processed comma separate
StringBuilder cd_items = new StringBuilder();
StringBuilder qtys = new StringBuilder();

for( Map.Entry&amp;lt;String, Object&amp;gt; entry : ((Map&amp;lt;String, Object&amp;gt;)formData.get(&quot;orderL&quot;)).entrySet() ){
   cd_items.append(&quot;,&quot;).append(entry.getKey());
   qtys.append(&quot;,&quot;).append(entry.getValue().toString());
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>environment/java</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/197</guid>
      <comments>https://yoursyun.tistory.com/entry/StringBuilder-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%95%A9%EC%B9%98%EA%B8%B0#entry197comment</comments>
      <pubDate>Tue, 16 Jul 2024 17:31:51 +0900</pubDate>
    </item>
    <item>
      <title>Map, HashMap</title>
      <link>https://yoursyun.tistory.com/entry/Map-HashMap</link>
      <description>&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&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;저장된 순서를 보장하려면 LinkedHashMap 을 이용 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;&lt;b&gt;Map&lt;/b&gt;&lt;/span&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;Map은 인터페이스입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 인터페이스는 키-값 쌍을 저장하는 모든 클래스가 구현해야 하는 메서드를 정의합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;주요 메서드로는 put(), get(), remove(), containsKey(), containsValue(), size() 등이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; HashMap, TreeMap, LinkedHashMap, ConcurrentHashMap &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;HashMap&lt;/b&gt;&lt;/span&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;HashMap은 Map 인터페이스를 구현한 구체적인 클래스입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해시 테이블을 사용하여 데이터를 저장하므로 빠른 검색 속도를 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;키와 값으로 null을 허용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>environment/java</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/196</guid>
      <comments>https://yoursyun.tistory.com/entry/Map-HashMap#entry196comment</comments>
      <pubDate>Fri, 5 Jul 2024 11:09:14 +0900</pubDate>
    </item>
    <item>
      <title>Jquery tag loop 를 돌면서 배열값 입력하기 ( foreach )</title>
      <link>https://yoursyun.tistory.com/entry/Jquery-tag-loop-%EB%A5%BC-%EB%8F%8C%EB%A9%B4%EC%84%9C-%EB%B0%B0%EC%97%B4%EA%B0%92-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0-foreach</link>
      <description>&lt;pre id=&quot;code_1720086294450&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const spans = $(&quot;#mytable span&quot;);
const values = Object.values(data);
spans.each(function(index) {
    if (index &amp;lt; values.length) {
        $(this).text(values[index]);
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1720086364710&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;table id=&quot;mytable&quot;&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>program/javascript</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/195</guid>
      <comments>https://yoursyun.tistory.com/entry/Jquery-tag-loop-%EB%A5%BC-%EB%8F%8C%EB%A9%B4%EC%84%9C-%EB%B0%B0%EC%97%B4%EA%B0%92-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0-foreach#entry195comment</comments>
      <pubDate>Thu, 4 Jul 2024 18:46:12 +0900</pubDate>
    </item>
    <item>
      <title>form array to json ( 폼 배열을 json 객체로 변환 )</title>
      <link>https://yoursyun.tistory.com/entry/form-array-to-json-%ED%8F%BC-%EB%B0%B0%EC%97%B4%EC%9D%84-json-%EA%B0%9D%EC%B2%B4%EB%A1%9C-%EB%B3%80%ED%99%98</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720059714640&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 id=&quot;hello&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;cd_item&quot; value=&quot;1111&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;qty&quot; value=&quot;1&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;remark&quot; value=&quot;g1&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;cd_item&quot; value=&quot;1112&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;qty&quot; value=&quot;2&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;remark&quot; value=&quot;g2&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;cd_item&quot; value=&quot;1113&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;qty&quot; value=&quot;3&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;remark&quot; value=&quot;g3&quot; /&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffe6; color: #080808;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;var formArray = $('#hello').serializeArray();
var formData = [];

for (var i = 0; i &amp;lt; formArray.length; i += 3) {
    var cd_item = formArray[i].value;
    var qty = formArray[i + 1].value;
    var remark = formArray[i + 2].value;

    if (qty &amp;gt; 0) {
        formData.push({
            cd_item: cd_item,
            qty: qty,
            remark: remark
        });
    }
}

var jsonData = JSON.stringify(formData);
console.log(jsonData);

const jsonObject = JSON.parse(jsonData);

jsonObject.forEach(function(item) {
    console.log(&quot;cd_item:&quot;, item.cd_item);
    console.log(&quot;qty:&quot;, item.qty);
    console.log(&quot;remark:&quot;, item.remark);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>program/javascript</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/194</guid>
      <comments>https://yoursyun.tistory.com/entry/form-array-to-json-%ED%8F%BC-%EB%B0%B0%EC%97%B4%EC%9D%84-json-%EA%B0%9D%EC%B2%B4%EB%A1%9C-%EB%B3%80%ED%99%98#entry194comment</comments>
      <pubDate>Wed, 26 Jun 2024 18:00:18 +0900</pubDate>
    </item>
    <item>
      <title>Ajax 요청 종료시 까지 동기화 처리</title>
      <link>https://yoursyun.tistory.com/entry/Ajax-%EC%9A%94%EC%B2%AD-%EC%A2%85%EB%A3%8C%EC%8B%9C-%EA%B9%8C%EC%A7%80-%EB%8F%99%EA%B8%B0%ED%99%94-%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;* $(&quot;#btn-search&quot;) 클릭을 하면 &quot;console.log(orderList.rData);&quot; 빈값이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;class&amp;nbsp;ClsDataTable&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;constructor&amp;nbsp;()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.rData&amp;nbsp;=&amp;nbsp;&quot;&quot;; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;async&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; ListItems(dataAttribute)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; await $.ajax({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;&quot;/hello&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;'get', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentType:&amp;nbsp;&quot;application/json;&amp;nbsp;charset=UTF-8&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;$(&quot;#sch-frm&quot;).serializeArray(), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;(data)&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.rData&amp;nbsp;=&amp;nbsp;data; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error:&amp;nbsp;function&amp;nbsp;(request,&amp;nbsp;status,&amp;nbsp;error)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$('#lblResult').text(&quot;&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$('#lblResult').html(request.status&amp;nbsp;+&amp;nbsp;&quot;/&quot;&amp;nbsp;+&amp;nbsp;request.responseText&amp;nbsp;+&amp;nbsp;&quot;/&quot;&amp;nbsp;+&amp;nbsp;error); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;const&amp;nbsp;orderList&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ClsDataTable(); &lt;br /&gt;&lt;br /&gt;$(&quot;#btn-search&quot;).on(&quot;click&quot;, async () =&amp;gt; { &lt;br /&gt;&amp;nbsp; await orderList.ListItems(&quot;orderList&quot;); &lt;br /&gt;&amp;nbsp; console.log(orderList.rData); &lt;br /&gt;});&lt;/p&gt;</description>
      <category>program/javascript</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/193</guid>
      <comments>https://yoursyun.tistory.com/entry/Ajax-%EC%9A%94%EC%B2%AD-%EC%A2%85%EB%A3%8C%EC%8B%9C-%EA%B9%8C%EC%A7%80-%EB%8F%99%EA%B8%B0%ED%99%94-%EC%B2%98%EB%A6%AC#entry193comment</comments>
      <pubDate>Tue, 25 Jun 2024 16:06:17 +0900</pubDate>
    </item>
    <item>
      <title>Jquery Json 파일 불러오기</title>
      <link>https://yoursyun.tistory.com/entry/Jquery-Json-%ED%8C%8C%EC%9D%BC-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0</link>
      <description>&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffe6; color: #080808;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// JSON 파일 경로
let jsonFilePath = '/json/hello.json';

// JSON 파일 비동기적으로 호출
$.getJSON(jsonFilePath, function(data) {
    // 호출이 성공하면 이 함수가 실행됩니다.
    console.log(&quot;load file : &quot;, data);
})
    .fail(function(jqXHR, textStatus, errorThrown) {
        // 호출이 실패하면 이 함수가 실행됩니다.
        console.error('JSON 파일 호출 실패:', textStatus, errorThrown);
    });&lt;/code&gt;&lt;/pre&gt;</description>
      <category>program/javascript</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/192</guid>
      <comments>https://yoursyun.tistory.com/entry/Jquery-Json-%ED%8C%8C%EC%9D%BC-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0#entry192comment</comments>
      <pubDate>Fri, 16 Feb 2024 16:44:12 +0900</pubDate>
    </item>
    <item>
      <title>intelliJ 2021.3 tomcat 빌드후 class 및 resource update</title>
      <link>https://yoursyun.tistory.com/entry/intelliJ-20213-tomcat-%EB%B9%8C%EB%93%9C%ED%9B%84-class-%EB%B0%8F-resource-update</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;intelliJ는 이클립스와 달리 build 후 tomcat 실행중 저장시 class 자동 배포가 되지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장후 Ctrl+10 또는&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;161&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BTO8X/btrz5OEYAnj/FFWwjhzOCllgWe8oNEPKpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BTO8X/btrz5OEYAnj/FFWwjhzOCllgWe8oNEPKpK/img.png&quot; data-alt=&quot;좌측 하단에 리로드(업데이트) 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BTO8X/btrz5OEYAnj/FFWwjhzOCllgWe8oNEPKpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBTO8X%2Fbtrz5OEYAnj%2FFFWwjhzOCllgWe8oNEPKpK%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;161&quot; height=&quot;250&quot; data-origin-width=&quot;161&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;좌측 하단에 리로드(업데이트) 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 이용하여 다시 빌드 해줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해, 아래 이미지 위치에서 설정을 변경 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djCb41/btrz8tfwB1u/JS4LgYmVTOhBJRTskP1AD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djCb41/btrz8tfwB1u/JS4LgYmVTOhBJRTskP1AD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djCb41/btrz8tfwB1u/JS4LgYmVTOhBJRTskP1AD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjCb41%2Fbtrz8tfwB1u%2FJS4LgYmVTOhBJRTskP1AD0%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;490&quot; height=&quot;308&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biQo2F/btrz9heRbDT/wy8mKjUHiDeZgkOmwQ9Or1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biQo2F/btrz9heRbDT/wy8mKjUHiDeZgkOmwQ9Or1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biQo2F/btrz9heRbDT/wy8mKjUHiDeZgkOmwQ9Or1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiQo2F%2Fbtrz9heRbDT%2Fwy8mKjUHiDeZgkOmwQ9Or1%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;1122&quot; height=&quot;827&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>environment/java</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/190</guid>
      <comments>https://yoursyun.tistory.com/entry/intelliJ-20213-tomcat-%EB%B9%8C%EB%93%9C%ED%9B%84-class-%EB%B0%8F-resource-update#entry190comment</comments>
      <pubDate>Fri, 22 Apr 2022 10:48:11 +0900</pubDate>
    </item>
    <item>
      <title>문자열  날짜 비교 ( yyyyMMdd 형태 )</title>
      <link>https://yoursyun.tistory.com/entry/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%A0%EC%A7%9C-%EB%B9%84%EA%B5%90-yyyyMMdd-%ED%98%95%ED%83%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;A&amp;nbsp;&amp;lt;&amp;nbsp;B &lt;br /&gt;*&amp;nbsp;0&amp;nbsp;:&amp;nbsp;A&amp;nbsp;==&amp;nbsp;B &lt;br /&gt;*&amp;nbsp;+1&amp;nbsp;:&amp;nbsp;A&amp;nbsp;&amp;gt;&amp;nbsp;B &lt;br /&gt;&lt;br /&gt;SimpleDateFormat&amp;nbsp;formatter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SimpleDateFormat(&quot;yyyyMMddHHmmss&quot;); &lt;br /&gt;&lt;br /&gt;Date&amp;nbsp;dateA&amp;nbsp;=&amp;nbsp;formatter.parse(a); &lt;br /&gt;Date&amp;nbsp;dateB&amp;nbsp;=&amp;nbsp;formatter.parse(b); &lt;br /&gt;&lt;br /&gt;return&amp;nbsp;dateA.compareTo(dateB);&lt;/p&gt;</description>
      <category>program/java</category>
      <author>yoursyun</author>
      <guid isPermaLink="true">https://yoursyun.tistory.com/189</guid>
      <comments>https://yoursyun.tistory.com/entry/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%A0%EC%A7%9C-%EB%B9%84%EA%B5%90-yyyyMMdd-%ED%98%95%ED%83%9C#entry189comment</comments>
      <pubDate>Fri, 22 Apr 2022 10:40:32 +0900</pubDate>
    </item>
  </channel>
</rss>