<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Build &amp;amp; Record</title>
    <link>https://programinglab.tistory.com/</link>
    <description>공부한 것과 경험을 기록합니다.
틀린 부분이 있다면 말씀해 주세요. 감사합니다.</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 23:50:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>han.log</managingEditor>
    <item>
      <title>Uncaught (in promise) TypeError: Cannot read properties of undefined (reading '0')</title>
      <link>https://programinglab.tistory.com/305</link>
      <description>&lt;pre id=&quot;code_1737349199913&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// script
const { data: testData, isLoading } = useQuery([&quot;&quot;], () =&amp;gt; fetchGetData(id),
        {
            enabled: Boolean(activityId.value),
        },
)

// tamplate
{{ testData[index]?.name }}&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;1. enabled&amp;nbsp; 옵션을 활성화한 상태에서, 조건에 맞지 않아 useQuery가 데이터를 가져오지 않는 경우 =&amp;gt; isLoading이 계속 true인 상태로 변하지 않음&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;2. useQuery가 데이터를 가져오지 않았기 때문에, 초기 데이터가 undefined 상태에서 화면에 데이터를 렌더링할 경우 =&amp;gt; Uncaught (in promise) TypeError: Cannot read properties of undefined (reading '0')&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해결방법&lt;/blockquote&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737349559148&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
      enabled: Boolean(activityId.value),
      initialData: [],
},&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;</description>
      <category>Error</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/305</guid>
      <comments>https://programinglab.tistory.com/305#entry305comment</comments>
      <pubDate>Mon, 20 Jan 2025 14:06:47 +0900</pubDate>
    </item>
    <item>
      <title>could not initialize proxy [ ... ] - no Session(JPA)</title>
      <link>https://programinglab.tistory.com/304</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: could not initialize proxy [kr.co. ... ] - no Session&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [kr.co. ... ] - no Session&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[http-nio-8081-exec-3] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: could not initialize proxy [kr.co. ... ] - no Session]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;해당 에러는 JPA를 사용해 데이터를 select할 때 발생할 수 있는 에러로&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;1:N의 관계를 가지고 있는 변수에 설정한 LAZY Loading 때문에 발생한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;@ManyToOne(fetch = FetchType.LAZY)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;// application.yml&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;jpa:
  database: MYSQL
  show-sql:
  properties:
  open-in-view: false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #383838; text-align: start;&quot;&gt;Open Session In View를 true로 설정하지 않으면 트랜잭션 시작 시점에 영속성&lt;/span&gt;&lt;span style=&quot;color: #383838; text-align: start;&quot;&gt; 컨텐스트가&lt;/span&gt;&lt;span style=&quot;color: #383838; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #383838; text-align: start;&quot;&gt;시작되어&lt;/span&gt;&lt;span style=&quot;color: #383838; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #383838; text-align: start;&quot;&gt;트랜잭션이 종료되는 시점에 영속성&amp;nbsp;컨텍스트가&amp;nbsp;소멸되게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #383838; text-align: start;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해결 방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Service.java 파일에서 DTO로 변환 후에 Controller로 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737093606939&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new ObjectDTO(ObjectEntity);&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;&amp;nbsp;&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;2. 변수의 설정을 즉시 로딩(Earger)으로 변경한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@ManyToOne(fetch = FetchType.EAGER)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 즉시 로딩을 사용하는 경우 JPQL을 사용하면&lt;b&gt; N+1 &lt;/b&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;&amp;nbsp;&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;&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;&lt;a href=&quot;https://jwdeveloper.tistory.com/310&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jwdeveloper.tistory.com/310&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737093725504&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;(JPA) could not initialize proxy - no Session (1)&quot; data-og-description=&quot;JPA를 사용하다 보면 아래 오류를 빈번하게 마주치게 된다. could not initialize proxy - no Session​ 해당 오류의 원인을 Open Session In View와 관련지어 정리해보고자 한다. 또한 영속성 컨텍스트의 시작과 &quot; data-og-host=&quot;jwdeveloper.tistory.com&quot; data-og-source-url=&quot;https://jwdeveloper.tistory.com/310&quot; data-og-url=&quot;https://jwdeveloper.tistory.com/310&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGl8Ll/hyX0lr37wR/1CfKKBPgXpcTx7vJFkHqg0/img.png?width=240&amp;amp;height=160&amp;amp;face=0_0_240_160,https://scrap.kakaocdn.net/dn/cCqqoQ/hyX4tWg48V/3gC9l5xJJjBjrGiZqoETmK/img.png?width=240&amp;amp;height=160&amp;amp;face=0_0_240_160,https://scrap.kakaocdn.net/dn/oijtz/hyX0lFCT41/fOxPvz2gQer0GuXp3KnqKk/img.png?width=2050&amp;amp;height=1172&amp;amp;face=0_0_2050_1172&quot;&gt;&lt;a href=&quot;https://jwdeveloper.tistory.com/310&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jwdeveloper.tistory.com/310&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGl8Ll/hyX0lr37wR/1CfKKBPgXpcTx7vJFkHqg0/img.png?width=240&amp;amp;height=160&amp;amp;face=0_0_240_160,https://scrap.kakaocdn.net/dn/cCqqoQ/hyX4tWg48V/3gC9l5xJJjBjrGiZqoETmK/img.png?width=240&amp;amp;height=160&amp;amp;face=0_0_240_160,https://scrap.kakaocdn.net/dn/oijtz/hyX0lFCT41/fOxPvz2gQer0GuXp3KnqKk/img.png?width=2050&amp;amp;height=1172&amp;amp;face=0_0_2050_1172');&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;(JPA) could not initialize proxy - no Session (1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JPA를 사용하다 보면 아래 오류를 빈번하게 마주치게 된다. could not initialize proxy - no Session​ 해당 오류의 원인을 Open Session In View와 관련지어 정리해보고자 한다. 또한 영속성 컨텍스트의 시작과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jwdeveloper.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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cantcoding.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cantcoding.tistory.com/78&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737093448885&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;JPA/ could not initialize proxy - no Session&quot; data-og-description=&quot;1.문제점 JPA를 통한 개발을 하다보면 한번쯤 만날 수 밖에없는 에러이다. JPA를 사용하여 DB에 저장된 리소스를 불러와서 반환하는 경우, 혹은 사용할 때 발생했던 에러이다. 2.접근 JPA에 대한 이&quot; data-og-host=&quot;cantcoding.tistory.com&quot; data-og-source-url=&quot;https://cantcoding.tistory.com/78&quot; data-og-url=&quot;https://cantcoding.tistory.com/78&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b55nh8/hyX0mR5hn2/oAdHWtSTjfhqomN3AtOGrk/img.png?width=800&amp;amp;height=265&amp;amp;face=0_0_800_265,https://scrap.kakaocdn.net/dn/doYqpK/hyX0vaoK7P/w7Q3i7e82pykdVIrm1fhQk/img.png?width=800&amp;amp;height=265&amp;amp;face=0_0_800_265,https://scrap.kakaocdn.net/dn/bAIjbT/hyX0ubwRbF/yp9ccQ05o5ABcHZc66gYqk/img.png?width=810&amp;amp;height=574&amp;amp;face=0_0_810_574&quot;&gt;&lt;a href=&quot;https://cantcoding.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cantcoding.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b55nh8/hyX0mR5hn2/oAdHWtSTjfhqomN3AtOGrk/img.png?width=800&amp;amp;height=265&amp;amp;face=0_0_800_265,https://scrap.kakaocdn.net/dn/doYqpK/hyX0vaoK7P/w7Q3i7e82pykdVIrm1fhQk/img.png?width=800&amp;amp;height=265&amp;amp;face=0_0_800_265,https://scrap.kakaocdn.net/dn/bAIjbT/hyX0ubwRbF/yp9ccQ05o5ABcHZc66gYqk/img.png?width=810&amp;amp;height=574&amp;amp;face=0_0_810_574');&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;JPA/ could not initialize proxy - no Session&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1.문제점 JPA를 통한 개발을 하다보면 한번쯤 만날 수 밖에없는 에러이다. JPA를 사용하여 DB에 저장된 리소스를 불러와서 반환하는 경우, 혹은 사용할 때 발생했던 에러이다. 2.접근 JPA에 대한 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cantcoding.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>Error</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/304</guid>
      <comments>https://programinglab.tistory.com/304#entry304comment</comments>
      <pubDate>Fri, 17 Jan 2025 15:05:53 +0900</pubDate>
    </item>
    <item>
      <title>트리쉐이킹이란?</title>
      <link>https://programinglab.tistory.com/301</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드에서 사용되지 않는 부분을 제거하는 과정&lt;/b&gt;을 시각적으로 설명하기 위해 붙여진 이름으로,&amp;nbsp; 나무(tree)를 흔들어(dead branches) 불필요한 가지를 떨궈내는 것에 비유한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;tree에 비유하는 이유&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 시스템과 코드베이스는 일반적으로 트리 구조와 비슷하게 구성된다. 즉, 애플리케이션의 최상위 모듈에서 시작해 하위 모듈로 연결된 &lt;b&gt;의존성 그래프&lt;/b&gt;를 생각할 수 있다. 이 트리에는 실제로 사용되는 모듈(가지)과 사용되지 않는 모듈(불필요한 가지)이 모두 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;'shaking'의 의미&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'쉐이킹'은 나무를 흔들어서 쓸모없는 가지를 떨어뜨리는 과정처럼, 코드베이스에서 &lt;b&gt;사용되지 않는 모듈이나 코드를 탐지하고 제거&lt;/b&gt;하는 것을 의미한다.&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;b&gt;코드 분석&lt;/b&gt;: 번들러가 코드 트리(의존성 그래프)를 탐색하여 각 모듈이 실제로 참조되고 사용되는지를 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;불필요한 코드 제거&lt;/b&gt;: 사용되지 않는 모듈이나 함수가 탐지되면 최종 번들에서 제외되어, 결과적으로 &lt;b&gt;작은 크기의 번들&lt;/b&gt;을 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;이 트리쉐이킹드에서 사용되지 않는 부분을 제거하는 과정을 시각적으로 설명하기 위해 붙여진 이름으로, 나무(tree)를 흔들어(dead branches) 불필요한 가지를 떨궈내는 것에 비유한 것이다.&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;tree에 비유하는 이유&lt;/blockquote&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;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;모듈 시스템과 코드베이스는 일반적으로 트리 구조와 비슷하게 구성된다. 즉, 애플리케이션의 최상위 모듈에서 시작해 하위 모듈로 연결된 의존성 그래프를 생각할 수 있다. 이 트리에는 실제로 사용되는 모듈(가지)과 사용되지 않는 모듈(불필요한 가지)이 모두 포함된다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;'shaking'의 의미&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/blockquote&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;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;'쉐이킹'은 나무를 흔들어서 쓸모없는 가지를 떨어뜨리는 과정처럼, 코드베이스에서 사용되지 않는 모듈이나 코드를 탐지하고 제거하는 것을 의미한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;이 트리쉐이킹을 통해&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;번들 크기를 줄이고, 로딩 속도를 개선&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;할 수 있다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>정리</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/301</guid>
      <comments>https://programinglab.tistory.com/301#entry301comment</comments>
      <pubDate>Fri, 8 Nov 2024 17:16:48 +0900</pubDate>
    </item>
    <item>
      <title>[Vue] ref와 reactive의 차이점</title>
      <link>https://programinglab.tistory.com/300</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 타입&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ref: 단일 값이나 원시 타입&lt;/li&gt;
