<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>춍춍 블로그</title>
    <link>https://chung-develop.tistory.com/</link>
    <description>개발부터 일상생활 내용까지 잡다한 내용을 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 17 May 2026 15:32:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Chung-A</managingEditor>
    <image>
      <title>춍춍 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/4061221/attach/fb0e1f914f5e40549398cc51a2083981</url>
      <link>https://chung-develop.tistory.com</link>
    </image>
    <item>
      <title>AWS 에서 카프카 사용해보기</title>
      <link>https://chung-develop.tistory.com/161</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans KR', sans-serif;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Kafka는 분산 데이터 스트리밍 플랫폼으로, 대용량 실시간 데이터 처리에 적합합니다. 기본 주체로는 프로듀서, 컨슈머, 브로커로 구성되며, 프로듀서는 데이터를 생성하고 브로커로 전송합니다. 컨슈머는 브로커에서 데이터를 읽어옵니다. 이러한 구성으로 데이터를 안정적으로 처리하고, 병렬적인 처리도 가능합니다. AWS Kafka는 확장성이 우수하여 요구 사항에 따라 자동으로 정확한 용량을 확보합니다. 또한, 관리가 용이하며, 높은 내구성과 성능을 제공합니다. AWS Kafka를 사용하면 기업은 대량의 데이터를 신속하게 처리하고 비즈니스 인텔리전스를 개발할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center; margin-top: 0; margin-bottom: 0;&quot;&gt;&lt;img style=&quot;max-width: 100%; max-height: 100%; margin-top: 0; margin-bottom: 0;&quot; src=&quot;https://blog.kakaocdn.net/dn/E06TV/btsB19gsQO9/a02BRWUkT7KsE3SRH31Cik/img.jpg&quot; alt=&quot;aws&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;font-family: 'Noto Sans KR', sans-serif; margin-top: 50px; padding: 7px 20px 7px; border-left: 10px #9c4423; border-bottom: 15px solid #ffffff; background-color: #28a8a8; color: #ffffff; font-size: 22px;&quot; data-ke-size=&quot;size26&quot;&gt;1. AWS Kafka 설치&lt;/h2&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans KR', sans-serif;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Kafka를 설치하기 위해서는 몇 가지 단계를 따라야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. AWS Management Console에 로그인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &quot;Kafka&quot;를 검색하여 &quot;Managed Streaming for Apache Kafka (MSK)&quot;를 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &quot;Create cluster&quot; 버튼을 클릭하여 새로운 Kafka 클러스터를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 클러스터 설정을 구성합니다.&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;/p&gt;
&lt;pre id=&quot;code_1702739312438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from kafka import KafkaProducer
from kafka import KafkaConsumer

# Kafka Producer 생성 예시 코드
def send_message(topic, message):
    producer = KafkaProducer(bootstrap_servers='your-bootstrap-servers')
    producer.send(topic, message)
    producer.close()

# Kafka Consumer 생성 예시 코드
def consume_messages(topic):
    consumer = KafkaConsumer(
        topic, 
        bootstrap_servers='your-bootstrap-servers', 
        group_id='your-group-id'
    )
    for message in consumer:
        print(message.value)
    consumer.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 &quot;your-bootstrap-servers&quot;는 Kafka 클러스터의 부트스트랩 서버 주소를 입력해야 합니다. 이 주소는 AWS MSK 클러스터 설정 페이지에서 확인할 수 있습니다. 또한, &quot;your-group-id&quot;는 Consumer Group ID를 나타냅니다. 위 예시 코드를 사용하면 Kafka Producer로 메시지를 보낼 수 있고, Kafka Consumer로 메시지를 소비할 수 있습니다. 이렇게 생성된 Kafka 클러스터를 사용하여 대용량 데이터를 신속하게 처리할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center; margin-top: 0; margin-bottom: 0;&quot;&gt;&lt;img style=&quot;max-width: 100%; max-height: 100%; margin-top: 0; margin-bottom: 0;&quot; src=&quot;https://blog.kakaocdn.net/dn/KYTUy/btsB6jCnErJ/wzwCd28XwGCq0OWCoHGZKK/img.jpg&quot; alt=&quot;aws&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;font-family: 'Noto Sans KR', sans-serif; margin-top: 50px; padding: 7px 20px 7px; border-left: 10px #9c4423; border-bottom: 15px solid #ffffff; background-color: #28a8a8; color: #ffffff; font-size: 22px;&quot; data-ke-size=&quot;size26&quot;&gt;2. AWS Kafka 토픽 생성&lt;/h2&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans KR', sans-serif;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 AWS에서 Kafka 토픽을 생성하는 실제 소스 코드 예시입니다. 이 코드 예시는 초보자도 이해하기 쉽게 설명되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702739334605&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3

def create_kafka_topic(topic_name, partition_count, replication_factor):
    # AWS Kafka 클라이언트 생성
    kafka_client = boto3.client('kafka')
    
    # 토픽 생성 요청
    response = kafka_client.create_topic(
        Name=topic_name,
        PartitionCount=partition_count,
        ReplicationFactor=replication_factor
    )

    # 토픽 생성 여부 확인
    if 'TopicArn' in response:
        print(&quot;Kafka 토픽 생성 성공&quot;)
    else:
        print(&quot;Kafka 토픽 생성 실패&quot;)