&lt;li&gt;reactive: 객체, 배열 등 복합 데이터 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 사용법&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ref: .value를 통해 접근&lt;/li&gt;
&lt;li&gt;reactive: 일반 객체처럼 속성에 직접 접근&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref와 reactive 모두 반응형 데이터를 다룰 때 사용하지만, 다루는 데이터 타입이 다르다는 특징이 있다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그러나 reactive는 ref와 달리 데이터의 값이 수정되거나 추가될 때 등 반응성을 잃는다는 점에서 주의해야 한다.&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;letter-spacing: 0px;&quot;&gt;Vue의 반응형 시스템은 reactive 객체 생성 시점에 존재하는 속성들만 추적하기 때문에, 새로 추가된 속성은 반응형으로 처리되지 않는다.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&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;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;1. 속성 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;f3c7a13f-ef53-494a-9de5-b244a88d4839&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730976266908&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const state = reactive({ count: 0 }); 
state.newProperty = 5;
console.log(state.newProperty); // 5
// Vue는 더이상 newProperty를 반응형으로 추적하지 않는다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;2. 데이터 수정&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730976421621&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let state = reactive({ count: 0 }); 
state = { count: 1 };&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 state 자체를 다른 객체로 할당했기 때문에 반응형으로 추적하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 배열의 인덱스 값 또는 길이를 수정하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730976532851&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const state = reactive([1, 2, 3]); 
state[1] = 10;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;해결방법&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reactive를 사용한 반응형 객체가 반응성을 잃었을 때, 아래와 같은 방법을 사용해 반응성을 유지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Vue.set() 또는 Object.assign()&lt;/b&gt;: 객체에 새로운 속성을 추가할 때 Vue.set() (Vue 2의 경우) 또는 Object.assign() 등을 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;toRefs() &lt;/b&gt;: 개별 속성을 반응형으로 만들어주는 toRefs() 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배열 메서드 주의&lt;/b&gt;: 배열은 push, pop, splice 등 Vue에서 감지할 수 있는 메서드 사용.&lt;/li&gt;
&lt;/ul&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;i&gt;Object.assign()&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730976830669&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const initState = {
    isEmpty: false,
    name: &quot;&quot;,
    phone: &quot;&quot;,
};

const formState = reactive({ ...initState });

const reset = () =&amp;gt; {
    Object.assign(formState, initState);
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1730976943514&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const formState = reactive({
    isEmpty: false,
    name: &quot;&quot;,
    phone: &quot;&quot;,
});

const getData = (params) =&amp;gt; {
    Object.assign(formState, params);
    refetch();
};&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;toRefs()&lt;/i&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre id=&quot;code_1730976762579&quot; class=&quot;pf&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const state = reactive({
    isEmpty: false,
    name: &quot;&quot;,
    phone: &quot;&quot;,
});
const { isEmpty, name, phone } = toRefs(state);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;ref 또는 reactive 중 한 가지만 사용하길 권장하는 이유&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 코드 일관성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ref의 경우 value를 통해 데이터에 접근할 수 있기 때문에 혼란을 야기할 수 있고, 코드의 일관성이 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 가독성과 유지보수성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&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;3. &lt;b&gt;타입스크립트 호환성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript를 사용할 때는 reactive보다 ref가 더 명확한 타입 정의를 제공하는 경우가 있다. 혼합 사용 시 타입 정의가 복잡해지거나 의도하지 않은 타입 오류가 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;한 가지 방식을 일관되게 사용하면 타입 시스템과의 호환성을 더 쉽게 유지할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 사용성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref는 원시 값이나 단일 값의 반응성을 다루는 데 적합하고, reactive는 객체나 배열 같은 복합 데이터 구조에 적합하기 때문에 한 가지 방식으로 통일하게 되면 &quot;어떤 데이터에 어떤 함수를 쓸지&quot;에 대한 모호함이 줄어들게 된다.&lt;/p&gt;</description>
      <category>Vue</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/300</guid>
      <comments>https://programinglab.tistory.com/300#entry300comment</comments>
      <pubDate>Thu, 7 Nov 2024 19:58:12 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] RANK() OVER() vs RANK() WITHIN GROUP() 차이점</title>
      <link>https://programinglab.tistory.com/299</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;ec8198b2-2c1a-4d39-8d9b-977b93ad0b4b&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;1. RANK() OVER()&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RANK() OVER()는 &lt;b&gt;윈도우 함수&lt;/b&gt;로, 각 행에 대해 순위를 매기고 그 결과를 반환한다. 주로 OVER(PARTITION BY ...) 구문과 함께 사용하며, 특정 그룹 내에서 순위를 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730879460595&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
    DNAME,
    NAME, 
    SAL, 
    RANK() OVER(PARTITION BY DNAME ORDER BY SAL DESC) AS rank 