# 토픽 이름, 파티션 수, 복제 팩터 지정하여 함수 호출
create_kafka_topic(&quot;my-topic&quot;, 3, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 AWS SDK인 boto3를 사용하여 AWS Kafka 클라이언트를 생성하고, `create_topic` 함수를 호출하여 토픽을 생성하는 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`create_kafka_topic` 함수는 아래와 같은 파라미터를 받습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- `topic_name`: 생성할 토픽의 이름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- `partition_count`: 토픽에 포함할 파티션의 수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- `replication_factor`: 파티션의 데이터를 복제할 복제 팩터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 `boto3`를 사용하여 `create_topic` 메소드를 호출하여 토픽을 생성합니다. 그리고 `response` 변수를 통해 토픽 생성 여부를 확인합니다. 위 예시를 실행하면 'my-topic'라는 이름의 토픽이 3개의 파티션과 2개의 복제 팩터로 생성됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;font-family: 'Noto Sans KR', sans-serif; margin-top: 50px; padding: 7px 20px 7px; border-left: 10px #9c4423; border-bottom: 15px solid #ffffff; background-color: #28a8a8; color: #ffffff; font-size: 22px;&quot; data-ke-size=&quot;size26&quot;&gt;3. AWS Kafka 메시지 생성 및 전송&lt;/h2&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans KR', sans-serif;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 초보자가 이해할 수 있도록 간단한 Python 코드 예시를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예시는 AWS SDK for Python인 boto3를 사용하여 AWS Kafka에 메시지를 생성하고 전송하는 방법을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 필요한 패키지를 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1702739382116&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3
import json

client = boto3.client('kafka', region_name='ap-southeast-2')

topic = 'your-topic-name'
message = {'key': 'value'}
response = client.put_record(
    ClusterArn='your-cluster-arn',
    TopicArn='your-topic-arn',
    Records=[
        {
            'Value': json.dumps(message),
            'PartitionKey': '1'
        }
    ]
)
print(f&quot;Success: {response['SequenceNumber']}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시에서 'your-topic-name', 'your-cluster-arn', 'your-topic-arn'은 실제 환경에 맞게 변경해야 합니다. 'your-topic-name'은 메시지를 전송할 토픽의 이름, 'your-cluster-arn'은 사용할 Kafka 클러스터의 ARN (Amazon Resource Name), 'your-topic-arn'은 토픽의 ARN입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지는 JSON 형식으로 생성하고, 'PartitionKey'는 메시지의 파티션을 지정하는 것입니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지 전송에 실패한 경우 예외가 발생하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같은 방법으로 AWS Kafka에 메시지를 생성하고 전송할 수 있습니다. 메시지 생성 및 전송에 필요한 인증 및 권한 설정이 완료되어야하며, AWS SDK for Python 및 필요한 패키지가 설치되어 있어야 합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;display: flex; justify-content: center; align-items: center; margin-top: 0; margin-bottom: 0;&quot;&gt;&lt;img style=&quot;max-width: 100%; max-height: 100%; margin-top: 0; margin-bottom: 0;&quot; src=&quot;https://blog.kakaocdn.net/dn/OZPKr/btsCaxTIMgX/dxitIJYNkuRlTdLHA8BmTK/img.png&quot; alt=&quot;aws&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;font-family: 'Noto Sans KR', sans-serif; margin-top: 50px; padding: 7px 20px 7px; border-left: 10px #9c4423; border-bottom: 15px solid #ffffff; background-color: #28a8a8; color: #ffffff; font-size: 22px;&quot; data-ke-size=&quot;size26&quot;&gt;4. AWS Kafka 메시지 수신 및 처리&lt;/h2&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans KR', sans-serif;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 AWS Kafka에서 메시지를 수신하고 처리하는 예제 코드를 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. AWS SDK 설치 AWS SDK를 사용하여 Kafka 메시지를 수신하려면 먼저 AWS SDK를 설치해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS SDK를 설치하려면 다음 명령어를 실행합니다&lt;/p&gt;
&lt;pre id=&quot;code_1702739523090&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install boto3&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;2. Kafka 클라이언트 초기화 AWS Kafka에 연결하기 위해 Kafka 클라이언트를 초기화해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 클라이언트 초기화하는 예제 코드입니다&lt;/p&gt;
&lt;pre id=&quot;code_1702739549898&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from kafka import KafkaConsumer

consumer = KafkaConsumer(
    'topic_name',
    bootstrap_servers='kafka_broker_endpoint',
    security_protocol='SSL',
    ssl_cafile='path_to_ca_cert',
    ssl_certfile='path_to_client_cert',
    ssl_keyfile='path_to_client_key'
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 'topic_name'은 메시지를 소비할 Kafka 토픽의 이름을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'kafka_broker_endpoint'는 AWS Kafka 브로커의 엔드포인트 주소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'ssl_cafile', 'ssl_certfile' 및 'ssl_keyfile'은 AWS Kafka에 대한 SSL 인증서 및 키 파일의 경로입니다.&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;3. 메시지 수신 및 처리 KafkaConsumer 객체에 대한 `poll()` 메서드를 사용하여 메시지를 수신하고 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 메시지 수신 및 처리를 담당하는 예제 코드입니다&lt;/p&gt;
&lt;pre id=&quot;code_1702739578025&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for message in consumer.poll().items():
    value = message.value.decode('utf-8')
    print('Received message:', value)
    # 여기에 메시지 처리 로직을 추가하세요&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poll()` 메서드는 Kafka 토픽에서 메시지를 가져와서 메시지들의 이터레이터를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 메시지는 바이트로 인코딩되어 있으므로, `decode('utf-8')` 메서드를 사용하여 문자열로 디코딩해야 합니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 프로젝트에서는 이 예제 코드를 확장하여 원하는 기능을 구현하면 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DevOps/AWS</category>
      <category>AWS</category>
      <category>AWS Kafka</category>
      <category>AWS 카프카</category>
      <category>kafka</category>
      <category>kafka console</category>
      <category>Managed Streaming for Apache Kafka</category>
      <category>msk</category>
      <category>아파치 카프카</category>
      <category>카프카</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/161</guid>
      <comments>https://chung-develop.tistory.com/161#entry161comment</comments>
      <pubDate>Sat, 16 Dec 2023 23:58:53 +0900</pubDate>
    </item>
    <item>
      <title>개발자 전망: 심층 분석과 미래 전략</title>
      <link>https://chung-develop.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;개발자 전망: 심층 분석과 미래 전략&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #890009;&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&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;/li&gt;
&lt;li&gt;주요 기술 트렌드와 개발자 역할의 변화&lt;/li&gt;
&lt;li&gt;데이터 과학과 AI의 부상&lt;/li&gt;
&lt;li&gt;클라우드 컴퓨팅의 확장&lt;/li&gt;
&lt;li&gt;개발자의 글로벌 역량 강화&lt;/li&gt;
&lt;li&gt;지속 가능한 경력 개발을 위한 전략&lt;/li&gt;
&lt;li&gt;결론: 미래를 위한 개발자의 준비&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시장 동향과 개발자 수요 변화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 IT 시장은 급속한 변화를 겪고 있으며, 이는 개발자에 대한 수요와 역할에도 영향을 미치고 있다. 디지털 전환, 자동화, 원격 작업의 증가는 개발자에 대한 수요를 증가시키고 있다. 또한, 스타트업과 대기업 모두에서 기술 혁신의 필요성이 강조되면서 소프트웨어 개발자에 대한 수요가 전례 없이 증가하고 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 기술 트렌드와 개발자 역할의 변화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록체인, 인공지능, 사물인터넷(IoT), 클라우드 컴퓨팅 등의 기술 트렌드가 개발자의 역할을 변화시키고 있다. 이러한 기술은 전통적인 개발 방식을 넘어서 새로운 기술 스택과 접근 방식을 요구하고 있다. 개발자는 더 이상 단순한 코드 작성자가 아니라, 복잡한 시스템을 설계하고 통합하는 역할을 수행하게 되었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 과학과 AI의 부상&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 과학과 인공지능(AI)은 현대 개발 환경에서 중요한 요소가 되었다. 이러한 기술은 개인화된 서비스, 예측 분석, 자동화된 의사결정 과정 등을 가능하게 하여, 개발자에게 새로운 기회와 도전을 제공하고 있다. 이 분야에서 성공하기 위해서는, 개발자는 기계 학습, 통계학, 데이터 처리 등의 새로운 기술을 습득해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클라우드 컴퓨팅의 확장&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 컴퓨팅은 IT 인프라와 개발 방식에 혁명을 가져왔다. 이는 개발자에게 유연성을 제공하며, 더 빠르고 효율적인 개발 프로세스를 가능하게 한다. AWS, Azure, Google Cloud 등의 클라우드 플랫폼은 개발자에게 새로운 플랫폼과 도구를 제공하고 있으며, 이를 활용한 서비스 개발이 중요해지고 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개발자의 글로벌 역량 강화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 시장에서의 경쟁력을 갖추기 위해서는 개발자가 국제적인 시각과 다양한 문화에 대한 이해가 필요하다. 다국어 지원, 다양한 문화적 배경을 고려한 디자인 및 개발, 국제적인 협업 능력 등은 글로벌 시장에서 성공적인 개발자가 되기 위한 핵심 요소이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;지속 가능한 경력 개발을 위한 전략&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술의 빠른 변화와 새로운 기술의 등장은 개발자에게 지속적인 학습과 자기계발을 요구한다. 이를 위해 온라인 강의, 튜토리얼, 세미나 참여, 기술 커뮤니티 활동 등을 통해 최신 기술 동향을 파악하고, 전문성을 강화하는 것이 중요하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론: 미래를 위한 개발자의 준비&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미래의 개발자는 단순한 기술 전문가를 넘어서, 전략적 사고와 비즈니스 이해를 바탕으로 한 혁신적인 해결책을 제시할 수 있어야 한다. 이를 위해서는 기술적 능력과 함께, 시장과 산업의 변화를 예측하고 대응하는 능력이 필수적이다. 지속적인 학습과 역량 개발을 통해 개발자는 미래의 변화에 대비할 수 있다.&lt;/p&gt;</description>
      <category>생활/일상</category>
      <category>개발자</category>
      <category>개발자 경력</category>
      <category>개발자 경쟁력</category>
      <category>개발자 시장</category>
      <category>개발자 전망</category>
      <category>개발자 취업</category>
      <category>개발자 트렌드</category>
      <category>경력</category>
      <category>미래 전망</category>
      <category>미래 트렌드</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/159</guid>
      <comments>https://chung-develop.tistory.com/159#entry159comment</comments>
      <pubDate>Sat, 16 Dec 2023 13:25:22 +0900</pubDate>
    </item>
    <item>
      <title>[기술면접]Spring Batch 예상 질문 리스트</title>
      <link>https://chung-develop.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 제 이직 준비 과정에서 경험한 스프링 배치 관련 면접 질문에 대한 내용을 공유해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접에서 자주 물어보는 질문들을 정리해보았습니다.&lt;/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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;p data-ke-size=&quot;size16&quot;&gt;스프링 배치는 대용량 데이터 처리와 스케줄링을 효과적으로 다루기 위한 프레임워크로, 이를 통해 일관성 있고 안정적인 배치 작업을 수행할 수 있습니다. 특히 대용량 데이터를 읽어 파일생성과 같은 작업을 할때 유용하게 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 멱등성은 어떻게 유지하나요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멱등성은 동일한 입력에 대해 항상 동일한 출력을 보장하는 원칙입니다. 멱등성이 깨지는 경우의 대표적으로 데이터를 insert 하는 잡을 들 수 있는데 이러한 잡을 두번 돌리는 경우 DB에 별도의 유니크 키 등이 없는 한 중복 데이터가 생성되게 됩니다. 이러한 현상을 막기 위해 배치를 구동할 때 배치를 통해 생성될 데이터들을 삭제하는 등의 사전 스텝들을 넣어놓았으며 이로 부족할 경우 별도의 잡을 구성하여 함께 돌리는 방식으로 데이터의 멱등성을 유지하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 스프링 배치 메타 데이터 테이블은 어떤 것들이 있나요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION 등의 테이블이 있으며, 이들은 배치 작업의 메타데이터를 저장합니다.&lt;/p&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;스프링 배치는 스킵 및 재시도 기능을 제공하여 실패한 청크를 스킵하거나, 실패 시 재시도할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 스프링 배치 멀티 스레드와 파티셔닝의 차이는 무엇인가요?&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;&lt;b&gt;멀티 스레드 (Multi-Threading):&lt;/b&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;li&gt;데이터를 병렬로 처리하므로 성능 향상을 가져올 수 있습니다.&lt;/li&gt;
&lt;li&gt;주로 CPU 연산이 많이 필요한 작업에 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파티셔닝 (Partitioning):&lt;/b&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;li&gt;주로 데이터베이스나 파일 등에서 가져온 데이터를 특정 기준에 따라 분할하여 처리합니다.&lt;/li&gt;
&lt;li&gt;I/O 바운드 작업에서 성능 향상을 가져올 수 있습니다.&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;&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;멀티 스레딩은 주로 CPU 연산이 많은 작업에서 성능을 향상시키는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;파티셔닝은 데이터를 병렬로 처리하여 I/O 바운드 작업에서 성능을 향상시키는 데 사용됩니다.&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;멀티 스레딩은 하나의 작업을 여러 스레드로 분할하여 처리합니다.&lt;/li&gt;
&lt;li&gt;파티셔닝은 데이터를 여러 파티션으로 나누어 독립적으로 처리합니다.&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;멀티 스레딩은 작업 간에 종속성이 있을 수 있습니다.&lt;/li&gt;
&lt;li&gt;파티셔닝은 각 파티션 간에 독립적이므로 작업 간에 종속성이 적습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 트랜지션 관리를 왜 청크 단위로 하는지 설명해주세요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;청크 단위로 트랜잭션을 관리하면 데이터베이스 부하를 최소화하면서 대용량 데이터 처리가 가능하며, 실패 시 롤백을 효과적으로 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. reader, processor, writer 의 차이는 무엇인가요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 잡의 핵심 구성 요소 중 하나로, 데이터를 읽는 리더, 가공하는 프로세서, 결과를 쓰는 라이터의 세 가지 구성 요소를 가집니다.&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;리더 (Reader):&lt;/b&gt; 데이터를 읽어오는 역할을 수행합니다. 데이터는 파일, 데이터베이스, 메시지 큐 등 다양한 소스에서 읽을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로세서 (Processor):&lt;/b&gt; 리더에서 읽어온 데이터를 가공하거나 변환하는 역할을 합니다. 이 부분은 선택적으로 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;라이터 (Writer):&lt;/b&gt; 최종 결과를 어떤 형태로 저장할지 정하는 역할을 합니다. 데이터베이스에 저장하거나 파일로 출력할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. 커서 기반 대 페이징 기반의 차이점은 무엇인가요?&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;&lt;b&gt;커서 기반 (Cursor-based):&lt;/b&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;li&gt;작업이 시작되면 데이터베이스에서 커서를 열고, 한 번에 모든 데이터를 가져오게 됩니다.&lt;/li&gt;
&lt;li&gt;주로 작은 규모의 데이터에 적합하며, 대용량 데이터의 경우 메모리 부족 문제가 발생할 수 있습니다.&lt;/li&gt;
&lt;li&gt;커넥션을 한번 연결해놓고 데이터를 계속 끌어오기때문에 속도가 빠른 편입니다.&lt;/li&gt;
&lt;li&gt;다만... reader 에서 커서로 오픈해놓은 상태의 데이터에 대해 writer 에서 udpate 칠 경우 오류가 날 수 있으므로 주의가 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;페이징 기반 (Paging-based):&lt;/b&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;li&gt;한 번에 작은 양의 데이터만 읽어오므로 메모리 부하가 상대적으로 적습니다.&lt;/li&gt;
&lt;li&gt;데이터베이스에서 특정 범위의 데이터만 가져오기 때문에 전체 데이터를 읽는 것보다 효율적입니다.&lt;/li&gt;
&lt;li&gt;일반적으로 페이지가 시작되는 id 값을 where 절에 추가하여 조회 속도를 높입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. 배치 실행은 어떻게 하는지 설명해주세요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 실행은 스케줄러를 통해 주기적으로 실행하거나, 필요한 시점에 젠킨스를 통해 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10. 지연되는 배치 잡은 어떻게 모니터링하나요?&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;배치 잡이 예상보다 오래 걸리는 경우 또는 일반적인 실행 시간과 비교해 더 오랜 시간이 소요되는 경우, 지연된 배치 잡을 모니터링해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모니터링 방법:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;로그 분석:&lt;/b&gt; 배치 잡의 로그를 상세히 분석하여 어떤 부분에서 시간이 소요되는지 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 모니터링 도구 사용:&lt;/b&gt; 서버 및 데이터베이스의 성능을 모니터링하는 도구를 활용하여 병목 현상이나 성능 이슈를 파악합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스케줄러 설정 확인:&lt;/b&gt; 잡이 실행되는 스케줄러의 설정을 확인하여 예상 시간과 일치하는지 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존 잡 확인:&lt;/b&gt; 현재 실행 중인 잡이 다른 잡에 의존하는 경우, 의존 잡이 끝나길 기다리는 경우가 있을 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연의 원인을 파악한 후, 해당 문제에 대한 조치를 취합니다. 이는 데이터베이스 인덱스 최적화, 쿼리 튜닝, 잡의 병렬 처리 등의 방법을 포함할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연이 예상 범위 내에 있다면 잡이 정상적으로 실행 중임을 감안하고 추가적인 모니터링을 진행하거나 알림을 설정합니다&lt;/p&gt;</description>
      <category>Backend/Spring</category>
      <category>Batch 면접</category>
      <category>spring batch</category>
      <category>기술면접</category>
      <category>대용량 데이터처리</category>
      <category>면접준비</category>
      <category>배치프레임워크</category>
      <category>백엔드개발자</category>
      <category>스프링</category>
      <category>스프링배치</category>
      <category>자바</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/158</guid>
      <comments>https://chung-develop.tistory.com/158#entry158comment</comments>
      <pubDate>Tue, 12 Dec 2023 23:18:13 +0900</pubDate>
    </item>
    <item>
      <title>[SQL]GroupBy를 이용하여 중복값 카운팅하기</title>
      <link>https://chung-develop.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 데이터 집계나 중복데이터 확인을 위해 중복값을 찾아야 하는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(가장 흔한 경우로는 회원가입시 동일한 id 로 가입을 막기위해 id 중복확인 같은 기능이 있을 것 같다)&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;(mysql 기준인데 각자 db 에 맞게 변형하면 될듯하다)&lt;/p&gt;
&lt;pre id=&quot;code_1699190124260&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 중복값 체크할 컬럼명,
       count(*)
FROM 테이블명
WHERE where조건
GROUP BY 중복값체크할컬럼명
HAVING count(중복값 체크할 컬럼명)&amp;gt;1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>에러해결 &amp;amp; 최적화/DB</category>
      <category>mysql</category>
      <category>mysql 중복</category>
      <category>sql</category>
      <category>SQL GROUP BY</category>
      <category>sql 중복</category>
      <category>sql 중복값</category>
      <category>sql 중복값 추출 쿼리</category>
      <category>중복 쿼리</category>
      <category>중복값 검증</category>
      <category>중복값 추출</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/157</guid>
      <comments>https://chung-develop.tistory.com/157#entry157comment</comments>
      <pubDate>Sun, 5 Nov 2023 22:16:58 +0900</pubDate>
    </item>
    <item>
      <title>[해결]Error Code: 1227. Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation</title>
      <link>https://chung-develop.tistory.com/156</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 에서 RDS 서비스 이용중에 아래와 같은 에러가 발생할 수 있다&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;Error Code: 1227. Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation&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;p data-ke-size=&quot;size16&quot;&gt;log_bin_trust_function_creators&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 파라미터 값을 1로 바꾼다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oe8m9/btszJZfV4AS/ImbK8hPKMkApjYKh7cJTv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oe8m9/btszJZfV4AS/ImbK8hPKMkApjYKh7cJTv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oe8m9/btszJZfV4AS/ImbK8hPKMkApjYKh7cJTv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOe8m9%2FbtszJZfV4AS%2FImbK8hPKMkApjYKh7cJTv1%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;2000&quot; height=&quot;1101&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1101&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Cannot modify a default parameter group 이라면서 빨간거 뜨는 경우가 있는데 기본적으로 RDS의 default parameter group은 수정이 안된다. 새로운 그룹을 만들어서 적용하자&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;적용이 끝나면 적용할 RDS 로 가서 수정 을 누르고 파라미터 그룹 적용을 바꿔주자&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-origin-width=&quot;2000&quot; data-origin-height=&quot;1132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca6uLP/btszKb79Aa9/pCVAeqqPCupRLvaKBU9Ot0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca6uLP/btszKb79Aa9/pCVAeqqPCupRLvaKBU9Ot0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca6uLP/btszKb79Aa9/pCVAeqqPCupRLvaKBU9Ot0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca6uLP%2FbtszKb79Aa9%2FpCVAeqqPCupRLvaKBU9Ot0%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;2000&quot; height=&quot;1132&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1132&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;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;나의 경우에는 이렇게 해서 해결이 되었는데&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://repost.aws/ko/knowledge-center/definer-error-mysqldump&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://repost.aws/ko/knowledge-center/definer-error-mysqldump&lt;/a&gt;&lt;/p&gt;</description>
      <category>DevOps/AWS</category>
      <category>Access denied</category>
      <category>AWS RDS</category>
      <category>aws rds 오류</category>
      <category>Error Code: 1227</category>
      <category>Error Code: 1227. Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation</category>
      <category>RDS</category>
      <category>RDS 권한오류</category>
      <category>RDS 오류</category>
      <category>you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation</category>
      <category>권한오류</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/156</guid>
      <comments>https://chung-develop.tistory.com/156#entry156comment</comments>
      <pubDate>Sun, 5 Nov 2023 22:09:41 +0900</pubDate>
    </item>
    <item>
      <title>Mysql 현재 실행중인 쿼리 확인하기</title>
      <link>https://chung-develop.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Mysql에서 가끔 커넥션이 부족하거나 내가 날린 쿼리가 너무 느려서 잘 실행되고 있는지 확인하고 싶을때가 있습니다.&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;MySQL에서 현재 실행 중인 쿼리를 확인하려면 다음 명령어를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 콘솔 또는 클라이언트에서 다음과 같이 입력하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699023438386&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW FULL PROCESSLIST;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;46bf7aca-fed7-4912-a263-ab0307152a56&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컬럼의 의미와 예시를 아래에 설명합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Id: 각 실행 중인 쿼리의 고유 식별자입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: 1, 2, 3, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;User: 쿼리를 실행하는 MySQL 사용자의 이름입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: root, myuser, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Host: MySQL에 연결한 호스트 또는 IP 주소입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: localhost, 192.168.1.100, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;db: 현재 쿼리가 실행 중인 데이터베이스의 이름입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: mydb, testdb, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Command: 현재 실행 중인 쿼리의 MySQL 명령 유형입니다. 예를 들어, SELECT, UPDATE, INSERT 등이 될 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: Query, Sleep, Connect, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Time: 쿼리가 실행된 시간(초)입니다. 이 값은 쿼리의 실행 시간을 나타냅니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: 5, 10, 30, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;State: 쿼리의 현재 상태를 설명하는 문자열입니다. 쿼리가 어떤 작업을 수행하고 있는지를 나타냅니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: Sending data, Copying to tmp table, Locked, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Info: 쿼리에 대한 자세한 정보 또는 SQL 문 자체를 포함할 수 있는 필드입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: SELECT * FROM customers WHERE age &amp;gt; 30, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;이러한 정보는 MySQL 서버에서 실행 중인 모든 쿼리를 모니터링하고 성능 문제를 진단하는 데 유용합니다. 예를 들어, 어떤 쿼리가 더 오래 걸리는지 확인하거나, 어떤 쿼리가 블로킹 상태에 있는지 확인하는 데 사용할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>에러해결 &amp;amp; 최적화/DB</category>
      <category>sql 쿼리 상태</category>
      <category>sql 쿼리 확인</category>
      <category>sql 쿼리튜닝</category>
      <category>sql쿼리 확인</category>
      <category>슬로우쿼리 확인</category>
      <category>실행중인 쿼리</category>
      <category>쿼리 확인</category>
      <category>쿼리상태</category>
      <category>현재 실행중인 쿼리</category>
      <category>현재실행중인쿼리</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/155</guid>
      <comments>https://chung-develop.tistory.com/155#entry155comment</comments>
      <pubDate>Fri, 3 Nov 2023 23:59:38 +0900</pubDate>
    </item>
    <item>
      <title>[쿼리튜닝]where문에 cast를 쓰면 안되는 이유</title>
      <link>https://chung-develop.tistory.com/154</link>
      <description>&lt;div&gt;
&lt;div data-message-id=&quot;710c7fe8-bbd1-4608-8884-79071b4a48a4&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 조건절에서 컬럼에 캐스팅을 사용하면 성능에 영향을 미치는 이유는 다음과 같습니다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 인덱스 활용 어려움&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐스팅을 통해 컬럼의 데이터 형식이 변경되면, 해당 컬럼에 대한 인덱스 활용이 제한됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 원본 데이터 형식을 기반으로 작성되며, 캐스팅을 적용하면 인덱스가 효과적으로 활용되지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 조건 검색 시 성능 저하가 발생할 수 있습니다.&lt;/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;&lt;b&gt;2. 풀 스캔 필요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐스팅을 사용하면 데이터베이스 시스템은 모든 레코드를 순회하여 조건을 충족하는 레코드를 찾아야 합니다. 이는 &quot;풀 스캔&quot;이라고 알려져 있으며, 데이터베이스 성능을 저하시키는 주요 원인 중 하나입니다. 특히 대용량 테이블에서 더 큰 문제가 발생할 수 있습니다.&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;&lt;b&gt;3. 타입 불일치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>에러해결 &amp;amp; 최적화/DB</category>
      <category>cast</category>
      <category>sql 쿼리 성능</category>
      <category>sql 쿼리튜닝</category>
      <category>sql 튜닝방법</category>
      <category>sql쿼리 튜닝</category>
      <category>대용량쿼리</category>
      <category>슬로우쿼리</category>
      <category>슬로우쿼리 튜닝</category>
      <category>조건절 cast</category>
      <category>쿼리튜닝</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/154</guid>
      <comments>https://chung-develop.tistory.com/154#entry154comment</comments>
      <pubDate>Fri, 3 Nov 2023 23:50:36 +0900</pubDate>
    </item>
    <item>
      <title>Thymeleaf로 Ajax요청보내기</title>
      <link>https://chung-develop.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Thymeleaf를 사용하여 AJAX 요청을 보내는 방법에 대해 적어보려고 합니다.&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;의존성 추가&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 spring-web과 thymeleaf 의존성을 프로젝트에 추가해야 합니다. Maven을 사용한다면 다음과 같이 의존성을 추가하세요&lt;/p&gt;
&lt;pre id=&quot;code_1698763873726&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&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;b&gt;2. Thymeleaf 페이지 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분에서는 Thymeleaf를 사용하여 AJAX 요청을 보낼 페이지를 생성하는 방법을 설명하겠습니다. 이 페이지를 통해 사용자가 AJAX 요청을 시작할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 프로젝트의 src/main/resources/templates 폴더 (또는 해당하는 Thymeleaf 템플릿 폴더) 내에 Thymeleaf 템플릿 파일을 생성합니다. 이 파일을 &quot;ajax-example.html&quot;이라고 가정하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &quot;ajax-example.html&quot;의 예시 코드입니다&lt;/p&gt;
&lt;pre id=&quot;code_1698764108683&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;AJAX 예제 페이지&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Thymeleaf AJAX 예제 페이지&amp;lt;/h1&amp;gt;
    
    &amp;lt;button id=&quot;ajaxButton&quot;&amp;gt;AJAX 요청 보내기&amp;lt;/button&amp;gt;
    
    &amp;lt;div id=&quot;resultDiv&quot;&amp;gt;요청 결과: &amp;lt;/div&amp;gt;
    
    &amp;lt;!-- AJAX 요청을 처리할 JavaScript 코드 --&amp;gt;
    &amp;lt;script th:inline=&quot;javascript&quot;&amp;gt;
        $(document).ready(function() {
            $('#ajaxButton').click(function() {
                // AJAX 요청을 이곳에서 처리
            });
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;b&gt;3. 컨트롤러 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 컨트롤러를 만들어 AJAX 요청을 처리할 경로를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음과 같이 메서드를 생성합니다&lt;/p&gt;
&lt;pre id=&quot;code_1698763947854&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class AjaxController {
    @GetMapping(&quot;/ajax-example&quot;)
    public String ajaxExample(Model model) {
        return &quot;ajax-example&quot;;
    }
}&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;b&gt; 4. AJAX 요청 처리 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thymeleaf 페이지 내에서 AJAX 요청을 처리할 JavaScript를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 그 예시입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698763984589&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- ajax-example.html --&amp;gt;
&amp;lt;script th:inline=&quot;javascript&quot;&amp;gt;
    $(document).ready(function() {
        $('#ajaxButton').click(function() {
            $.ajax({
                url: '/your-ajax-endpoint', // 실제 AJAX 요청을 처리할 엔드포인트
                type: 'GET', // 또는 'POST', 요청 유형에 따라 설정
                success: function(response) {
                    $('#resultDiv').text(response); // 요청 결과를 표시할 요소
                },
                error: function() {
                    alert('에러 발생');
                }
            });
        });
    });
&amp;lt;/script&amp;gt;

&amp;lt;button id=&quot;ajaxButton&quot;&amp;gt;AJAX 요청 보내기&amp;lt;/button&amp;gt;
&amp;lt;div id=&quot;resultDiv&quot;&amp;gt;요청 결과: &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 #ajaxButton을 클릭하면 AJAX 요청이 보내지며, 결과는 #resultDiv에 표시됩니다.&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;이렇게하면 Spring Thymeleaf를 사용하여 AJAX 요청을 전송하는 간단한 예제가 준비됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예제를 기반으로 프로젝트에 적용하여 원하는 AJAX 동작을 구현하시길 바라겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Thymeleaf</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/153</guid>
      <comments>https://chung-develop.tistory.com/153#entry153comment</comments>
      <pubDate>Thu, 2 Nov 2023 08:00:31 +0900</pubDate>
    </item>
    <item>
      <title>쉽게 알아보는 Spring Thymeleaf란?</title>
      <link>https://chung-develop.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Thymeleaf는 Java와 Kotlin 개발자들에게 웹 애플리케이션 개발을 위한 강력한 도구 중 하나입니다.&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;Spring Thymeleaf이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Thymeleaf는 Spring Framework와 Thymeleaf 템플릿 엔진의 통합을 제공하는 라이브러리입니다. 이것은 웹 애플리케이션의 사용자 인터페이스를 구축하고 관리하는 데 매우 유용합니다. Thymeleaf는 HTML을 템플릿으로 사용하며, 서버 측 및 클라이언트 측 렌더링을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Spring Thymeleaf의 주요 특징&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Thymeleaf 템플릿 엔진&lt;/b&gt;: Thymeleaf는 HTML을 기반으로 하는 템플릿 엔진으로, 자연스럽게 HTML 문서와 통합됩니다. 이것은 개발자들이 간단하게 템플릿을 작성하고 유지 관리할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spring Framework 통합&lt;/b&gt;: Spring Thymeleaf는 Spring Framework와 통합되어 있으며, Spring의 다양한 기능과 함께 사용할 수 있습니다. 이것은 의존성 주입, AOP, 보안, 데이터 액세스, 백엔드 로직과의 효율적인 통합을 가능하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로세스 변수 사용&lt;/b&gt;: Thymeleaf는 컨트롤러에서 전달한 데이터를 템플릿에서 쉽게 사용할 수 있도록 지원합니다. 이를 통해 동적인 웹 페이지를 생성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTML5 및 CSS3 지원&lt;/b&gt;: Spring Thymeleaf는 최신 웹 기술 표준을 준수하며, HTML5 및 CSS3와의 통합을 강화합니다. 이것은 멋진 사용자 경험을 제공하는 데 도움이 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다국어 지원&lt;/b&gt;: 다국어 웹 애플리케이션을 개발할 때 Spring Thymeleaf는 다양한 언어 및 로케일에 대한 지원을 제공합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Spring Thymeleaf 사용예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller 코드&lt;/p&gt;
&lt;pre id=&quot;code_1698763392695&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class MyController {

    @GetMapping(&quot;/hello&quot;)
    public String hello(Model model) {
        model.addAttribute(&quot;message&quot;, &quot;안녕하세요, Spring Thymeleaf!&quot;);
        return &quot;hello&quot;;
    }
}&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;Html 코드&lt;/p&gt;
&lt;pre id=&quot;code_1698763429494&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;환영합니다&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1 th:text=&quot;${message}&quot;&amp;gt;환영합니다&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용은 간단한 Spring Thymeleaf 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러는 &quot;hello&quot; 페이지로 메시지를 전달하고, Thymeleaf 템플릿에서 이 메시지를 출력합니다.&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Thymeleaf</category>
      <category>Java 웹 프로그래밍</category>
      <category>Spring Framework</category>
      <category>Spring Thymeleaf</category>
      <category>Thymeleaf 예제</category>
      <category>서버 사이드 렌더링</category>
      <category>웹 개발</category>
      <category>웹 애플리케이션 개발</category>
      <category>웹 페이지 디자인</category>
      <category>타임리프</category>
      <category>프론트엔드 템플릿</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/152</guid>
      <comments>https://chung-develop.tistory.com/152#entry152comment</comments>
      <pubDate>Wed, 1 Nov 2023 08:00:49 +0900</pubDate>
    </item>
    <item>
      <title>인덱스 설계를 통한 쿼리속도 튜닝하기</title>
      <link>https://chung-develop.tistory.com/151</link>
      <description>&lt;div&gt;
&lt;div data-message-id=&quot;ceae3fa6-89bb-4e34-aa38-9749f0944e3c&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 데이터베이스 성능을 향상시키고 쿼리 속도를 향상시키는 중요한 역할을 합니다. 인덱스를 설계할때 주의할 점에 대해 짚어보겠습니다.&lt;/p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;p data-ke-size=&quot;size16&quot;&gt;가장 뻔한 이야기긴 하지만 인덱스를 설계할 때, 자주 사용되는 열을 선택적으로 인덱싱해야 합니다. 불필요한 인덱스는 성능 저하의 원인이 될 수 있습니다.&lt;/p&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 style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;나쁜 예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;좋은 예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span&gt;&lt;span&gt;모든 열에 인덱스를 추가하면 인덱스 크기가 커져 디스크 공간 낭비와 성능 저하 발생 가능.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span&gt;&lt;span&gt;주문 테이블에서 주문일자 열에만 인덱스를 추가하면 주문일자로의 검색에 최적화.&lt;/span&gt;&lt;/span&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;b&gt;2. 복합 인덱스 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복합 인덱스는 여러 열을 함께 인덱싱하는 것으로, 여러 조건을 동시에 사용하는 쿼리를 최적화할 수 있습니다.&lt;/p&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 style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;나쁜 예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;좋은 예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span&gt;각각 단일 열에 별도의 인덱스 생성 &lt;br /&gt;=&amp;gt; &lt;span&gt;이름 열과 성별 열에 각각 단일 인덱스를 만들 경우, 복합 검색 성능이 저하.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span&gt;&lt;span&gt;이름과 성별 열을 복합 인덱스로 만들면 이름과 성별로의 검색에 효과적일수 있음&lt;/span&gt;&lt;/span&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;b&gt;3. 인덱스 크기 고려&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 크기가 크면 디스크 공간을 차지하고 I/O 비용을 증가시킬 수 있습니다. 필요한 열만 인덱싱해야 합니다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 30px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 30px;&quot;&gt;&lt;b&gt;나쁜 예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 30px;&quot;&gt;&lt;b&gt;좋은 예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;&lt;span&gt;긴 텍스트 열에 전체 텍스트 인덱스 생성&lt;br /&gt;&lt;/span&gt;=&amp;gt; 전체 텍스트 인덱스를 만들면 인덱스 크기가 매우 커져서 성능에 좋지않음&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;긴 텍스트열에서 자주 검색이 필요한 부분을 가공하여 저장 후 인덱스 생성 &lt;br /&gt;&lt;br /&gt;긴 문자에 대한 검색이 꼭 필요한 경우에는 인덱스가 아닌 elastic search 와 같이 다른 방법을 고려해보는 것이 좋을 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 인덱스 유형 선택&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;MySQL은 다양한 인덱스 유형(B-tree index, hash index...)을 지원하며, 데이터의 특성에 따라 적절한 인덱스를 선택해야 합니다.&lt;/li&gt;
&lt;li&gt;인덱스 유형에 대한 설명을 보고싶다면 아래 접은 글 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해시 인덱스 (Hash Index)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 인덱스는 빠른 검색을 제공하는 데 사용되는 인덱스 유형입니다. 해시 함수를 사용하여 데이터를 해시값으로 변환하고 해당 해시값을 기반으로 데이터를 저장 및 검색합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;빠른 검색:&lt;/b&gt; 해시 인덱스는 일반적으로 빠른 검색을 제공하며, 데이터베이스 테이블의 크기에 관계없이 일정한 검색 속도를 유지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;등값 검색:&lt;/b&gt; 해시 인덱스는 등값 검색 (Equality Search)에 효과적이며, 주로 식별자와 같이 유일한 값을 검색하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해시 충돌:&lt;/b&gt; 해시 충돌이 발생할 수 있으며, 두 개 이상의 데이터가 같은 해시값을 가질 때 문제가 될 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 테이블에서 사용자 ID에 대한 해시 인덱스를 생성하고, 특정 사용자를 ID를 기반으로 검색할 때 빠른 검색 제공.&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;b&gt;B-트리 인덱스 (B-Tree Index)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-트리(균형 트리) 인덱스는 데이터를 정렬된 트리 구조로 저장하는 인덱스 유형입니다. B-트리는 많은 데이터베이스 관리 시스템에서 기본 인덱스 유형으로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;범위 검색:&lt;/b&gt; B-트리 인덱스는 범위 검색 (Range Search)에 효과적이며, 정렬된 데이터에서 범위를 검색할 때 유용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;균형된 트리:&lt;/b&gt; B-트리는 균형된 트리 구조로 데이터를 저장하므로 검색과 삽입이 균형적으로 이루어집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인덱스 크기:&lt;/b&gt; B-트리 인덱스는 해시 인덱스보다 크기가 크며, 디스크 공간을 더 차지합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주문 테이블에서 주문 일자에 대한 B-트리 인덱스를 생성하고 특정 기간 내의 주문을 검색할 때 효과적으로 범위 검색을 수행.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;해시 인덱스는 빠른 등값 검색에 유용하며 해시 충돌에 주의해야 합니다.&lt;/li&gt;
&lt;li&gt;B-트리 인덱스는 범위 검색과 정렬된 데이터에 효과적이며 인덱스 크기가 크다는 점에 주의해야 합니다.&lt;/li&gt;
&lt;li&gt;데이터베이스의 사용 사례와 쿼리 패턴에 따라 해시 인덱스 또는 B-트리 인덱스를 선택해야 합니다.&lt;/li&gt;
&lt;/ul&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 style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;나쁜 예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span&gt;&lt;span&gt;정렬된 열에 해시 인덱스를 사용하면 범위 검색 시 성능 저하.&lt;/span&gt;&lt;/span&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;b&gt;5. 인덱스의 순서 고려:&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;인덱스의 열 순서는 중요합니다. 쿼리의 조건에 따라 가장 선택적인 열을 앞에 두는 것이 효과적일 수 있습니다.&lt;/li&gt;
&lt;li&gt;인덱스 탐색시 인덱스 순서에 따라 스캔할 데이터 범위를 좁히는 방식으로 동작하므로 가장 앞에 스캔범위를 줄일 수 있는 컬럼을 넣는것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 116px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;나쁜 예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 96px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 96px;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;복합 인덱스 순서를 역으로 생성하면 사용하는 쿼리 성능 저하.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;=&amp;gt; (고객 ID, 주문일자) 또는 (고객ID)로 검색하는 경우인데 (주문일자, 고객 ID) 로 인덱스를 만들어놓으면 비효율적&lt;br /&gt;&lt;br /&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;b&gt;6. 주기적인 인덱스 최적화:&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;테이블에 적재된 데이터 성격과 상황, 쿼리에 따라 옵티마이저가 설정하는 실행계획이 달라지는 경우가 있습니다.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. 테스트와 성능 모니터링:&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;인덱스를 설계한 후에는 실제 데이터로 테스트하고 성능을 모니터링하여 조정이 필요한 경우 적절히 대응해야 합니다.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. SQL 쿼리 작성 최적화:&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;인덱스를 활용하기 위해 SQL 쿼리를 최적화해야 합니다. 불필요한 조인, 서브쿼리, 데이터 형변환을 피해야 합니다.&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4854979689590425&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-format=&quot;autorelaxed&quot; data-ad-client=&quot;ca-pub-4854979689590425&quot; data-ad-slot=&quot;1930638191&quot;&gt;&lt;/ins&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&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;데이터의 특성과 쿼리 패턴을 고려하여 최상의 성능을 얻을 수 있는 인덱스를 설계하고 유지 보수해야 합니다.&lt;/p&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 class=&quot;notranslate&quot; style=&quot;all: initial;&quot;&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>에러해결 &amp;amp; 최적화/DB</category>
      <category>index 생성방법</category>
      <category>index 쿼리튜닝</category>
      <category>mysql index</category>
      <category>sql 여러정보 조회시</category>
      <category>sql 쿼리튜닝</category>
      <category>sql튜닝방법</category>
      <category>인덱스 설계</category>
      <category>조회속도 느림</category>
      <category>조회속도 튜닝</category>
      <category>쿼리튜닝</category>
      <author>Chung-A</author>
      <guid isPermaLink="true">https://chung-develop.tistory.com/151</guid>
      <comments>https://chung-develop.tistory.com/151#entry151comment</comments>
      <pubDate>Tue, 31 Oct 2023 21:44:38 +0900</pubDate>
    </item>
  </channel>
</rss>