FROM employees;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNAME별로 데이터를 그룹화고, 각 그룹 내에서 SAL을 내림차순 정렬하여 순위를 매긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RANK() 함수는 동일한 값에 동일한 순위를 부여하고, 다음 순위는 건너뛴다. ex) 1위가 2명이면 다음은 2위가 아닌 3위.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순위를 건너뛰지 않고 이어지게 하고 싶은 경우에는 DENSE_RANK()를 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- 각 행에 대해 개별적으로 순위를 부여한다.&lt;br /&gt;- PARTITION BY로 그룹화하여, 그룹별 순위를 계산한다.&lt;br /&gt;- ORDER BY로 정렬 기준을 설정하여 순위를 매긴다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;2. RANK() WITHIN GROUP()&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RANK() WITHIN GROUP()은 &lt;b&gt;집계 함수&lt;/b&gt;로, 집계된 결과에서 특정 값의 순위를 계산한다. RANK() WITHIN GROUP은 행마다 순위를 반환하는 것이 아니라, 집계된 값에 대해 특정 조건에 맞는 순위를 구할 때 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730880146076&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
    DNAME, 
    RANK(3000) WITHIN GROUP (ORDER BY SAL DESC) AS rank 
FROM employees 
GROUP BY DNAME;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 DNAME 그룹에서 SAL을 내림차순으로 정렬하고, SAL의 값이 3000인 데이터의 순위를 매긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- 집계 함수로서, 집계된 결과에 대해 순위를 부여한다.&lt;br /&gt;- 여러 행을 그룹화(GROUP BY)한 후 특정 열에 대해 순위를 매길 때 사용한다.&lt;br /&gt;- RANK() WITHIN GROUP은 그룹화된 데이터에 대한 특정 값의 순위를 구할 때 유용하게 사용할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;차이점 요약&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;함수 종류&lt;/td&gt;
&lt;td&gt;윈도우 함수&lt;/td&gt;
&lt;td&gt;집계 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;반환 형태&lt;/td&gt;
&lt;td&gt;원본 데이터의 각 행에 순위 부여&lt;/td&gt;
&lt;td&gt;그룹화된 결과에서 특정 값의 순위를 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;문법&lt;/td&gt;
&lt;td&gt;PARTITION BY, ORDER BY&lt;/td&gt;
&lt;td&gt;WITHIN GROUP (ORDER BY ...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용 용도&lt;/td&gt;
&lt;td&gt;각 행에 대해 순위를 부여하고 결과 집합 유지&lt;/td&gt;
&lt;td&gt;그룹화된 데이터에서 특정 값의 순위를 얻고자 할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;RANK() OVER()는 주로 개별 행에 순위를 매길 때 사용하고, RANK() WITHIN GROUP()은 집계된 그룹에서 특정 값의 순위를 구할 때 사용한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;bfc8124a-48d5-4842-912e-be3040d0663e&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시)&amp;nbsp;Table. employees&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;ID&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;NAME&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;DNAME&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SAL&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;홍길동&lt;/td&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;박길동&lt;/td&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;최길동&lt;/td&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;김길동&lt;/td&gt;
&lt;td&gt;남유럽지부&lt;/td&gt;
&lt;td&gt;450&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;이길동&lt;/td&gt;
&lt;td&gt;남유럽지부&lt;/td&gt;
&lt;td&gt;550&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. RANK() OVER()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 직원의 급여 순위를 DNAME별로 계산하기.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730880887938&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
    DNAME, 
    NAME, 
    SAL, 
    RANK() OVER(PARTITION BY DNAME ORDER BY SAL DESC) AS rank 
FROM employees;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PARTITION BY DNAME을 통해 DNAME별로 데이터를 그룹화하고, 각 DNAME 그룹 내에서 SAL을 내림차순으로 정렬하여 순위를 매긴다.&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;bfc8124a-48d5-4842-912e-be3040d0663e&quot; data-message-author-role=&quot;assistant&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;bfc8124a-48d5-4842-912e-be3040d0663e&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;최길동&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;박길동&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;홍길동&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;남유럽지부&lt;/td&gt;
&lt;td&gt;이길동&lt;/td&gt;
&lt;td&gt;550&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;남유럽지부&lt;/td&gt;
&lt;td&gt;김길동&lt;/td&gt;
&lt;td&gt;450&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. RANK() WITHIN GROUP() 예제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 DNAME 그룹에서 특정 급여(SAL = 450 )가 몇 번째 순위에 있는지 구하기.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1730881204236&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
    DNAME, 
    RANK() WITHIN GROUP (ORDER BY SAL DESC) AS rank_for_450 
FROM employees 
WHERE SAL = 450 
GROUP BY DNAME;&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;GROUP BY DNAME을 통해 DNAME별로 그룹화한 후, SAL이 450일 때의 순위를 각 그룹 내에서 구한다. WITHIN GROUP을 통해 그룹 내에서 SAL을 내림차순으로 정렬한 후, SAL = 450이 몇 번째 순위에 있는지 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;아시아지부&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;남유럽지부&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>SQL</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/299</guid>
      <comments>https://programinglab.tistory.com/299#entry299comment</comments>
      <pubDate>Wed, 6 Nov 2024 17:10:10 +0900</pubDate>
    </item>
    <item>
      <title>S3 browser add new Account</title>
      <link>https://programinglab.tistory.com/290</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;system.config.properties 설정 파일 확인하여 Account만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;720&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EOup7/btsJ408wY2r/rcpqVHYE6yis1DkkS8cXuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EOup7/btsJ408wY2r/rcpqVHYE6yis1DkkS8cXuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EOup7/btsJ408wY2r/rcpqVHYE6yis1DkkS8cXuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEOup7%2FbtsJ408wY2r%2FrcpqVHYE6yis1DkkS8cXuK%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;509&quot; height=&quot;552&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;781&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;1. REST Endpoint&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;aws.s3.bucket.url&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Access Key Key ID&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;aws.s3.access.key&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Secret Access Key&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;aws.s3.secret.key&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>정리</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/290</guid>
      <comments>https://programinglab.tistory.com/290#entry290comment</comments>
      <pubDate>Mon, 14 Oct 2024 10:39:20 +0900</pubDate>
    </item>
    <item>
      <title>라이브러리 파일 Git에서 제외시키기</title>
      <link>https://programinglab.tistory.com/287</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bokiBH/btsJCTjtueT/Kdb20uKg1MTf2ekkxj7jZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bokiBH/btsJCTjtueT/Kdb20uKg1MTf2ekkxj7jZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bokiBH/btsJCTjtueT/Kdb20uKg1MTf2ekkxj7jZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbokiBH%2FbtsJCTjtueT%2FKdb20uKg1MTf2ekkxj7jZ1%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;611&quot; height=&quot;298&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;298&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'.gitigonre' 파일에서 제외시켰음에도 불구하고 사진과 같은 파일들이 추가될 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726335313810&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rm -r --cached .idea/libraries/&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;.idea/libraries/ 폴더 아래의 파일들을 Git의 &lt;b&gt;트래킹 목록에서 제거&lt;/b&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;</description>
      <category>Git</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/287</guid>
      <comments>https://programinglab.tistory.com/287#entry287comment</comments>
      <pubDate>Sun, 15 Sep 2024 02:37:25 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] jpa SqlExceptionHelper - SQL Error: 1064, SQLState: 42000</title>
      <link>https://programinglab.tistory.com/286</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;* Entity에 예약어 사용되고 있는지 확인&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;pre id=&quot;code_1726132269264&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Column(name = &quot;`order`&quot;)
private int order;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Error</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/286</guid>
      <comments>https://programinglab.tistory.com/286#entry286comment</comments>
      <pubDate>Thu, 12 Sep 2024 18:11:21 +0900</pubDate>
    </item>
    <item>
      <title>PC 갑자기 물음표 거꾸 입력될 때/띄어쓰기 두 배로 넓어졌을 때 해결</title>
      <link>https://programinglab.tistory.com/281</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/6250hijk/223010824623&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/6250hijk/223010824623&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723619721993&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;PC카톡 갑자기 물음표 거꾸로 입력될 때 해결 방법&quot; data-og-description=&quot;&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/6250hijk/223010824623&quot; data-og-url=&quot;https://blog.naver.com/6250hijk/223010824623&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PAlos/hyWOgdznof/yxb9cYjOk0ANvHshs1YVi1/img.png?width=456&amp;amp;height=184&amp;amp;face=0_0_456_184&quot;&gt;&lt;a href=&quot;https://blog.naver.com/6250hijk/223010824623&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/6250hijk/223010824623&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PAlos/hyWOgdznof/yxb9cYjOk0ANvHshs1YVi1/img.png?width=456&amp;amp;height=184&amp;amp;face=0_0_456_184');&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;PC카톡 갑자기 물음표 거꾸로 입력될 때 해결 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.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;
&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-14 161606.png&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8DGjO/btsI3ZRDWZe/EzgdNlg2JDbYsTtCJUHKA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8DGjO/btsI3ZRDWZe/EzgdNlg2JDbYsTtCJUHKA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8DGjO/btsI3ZRDWZe/EzgdNlg2JDbYsTtCJUHKA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8DGjO%2FbtsI3ZRDWZe%2FEzgdNlg2JDbYsTtCJUHKA0%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;315&quot; height=&quot;246&quot; data-filename=&quot;스크린샷 2024-08-14 161606.png&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>기타</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/281</guid>
      <comments>https://programinglab.tistory.com/281#entry281comment</comments>
      <pubDate>Wed, 14 Aug 2024 16:17:44 +0900</pubDate>
    </item>
    <item>
      <title>reduce() 정리</title>
      <link>https://programinglab.tistory.com/280</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;reduce()&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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: #1b1b1b; text-align: start;&quot;&gt;배열의 각 요소에 대해 주어진 reducer() 함수를 실행하고, 하나의 결과값을 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;reducer()&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;함수의 반환 값은 누적값에 할당되고, 누적값은 순회 중 유지되므로 결국 최종 결과는 하나의 값이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #1b1b1b; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;누적 (acc)&lt;/li&gt;
&lt;li&gt;현재 값 (cur)&lt;/li&gt;
&lt;li&gt;현재 인덱스 (idx)&lt;/li&gt;
&lt;li&gt;원본 배열 (src)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote id=&quot;매개변수&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;매개변수&lt;/b&gt;&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;- callback
&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;
- accumulator
&lt;p data-ke-size=&quot;size16&quot;&gt;누산기는 콜백의 반환값을 누적한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백의 이전 반환값 또는 콜백의 첫 번째 호출이면서&lt;span&gt;&amp;nbsp;&lt;/span&gt;initialValue를 제공한 경우에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;initialValue의 값이 할당된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
- currentValue
&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;
- currentIndex
&lt;p data-ke-size=&quot;size16&quot;&gt;처리할 현재 요소의 인덱스로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;initialValue를 제공한 경우 0, 아니면 1부터 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
- initialValue&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백백의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용한다. 빈 배열에서 초기값 없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;reduce()를 호출하면 오류가 발생한다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723612329041&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 사용법
arr.reduce(callback[, initialValue])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723612970811&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array1 = [1, 2, 3, 4];

// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
  (accumulator, currentValue) =&amp;gt; accumulator + currentValue,
  initialValue,
);

console.log(sumWithInitial);
// Expected output: 10&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;출처&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVASCRIPT</category>
      <author>han.log</author>
      <guid isPermaLink="true">https://programinglab.tistory.com/280</guid>
      <comments>https://programinglab.tistory.com/280#entry280comment</comments>
      <pubDate>Wed, 14 Aug 2024 14:30:40 +0900</pubDate>
    </item>
  </channel>
</rss>