<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>super.SHY();</title>
    <link>https://learn-run.tistory.com/</link>
    <description>하루의 배움(1)이 깊어지고(2), 
쌓여서(3), 단단한 자산(4)이 되는 과정. 
시간의 밀도를 기록하는 개발자 Serena입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 16:09:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>this.Serena</managingEditor>
    <image>
      <title>super.SHY();</title>
      <url>https://tistory1.daumcdn.net/tistory/3410189/attach/a40718bcd5b14eb38b59d18394b863e2</url>
      <link>https://learn-run.tistory.com</link>
    </image>
    <item>
      <title>[TIL] Day 107 &amp;mdash; 모의면접 (3/20)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-107-%E2%80%94-%EB%AA%A8%EC%9D%98%EB%A9%B4%EC%A0%91-320</link>
      <description>&lt;h1&gt;[TIL] Day 107 &amp;mdash; 모의면접 피드백 정리 (3/20)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;날짜:&lt;/b&gt; 2026-03-20&lt;br /&gt;&lt;b&gt;분류:&lt;/b&gt; &lt;code&gt;면접&lt;/code&gt; &lt;code&gt;커리어&lt;/code&gt; &lt;code&gt;취업전략&lt;/code&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;면접관이 중시하는 6대 핵심 역량&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 24px;&quot;&gt;#&lt;/th&gt;
&lt;th style=&quot;width: 184px;&quot;&gt;역량&lt;/th&gt;
&lt;th style=&quot;width: 311px;&quot;&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 184px;&quot;&gt;문제 해결 능력&lt;/td&gt;
&lt;td style=&quot;width: 311px;&quot;&gt;프로젝트에서 겪은 문제를 어떤 과정으로 해결했는지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 184px;&quot;&gt;협업 / 커뮤니케이션&lt;/td&gt;
&lt;td style=&quot;width: 311px;&quot;&gt;비개발자(고객사, 영업, 기획)와의 소통 능력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 184px;&quot;&gt;적응력 및 학습 능력&lt;/td&gt;
&lt;td style=&quot;width: 311px;&quot;&gt;도메인(업무) 지식을 얼마나 빨리 흡수할 수 있는지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 184px;&quot;&gt;기술 전문성&lt;/td&gt;
&lt;td style=&quot;width: 311px;&quot;&gt;기술 질문에 대한 정확한 답변 능력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 184px;&quot;&gt;AI 역량&lt;/td&gt;
&lt;td style=&quot;width: 311px;&quot;&gt;AI 도구 활용 및 AI 모델 연동 경험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 184px;&quot;&gt;AI 협업 관점의 기술력&lt;/td&gt;
&lt;td style=&quot;width: 311px;&quot;&gt;코드 어시스턴트 활용 시 본인의 독립적 역량 증명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;질문 유형별 답변 전략&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;어려운 문제를 해결한 경험&quot; &amp;mdash; 문제 해결력 평가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STAR 기법 변형 서사 구조&lt;/b&gt; 를 반드시 따를 것&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;① 문제 제기 (두괄식)  &amp;rarr;  &quot;프로젝트에서 OO 문제에 직면했습니다&quot;
② 원인 분석           &amp;rarr;  문제의 근본 원인이 무엇이었는지
③ 해결 과정           &amp;rarr;  구체적으로 어떤 방법/기술을 적용했는지
④ 결과                &amp;rarr;  정량적 성과 (예: 처리 속도 40% 향상, 불필요 데이터 0건)
⑤ 배운 점 (Best)      &amp;rarr;  이 경험에서 무엇을 배웠는지 &amp;larr; 여기까지 가면 최고&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;어떤 파트를 맡았는지&quot; &amp;mdash; 역할 확인&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;&quot;나는 OO 파트를 맡았습니다&quot;만 간결하게 답변&lt;/li&gt;
&lt;li&gt;맡은 역할 이상으로 문제&amp;middot;해결까지 늘어놓으면 초점이 흐려짐&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;기억에 남는 기능&quot; &amp;mdash; 기술 심화 평가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접관이 파고드는 순서:&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;어떤 파트 맡았어요?&quot;
&amp;rarr; &quot;그 파트에 이런 기능이 있을 텐데, 어떻게 개발했어요?&quot;
&amp;rarr; 기능 개발 과정 &amp;rarr; 사용한 기술 상세 질문&lt;/code&gt;&lt;/pre&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;페이징, 유효성 체크, 주소 API 같은 기본 기능은 언급하지 말 것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오픈 API 연동 &amp;middot; AI 기능 접목 &amp;middot; 대량 데이터 처리&lt;/b&gt; 관련 기능이 좋음&lt;/li&gt;
&lt;li&gt;AI가 생성한 코드라도 로직을 완전히 파악하고 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&quot;생성형 AI 대비 본인의 강점&quot; &amp;mdash; AI 시대 차별화&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;답변 방향&lt;/td&gt;
&lt;td&gt;AI는 질문에 대해서만 분석하지만, 나는 다양한 업무 경험을 바탕으로 도메인 관점에서 설명 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;핵심 보완&lt;/td&gt;
&lt;td&gt;반드시 &lt;b&gt;구체적 프로젝트 사례&lt;/b&gt;로 뒷받침해야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;어필 포인트&lt;/td&gt;
&lt;td&gt;사전 기획 연구, 벤치마킹 경험, 업무 프로세스 이해도를 사례로 제시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커뮤니케이션 관련 핵심 피드백&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비개발자와의 소통 역량&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 용어를 상대방 눈높이에 맞춰 설명하는 능력이 필요&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;❌ 나쁜 예&lt;/th&gt;
&lt;th&gt;✅ 좋은 예&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&quot;DB 쿼리문을 수정하고 DB 튜닝을 해서 속도를 40% 올렸습니다&quot;&lt;/td&gt;
&lt;td&gt;전문 용어를 최소화하고 비유&amp;middot;은유를 활용하여 비개발자가 이해할 수 있도록 설명&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;h3 data-ke-size=&quot;size23&quot;&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;b&gt;첫 문장에 핵심 메시지&lt;/b&gt; 배치&lt;/li&gt;
&lt;li&gt;AI 협업 역량 질문 예시: &quot;코드 어시스턴트와 어떻게 협업했는지&quot;를 한 문장으로 먼저 제시 &amp;rarr; 상세 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수료 후 준비 액션 리스트&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;액션 항목&lt;/th&gt;
&lt;th&gt;상세&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;핵심 기능 정리&lt;/td&gt;
&lt;td&gt;고난이도 기능의 개발 과정을 단계별로 문서화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;오픈 API 연동 경험 정리&lt;/td&gt;
&lt;td&gt;API 문서 분석 &amp;rarr; DB 설계 &amp;rarr; 데이터 적재 &amp;rarr; 스케줄러 활용 등 전 과정 설명 준비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;AI 연동 경험 확보&lt;/td&gt;
&lt;td&gt;LangChain, LangGraph, YOLO 등 AI 모델&amp;middot;오픈소스를 프로젝트에 연동하는 경험 만들기&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;문제 &amp;rarr; 원인 &amp;rarr; 해결 과정 &amp;rarr; 결과 &amp;rarr; 배운 점 흐름으로 모든 경험 재구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;생성형 AI 활용 답변 다듬기&lt;/td&gt;
&lt;td&gt;정리한 답변을 AI에게 &quot;개발자답게, 전문 용어를 적절히 섞어 재작성해 달라&quot;고 요청하여 표현 고급화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; STAR 기법으로 내 프로젝트 경험 3개 이상 재구성&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 고난이도 기능 1개 선정 후 개발 과정 단계별 문서화&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; LangChain / LangGraph 프로젝트 연동 실습&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; 비개발자 대상 기술 설명 연습 (비유&amp;middot;은유 활용)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; AI 생성 코드 검수 &amp;rarr; 로직 완전 이해 후 사용하는 습관 정착&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;size14&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이 글은 현직자 강연 청취 및 모의면접 참관을 바탕으로 개인적으로 정리한 내용입니다.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;특정 발언의 정확한 인용이 아닌, 인상 깊었던 개념을 재구성한 것임을 밝힙니다.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/97</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-107-%E2%80%94-%EB%AA%A8%EC%9D%98%EB%A9%B4%EC%A0%91-320#entry97comment</comments>
      <pubDate>Mon, 8 Jun 2026 22:01:48 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 99 &amp;mdash; LangChain RAG + OpenAI API 활용 (3/13)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-99-%E2%80%94-LangChain-RAG-OpenAI-API-%ED%99%9C%EC%9A%A9-313</link>
      <description>&lt;h1&gt;[TIL] Day 99 — LangChain RAG + OpenAI API 활용 (3/13)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-03-13&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Python&lt;/code&gt; &lt;code&gt;LangChain&lt;/code&gt; &lt;code&gt;LangGraph&lt;/code&gt; &lt;code&gt;RAG&lt;/code&gt; &lt;code&gt;FAISS&lt;/code&gt; &lt;code&gt;OpenAI API&lt;/code&gt; &lt;code&gt;Pandas&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: OpenAI API로 챗봇 개발 + LangChain 기반 RAG 구현(FAISS/PDF) + 프롬프트 엔지니어링 기법 실습&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;OpenAI API 주요 LLM 모델 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;플랫폼&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;OpenAI (GPT-4o 등)&lt;/td&gt;
&lt;td&gt;고성능, 범용&lt;/td&gt;
&lt;td&gt;유료 (API Key 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;초고속 추론, LLaMA 기반&lt;/td&gt;
&lt;td&gt;무료 티어 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;로컬 실행, 완전 오프라인&lt;/td&gt;
&lt;td&gt;무료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HuggingFace&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;hr&gt;
&lt;h2&gt;RAG (Retrieval-Augmented Generation) 구현&lt;/h2&gt;
&lt;p&gt;LLM이 답변 전 외부 지식베이스에서 관련 정보를 검색해 정확성을 높이는 패턴&lt;/p&gt;
&lt;h3&gt;FAISS를 활용한 기본 RAG&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 1. 문서 로드 &amp;amp; 청크 분할
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(documents)

# 2. 임베딩 → 벡터 DB 저장
vectorstore = FAISS.from_documents(docs, OpenAIEmbeddings())

# 3. 유사도 검색
retriever = vectorstore.as_retriever()
results = retriever.invoke(&amp;quot;호텔 체크인 시간은?&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PDF 파일 기반 RAG&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader(&amp;quot;document.pdf&amp;quot;)
pages = loader.load_and_split()&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;Pandas 핵심 문법&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pandas as pd

df = pd.read_csv(&amp;quot;sample.csv&amp;quot;)    # CSV 파일을 DataFrame으로 로드
df.columns.tolist()               # 열 이름 리스트 반환
df.head(5)                        # 상위 5행 미리보기 (기본값)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; FAISS vs ChromaDB — 벡터 DB 선택 기준 (속도 vs 영속성)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;chunk_size&lt;/code&gt; / &lt;code&gt;chunk_overlap&lt;/code&gt; 파라미터가 검색 품질에 미치는 영향&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; LangGraph로 다단계 RAG 에이전트 구현 방법&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 프롬프트 엔지니어링 기법 — Few-shot, Chain-of-Thought, ReAct&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; OpenAI API &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;max_tokens&lt;/code&gt; 파라미터 튜닝&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/96</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-99-%E2%80%94-LangChain-RAG-OpenAI-API-%ED%99%9C%EC%9A%A9-313#entry96comment</comments>
      <pubDate>Mon, 8 Jun 2026 22:00:03 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 98 &amp;mdash; 머신러닝 핵심 개념 + 데이터 흐름 정리 (3/12)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-98-%E2%80%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%9D%90%EB%A6%84-%EC%A0%95%EB%A6%AC-312</link>
      <description>&lt;h1&gt;[TIL] Day 98 — 머신러닝 핵심 개념 + 데이터 흐름 정리 (3/12)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-03-12&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Python&lt;/code&gt; &lt;code&gt;Machine Learning&lt;/code&gt; &lt;code&gt;scikit-learn&lt;/code&gt; &lt;code&gt;NumPy&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: 머신러닝 3대 학습 방식(지도/비지도/강화) + 데이터 흐름(Train→Val→Test) + 대표 알고리즘 비교 정리&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;머신러닝 3가지 학습 방식&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;학습 방식&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;대표 태스크&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;지도 학습&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Label 있는 데이터로 학습&lt;/td&gt;
&lt;td&gt;분류, 회귀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비지도 학습&lt;/strong&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;strong&gt;강화 학습&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;환경과 상호작용하며 보상 최대화&lt;/td&gt;
&lt;td&gt;게임 AI, 로봇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;데이터 흐름&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;원시 데이터 수집 → 전처리 → 특성 공학
↓
데이터 분할: Train / Validation / Test
↓
모델 학습 → 평가 → (미충족 시 재학습)
↓
성능 충족 시 최종 모델 배포&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;대표 알고리즘&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;알고리즘&lt;/th&gt;
&lt;th&gt;유형&lt;/th&gt;
&lt;th&gt;주요 용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&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;분류/회귀&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;다수 트리 앙상블(Ensemble) → 안정성 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K-Means&lt;/td&gt;
&lt;td&gt;군집화&lt;/td&gt;
&lt;td&gt;데이터를 K개 군집으로 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;평가 지표&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;분류:&lt;/strong&gt; Accuracy / Precision / Recall / F1-Score&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;회귀:&lt;/strong&gt; MSE(평균제곱오차) / MAE(평균절댓값오차)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Overfitting vs Underfitting — 원인과 해결 방법&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; scikit-learn &lt;code&gt;train_test_split&lt;/code&gt; + Cross Validation 실습&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 라벨 인코딩 — &lt;code&gt;LabelEncoder&lt;/code&gt; vs &lt;code&gt;OneHotEncoder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; NumPy 배열 &lt;code&gt;shape&lt;/code&gt; 해석 — 1D/2D/3D 차원 구조 이해&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/95</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-98-%E2%80%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%9D%90%EB%A6%84-%EC%A0%95%EB%A6%AC-312#entry95comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:59:06 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 97 &amp;mdash; Python 가상환경(venv) + LangChain 개발 환경 세팅 + 호텔 챗봇 실행 (3/11)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-97-%E2%80%94-Python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BDvenv-LangChain-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-%ED%98%B8%ED%85%94-%EC%B1%97%EB%B4%87-%EC%8B%A4%ED%96%89-311</link>
      <description>&lt;h1&gt;[TIL] Day 97 — Python 가상환경(venv) + LangChain 개발 환경 세팅 + 호텔 챗봇 실행 (3/11)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-03-11&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Python&lt;/code&gt; &lt;code&gt;uv&lt;/code&gt; &lt;code&gt;LangChain&lt;/code&gt; &lt;code&gt;FastAPI&lt;/code&gt; &lt;code&gt;venv&lt;/code&gt; &lt;code&gt;VS Code&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: AI Data 과정 첫날 — Python 패키지 관리 핵심 개념(pip/import/venv) 정리 + uv로 빠르게 LangChain 환경 세팅 후 호텔 안내 챗봇 실행&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;pip install vs import — 헷갈리는 두 개념 완벽 정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;&lt;code&gt;py -m pip install&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;import&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&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;strong&gt;터미널&lt;/strong&gt; (CMD, PowerShell)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;파이썬 코드 내부&lt;/strong&gt; 최상단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실행 주기&lt;/td&gt;
&lt;td&gt;환경 당 &lt;strong&gt;최초 1회&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스크립트 실행 시 &lt;strong&gt;매번&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 터미널에서 설치 (1회)
py -m pip install numpy pandas matplotlib seaborn&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 코드 파일에서 호출 (매번)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;Python 가상환경 (venv) — 프로젝트별 환경 분리&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;왜 필요한가?&lt;/strong&gt; 프로젝트 A는 &lt;code&gt;pandas 1.0&lt;/code&gt;, 프로젝트 B는 &lt;code&gt;pandas 2.0&lt;/code&gt;이 필요할 때&lt;br&gt;글로벌 환경에 하나만 설치하면 버전 충돌 → 가상환경으로 프로젝트별 독립 관리&lt;/p&gt;
&lt;h3&gt;핵심 워크플로우&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 생성 (프로젝트 시작 시 1회)
py -m venv venv

# 2. 활성화 (작업할 때마다)
venv\Scripts\activate
# → 터미널 앞에 (venv) 표시 확인

# 3. 패키지 설치 (반드시 활성화 상태에서!)
py -m pip install 라이브러리명

# 4. 종료
deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 주의:&lt;/strong&gt; &lt;code&gt;(venv)&lt;/code&gt; 표시 없이 &lt;code&gt;pip install&lt;/code&gt; 하면 글로벌 환경에 설치됨&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;uv — pip보다 10~100배 빠른 패키지 관리 도구&lt;/h2&gt;
&lt;p&gt;Rust로 작성된 고성능 Python 패키지 관리자. pip, pip-tools, pyenv, poetry를 하나로 통합&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Windows 설치
powershell -ExecutionPolicy ByPass -c &amp;quot;irm https://astral.sh/uv/install.ps1 | iex&amp;quot;

# 프로젝트 세팅
uv venv .venv --python 3.13        # 가상환경 생성
.venv\Scripts\activate             # 활성화
uv pip install -r requirements.txt # 일괄 설치&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;LangChain 개발 환경 구성 — requirements.txt 핵심 패키지&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;langchain                # LangChain 메인
langchain-core           # 코어 기능
langchain-community      # 커뮤니티 확장
langgraph                # 상태 기반 워크플로우
langchain-openai         # OpenAI 모델 연동
chromadb                 # 벡터 DB
fastapi==0.115.0         # API 서버
uvicorn[standard]==0.30.6 # ASGI 서버&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;버전은 실습 환경 기준으로 고정. &lt;code&gt;uv pip install -r requirements.txt&lt;/code&gt; 로 일괄 설치&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;호텔 안내 챗봇 실행&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;hotel_answer.txt&lt;/code&gt; 파일을 참조해 질문에 답변하는 간단한 RAG 챗봇&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# FastAPI 서버 실행
uvicorn main:app --reload
# → http://127.0.0.1:8000 에서 챗봇 확인&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;uv&lt;/code&gt; vs &lt;code&gt;pip&lt;/code&gt; — 대규모 프로젝트에서 속도 차이 벤치마크&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;requirements.txt&lt;/code&gt; vs &lt;code&gt;pyproject.toml&lt;/code&gt; — 현대적인 Python 프로젝트 구성&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; LangChain &lt;code&gt;LCEL(LangChain Expression Language)&lt;/code&gt; 기본 문법&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; FastAPI &lt;code&gt;@app.post&lt;/code&gt; 라우터와 Pydantic 모델 연동&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; ChromaDB에 문서를 임베딩하고 검색하는 RAG 기본 흐름&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/94</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-97-%E2%80%94-Python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BDvenv-LangChain-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-%ED%98%B8%ED%85%94-%EC%B1%97%EB%B4%87-%EC%8B%A4%ED%96%89-311#entry94comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:58:16 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 80 &amp;mdash; 특강: AI 시대 개발자 취업 전략 (2/10)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-80-%E2%80%94-%ED%8A%B9%EA%B0%95-AI-%EC%8B%9C%EB%8C%80-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85-%EC%A0%84%EB%9E%B5-210</link>
      <description>&lt;h1&gt;[TIL] Day 80 — 특강: AI 시대 개발자 취업 전략 (2/10)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-02-10&lt;br&gt;&lt;strong&gt;분류:&lt;/strong&gt; &lt;code&gt;특강&lt;/code&gt; &lt;code&gt;취업전략&lt;/code&gt; &lt;code&gt;커리어&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: IT 채용 기준 변화 + AI 시대 신입 개발자 생존 전략 + 포트폴리오·면접 대비 핵심 정리&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;IT 업계의 변화&lt;/h2&gt;
&lt;p&gt;현재 시장이 요구하는 개발자상:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;풀스택, AI 활용, 클라우드 이해와 경험을 갖춘 &lt;strong&gt;도메인 해결사&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;단순 코드 작성자가 아닌 &lt;strong&gt;아키텍처 설계 역량&lt;/strong&gt; 보유자&lt;/li&gt;
&lt;li&gt;평가 지표 변화: 코딩 테스트(알고리즘) → &lt;strong&gt;시스템 설계 · 코드 리뷰 · AI 협업 능력&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;AI 시대 개발자의 당면 과제&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;직면한 문제&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI로 산출 능력은 향상됐지만, &lt;strong&gt;유지보수·버그 대응 능력은 저하&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;신규 개발자의 실질 역량 저하 심화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;대비 방안&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현장 업무 프로세스 파악&lt;/li&gt;
&lt;li&gt;분석 · 기획 · 설계 경험 축적&lt;/li&gt;
&lt;li&gt;개발 트렌드 신속 파악&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI 활용 원칙&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI에 &lt;strong&gt;의존&lt;/strong&gt;이 아닌 AI &lt;strong&gt;활용&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;2~3일 내 과제 완성 필수&lt;/li&gt;
&lt;li&gt;AI를 도구 삼아 고객 니즈 파악 및 문제 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;채용 기준의 변화&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;기존&lt;/th&gt;
&lt;th&gt;현재&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;개발 역량 비중&lt;/td&gt;
&lt;td&gt;~60%&lt;/td&gt;
&lt;td&gt;20~30%&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;strong&gt;검수·리뷰&lt;/strong&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;시스템 설계, 코드 리뷰, AI 협업 능력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;신입에게 필요한 역량 4대 축&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. AI-Native 개발 역량 (AI 리터러시)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코드 작성 → 코드 &lt;strong&gt;검수·리뷰&lt;/strong&gt; 능력으로 전환&lt;/li&gt;
&lt;li&gt;프롬프트 역량 자체는 줄어들 것. 단, &lt;strong&gt;관련 로직·UI 지식 + 도메인 정보&lt;/strong&gt;를 적용한 지시 능력 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 도메인 지식&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개발하는 분야의 업무 프로세스 지식&lt;/li&gt;
&lt;li&gt;얼마나 빠르게 흡수하느냐가 핵심&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 비즈니스 문제 해결력&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;고객·고객사와의 소통 능력&lt;/li&gt;
&lt;li&gt;학원 프로젝트에서 고객사·수행사·기획사 역할 동시 수행 경험&lt;ul&gt;
&lt;li&gt;고객사: 요구사항 도출&lt;/li&gt;
&lt;li&gt;수행사: 현실 가능성 검토 및 구현&lt;/li&gt;
&lt;li&gt;기획사: 비즈니스 로직 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;팀원 의견 충돌 해결 과정도 협업 능력 증명 기회&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. 협업 능력&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI와의 협업&lt;/li&gt;
&lt;li&gt;동료 개발자와의 협업&lt;/li&gt;
&lt;li&gt;상급자와의 협업&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;현장에서 원하는 개발자&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;인성 = 업무 역량 (협업)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;잘 듣고 · 잘 이해하고 · 잘 말하면 됨&lt;/li&gt;
&lt;li&gt;업무 역량 향상 방법: &lt;strong&gt;경청 + 기록&lt;/strong&gt; → 기록한 것을 보고 질문&lt;/li&gt;
&lt;li&gt;상대가 모호하게 말해도 정확히 이해하고, 본인은 팩트 위주로 명확하게 전달&lt;/li&gt;
&lt;li&gt;겸손: &amp;#39;내가 하는 게 제일 좋다&amp;#39;는 오만함 제거. 나를 낮추는 게 아니라 &lt;strong&gt;감추는 것&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;개발 실력&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;납기일 내 산출 원칙, 프로젝트 기간 엄수&lt;/li&gt;
&lt;li&gt;성실 · 책임감 → 근태&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;역량 증명 방법&lt;/h2&gt;
&lt;h3&gt;AI 협업 도구 활용 능력&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AI Pair Programming: ChatGPT, Claude 등 다양한 LLM 서비스 적극 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프롬프트 엔지니어링 기록&lt;/strong&gt;: 언제, 어떤 페이지 개발 시, 어떤 도구에 어떤 프롬프트를 사용했는지 히스토리 관리&lt;/li&gt;
&lt;li&gt;하나의 웹 페이지 개발 시 사용한 프롬프트 통합 정리 및 지속 정제&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;포트폴리오 구조 (10장 기준)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1~2페이지&lt;/td&gt;
&lt;td&gt;프로젝트 압축 요약 (개요, 내가 맡은 파트, 기술 스택)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8~9페이지&lt;/td&gt;
&lt;td&gt;담당 내용 상세 기록 (설계 근거 + 문제 해결 과정)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;포장 스킬: 사실을 있는 그대로 쓰되, &lt;strong&gt;단어와 표현을 다듬어 임팩트 있게 표현&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;서비스 기능 개발 시 반드시 포함:&lt;ul&gt;
&lt;li&gt;어떤 오픈소스를 활용했는가&lt;/li&gt;
&lt;li&gt;왜 그 기술을 선택했는가&lt;/li&gt;
&lt;li&gt;어떤 이슈가 있었고 어떻게 해결했는가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로젝트 진행 시 관련 업체 사전 조사·연구 내용 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;필수 기술 스택&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기술&lt;/th&gt;
&lt;th&gt;우선순위&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;RAG 기반 LLM&lt;/td&gt;
&lt;td&gt;⭐ 최우선&lt;/td&gt;
&lt;td&gt;기업 AI 도입 핵심 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangChain / LangGraph&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;기업 요구 기술&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker / Kubernetes&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;데이터 파이프라인 구축 역량 증명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java + Python&lt;/td&gt;
&lt;td&gt;필수&lt;/td&gt;
&lt;td&gt;엔터프라이즈 + AI 백엔드 양쪽 대응&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;협업 · 코드 리뷰 역량&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AI가 생성한 소스를 &lt;strong&gt;직접 검수&lt;/strong&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;strong&gt;문서화 능력&lt;/strong&gt; (화면 정의서, 기능 명세서, 업무 기획서 학습)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;협업 관련 면접 답변 전략&lt;/h2&gt;
&lt;p&gt;협업 질문에는 &lt;strong&gt;협업 툴을 활용한 구체적 사례&lt;/strong&gt;로 답변&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Git 충돌 해결 예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존: 충돌 시 만나서 직접 해결&lt;/li&gt;
&lt;li&gt;개선: 머지 권한을 1명에게만 부여, 또는 다수 검수 후 머지 규정 수립&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소통 부족 개선 예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;문제: 의사소통 부족&lt;/li&gt;
&lt;li&gt;해결: Slack 도입 → 매일 이슈 공유 → 과정을 Notion에 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;면접 예상 질문 대비&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AI / 클라우드&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI·클라우드 활용 경험 및 기술&lt;/li&gt;
&lt;li&gt;서비스에 AI를 어떻게 적용했는가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;JavaScript / React&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;const&lt;/code&gt; 차이&lt;/li&gt;
&lt;li&gt;Hook이란 무엇인가&lt;/li&gt;
&lt;li&gt;상태 관리는 어떻게 했는가&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt; 함수 활용 방식&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Promise&lt;/code&gt; 객체란 무엇인가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;객체지향 언어에서 객체란 무엇인가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;데이터 중심 질문 (서비스 기반)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;그 서비스에 어떤 데이터가 필요한가&lt;/li&gt;
&lt;li&gt;데이터 타입은 무엇이고 왜 선택했는가&lt;/li&gt;
&lt;li&gt;개발 중 어떤 이슈가 있었고 어떻게 해결했는가&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;  이슈가 없었더라도 &lt;strong&gt;&amp;quot;내가 아는 지식으로 해결 방법을 제시&amp;quot;&lt;/strong&gt; 하는 방식으로 답변 준비&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;핵심 체크리스트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; AI Pair Programming 다양한 도구 경험 (ChatGPT, Claude 등)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 프롬프트 히스토리 기록 (기능별 사용 프롬프트 정리)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; RAG 기반 LLM 프로젝트 1개 이상&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Docker 경험 + 클라우드 기본 개념&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Git 협업 프로세스 구축 경험 (브랜치 전략, 머지 규정)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Slack / Notion 협업 툴 활용 사례 기록&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 오류 해결 경험 또는 해결 방법 제시 준비&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 담당 도메인 사전 조사·학습 기록&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 화면 정의서, 기능 명세서 작성 경험&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 오픈소스 직접 활용 및 코드 리뷰 경험&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/93</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-80-%E2%80%94-%ED%8A%B9%EA%B0%95-AI-%EC%8B%9C%EB%8C%80-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85-%EC%A0%84%EB%9E%B5-210#entry93comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:56:21 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 71 &amp;mdash; Spring Boot 핵심 개념 복습 (1/28)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-71-%E2%80%94-Spring-Boot-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90-%EB%B3%B5%EC%8A%B5-128</link>
      <description>&lt;h1&gt;[TIL] Day 71 — Spring Boot 핵심 개념 복습 (1/28)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-28&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;JPA&lt;/code&gt; &lt;code&gt;Spring MVC&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: 지금까지 배운 Spring Boot 전반 내용 복습 — IoC/DI, MVC 흐름, JPA 영속성 컨텍스트 재정리&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;Spring Boot 핵심 개념 복습 체크리스트&lt;/h2&gt;
&lt;h3&gt;IoC / DI (제어의 역전 / 의존성 주입)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 나쁜 예 — 강한 결합
public class OrderService {
    private MemberRepository memberRepository = new MemberRepository(); // 직접 생성
}

// 좋은 예 — DI (Spring이 주입)
@Service
@RequiredArgsConstructor
public class OrderService {
    private final MemberRepository memberRepository; // Spring이 알아서 주입
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Spring MVC 요청 처리 흐름&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;HTTP 요청
↓
DispatcherServlet (프론트 컨트롤러)
↓
HandlerMapping → 어떤 Controller?
↓
Controller → 비즈니스 로직 위임
↓
Service → Repository
↓
Model + ViewName 반환
↓
ViewResolver → Thymeleaf 템플릿
↓
HTTP 응답&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;JPA + Spring Data JPA 핵심 복습&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// Repository 인터페이스만 선언하면 구현체 자동 생성
public interface MemberRepository extends JpaRepository&amp;lt;Member, Long&amp;gt; {
    Optional&amp;lt;Member&amp;gt; findByEmail(String email); // 메서드 이름으로 쿼리 자동 생성
}&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;메서드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;INSERT or UPDATE (ID가 null이면 INSERT, 기존 엔티티면 MERGE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findById()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PK로 단건 조회, &lt;code&gt;Optional&lt;/code&gt; 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findAll()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;전체 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;@SpringBootApplication&lt;/code&gt;이 포함하는 3가지 어노테이션 역할&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;@Controller&lt;/code&gt; vs &lt;code&gt;@RestController&lt;/code&gt; 차이&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Spring Boot Auto Configuration 동작 원리&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;JpaRepository&lt;/code&gt; vs &lt;code&gt;CrudRepository&lt;/code&gt; vs &lt;code&gt;PagingAndSortingRepository&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/92</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-71-%E2%80%94-Spring-Boot-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90-%EB%B3%B5%EC%8A%B5-128#entry92comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:49:15 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 69 &amp;mdash; Querydsl 동적 쿼리 + 쇼핑몰 상품 관리 (1/26)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-69-%E2%80%94-Querydsl-%EB%8F%99%EC%A0%81-%EC%BF%BC%EB%A6%AC-%EC%87%BC%ED%95%91%EB%AA%B0-%EC%83%81%ED%92%88-%EA%B4%80%EB%A6%AC-126</link>
      <description>&lt;h1&gt;[TIL] Day 69 — Querydsl 동적 쿼리 + 쇼핑몰 상품 관리 (1/26)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-26&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;JPA&lt;/code&gt; &lt;code&gt;Querydsl&lt;/code&gt; &lt;code&gt;Thymeleaf&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: 오전 팀프로젝트 1차 발표(UseCase/ERD), 오후 Querydsl로 타입 세이프한 동적 쿼리 작성 + 쇼핑몰 상품 관리 기능 구현&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;팀프로젝트 1차 발표&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UseCase 다이어그램 + ERD 포함하여 발표&lt;/li&gt;
&lt;li&gt;다음 발표 때는 &lt;strong&gt;DB 클래스 다이어그램&lt;/strong&gt; 추가 예정&lt;/li&gt;
&lt;li&gt;이후 일정: 2월 생성형 AI 진도 → 3월 9일 2차 발표 → 3월 16일~ 3차 프로젝트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Querydsl — 타입 세이프 동적 쿼리&lt;/h2&gt;
&lt;p&gt;JPQL을 문자열이 아닌 &lt;strong&gt;Java 코드&lt;/strong&gt;로 작성 → 컴파일 타임에 오류 감지 가능&lt;/p&gt;
&lt;h3&gt;의존성 추가 (Gradle)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;implementation &amp;#39;com.querydsl:querydsl-jpa:5.0.0:jakarta&amp;#39;
annotationProcessor &amp;#39;com.querydsl:querydsl-apt:5.0.0:jakarta&amp;#39;
annotationProcessor &amp;#39;jakarta.annotation:jakarta.annotation-api&amp;#39;
annotationProcessor &amp;#39;jakarta.persistence:jakarta.persistence-api&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;빌드 시 &lt;code&gt;Q클래스&lt;/code&gt; 자동 생성 (e.g., &lt;code&gt;QItem&lt;/code&gt;, &lt;code&gt;QMember&lt;/code&gt;)&lt;/p&gt;
&lt;h3&gt;ItemRepositoryCustom + 동적 쿼리&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Repository
public class ItemRepositoryCustomImpl implements ItemRepositoryCustom {

    private final JPAQueryFactory queryFactory;

    public ItemRepositoryCustomImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List&amp;lt;Item&amp;gt; getAdminItemPage(ItemSearchDto dto, Pageable pageable) {
        QItem item = QItem.item;
        return queryFactory
            .selectFrom(item)
            .where(
                itemSellStatusEq(dto.getItemSellStatus()), // null이면 조건 무시
                searchByLike(dto.getSearchBy(), dto.getSearchQuery())
            )
            .orderBy(item.id.desc())
            .offset(pageable.getOffset())
            .limit(pageable.getPageSize())
            .fetch();
    }

    // null 반환 시 where 절에서 자동 제외
    private BooleanExpression itemSellStatusEq(ItemSellStatus status) {
        return status == null ? null : QItem.item.itemSellStatus.eq(status);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Querydsl 핵심 장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;조건절 &lt;code&gt;null&lt;/code&gt; 반환 시 자동으로 해당 조건 제외 → 깔끔한 동적 쿼리&lt;/li&gt;
&lt;li&gt;IDE 자동완성 + 컴파일 오류 감지로 JPQL 오타 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;BooleanBuilder&lt;/code&gt; vs &lt;code&gt;BooleanExpression&lt;/code&gt; — 복잡한 조건 조합 시 차이&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Querydsl &lt;code&gt;fetchResults()&lt;/code&gt;가 deprecated된 이유와 대안&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; UseCase 다이어그램 vs 시퀀스 다이어그램 — 언제 어떤 걸 써야 하는가&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; ERD에서 식별 관계 vs 비식별 관계 설계 기준&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Spring Data JPA &lt;code&gt;Specification&lt;/code&gt; vs Querydsl 비교&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의기록</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/91</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-69-%E2%80%94-Querydsl-%EB%8F%99%EC%A0%81-%EC%BF%BC%EB%A6%AC-%EC%87%BC%ED%95%91%EB%AA%B0-%EC%83%81%ED%92%88-%EA%B4%80%EB%A6%AC-126#entry91comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:48:18 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 67 &amp;mdash; JPA 영속성 컨텍스트 심화 (1/22)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-67-%E2%80%94-JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%8B%AC%ED%99%94-122</link>
      <description>&lt;h1&gt;[TIL] Day 67 — JPA 영속성 컨텍스트 심화 (1/22)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-22&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;JPA&lt;/code&gt; &lt;code&gt;Hibernate&lt;/code&gt; &lt;code&gt;영속성 컨텍스트&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: JPA 영속성 컨텍스트의 핵심 개념 — 1차 캐시, 변경 감지(Dirty Checking), 지연 로딩 동작 원리 정리&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;JPA 영속성 컨텍스트 (Persistence Context)&lt;/h2&gt;
&lt;p&gt;엔티티를 저장하는 &lt;strong&gt;논리적 공간&lt;/strong&gt;. EntityManager가 관리하는 1차 캐시 역할&lt;/p&gt;
&lt;h3&gt;엔티티 생명주기&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;비영속 (new)
↓ em.persist()
영속 (managed)    ← 1차 캐시에 저장, 변경 감지 대상
↓ em.detach() / em.clear() / em.close()
준영속 (detached) ← 컨텍스트에서 분리, 변경 감지 안 됨

영속 (managed)
↓ em.remove()
삭제 (removed)    ← DB 삭제 예약&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1차 캐시 — 같은 트랜잭션 내 DB 조회 최소화&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 첫 번째 find() → DB 쿼리 발생
Member member1 = em.find(Member.class, 1L);

// 두 번째 find() → 1차 캐시에서 반환, DB 쿼리 없음
Member member2 = em.find(Member.class, 1L);

System.out.println(member1 == member2); // true (동일 인스턴스)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;변경 감지 (Dirty Checking)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;em.update()&lt;/code&gt; 같은 메서드 없이 필드만 바꿔도 트랜잭션 커밋 시 자동으로 UPDATE 쿼리 발생&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Transactional
public void changePrice(Long itemId, int newPrice) {
    Item item = itemRepository.findById(itemId).orElseThrow();
    item.setPrice(newPrice); // 별도 save() 호출 없이 자동 반영
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;원리:&lt;/strong&gt; 영속성 컨텍스트는 엔티티를 처음 조회할 때 스냅샷을 저장&lt;br&gt;→ 커밋 시점에 현재 상태와 스냅샷 비교 → 다르면 UPDATE 쿼리 생성&lt;/p&gt;
&lt;h3&gt;지연 로딩 (Lazy Loading) 주의사항&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@OneToMany(mappedBy = &amp;quot;order&amp;quot;, fetch = FetchType.LAZY)
private List&amp;lt;OrderItem&amp;gt; orderItems; // 실제 접근 시 쿼리 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;트랜잭션 밖에서 지연 로딩된 컬렉션에 접근하면 &lt;code&gt;LazyInitializationException&lt;/code&gt; 발생&lt;br&gt;→ 해결책: &lt;code&gt;@Transactional&lt;/code&gt; 범위 안에서 처리하거나 &lt;code&gt;fetch join&lt;/code&gt; 사용&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;@Transactional(readOnly = true)&lt;/code&gt; — 읽기 전용 트랜잭션에서 Dirty Checking 비활성화 효과&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; OSIV (Open Session In View) 패턴과 그 문제점&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; N+1 문제 해결 — &lt;code&gt;fetch join&lt;/code&gt; vs &lt;code&gt;@EntityGraph&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;em.flush()&lt;/code&gt;와 &lt;code&gt;em.clear()&lt;/code&gt;를 명시적으로 사용하는 케이스&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/90</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-67-%E2%80%94-JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%8B%AC%ED%99%94-122#entry90comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:32:20 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 66 &amp;mdash; JPA 엔티티 연관관계 매핑 + Dockerfile 커스텀 이미지 빌드 (1/21)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-66-%E2%80%94-JPA-%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-Dockerfile-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C-121</link>
      <description>&lt;h1&gt;[TIL] Day 66 — JPA 엔티티 연관관계 매핑 + Dockerfile 커스텀 이미지 빌드 (1/21)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-21&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;JPA&lt;/code&gt; &lt;code&gt;Hibernate&lt;/code&gt; &lt;code&gt;Docker&lt;/code&gt; &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: JPA 양방향 연관관계 매핑과 영속성 전이 설계 원칙 + Dockerfile로 nginx/MySQL 커스텀 이미지 직접 빌드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;JPA 엔티티 연관관계 매핑&lt;/h2&gt;
&lt;h3&gt;양방향 관계 설계 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// Order.java
@Entity
@ToString(exclude = {&amp;quot;member&amp;quot;, &amp;quot;orderItems&amp;quot;}) // 순환 참조 방지
public class Order {

    @ManyToOne
    @JoinColumn(name = &amp;quot;member_id&amp;quot;)
    private Member member;

    @OneToMany(mappedBy = &amp;quot;order&amp;quot;,
        cascade = CascadeType.ALL,   // 부모 저장 시 자식도 함께
        orphanRemoval = true)        // 부모에서 제거 시 자식 DB 삭제
    @Builder.Default
    private List&amp;lt;OrderItem&amp;gt; orderItems = new ArrayList&amp;lt;&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;@ToString(exclude) — StackOverflowError 방지&lt;/h3&gt;
&lt;p&gt;양방향 관계에서 &lt;code&gt;toString()&lt;/code&gt; 호출 시 서로를 무한 참조해 스택 오버플로우 발생&lt;br&gt;→ 연관 엔티티 필드를 &lt;code&gt;exclude&lt;/code&gt;에 명시해 단순 값 필드만 출력&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@ToString(exclude = &amp;quot;orders&amp;quot;)             // Member
@ToString(exclude = {&amp;quot;member&amp;quot;, &amp;quot;orderItems&amp;quot;}) // Order
@ToString(exclude = &amp;quot;order&amp;quot;)              // OrderItem&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;cascade + orphanRemoval 조합&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;효과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CascadeType.ALL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;부모 저장/삭제 시 자식도 동일 작업 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orphanRemoval = true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;부모 컬렉션에서 제거된 자식을 DB에서도 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;두 설정을 함께 쓰면 부모 엔티티 하나로 자식 생명주기를 완전히 제어 가능&lt;/p&gt;
&lt;h3&gt;JPQL DISTINCT + ORDER BY&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Query(&amp;quot;SELECT DISTINCT o FROM Order o &amp;quot; +
       &amp;quot;WHERE o.member = :member &amp;quot; +
       &amp;quot;ORDER BY o.orderDate DESC&amp;quot;)
List&amp;lt;Order&amp;gt; findByMember(@Param(&amp;quot;member&amp;quot;) Member member);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;DISTINCT&lt;/code&gt; — 조인으로 인한 중복 제거 / &lt;code&gt;DESC&lt;/code&gt; — 최신 주문 먼저&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Dockerfile로 커스텀 이미지 빌드&lt;/h2&gt;
&lt;h3&gt;nginx Dockerfile 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;FROM nginx
COPY ./html /usr/share/nginx/html&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -t buildnginx .              # 현재 디렉터리 Dockerfile로 빌드
docker run --name mynginx -d -p 5555:80 buildnginx&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;MySQL Dockerfile (별도 파일 지정)&lt;/h3&gt;
&lt;p&gt;파일명: &lt;code&gt;MySQLDockerfile&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;FROM mysql
ENV MYSQL_ROOT_PASSWORD=1234
ENV MYSQL_DATABASE=mydb&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -f MySQLDockerfile -t buildmysql .   # -f 로 파일명 지정
docker run -d --name mysql-container -p 3306:3306 buildmysql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker build&lt;/code&gt; 핵심 옵션&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t 이름:태그&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빌드할 이미지 이름/태그 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f 파일명&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;기본 &lt;code&gt;Dockerfile&lt;/code&gt; 대신 다른 파일 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빌드 컨텍스트 (현재 디렉터리)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;@ManyToMany&lt;/code&gt;를 지양하고 중간 엔티티로 풀어야 하는 이유&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;FetchType.LAZY&lt;/code&gt; vs &lt;code&gt;EAGER&lt;/code&gt; — N+1 문제 발생 시나리오&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Dockerfile &lt;code&gt;COPY&lt;/code&gt; vs &lt;code&gt;ADD&lt;/code&gt; 차이&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;.dockerignore&lt;/code&gt; 파일로 빌드 컨텍스트 최적화&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;docker inspect 이미지명&lt;/code&gt;으로 레이어 구조 확인&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/89</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-66-%E2%80%94-JPA-%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-Dockerfile-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C-121#entry89comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:30:21 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 65 &amp;mdash; Spring Boot Validation + Docker 이미지 커밋/푸시 (1/20)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-65-%E2%80%94-Spring-Boot-Validation-Docker-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%BB%A4%EB%B0%8B%ED%91%B8%EC%8B%9C-120</link>
      <description>&lt;h1&gt;[TIL] Day 65 &amp;mdash; Spring Boot Validation + Docker 이미지 커밋/푸시 (1/20)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;날짜:&lt;/b&gt; 2026-01-20&lt;br /&gt;&lt;b&gt;기술 스택:&lt;/b&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;Bean Validation&lt;/code&gt; &lt;code&gt;Thymeleaf&lt;/code&gt; &lt;code&gt;Docker Hub&lt;/code&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 줄 요약: Bean Validation 어노테이션으로 입력값 검증 로직 구현 + Docker 이미지를 직접 만들어 Docker Hub에 배포하는 흐름 실습&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring Boot Validation &amp;mdash; 입력값 검증&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의존성 추가&lt;/h3&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-validation'&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bean Validation 주요 어노테이션&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;어노테이션&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;적용 대상&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@NotNull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;null 불허 (빈 문자열 허용)&lt;/td&gt;
&lt;td&gt;모든 타입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@NotEmpty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;null + 빈 문자열 불허&lt;/td&gt;
&lt;td&gt;String, Collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@NotBlank&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;null + 빈 문자열 + 공백만 있는 문자열 불허&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;이메일 형식 검증&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Size(min=, max=)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;문자열 길이 범위 제한&lt;/td&gt;
&lt;td&gt;String, Collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Min&lt;/code&gt; / &lt;code&gt;@Max&lt;/code&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;code&gt;@Null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;null만 허용&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;&lt;b&gt;선택 기준:&lt;/b&gt; 문자열은 &lt;code&gt;@NotBlank&lt;/code&gt; 우선 &amp;rarr; &lt;code&gt;@NotEmpty&lt;/code&gt; &amp;rarr; &lt;code&gt;@NotNull&lt;/code&gt; 순으로 엄격함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DTO에 검증 어노테이션 적용&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// MemberFormDto.java
public class MemberFormDto {

    @NotBlank(message = &quot;이름은 필수입니다&quot;)
    private String name;

    @Email(message = &quot;이메일 형식이 올바르지 않습니다&quot;)
    @NotBlank(message = &quot;이메일은 필수입니다&quot;)
    private String email;

    @Size(min = 8, max = 20, message = &quot;비밀번호는 8~20자입니다&quot;)
    private String password;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Controller에서 @Valid 사용&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// MemberController.java
@PostMapping(&quot;/new&quot;)
public String createMember(@Valid MemberFormDto dto,
                           BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return &quot;member/memberForm&quot;; // 에러 시 폼으로 돌아가기
    }
    memberService.saveMember(dto);
    return &quot;redirect:/&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포인트:&lt;/b&gt; &lt;code&gt;@Valid&lt;/code&gt; + &lt;code&gt;BindingResult&lt;/code&gt;는 항상 붙어서 선언. &lt;code&gt;BindingResult&lt;/code&gt;가 없으면 검증 실패 시 예외 발생&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker 이미지 직접 만들어서 Hub에 올리기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커스텀 이미지 생성 플로우&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 1. httpd 컨테이너 실행 (베이스)
docker run --name myhttpd -d -p 8888:80 httpd

# 2. 내 파일을 컨테이너 안에 복사
docker cp unico.html myhttpd:/usr/local/apache2/htdocs
docker cp doolys.jpg myhttpd:/usr/local/apache2/htdocs

# 3. 현재 컨테이너 상태를 이미지로 커밋
docker commit myhttpd 본인id/myhttpd:1.0

# 4. Docker Hub에 푸시
docker push 본인id/myhttpd:1.0

# 5. 다른 사람의 이미지를 바로 실행 (없으면 자동 pull)
docker run --name my -d -p 7777:80 qones/myhttpd:1.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;docker commit&lt;/code&gt; vs &lt;code&gt;Dockerfile&lt;/code&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;code&gt;commit&lt;/code&gt; &amp;rarr; 빠르고 간단, 재현성 낮음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Dockerfile&lt;/code&gt; &amp;rarr; 단계별 명시적 선언, 재현성 높음 (실무 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Thymeleaf에서 &lt;code&gt;th:errors&lt;/code&gt;로 검증 에러 메시지 표시&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;@Validated&lt;/code&gt; vs &lt;code&gt;@Valid&lt;/code&gt; 차이 (그룹 검증)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;docker commit&lt;/code&gt; 후 이미지 레이어 구조 확인 (&lt;code&gt;docker history&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Docker Hub 대신 AWS ECR에 이미지 저장하는 방법&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;BindingResult&lt;/code&gt; 에러 필드별 접근 (&lt;code&gt;getFieldError()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의기록</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/88</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-65-%E2%80%94-Spring-Boot-Validation-Docker-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%BB%A4%EB%B0%8B%ED%91%B8%EC%8B%9C-120#entry88comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:27:22 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 64 &amp;mdash; Spring Boot 4.x 쇼핑몰 프로젝트 시작 + Docker Redmine 구성 (1/19)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-64-%E2%80%94-Spring-Boot-4x-%EC%87%BC%ED%95%91%EB%AA%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91-Docker-Redmine-%EA%B5%AC%EC%84%B1-119</link>
      <description>&lt;h1&gt;[TIL] Day 64 — Spring Boot 4.x 쇼핑몰 프로젝트 시작 + Docker Redmine 구성 (1/19)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-19&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;Java 21&lt;/code&gt; &lt;code&gt;Gradle&lt;/code&gt; &lt;code&gt;MariaDB&lt;/code&gt; &lt;code&gt;H2&lt;/code&gt; &lt;code&gt;Docker&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: Spring Boot 4.0.1 + Gradle 기반 쇼핑몰 프로젝트 환경 세팅 + Docker로 Redmine-MySQL 프로젝트 관리 툴 구성&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;Spring Boot 쇼핑몰 프로젝트 환경&lt;/h2&gt;
&lt;h3&gt;실습 환경 구성 (책과 다른 최신 버전 사용)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;설정값&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Spring Boot&lt;/td&gt;
&lt;td&gt;4.0.1 (2026-01-19 기준)&lt;/td&gt;
&lt;td&gt;책은 구버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;21 (LTS)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빌드 도구&lt;/td&gt;
&lt;td&gt;Gradle&lt;/td&gt;
&lt;td&gt;책은 Maven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB (운영)&lt;/td&gt;
&lt;td&gt;MariaDB&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB (테스트)&lt;/td&gt;
&lt;td&gt;H2&lt;/td&gt;
&lt;td&gt;인메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lombok&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;h3&gt;부트캠프 DB 로드맵&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;단계&lt;/th&gt;
&lt;th&gt;DB&lt;/th&gt;
&lt;th&gt;기술 스택&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1차 팀프로젝트&lt;/td&gt;
&lt;td&gt;Oracle&lt;/td&gt;
&lt;td&gt;JSP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;강의&lt;/td&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;Spring Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2차 프로젝트&lt;/td&gt;
&lt;td&gt;MariaDB&lt;/td&gt;
&lt;td&gt;(메인)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3차 프로젝트&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;IntelliJ 프로젝트 의존성 설정&lt;/h3&gt;
&lt;p&gt;Spring Initializr 기준 추가 의존성:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lombok, Thymeleaf, Spring Boot DevTools&lt;/li&gt;
&lt;li&gt;Spring Web, Spring Data JPA&lt;/li&gt;
&lt;li&gt;MariaDB Driver, H2 Database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Security&lt;/strong&gt; (보안 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Docker 네트워크 — Redmine + MySQL 구성&lt;/h2&gt;
&lt;p&gt;Redmine은 오픈소스 프로젝트 관리 도구. Docker로 로컬에 빠르게 띄울 수 있음&lt;/p&gt;
&lt;h3&gt;1. 네트워크 생성&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create redmine000net2
docker network ls    # 생성 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. MySQL 컨테이너 실행&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --name mysql000ex13 -dit \
  --net redmine000net2 \
  -e MYSQL_ROOT_PASSWORD=1234 \
  -e MYSQL_DATABASE=redmine000db \
  -e MYSQL_USER=kun \
  -e MYSQL_PASSWORD=1234 \
  mysql:5.7&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Redmine 컨테이너 실행&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -dit --name redmine000ex14 \
  --network redmine000net2 \
  -p 8086:3000 \
  -e REDMINE_DB_MYSQL=mysql000ex13 \
  -e REDMINE_DB_DATABASE=redmine000db \
  -e REDMINE_DB_USERNAME=kun \
  -e REDMINE_DB_PASSWORD=1234 \
  redmine:latest&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 동작 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps                          # 컨테이너 실행 확인
docker logs redmine000ex14         # 초기화 로그 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;브라우저에서 &lt;a href=&quot;http://localhost:8086&quot;&gt;http://localhost:8086&lt;/a&gt; 접속&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;docker run 옵션 정리&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detached — 백그라운드 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive — 입력 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TTY — 터미널 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 8086:3000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;호스트:8086 → 컨테이너:3000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Spring Boot 4.x vs 3.x 주요 변경사항&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Gradle vs Maven — 멀티 모듈 프로젝트에서의 차이&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; MariaDB vs MySQL — 실무에서 선택 기준&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;docker logs -f&lt;/code&gt;로 실시간 로그 스트리밍&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Redmine을 팀 프로젝트 이슈 트래킹에 활용하는 방법&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/87</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-64-%E2%80%94-Spring-Boot-4x-%EC%87%BC%ED%95%91%EB%AA%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91-Docker-Redmine-%EA%B5%AC%EC%84%B1-119#entry87comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:24:03 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 63 &amp;mdash; Java Stream/Lambda + Docker WordPress 환경 구성 (1/16)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-63-%E2%80%94-Java-StreamLambda-Docker-WordPress-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1-116</link>
      <description>&lt;h1&gt;[TIL] Day 63 — Java Stream/Lambda + Docker WordPress 환경 구성 (1/16)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-16&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Java&lt;/code&gt; &lt;code&gt;Lambda&lt;/code&gt; &lt;code&gt;Stream&lt;/code&gt; &lt;code&gt;IOStream&lt;/code&gt; &lt;code&gt;Docker&lt;/code&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: Java Lambda/Stream/I/O Stream 오전 실습 + Docker 네트워크로 MySQL-WordPress 연동 환경 구성&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;Java Lambda / Stream / I/O Stream&lt;/h2&gt;
&lt;h3&gt;Stream API 핵심 패턴&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;List&amp;lt;String&amp;gt; names = List.of(&amp;quot;Alice&amp;quot;, &amp;quot;Bob&amp;quot;, &amp;quot;Charlie&amp;quot;);

// filter → map → collect
List&amp;lt;String&amp;gt; result = names.stream()
    .filter(n -&amp;gt; n.length() &amp;gt; 3)        // 3자 초과만
    .map(String::toUpperCase)           // 대문자 변환
    .collect(Collectors.toList());      // 리스트로 수집&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;I/O Stream 기본 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 파일 쓰기
try (FileWriter fw = new FileWriter(&amp;quot;output.txt&amp;quot;, StandardCharsets.UTF_8)) {
    fw.write(&amp;quot;Hello, File!&amp;quot;);
}

// 파일 읽기
try (BufferedReader br = new BufferedReader(new FileReader(&amp;quot;output.txt&amp;quot;))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;Docker 네트워크로 WordPress + MySQL 구성&lt;/h2&gt;
&lt;p&gt;컨테이너 간 통신을 위해 Docker 가상 네트워크 생성 후 같은 네트워크에 올리면 컨테이너 이름으로 서로 통신 가능&lt;/p&gt;
&lt;h3&gt;1. 네트워크 생성&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create wordpress000net1&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. MySQL 컨테이너 실행&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --name mysql000ex11 -dit \
  --net=wordpress000net1 \
  -e MYSQL_ROOT_PASSWORD=1234 \
  -e MYSQL_DATABASE=wordpress000db \
  -e MYSQL_USER=kun \
  -e MYSQL_PASSWORD=1234 \
  mysql:5.7&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. WordPress 컨테이너 실행&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --name wordpress000ex12 -dit \
  --net=wordpress000net1 \
  -p 8085:80 \
  -e WORDPRESS_DB_HOST=mysql000ex11 \
  -e WORDPRESS_DB_NAME=wordpress000db \
  -e WORDPRESS_DB_USER=kun \
  -e WORDPRESS_DB_PASSWORD=1234 \
  wordpress:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;브라우저에서 &lt;code&gt;localhost:8085&lt;/code&gt; 접속으로 WordPress 설치 화면 확인&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 포인트&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--net&lt;/code&gt; 옵션으로 같은 가상 네트워크에 참여하면 컨테이너 이름(&lt;code&gt;mysql000ex11&lt;/code&gt;)으로 DB 호스트 지정 가능&lt;/li&gt;
&lt;li&gt;포트 매핑 &lt;code&gt;-p 호스트:컨테이너&lt;/code&gt; — 호스트 8085 → 컨테이너 80&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Stream &lt;code&gt;reduce()&lt;/code&gt;, &lt;code&gt;flatMap()&lt;/code&gt;, &lt;code&gt;distinct()&lt;/code&gt; 활용 예시&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Docker bridge 네트워크 vs host 네트워크 차이&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;docker network inspect&lt;/code&gt;로 네트워크 상태 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; WordPress MySQL 버전 호환성 이슈 (&lt;code&gt;mysql:5.7&lt;/code&gt; vs 최신)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; I/O Stream vs NIO (&lt;code&gt;java.nio.file.Files&lt;/code&gt;) 성능 비교&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/86</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-63-%E2%80%94-Java-StreamLambda-Docker-WordPress-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1-116#entry86comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:19:33 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 62 &amp;mdash; Eclipse에서 Lambda 함수 실습 (1/15)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-62-%E2%80%94-Eclipse%EC%97%90%EC%84%9C-Lambda-%ED%95%A8%EC%88%98-%EC%8B%A4%EC%8A%B5-115</link>
      <description>&lt;h1&gt;[TIL] Day 62 — Eclipse에서 Lambda 함수 실습 (1/15)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2026-01-15&lt;br&gt;&lt;strong&gt;기술 스택:&lt;/strong&gt; &lt;code&gt;Java&lt;/code&gt; &lt;code&gt;Lambda&lt;/code&gt; &lt;code&gt;Eclipse&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;한 줄 요약: Eclipse 환경에서 Java Lambda 표현식 실습 진행&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;Lambda 표현식 (람다식) 기본 개념&lt;/h2&gt;
&lt;p&gt;Java 8부터 도입된 &lt;strong&gt;함수형 프로그래밍&lt;/strong&gt; 스타일. 익명 함수를 간결하게 표현하는 방법&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 기존 익명 클래스 방식
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println(&amp;quot;Hello&amp;quot;);
    }
};

// Lambda 표현식
Runnable r2 = () -&amp;gt; System.out.println(&amp;quot;Hello&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;Lambda 기본 문법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 매개변수 없음
() -&amp;gt; System.out.println(&amp;quot;Hello&amp;quot;)

// 매개변수 1개
x -&amp;gt; x * x

// 매개변수 2개
(x, y) -&amp;gt; x + y

// 블록 형태
(x, y) -&amp;gt; {
    int result = x + y;
    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;함수형 인터페이스 (Functional Interface)&lt;/h3&gt;
&lt;p&gt;Lambda를 사용하려면 &lt;strong&gt;단 하나의 추상 메서드&lt;/strong&gt;만 가진 인터페이스가 필요&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;인터페이스&lt;/th&gt;
&lt;th&gt;매개변수&lt;/th&gt;
&lt;th&gt;반환값&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Runnable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;void&lt;/td&gt;
&lt;td&gt;실행만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Supplier&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;공급자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Consumer&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;void&lt;/td&gt;
&lt;td&gt;소비자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Function&amp;lt;T,R&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BiFunction&amp;lt;T,U,R&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;T, U&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;두 인수 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;판단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;@FunctionalInterface&lt;/code&gt; 어노테이션 역할&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Stream API와 Lambda 연계 — &lt;code&gt;filter()&lt;/code&gt;, &lt;code&gt;map()&lt;/code&gt;, &lt;code&gt;collect()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Method Reference (&lt;code&gt;::&lt;/code&gt;) 문법&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Lambda에서 외부 변수 참조 시 effectively final 조건&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/85</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-62-%E2%80%94-Eclipse%EC%97%90%EC%84%9C-Lambda-%ED%95%A8%EC%88%98-%EC%8B%A4%EC%8A%B5-115#entry85comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:15:38 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Day 58 &amp;mdash; AWS Elastic Beanstalk + Docker nginx + DB 리턴 타입 설계 (1/9)</title>
      <link>https://learn-run.tistory.com/entry/TIL-Day-58-%E2%80%94-AWS-Elastic-Beanstalk-Docker-nginx-DB-%EB%A6%AC%ED%84%B4-%ED%83%80%EC%9E%85-%EC%84%A4%EA%B3%84-19</link>
      <description>&lt;h1&gt;[TIL] Day 58 &amp;mdash; AWS Elastic Beanstalk + Docker nginx + DB 리턴 타입 설계 (1/9)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;날짜:&lt;/b&gt; 2026-01-09&lt;br /&gt;&lt;b&gt;기술 스택:&lt;/b&gt; &lt;code&gt;AWS&lt;/code&gt; &lt;code&gt;Elastic Beanstalk&lt;/code&gt; &lt;code&gt;Docker&lt;/code&gt; &lt;code&gt;Spring Boot&lt;/code&gt; &lt;code&gt;Thymeleaf&lt;/code&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 줄 요약: Docker를 활용한 AWS 완전 관리형 서비스 배포 테스트 + DB 작업 시 int vs void 리턴 타입 설계 기준&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS Elastic Beanstalk 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Elastic Beanstalk&lt;/b&gt; EC2, 로드 밸런서, 오토 스케일링 등 인프라 프로비저닝을 자동화하는&lt;br /&gt;AWS의 &lt;b&gt;완전 관리형 애플리케이션 배포 서비스&lt;/b&gt;&lt;br /&gt;&amp;rarr; 인프라 직접 관리 없이 코드만 올리면 되는 PaaS 구조&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker Nginx 기본 실행&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;docker run -d -p 80:80 nginx&lt;/code&gt;&lt;/pre&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detached mode &amp;mdash; 백그라운드에서 컨테이너 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 80:80&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;호스트:80 &amp;rarr; 컨테이너:80 포트 포워딩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nginx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;실행할 Docker 이미지명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 &lt;code&gt;localhost:80&lt;/code&gt; 접속으로 nginx 동작 확인&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DB 작업 리턴 타입 설계 기준 &amp;mdash; int vs void&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;int 타입 &amp;mdash; 성공/실패 검증이 중요한 경우&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// DB에서 영향받은 row 수를 반환 (0이면 없는 데이터)
int result = memberRepository.deleteMember(memberId);
if (result == 0) {
    throw new MemberNotFoundException(&quot;존재하지 않는 회원입니다&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용 시점:&lt;/b&gt; 삭제, 수정 등 작업 성공 여부를 반드시 추적해야 하는 로직&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;void 타입 &amp;mdash; 단순 실행이 목적인 경우&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;// 반환값 체크 없이 실행만 시도
public void deleteAccessLog(long logId) {
    accessLogRepository.delete(logId);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용 시점:&lt;/b&gt; 실패해도 메인 비즈니스 로직에 큰 영향이 없는 부가 작업 (로그 삭제 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설계 진단 체크포인트&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 작업이 실패하면 사용자에게 알림이 가야 하는가?&quot;&lt;br /&gt;&amp;rarr; YES &amp;rarr; &lt;code&gt;int&lt;/code&gt; / NO &amp;rarr; &lt;code&gt;void&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;더 알아볼 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Elastic Beanstalk vs EC2 직접 배포 비교 &amp;mdash; 언제 어떤 방식을 선택해야 하는가&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Docker 이미지 생명주기 (&lt;code&gt;pull&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; &lt;code&gt;docker run -p&lt;/code&gt; 포트 포워딩 원리 이해&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Spring MyBatis에서 &lt;code&gt;int&lt;/code&gt; 리턴값을 활용한 예외 실제 코드 작성 연습&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Thymeleaf 에러 페이지 구성 방법&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>⏳ Time Log/1. One Day (Daily &amp;middot; TIL)</category>
      <category>강의노트</category>
      <category>부트캠프</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/84</guid>
      <comments>https://learn-run.tistory.com/entry/TIL-Day-58-%E2%80%94-AWS-Elastic-Beanstalk-Docker-nginx-DB-%EB%A6%AC%ED%84%B4-%ED%83%80%EC%9E%85-%EC%84%A4%EA%B3%84-19#entry84comment</comments>
      <pubDate>Mon, 8 Jun 2026 19:41:49 +0900</pubDate>
    </item>
    <item>
      <title>AI INSIGHT DAY 강연 후기 &amp;mdash; AI 시대에 회사가 원하는 개발자</title>
      <link>https://learn-run.tistory.com/entry/AI-INSIGHT-DAY-%EA%B0%95%EC%97%B0-%ED%9B%84%EA%B8%B0-%E2%80%94-AI-%EC%8B%9C%EB%8C%80%EC%97%90-%ED%9A%8C%EC%82%AC%EA%B0%80-%EC%9B%90%ED%95%98%EB%8A%94-%EA%B0%9C%EB%B0%9C%EC%9E%90</link>
      <description>&lt;h1&gt;AI 시대, 회사가 진짜 원하는 개발자는 따로 있다&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K-DT AI INSIGHT DAY 현직자 강연 후기 &amp;mdash; 코드 실력보다 중요한 것들&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고용노동부와 메인비즈협회가 주최한 &lt;b&gt;K-디지털트레이닝(벤처유형) 지원행사 'AI INSIGHT DAY'&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;일시&lt;/b&gt;: 2026년 5월 6일(수) 10:30 ~ 13:00&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장소&lt;/b&gt;: 디캠프 선릉&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로그램&lt;/b&gt;: 현직자 AI 관련 직무 토크 &amp;amp; Q&amp;amp;A &amp;rarr; 이후 2026 국제인공지능대전 전시 관람&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타트업부터 대기업, VC까지 다양한 현장을 경험한 현직 CTO의 강연으로, 실무에서 AI를 어떻게 다루는지, 회사가 어떤 개발자를 원하는지에 대한 솔직한 이야기를 들을 수 있었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현업 개발의 3가지 축&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현업 IT를 이해하려면 세 가지 축으로 바라봐야 한다고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫째, 운영체제(OS)&lt;/b&gt; 우리가 만드는 모든 소프트웨어는 결국 어떤 운영체제 위에서 돌아가는 응용 프로그램이다. 무엇을 만드느냐보다 어떤 환경 위에서 만드느냐가 먼저다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;둘째, 웹 vs 앱&lt;/b&gt; 현업의 60~70%는 웹 또는 앱 개발이다. 둘의 구분은 단순하다. 설치가 없으면 웹, 카메라&amp;middot;위치&amp;middot;자이로센서 등 디바이스 퍼미션이 필요하면 앱이다. 방향을 잡기 전에 이 구분부터 명확히 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;셋째, 협업 태도&lt;/b&gt; 비즈니스를 이해하고 공감하는 능력, 문서화 습관, Git 활용, 코드 리뷰 문화. 이것이 개발 실력만큼이나 현업에서 중요하게 평가받는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기업 규모에 따라 AI 활용 방식이 다르다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 AI 툴을 쓰더라도 회사 규모에 따라 목적과 방식이 완전히 달라진다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 74.5349%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 21.0465%;&quot;&gt;&lt;b&gt; 구분 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 26.3832%;&quot;&gt;&lt;b&gt;스타트업 / 소규모 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 27.0136%;&quot;&gt;&lt;b&gt; 중견 / 대기업 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 21.0465%;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 26.3832%;&quot;&gt;생산성 극대화&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 27.0136%;&quot;&gt;보안 및 규정 준수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 21.0465%;&quot;&gt;&lt;b&gt;핵심 가치&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 26.3832%;&quot;&gt;장기 지속 가능성, 확장성&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 27.0136%;&quot;&gt;신속 대응, 안정성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대기업이 AI에 신중한 이유는 분명하다. B2B 규모의 납품 계약에서 AI 생성 코드의 오류 하나가 엄청난 손실로 이어질 수 있기 때문이다. 반면 스타트업은 빠른 프로토타이핑과 생산성이 생존과 직결되므로 훨씬 적극적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신약 개발사나 보안 솔루션 업체처럼 코드 자체가 자산인 회사들은 외부 AI에 내부 로직을 노출시키지 않기 위해 자체 내부 모델을 파인튜닝해서 사용하는 사례도 늘고 있다고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;회사가 원하는 개발자 &amp;mdash; AI 시대 5가지 핵심 역량&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① Code Explanation &amp;mdash; 코드를 읽고, 설명할 수 있는 능력&lt;/h3&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;/li&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;AI가 만들어준 코드도 예외가 아니다. &quot;왜 이렇게 짰어?&quot;라고 AI에게 반문하고, 내 언어로 설명할 수 없으면 그 코드는 내 코드가 아니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② System Design / Architecture / OS 이해&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 디자인, 운영체제 기초, 인프라 지식. 개발만 하다 보면 놓치기 쉬운 영역인데, 현업에서는 이 배경이 있는 사람과 없는 사람의 차이가 크게 난다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 좋은 라이브러리와 SDK를 찾고, 제대로 쓰는 능력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 사람이 잘 만들어놓은 오픈소스 라이브러리와 SDK를 활용하는 게 소프트웨어 발전의 핵심이다. 무작정 가져다 쓰는 게 아니라, 사용자 수&amp;middot;업데이트 빈도&amp;middot;라이선스&amp;middot;안정성을 따져 선택하는 능력이 중요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 트러블슈팅 경험&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Root Cause를 찾아내는 통찰력&lt;/li&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;프로젝트를 설명할 때 &quot;이런 기능을 만들었어요&quot;로 끝내지 말고, &quot;이런 문제가 있었고, 이렇게 해결했습니다&quot;까지 가야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 프롬프트 엔지니어링 능력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 쓰는 방식 자체도 역량이 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;좋은 프롬프트 구조&lt;/b&gt;: 상황 설명 + 역할 지정 + &quot;너라면 어떻게 할 것인가&quot; 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 내놓은 결과를 그대로 쓰지 않는다. 뼈대로만 쓰고, 비즈니스 로직의 특이사항과 엣지 케이스를 직접 반영해 후처리하는 과정이 필수다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SW 개발은 조별과제다 &amp;mdash; AI 시대의 협업 원칙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강연에서 가장 인상 깊었던 한 마디다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;AI 툴에만 의존하는 코드는 협업을 망친다. AI 툴을 사용하지 않는 개발자는 생산성을 망친다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 문장 사이 어딘가에 정답이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 만들어낸 코드는 팀의 코딩 컨벤션을 모른다. 프로젝트의 아키텍처 결정 배경도 모른다. 팀 프로젝트를 하면서 실제로 겪었던 부분이기도 하다. 컨벤션을 문서화하고 룰을 걸어놔도, AI는 프로젝트가 길어질수록 그 규칙을 벗어난 코드를 낸다. 결국 그걸 잡아내는 사람이고, 판단 기준 또한 사람의 머릿속에 있다. AI를 잘 쓰는 것과 AI가 낸 결과를 검증하는 것은 다른 역량이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 도구다. 뼈대를 잡는 데는 유용하지만, 비즈니스 로직과 팀 규약에 맞게 다듬는 건 사람의 몫이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oj633/dJMcaiwt4LJ/YufC7TlJzFUhMHk5KcuUMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oj633/dJMcaiwt4LJ/YufC7TlJzFUhMHk5KcuUMK/img.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;901&quot; data-is-animation=&quot;false&quot; width=&quot;200&quot; height=&quot;267&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oj633/dJMcaiwt4LJ/YufC7TlJzFUhMHk5KcuUMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOj633%2FdJMcaiwt4LJ%2FYufC7TlJzFUhMHk5KcuUMK%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;676&quot; height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UO4ej/dJMcahEk9mt/jZHnkkc23EA1cTUV3Akto1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UO4ej/dJMcahEk9mt/jZHnkkc23EA1cTUV3Akto1/img.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;901&quot; data-is-animation=&quot;false&quot; width=&quot;200&quot; height=&quot;267&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UO4ej/dJMcahEk9mt/jZHnkkc23EA1cTUV3Akto1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUO4ej%2FdJMcahEk9mt%2FjZHnkkc23EA1cTUV3Akto1%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;676&quot; height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nmHVn/dJMcaf0O7U7/TQyb7hIJuIAhEymWckBLXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nmHVn/dJMcaf0O7U7/TQyb7hIJuIAhEymWckBLXK/img.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;901&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nmHVn/dJMcaf0O7U7/TQyb7hIJuIAhEymWckBLXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnmHVn%2FdJMcaf0O7U7%2FTQyb7hIJuIAhEymWckBLXK%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;676&quot; height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2026 &lt;a href=&quot;https://www.aiexpo.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;국제인공지능대전&lt;/a&gt; 전시 관람&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강연이 끝난 후 코엑스 A홀에서 열린 &lt;b&gt;제9회 국제인공지능대전(AI EXPO KOREA 2026)&lt;/b&gt; 전시를 관람했다. 5월 6일부터 8일까지 3일간 진행된 이 행사는 18개국 330개 기업&amp;middot;기관이 562개 부스를 운영하는 아시아 최대 규모의 단일 AI 전시회다. 한국인공지능협회, 서울메쎄, 인공지능신문이 공동 주최하며 2018년 첫 회 이후 올해로 9회째를 맞았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;현장을 돌아다니며 든 생각들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI에 관심 갖는 회사의 스펙트럼&lt;/b&gt; 지나다니면서 사람들의 명찰이 눈에 들어왔다. 이름만 들으면 알 만한 대기업부터 중소기업까지, 정말 다양한 규모와 업종의 사람들이 시간을 내 전시장을 찾아왔다. AI가 더 이상 IT 업계만의 관심사가 아니라는 걸 명찰들이 말해주고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 이미 시작한 학생들 &lt;/b&gt;전시를 둘러보다 SW마이스터고관도 둘러보았다. 고등학교 때부터 체계적으로 공부하고, 마음 맞는 친구들과 팀을 꾸려 직접 부스까지 운영하는 모습이 인상적이었다. 멋있으면서도 부러웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;협업툴에 AI를 얹은 서비스들&lt;/b&gt; 메신저와 프로젝트 관리 기능을 결합한 협업툴에 AI를 통합한 서비스들이 꽤 많이 보였다. 이전 직장에서 Flow를 실제로 써봤던 경험이 있어서 그런지 이 카테고리 부스들에 자연스럽게 시선이 갔다. AI 발전 이후 이런 기능을 가진 서비스들이 이렇게 많이 생겨났구나 싶었다. 몇 년 사이의 변화가 느껴지는 순간이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Taiwan Pavilion&lt;/b&gt; 한켠에는 TAITRA(대만대외무역발전협회) 주관의 Taiwan Pavilion이 넓은 구역을 차지하고 있었다. &quot;From Chip to Application&quot;을 테마로 16개 기업이 참가해 칩셋부터 엣지 AI 서버&amp;middot;클라우드&amp;middot;네트워크 어플라이언스까지 전시했다. AI 하드웨어 인프라 면에서 타이완은 이미 글로벌 최상위권이라는데 직접 보니 그 산업 기반의 두께가 느껴지는 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;피지컬 AI &amp;mdash; 신기함과 궁금함 사이&lt;/b&gt; 로봇 시연 구역은 발길이 가장 많이 몰리는 곳이었다. 직접 움직이는 걸 보니 신기하긴 했는데, 동시에 이게 실제 일상이나 업무 현장에서 어떻게 쓰일지가 궁금해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;산업 현장과 AI &amp;mdash; 인명 안전을 위한 기술&lt;/b&gt; 산업 현장 관련 부스들도 생각보다 많았다. 정부 기관도 전시에 직접 참여할 만큼 이 분야에 관심이 크다는 걸 느꼈고, AI가 산업 현장의 인명 재해를 예방하는 데 실질적으로 활용되고 있다는 걸 알게 됐다. 기술이 거창한 미래보다 지금 당장의 안전을 위해 쓰이고 있다는 사실이 인상적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PLAUD의 굿즈 &amp;mdash; 뜻밖의 마케팅 인사이트&lt;/b&gt; AI 기술과는 별개로, 전시장을 돌다 보니 유독 눈에 띄는 게 있었다. 크고 심플한 검정색 타포린백을 들고 다니는 사람들이 곳곳에 보였는데, 알고 보니 PLAUD라는 기업 부스에서 나눠주는 이벤트 굿즈였다. &quot;우리도 저기 찾아가보자&quot; 하고 부스를 방문했더니, 그 가방 때문에 찾아온 사람이 많다고 했다. 작은 아이템 하나가 사람을 부스로 이끈다. 전시 행사에서 굿즈 하나도 마케팅이 된다는 걸 직접 목격한 순간이었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하루 동안 강연과 전시를 연달아 경험하고 나니, 머릿속으로만 그리던 AI 생태계의 실제 온도를 몸으로 느낄 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강연에서 들은 이야기들을 전시장에서 눈으로 볼 수 있었고, 또 전시장에서 본 것들로 강연 내용을 다시 한번 확인할 수 있는 시간이었다. AI는 이미 특정 업계나 직군만의 이야기가 아니다. 대기업도, 중소기업도, 고등학생도, 타이완 기업도 모두 같은 자리에 있었다. 기술이 빠르게 변화하는 시대일수록, 살아남는 건 도구를 잘 다루는 사람이 아니라 도구를 이해하고 설명할 수 있는 사람인 것 같다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;이 글은 현직자 강연 청취 및 전시 관람을 바탕으로 개인적으로 정리한 내용입니다. 특정 발언의 정확한 인용이 아닌, 인상 깊었던 개념을 재구성한 것임을 밝힙니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>⏳ Time Log/2. Two Weeks (Step &amp;middot; WIL)</category>
      <category>AI INSIGHT DAY</category>
      <category>K-디지털트레이닝</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/83</guid>
      <comments>https://learn-run.tistory.com/entry/AI-INSIGHT-DAY-%EA%B0%95%EC%97%B0-%ED%9B%84%EA%B8%B0-%E2%80%94-AI-%EC%8B%9C%EB%8C%80%EC%97%90-%ED%9A%8C%EC%82%AC%EA%B0%80-%EC%9B%90%ED%95%98%EB%8A%94-%EA%B0%9C%EB%B0%9C%EC%9E%90#entry83comment</comments>
      <pubDate>Sun, 10 May 2026 19:29:51 +0900</pubDate>
    </item>
    <item>
      <title>[Windows] 우클릭 YYYY-MM-DD.txt 자동 생성 레지스트리</title>
      <link>https://learn-run.tistory.com/entry/Windows-%EC%9A%B0%ED%81%B4%EB%A6%AD-YYYY-MM-DDtxt-%EC%9E%90%EB%8F%99-%EC%83%9D%EC%84%B1-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%8A%B8%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt; 우클릭 한 번으로 YYYY-MM-DD.txt 파일을 해당 경로에 생성하고 즉시 여는 설정&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;사용 목적에 따라 '폴더 빈 공간'과 '폴더 아이콘' 두 가지 타겟에 모두 설정해 두면 편리&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 폴더 빈 공간 &amp;amp; 바탕화면 타겟&lt;/h2&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;레지스트리 경로:&lt;/b&gt; &lt;code&gt;HKEY_CLASSES_ROOT\Directory\Background\shell&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;키 및 값 세팅&lt;/h3&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;code&gt;NewText&lt;/code&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;code&gt;(기본값)&lt;/code&gt; : &lt;code&gt;New Text&lt;/code&gt; (메뉴에 표시될 이름)&lt;/li&gt;
&lt;li&gt;문자열 값 생성 (&lt;code&gt;이름&lt;/code&gt;: &lt;code&gt;Icon&lt;/code&gt; / &lt;code&gt;데이터&lt;/code&gt;: &lt;code&gt;%SystemRoot%\System32\SHELL32.dll,-156&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NewText&lt;/code&gt; 하위에 &lt;b&gt;&lt;code&gt;command&lt;/code&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;code&gt;(기본값)&lt;/code&gt; : &lt;code&gt;cmd /c cd %V &amp;amp; echo %%date%% &amp;gt;%%date%%.txt &amp;amp; start %%date%%.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cptxz3/dJMcaf0DPJt/2vXCxWEDOwHqo3NsgFvb50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cptxz3/dJMcaf0DPJt/2vXCxWEDOwHqo3NsgFvb50/img.png&quot; data-alt=&quot;HKEY_CLASSES_ROOT\Directory\Background\shell&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cptxz3/dJMcaf0DPJt/2vXCxWEDOwHqo3NsgFvb50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcptxz3%2FdJMcaf0DPJt%2F2vXCxWEDOwHqo3NsgFvb50%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;935&quot; height=&quot;338&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HKEY_CLASSES_ROOT\Directory\Background\shell&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuhulq/dJMcagFiVwG/eiLBHC1fHyULZ62ktmk9N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuhulq/dJMcagFiVwG/eiLBHC1fHyULZ62ktmk9N0/img.png&quot; data-alt=&quot;%SystemRoot%\System32\SHELL32.dll,-156&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuhulq/dJMcagFiVwG/eiLBHC1fHyULZ62ktmk9N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuhulq%2FdJMcagFiVwG%2FeiLBHC1fHyULZ62ktmk9N0%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;930&quot; height=&quot;376&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;%SystemRoot%\System32\SHELL32.dll,-156&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi6sMI/dJMcacv8aKM/qeT0oB6ioLas1UKhp7fktk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi6sMI/dJMcacv8aKM/qeT0oB6ioLas1UKhp7fktk/img.png&quot; data-alt=&quot;cmd /c cd %V &amp;amp;amp; echo %%date%% &amp;amp;gt;%%date%%.txt &amp;amp;amp; start %%date%%.txt&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi6sMI/dJMcacv8aKM/qeT0oB6ioLas1UKhp7fktk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi6sMI%2FdJMcacv8aKM%2FqeT0oB6ioLas1UKhp7fktk%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;930&quot; height=&quot;379&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cmd /c cd %V &amp;amp; echo %%date%% &amp;gt;%%date%%.txt &amp;amp; start %%date%%.txt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gbaes/dJMcagedDg0/O0YdUDXxfgXquvXH4m8KCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gbaes/dJMcagedDg0/O0YdUDXxfgXquvXH4m8KCk/img.png&quot; data-alt=&quot;우클릭 시 New Text 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gbaes/dJMcagedDg0/O0YdUDXxfgXquvXH4m8KCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGbaes%2FdJMcagedDg0%2FO0YdUDXxfgXquvXH4m8KCk%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;230&quot; height=&quot;378&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우클릭 시 New Text 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 폴더 아이콘 타겟&lt;/h2&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;레지스트리 경로:&lt;/b&gt; &lt;code&gt;HKEY_CLASSES_ROOT\Directory\shell&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;키 및 값 세팅&lt;/h3&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;code&gt;NewText&lt;/code&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;code&gt;(기본값)&lt;/code&gt; : &lt;code&gt;New Text&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;문자열 값 생성 (&lt;code&gt;이름&lt;/code&gt;: &lt;code&gt;Icon&lt;/code&gt; / &lt;code&gt;데이터&lt;/code&gt;: &lt;code&gt;%SystemRoot%\System32\SHELL32.dll,-156&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NewText&lt;/code&gt; 하위에 &lt;b&gt;&lt;code&gt;command&lt;/code&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;code&gt;(기본값)&lt;/code&gt; : &lt;code&gt;cmd /c cd %V &amp;amp; echo %%date%% &amp;gt;%%date%%.txt &amp;amp; start %%date%%.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 실행 명령어 요약&lt;/h2&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;cmd /c cd %V &amp;amp; echo %%date%% &amp;gt;%%date%%.txt &amp;amp; start %%date%%.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;cmd /c&lt;/code&gt; : 백그라운드 명령 프롬프트 실행 후 작업 완료 시 창 닫기&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd %V&lt;/code&gt; : 레지스트리에서 전달받은 현재 타겟 경로(&lt;code&gt;%V&lt;/code&gt;)로 이동&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; : 앞 명령어 완료 후 다음 명령어 실행 (순차 체이닝)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo %%date%%&lt;/code&gt; : 오늘 날짜 출력 (레지스트리 변수 충돌을 막기 위해 &lt;code&gt;%&lt;/code&gt;를 두 번 써서 이스케이프)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;%%date%%.txt&lt;/code&gt; : 출력된 날짜를 텍스트 파일명과 내부 텍스트로 저장&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start %%date%%.txt&lt;/code&gt; : 만들어진 파일을 메모장(기본 편집기)으로 즉시 열기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 롤백 (삭제)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 제거하고 싶을 때는 생성했던 &lt;code&gt;NewText&lt;/code&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;code&gt;...\Directory\Background\shell\NewText&lt;/code&gt; 삭제&lt;/li&gt;
&lt;li&gt;&lt;code&gt;...\Directory\shell\NewText&lt;/code&gt; 삭제&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Tech Note</category>
      <category>regedit</category>
      <category>Windows11</category>
      <category>우클릭</category>
      <category>우클릭메모장</category>
      <category>윈도우설정</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/82</guid>
      <comments>https://learn-run.tistory.com/entry/Windows-%EC%9A%B0%ED%81%B4%EB%A6%AD-YYYY-MM-DDtxt-%EC%9E%90%EB%8F%99-%EC%83%9D%EC%84%B1-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%8A%B8%EB%A6%AC#entry82comment</comments>
      <pubDate>Fri, 24 Apr 2026 15:22:25 +0900</pubDate>
    </item>
    <item>
      <title>옵티마이저(Optimizer)</title>
      <link>https://learn-run.tistory.com/entry/%EC%98%B5%ED%8B%B0%EB%A7%88%EC%9D%B4%EC%A0%80Optimizer</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;SQL공부를 해보려고 이것저것 찾아보던 중에, SQL을 제대로 이해하려면 옵티마이저가 어떻게 동작하는지 먼저 알아두는 것이 좋다는 영상을 보았다. 옵티마이저는 SQL을 데이터가 어떻게 처리할 지 결정해주는 역할을 한다고 한다. 뭔지 잘 모르겠지만, 일단 정리.&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저(Optimizer)란 주어진 목적 함수(Objective Function)를 최소화하거나 최대화하기 위해 변수(파라미터)를 체계적으로 조정하는 알고리즘 또는 시스템을 말합니다. 이 개념은 데이터베이스, 머신러닝, 컴파일러, 수학적 최적화, 운영 연구(Operations Research) 등 거의 모든 컴퓨터 과학 및 공학 분야에서 핵심적인 역할을 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 데이터베이스 옵티마이저 (Query Optimizer)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 정의와 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 옵티마이저는 사용자가 작성한 SQL 쿼리를 분석하여 &lt;b&gt;가장 효율적인 실행 계획(Execution Plan)&lt;/b&gt;을 생성하는 DBMS의 핵심 구성 요소입니다. 동일한 결과를 반환하는 쿼리라도 내부 실행 방식에 따라 성능 차이가 수십, 수백 배에 달할 수 있기 때문에 옵티마이저의 역할은 매우 중요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. SQL 처리 과정에서의 위치&lt;/h3&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;SQL 입력 &amp;rarr; 파서(Parser) &amp;rarr; 옵티마이저(Optimizer) &amp;rarr; 실행 엔진(Execution Engine) &amp;rarr; 결과 반환&lt;/code&gt;&lt;/pre&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;단계&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파싱(Parsing)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SQL 문법 검증, 구문 트리(Parse Tree) 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;변환(Transformation)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;쿼리를 논리적으로 동등한 더 효율적인 형태로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최적화(Optimization)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;여러 실행 계획 후보를 생성하고 비용을 추정하여 최적 계획 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;실행(Execution)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;선택된 실행 계획에 따라 데이터 접근 및 결과 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. 옵티마이저의 유형&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3.1. 규칙 기반 옵티마이저 (RBO, Rule-Based Optimizer)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 정해진 &lt;b&gt;우선순위 규칙&lt;/b&gt;에 따라 실행 계획을 결정합니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;우선순위&lt;/th&gt;
&lt;th&gt;접근 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 (최고)&lt;/td&gt;
&lt;td&gt;ROWID에 의한 단일 행 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;유니크 인덱스를 통한 단일 행 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;클러스터 조인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;해시 클러스터 키에 의한 단일 행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&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;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N (최저)&lt;/td&gt;
&lt;td&gt;풀 테이블 스캔 (Full Table Scan)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 예측 가능하고 일관된 실행 계획&lt;br /&gt;&lt;b&gt;단점&lt;/b&gt;: 데이터의 실제 분포나 양을 고려하지 않아 비효율적인 계획 수립 가능&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3.2. 비용 기반 옵티마이저 (CBO, Cost-Based Optimizer)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 및 인덱스의 &lt;b&gt;통계 정보&lt;/b&gt;를 기반으로 각 실행 계획의 비용(Cost)을 추정하고, 가장 낮은 비용의 계획을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비용 추정에 사용되는 주요 통계 정보:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;통계 항목&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;카디널리티(Cardinality)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;테이블의 총 행(Row) 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;선택도(Selectivity)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;조건에 의해 선택되는 행의 비율 (0~1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;밀도(Density)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;특정 컬럼 값의 분포 밀도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;히스토그램(Histogram)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬럼 값의 분포를 구간별로 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;클러스터링 팩터&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인덱스 순서와 테이블 데이터의 물리적 정렬 일치도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;평균 행 길이&lt;/b&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;&lt;b&gt;비용 계산 공식 (단순화):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;총 비용 = (I/O 비용) + (CPU 비용) + (네트워크 비용)
       = (단일 블록 읽기 횟수 &amp;times; 단일 블록 읽기 비용)
       + (다중 블록 읽기 횟수 &amp;times; 다중 블록 읽기 비용)
       + (CPU 연산 비용)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. 주요 최적화 기법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.4.1. 접근 경로 최적화 (Access Path Optimization)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;접근 방식&lt;/th&gt;
&lt;th&gt;적합한 경우&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;풀 테이블 스캔&lt;/b&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;b&gt;인덱스 범위 스캔&lt;/b&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;b&gt;인덱스 유니크 스캔&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;유니크 키로 단일 행 접근&lt;/td&gt;
&lt;td&gt;인덱스 깊이 + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;인덱스 풀 스캔&lt;/b&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;b&gt;인덱스 스킵 스캔&lt;/b&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;h4 data-ke-size=&quot;size20&quot;&gt;2.4.2. 조인 최적화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조인 방법:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;조인 방법&lt;/th&gt;
&lt;th&gt;원리&lt;/th&gt;
&lt;th&gt;적합한 경우&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Nested Loop Join&lt;/b&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;b&gt;Sort Merge Join&lt;/b&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;b&gt;Hash Join&lt;/b&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;&lt;b&gt;조인 순서 최적화:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N개의 테이블을 조인할 때 가능한 조인 순서는 N!(팩토리얼)가지입니다. 테이블 수가 많아지면 모든 경우를 탐색하는 것이 불가능하므로, 옵티마이저는 다음과 같은 전략을 사용합니다:&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;동적 프로그래밍(Dynamic Programming)&lt;/b&gt;: 소규모 테이블 집합에 대해 최적 해를 점진적으로 구축&lt;/li&gt;
&lt;li&gt;&lt;b&gt;탐욕 알고리즘(Greedy Algorithm)&lt;/b&gt;: 각 단계에서 가장 비용이 낮은 조인을 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유전 알고리즘&lt;/b&gt;: PostgreSQL에서 테이블 수가 12개 이상일 때 사용 (GEQO)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.4.3. 쿼리 변환 (Query Transformation)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;변환 기법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;서브쿼리 Unnesting&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상관 서브쿼리를 조인으로 변환&lt;/td&gt;
&lt;td&gt;&lt;code&gt;WHERE id IN (SELECT ...)&lt;/code&gt; &amp;rarr; &lt;code&gt;JOIN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;뷰 병합(View Merging)&lt;/b&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;b&gt;조건 푸시다운(Predicate Pushdown)&lt;/b&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;b&gt;공통 부분식 제거&lt;/b&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;b&gt;OR Expansion&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;OR 조건을 UNION ALL로 변환&lt;/td&gt;
&lt;td&gt;각 조건에 대해 별도의 인덱스 활용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.5. 실행 계획 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 계획을 확인하는 방법:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- Oracle
EXPLAIN PLAN FOR SELECT * FROM employees WHERE dept_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- PostgreSQL
EXPLAIN ANALYZE SELECT * FROM employees WHERE dept_id = 10;

-- MySQL
EXPLAIN SELECT * FROM employees WHERE dept_id = 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 계획에서 확인해야 할 핵심 항목:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Operation&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수행되는 작업 (TABLE ACCESS, INDEX SCAN, HASH JOIN 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Rows&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;예상 반환 행 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cost&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;추정 비용 (상대적 수치)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Bytes&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;예상 데이터 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Time&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;예상 실행 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Actual Rows&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실제 반환 행 수 (ANALYZE 옵션 사용 시)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.6. 옵티마이저 힌트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저의 판단을 개발자가 직접 제어할 수 있는 방법입니다:&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;-- Oracle 힌트 예시
SELECT /*+ INDEX(e idx_dept_id) */ *
FROM employees e
WHERE dept_id = 10;

SELECT /*+ FULL(e) */ *
FROM employees e
WHERE dept_id = 10;

SELECT /*+ USE_HASH(e d) */ *
FROM employees e, departments d
WHERE e.dept_id = d.dept_id;

-- MySQL 힌트 예시
SELECT /*+ NO_INDEX(e idx_dept_id) */ *
FROM employees e
WHERE dept_id = 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 힌트 종류:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;힌트&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FULL(table)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;풀 테이블 스캔 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INDEX(table index)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;특정 인덱스 사용 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USE_NL(table)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nested Loop 조인 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USE_HASH(table)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hash 조인 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USE_MERGE(table)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sort Merge 조인 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LEADING(table ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;조인 순서 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PARALLEL(table, degree)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;병렬 처리 수준 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 머신러닝/딥러닝 옵티마이저&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 기본 원리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 옵티마이저의 목표는 &lt;b&gt;손실 함수 L(&amp;theta;)를 최소화하는 파라미터 &amp;theta;를 찾는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; &amp;middot; &amp;nabla;L(&amp;theta;(t))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &amp;eta;는 학습률(Learning Rate), &amp;nabla;L은 손실 함수의 그래디언트입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 주요 옵티마이저 상세 설명&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.1. SGD (Stochastic Gradient Descent)&lt;/h4&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; &amp;middot; g(t)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;g(t)는 미니배치에서 계산된 그래디언트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 구현이 간단하고, 일반화(Generalization) 성능이 우수한 경우가 많음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 수렴 속도가 느리고, 학습률 설정에 민감하며, 안장점(Saddle Point)에서 정체될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.2. SGD with Momentum&lt;/h4&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;v(t) = &amp;beta; &amp;middot; v(t-1) + g(t)
&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; &amp;middot; v(t)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;beta;는 모멘텀 계수 (일반적으로 0.9)&lt;/li&gt;
&lt;li&gt;과거 그래디언트의 지수 이동 평균을 누적하여 &lt;b&gt;일관된 방향으로의 업데이트를 가속화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 진동 감소, 수렴 속도 향상, 지역 최소값(Local Minimum) 탈출 가능성 증가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 추가 하이퍼파라미터(&amp;beta;) 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.3. Nesterov Accelerated Gradient (NAG)&lt;/h4&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;&amp;theta;_lookahead = &amp;theta;(t) - &amp;beta; &amp;middot; v(t-1)
v(t) = &amp;beta; &amp;middot; v(t-1) + &amp;eta; &amp;middot; &amp;nabla;L(&amp;theta;_lookahead)
&amp;theta;(t+1) = &amp;theta;(t) - v(t)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Momentum의 개선 버전으로, &lt;b&gt;미래 위치를 예측&lt;/b&gt;하여 그래디언트를 계산&lt;/li&gt;
&lt;li&gt;오버슈팅(Overshooting)을 줄이고 더 정확한 수렴 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.4. AdaGrad (Adaptive Gradient)&lt;/h4&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;G(t) = G(t-1) + g(t)&amp;sup2;
&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; / &amp;radic;(G(t) + &amp;epsilon;) &amp;middot; g(t)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 파라미터별로 누적된 그래디언트 제곱합에 반비례하여 학습률을 조정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 희소(Sparse) 데이터에 효과적, 자주 업데이트되는 파라미터는 학습률 감소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 학습이 진행될수록 학습률이 지속적으로 감소하여 학습이 조기 중단될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.5. RMSProp (Root Mean Square Propagation)&lt;/h4&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;E[g&amp;sup2;](t) = &amp;gamma; &amp;middot; E[g&amp;sup2;](t-1) + (1-&amp;gamma;) &amp;middot; g(t)&amp;sup2;
&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; / &amp;radic;(E[g&amp;sup2;](t) + &amp;epsilon;) &amp;middot; g(t)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gamma;는 감쇠율(Decay Rate, 일반적으로 0.9)&lt;/li&gt;
&lt;li&gt;AdaGrad의 학습률 감소 문제를 해결하기 위해 &lt;b&gt;지수 이동 평균&lt;/b&gt; 사용&lt;/li&gt;
&lt;li&gt;Geoffrey Hinton이 제안&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.6. Adam (Adaptive Moment Estimation)&lt;/h4&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;m(t) = &amp;beta;1 &amp;middot; m(t-1) + (1-&amp;beta;1) &amp;middot; g(t)          # 1차 모멘트 (평균)
v(t) = &amp;beta;2 &amp;middot; v(t-1) + (1-&amp;beta;2) &amp;middot; g(t)&amp;sup2;          # 2차 모멘트 (분산)
m̂(t) = m(t) / (1 - &amp;beta;1^t)                     # 편향 보정
v̂(t) = v(t) / (1 - &amp;beta;2^t)                     # 편향 보정
&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; &amp;middot; m̂(t) / (&amp;radic;v̂(t) + &amp;epsilon;)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 하이퍼파라미터: &amp;beta;1=0.9, &amp;beta;2=0.999, &amp;epsilon;=1e-8, &amp;eta;=0.001&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 대부분의 문제에서 좋은 성능, 하이퍼파라미터 튜닝에 덜 민감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 일부 경우 SGD+Momentum 대비 일반화 성능이 떨어질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.7. AdamW (Adam with Decoupled Weight Decay)&lt;/h4&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;&amp;theta;(t+1) = &amp;theta;(t) - &amp;eta; &amp;middot; (m̂(t) / (&amp;radic;v̂(t) + &amp;epsilon;) + &amp;lambda; &amp;middot; &amp;theta;(t))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Adam에서 L2 정규화와 가중치 감쇠가 혼동되는 문제를 해결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가중치 감쇠를 그래디언트 업데이트와 분리(Decouple)&lt;/b&gt;하여 적용&lt;/li&gt;
&lt;li&gt;현재 Transformer 기반 모델(BERT, GPT 등)의 &lt;b&gt;사실상 표준 옵티마이저&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.8. 기타 최신 옵티마이저&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵티마이저&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LAMB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;대규모 배치 학습(Large Batch Training)에 최적화, 레이어별 적응적 학습률&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LARS&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LAMB과 유사, SGD 기반의 레이어별 적응적 학습률&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;RAdam&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Adam의 초기 학습 불안정성을 개선, 워밍업 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Lookahead&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기존 옵티마이저를 래핑하여 탐색과 활용의 균형을 개선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;AdaFactor&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메모리 효율적인 Adam 변형, 대형 모델에 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Lion&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Google에서 발견한 진화 기반 옵티마이저, Adam보다 메모리 효율적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Sophia&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2차 미분 정보를 활용하는 경량 옵티마이저, LLM 학습에 효과적&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 학습률 스케줄링 (Learning Rate Scheduling)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저와 함께 사용되는 학습률 조정 전략:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스케줄러&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Step Decay&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일정 에폭마다 학습률을 고정 비율로 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Exponential Decay&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;매 에폭/스텝마다 지수적으로 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cosine Annealing&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;코사인 함수를 따라 학습률을 주기적으로 변화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Warmup + Decay&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;초기에 학습률을 점진적으로 증가 후 감소 (Transformer에서 널리 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cyclic LR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;학습률을 주기적으로 증감하여 지역 최소값 탈출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;One Cycle Policy&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;단일 주기로 학습률을 증가 후 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;ReduceLROnPlateau&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;검증 손실이 개선되지 않을 때 학습률 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4. 옵티마이저 선택 가이드&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;                    시작
                     │
            ┌────────┴────────┐
            │ 문제 유형은?      │
            └────────┬────────┘
         ┌───────────┼───────────┐
         ▼           ▼           ▼
    컴퓨터 비전    NLP/LLM    일반/추천 시스템
         │           │           │
    SGD+Momentum  AdamW       Adam
    + Cosine LR   + Warmup    + ReduceLR
         │           │
    일반화 성능    빠른 수렴
    우수          + 안정적&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 컴파일러 옵티마이저&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 최적화 수준&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 컴파일러(GCC, Clang 등)는 최적화 수준을 플래그로 지정할 수 있습니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;플래그&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-O0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;최적화 없음 (디버깅용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-O1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;기본 최적화 (컴파일 시간과 성능의 균형)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-O2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;중간 수준 최적화 (대부분의 프로덕션 코드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-O3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;공격적 최적화 (루프 벡터화, 인라이닝 확대)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-Os&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;코드 크기 최적화 (임베디드 시스템)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-Ofast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;표준 준수를 희생한 최대 성능 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 주요 최적화 기법 상세&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.1. 기계 독립적 최적화 (중간 코드 수준)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;상수 폴딩&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컴파일 시점에 상수 연산 사전 계산&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x = 3 * 4&lt;/code&gt; &amp;rarr; &lt;code&gt;x = 12&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;상수 전파&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;알려진 상수 값을 사용처에 대입&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a=5; b=a+1&lt;/code&gt; &amp;rarr; &lt;code&gt;b=6&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데드 코드 제거&lt;/b&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;b&gt;공통 부분식 제거(CSE)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;동일 연산의 중복 계산 방지&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a*b+c*d&lt;/code&gt; 에서 &lt;code&gt;a*b&lt;/code&gt; 재사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;루프 불변 코드 이동&lt;/b&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;b&gt;강도 감소&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;비용 높은 연산을 저비용 연산으로 대체&lt;/td&gt;
&lt;td&gt;곱셈 &amp;rarr; 비트 시프트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;꼬리 호출 최적화&lt;/b&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;h4 data-ke-size=&quot;size20&quot;&gt;4.2.2. 루프 최적화&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;루프 언롤링&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;반복문 본체를 여러 번 복제하여 분기 오버헤드 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;루프 퓨전&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;동일 범위의 인접 루프를 하나로 병합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;루프 피싱&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;하나의 루프를 여러 루프로 분할하여 캐시 활용 개선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;루프 타일링&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;루프를 블록 단위로 분할하여 캐시 지역성 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;루프 벡터화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SIMD 명령어를 활용한 병렬 연산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.3. 기계 종속적 최적화 (코드 생성 수준)&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;레지스터 할당&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;변수를 CPU 레지스터에 효율적으로 매핑 (그래프 컬러링 알고리즘)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;명령어 선택&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;타겟 아키텍처에 최적인 명령어 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;명령어 스케줄링&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;파이프라인 스톨을 최소화하도록 명령어 순서 재배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;피홀 최적화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;짧은 명령어 시퀀스를 더 효율적인 시퀀스로 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 수학적 최적화 (Mathematical Optimization)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1. 분류 체계&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;최적화 문제
├── 연속 최적화 (Continuous Optimization)
│   ├── 제약 없는 최적화 (Unconstrained)
│   │   ├── 1차 방법: 경사 하강법, 켤레 경사법
│   │   └── 2차 방법: 뉴턴법, 준뉴턴법(BFGS, L-BFGS)
│   ├── 제약 있는 최적화 (Constrained)
│   │   ├── 선형 계획법 (LP): 심플렉스법, 내부점법
│   │   ├── 이차 계획법 (QP)
│   │   └── 비선형 계획법 (NLP): SQP, 내부점법, 페널티법
│   └── 볼록 최적화 (Convex Optimization)
│       └── 전역 최적해 보장
│
├── 이산 최적화 (Discrete / Combinatorial)
│   ├── 정수 계획법 (IP): 분지 한정법
│   ├── 혼합 정수 계획법 (MIP)
│   └── NP-Hard 문제: TSP, 배낭 문제 등
│
└── 메타휴리스틱 (Metaheuristics)
    ├── 유전 알고리즘 (GA)
    ├── 시뮬레이티드 어닐링 (SA)
    ├── 입자 군집 최적화 (PSO)
    └── 개미 군집 최적화 (ACO)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2. 주요 알고리즘 비교&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;알고리즘&lt;/th&gt;
&lt;th&gt;수렴 속도&lt;/th&gt;
&lt;th&gt;메모리&lt;/th&gt;
&lt;th&gt;적용 범위&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;경사 하강법&lt;/b&gt;&lt;/td&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;b&gt;뉴턴법&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이차&lt;/td&gt;
&lt;td&gt;높음 (Hessian 저장)&lt;/td&gt;
&lt;td&gt;소규모 문제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;L-BFGS&lt;/b&gt;&lt;/td&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;b&gt;심플렉스법&lt;/b&gt;&lt;/td&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;b&gt;내부점법&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;다항 시간&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&gt;대규모 LP/QP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 분야 간 공통 개념&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1. 탐색(Exploration) vs 활용(Exploitation)&lt;/h3&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;b&gt;탐색(Exploration)&lt;/b&gt;: 넓은 범위의 해 공간을 탐색하여 전역 최적해를 찾으려는 시도&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용(Exploitation)&lt;/b&gt;: 현재까지 발견된 좋은 해 근처를 집중적으로 탐색&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2. 수렴성(Convergence)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전역 수렴(Global Convergence)&lt;/b&gt;: 임의의 초기점에서 시작해도 최적해에 도달&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지역 수렴(Local Convergence)&lt;/b&gt;: 최적해 근처에서 시작했을 때의 수렴 속도&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수렴 속도&lt;/b&gt;: 선형(Linear) &amp;lt; 초선형(Superlinear) &amp;lt; 이차(Quadratic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3. 하이퍼파라미터 최적화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저 자체의 설정값을 최적화하는 메타 최적화:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;그리드 서치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;모든 조합을 체계적으로 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;랜덤 서치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;무작위 조합 시도 (그리드 서치보다 효율적인 경우 많음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;베이지안 최적화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이전 결과를 바탕으로 다음 시도점을 지능적으로 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Hyperband&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;조기 종료(Early Stopping)를 활용한 효율적 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Population-Based Training&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;여러 설정을 동시에 학습하며 진화적으로 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 요약 및 결론&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;분야&lt;/th&gt;
&lt;th&gt;최적화 대상&lt;/th&gt;
&lt;th&gt;핵심 옵티마이저&lt;/th&gt;
&lt;th&gt;핵심 고려 사항&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데이터베이스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;쿼리 실행 계획&lt;/td&gt;
&lt;td&gt;CBO (비용 기반)&lt;/td&gt;
&lt;td&gt;통계 정보의 정확성, 힌트 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;딥러닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;모델 파라미터&lt;/td&gt;
&lt;td&gt;Adam, AdamW, SGD&lt;/td&gt;
&lt;td&gt;학습률, 수렴 속도, 일반화 성능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;컴파일러&lt;/b&gt;&lt;/td&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;b&gt;수학적 최적화&lt;/b&gt;&lt;/td&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;옵티마이저는 분야에 관계없이 &lt;b&gt;&quot;제한된 자원(시간, 메모리, 계산량) 내에서 최선의 결과를 도출&quot;&lt;/b&gt;한다는 공통 목표를 공유합니다. 각 분야의 특성에 맞는 옵티마이저를 이해하고 적절히 선택하는 것이 시스템 성능 향상의 핵심입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Tech Note</category>
      <category>Optimizer</category>
      <category>SQL</category>
      <category>sqld</category>
      <category>데이터베이스</category>
      <category>옵티마이저</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/81</guid>
      <comments>https://learn-run.tistory.com/entry/%EC%98%B5%ED%8B%B0%EB%A7%88%EC%9D%B4%EC%A0%80Optimizer#entry81comment</comments>
      <pubDate>Thu, 16 Apr 2026 16:21:32 +0900</pubDate>
    </item>
    <item>
      <title>[Shortcut] 이클립스(Eclipse)</title>
      <link>https://learn-run.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%B4%9D%EC%A0%95%EB%A6%AC-%EA%B0%9C%EB%B0%9C-%EC%83%9D%EC%82%B0%EC%84%B1%EC%9D%84-%EB%86%92%EC%9D%B4%EB%8A%94-%ED%95%84%EC%88%98-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 코드 편집 단축키&lt;/h2&gt;
&lt;table style=&quot;width: 479px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 199px;&quot;&gt;단축키&lt;/th&gt;
&lt;th style=&quot;width: 280px;&quot;&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Ctrl + D&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;한 줄 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Ctrl + Alt + &amp;uarr;(&amp;darr;)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;한 줄(블럭) 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Alt + &amp;uarr;(&amp;darr;)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;현재 줄을 위(아래) 줄과 바꾸기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Ctrl + Shift + X&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;대문자로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Ctrl + Shift + Y&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;소문자로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Alt + Shift + R&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;같은 변수명 전체 일괄 변경 (Rename)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Ctrl + I&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;들여쓰기 자동 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 199px;&quot;&gt;&lt;code&gt;Ctrl + Shift + F&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 280px;&quot;&gt;코드 포맷팅 (문법 템플릿에 맞게 정렬)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 주석 처리 단축키&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;단축키&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + /&lt;/code&gt; 또는 &lt;code&gt;Ctrl + 7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;한 줄 주석 처리/해제 (&lt;code&gt;//&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + /&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;블록 주석 처리 (&lt;code&gt;/* */&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + \&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;블록 주석 해제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 블록 선택 단축키&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;단축키&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift + End&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;현재 커서부터 줄 끝까지 블록 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift + Home&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;현재 커서부터 줄 처음까지 블록 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Alt + Shift + 방향키(&amp;larr;&amp;uarr;&amp;rarr;&amp;darr;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;이미 선택된 블록을 방향키로 확장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 코드 자동 생성 및 Import&lt;/h2&gt;
&lt;table style=&quot;width: 563px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 192px;&quot;&gt;단축키&lt;/th&gt;
&lt;th style=&quot;width: 371px;&quot;&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 192px;&quot;&gt;&lt;code&gt;Ctrl + N &amp;rarr; Ctrl + V&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 371px;&quot;&gt;&lt;code&gt;public static void main(String[] args)&lt;/code&gt; 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 192px;&quot;&gt;&lt;code&gt;Ctrl + Shift + O&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 371px;&quot;&gt;자동 import + 사용하지 않는 import 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 192px;&quot;&gt;&lt;code&gt;Ctrl + Shift + M&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 371px;&quot;&gt;해당 객체에 커서를 놓고 누르면 Import 구문 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 192px;&quot;&gt;&lt;code&gt;Alt + Shift + S &amp;rarr; V&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 371px;&quot;&gt;Override 메소드 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 192px;&quot;&gt;&lt;code&gt;Alt + Shift + S&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 371px;&quot;&gt;소스 메뉴 출력 (Import, Comment, Generator 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 192px;&quot;&gt;&lt;code&gt;Alt + Shift + Z&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 371px;&quot;&gt;구문 블록을 감싸는 메뉴 제공 (try-catch 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 코드 탐색 및 검색&lt;/h2&gt;
&lt;table style=&quot;width: 522px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 221px;&quot;&gt;단축키&lt;/th&gt;
&lt;th style=&quot;width: 301px;&quot;&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + 클릭&lt;/code&gt; 또는 &lt;code&gt;F3&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;해당 클래스/메소드로 이동 (상세 검색)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + O&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;현재 소스의 메소드 리스트 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + L&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;지정한 줄 번호로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + H&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;프로젝트 전체 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + Alt + H&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;특정 클래스의 호출 위치 찾기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + Shift + G&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;해당 메서드/필드가 쓰이는 곳 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;F4&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;클래스의 상속 계층(Hierarchy) 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 221px;&quot;&gt;&lt;code&gt;Ctrl + Shift + Space&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 301px;&quot;&gt;메소드 파라미터 힌트 보기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 실행 및 디버깅&lt;/h2&gt;
&lt;table style=&quot;width: 537px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 172px;&quot;&gt;단축키&lt;/th&gt;
&lt;th style=&quot;width: 365px;&quot;&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;Ctrl + F11&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;소스 실행 (디버깅 없이)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;F11&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;소스 실행 (디버깅 모드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;F8&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;디버깅 계속 (다음 중단점까지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;F6&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;한 줄씩 디버깅 (Step Over)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;F5&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;함수 내부까지 한 줄씩 디버깅 (Step Into)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;Ctrl + Shift + B&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;커서 줄에 중단점(Breakpoint) 설정/해제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;F2&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;컴파일 에러 줄에서 에러 힌트 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 172px;&quot;&gt;&lt;code&gt;Ctrl + 1&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 365px;&quot;&gt;빠른 교정 (Quick Fix), 구문에 맞게 소스 교정 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 창 관리 및 이동&lt;/h2&gt;
&lt;table style=&quot;width: 458px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 234px;&quot;&gt;단축키&lt;/th&gt;
&lt;th style=&quot;width: 224px;&quot;&gt;기능&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Ctrl + W&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;현재 파일 닫기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Ctrl + Shift + F4&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;열린 파일 모두 닫기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Ctrl + M&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;전체 화면 전환 (토글)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Ctrl + PageUp / PageDown&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;편집 창(탭) 간 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Ctrl + F6&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;열린 창 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;F12&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;Editor 창으로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Alt + 방향키(&amp;larr;&amp;rarr;)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;이전/다음 작업 위치로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 234px;&quot;&gt;&lt;code&gt;Ctrl + _ 또는 {&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 224px;&quot;&gt;레이아웃 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 코드 템플릿 자동완성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Ctrl + Space&lt;/code&gt; + 키워드 = 자동완성&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;입력 + &lt;code&gt;Ctrl + Space&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;자동완성 결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sysout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;System.out.println();&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;try&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;try-catch 문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;for 문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;switch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;switch 문&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&lt;code&gt;Window &amp;gt; Preferences &amp;gt; Java &amp;gt; Editor &amp;gt; Templates&lt;/code&gt;에서 사용자 정의 템플릿 추가&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 환경 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;Ctrl + Shift + L&lt;/code&gt;: 이클립스 전체 단축키 목록 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;Window &amp;gt; Preferences &amp;gt; General &amp;gt; Appearance &amp;gt; Colors and Fonts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;Window &amp;gt; Preferences &amp;gt; General &amp;gt; Editors &amp;gt; Text Editors &amp;gt; Line spacing&lt;/code&gt; (20 이상 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자동 생성 주석 제거 (TODO 주석)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Window &amp;gt; Preferences &amp;gt; Java &amp;gt; Code Style &amp;gt; Code Templates&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Code&lt;/code&gt; 탭에서 &lt;code&gt;New method&lt;/code&gt; 템플릿의 &lt;code&gt;// TODO Auto-generated method stub&lt;/code&gt; 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 줄 길이(Line Width) 조절&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Window &amp;gt; Preferences &amp;gt; Java &amp;gt; Code Style &amp;gt; Formatter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;새 프로파일 생성(Edit) &amp;rarr; &lt;code&gt;Line Wrapping&lt;/code&gt; &amp;rarr; &lt;code&gt;Maximum line width&lt;/code&gt; 조절&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;code&gt;Preferences &amp;gt; Web Services &amp;gt; Server and Runtime &amp;gt; Tomcat v9.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Context root 변경: &lt;code&gt;Project Properties &amp;gt; Web Project Settings &amp;gt; Context root&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Tech Note</category>
      <category>Eclipse</category>
      <category>IDE</category>
      <category>이클립스</category>
      <category>이클립스 단축키 정리</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/80</guid>
      <comments>https://learn-run.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%B4%9D%EC%A0%95%EB%A6%AC-%EA%B0%9C%EB%B0%9C-%EC%83%9D%EC%82%B0%EC%84%B1%EC%9D%84-%EB%86%92%EC%9D%B4%EB%8A%94-%ED%95%84%EC%88%98-%EA%B0%80%EC%9D%B4%EB%93%9C#entry80comment</comments>
      <pubDate>Mon, 13 Apr 2026 14:11:13 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 명령어</title>
      <link>https://learn-run.tistory.com/entry/MySQL-%ED%95%B5%EC%8B%AC-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EC%9E%85%EB%AC%B8%EB%B6%80%ED%84%B0-%EC%8B%A4%EB%AC%B4%EA%B9%8C%EC%A7%80</link>
      <description>&lt;div style=&quot;background-color: #f5f5f5; padding: 20px 25px; border-radius: 10px; margin: 20px 0;&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  목차&lt;/h3&gt;
&lt;ul style=&quot;line-height: 2;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#section1&quot;&gt;1. 데이터베이스 관리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section2&quot;&gt;2. 테이블 관리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section3&quot;&gt;3. 데이터 삽입 (INSERT)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section4&quot;&gt;4. 데이터 조회 (SELECT)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section5&quot;&gt;5. 조인 (JOIN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section6&quot;&gt;6. 데이터 수정 (UPDATE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section7&quot;&gt;7. 데이터 삭제 (DELETE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section8&quot;&gt;8. 인덱스 (INDEX)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section9&quot;&gt;9. 그룹화 &amp;amp; 집계&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section10&quot;&gt;10. 뷰 (VIEW)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section11&quot;&gt;11. 저장 프로시저 (Stored Procedure)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section12&quot;&gt;12. 트랜잭션 (Transaction)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section13&quot;&gt;13. 백업 &amp;amp; 복원&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section14&quot;&gt;14. 사용자 관리 &amp;amp; 권한&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#section15&quot;&gt;15. 상태 확인 &amp;amp; 시스템&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- ==================== 1. 데이터베이스 관리 ==================== --&gt;
&lt;h2 id=&quot;section1&quot; data-ke-size=&quot;size26&quot;&gt;1. 데이터베이스 관리&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 현재 서버에 존재하는 모든 데이터베이스 목록 조회
SHOW DATABASES;

-- 새 데이터베이스 생성
CREATE DATABASE mydb;

-- 사용할 데이터베이스 선택 (이후 쿼리는 해당 DB에서 실행됨)
USE mydb;

-- 데이터베이스 삭제 (IF EXISTS: 존재하지 않아도 에러 발생하지 않음)
DROP DATABASE IF EXISTS mydb;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Tip:&lt;/b&gt; CREATE DATABASE 시 문자셋 명시 : 한글 등 다국어 데이터 안전하게 저장 가능&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 2. 테이블 관리 ==================== --&gt;
&lt;h2 id=&quot;section2&quot; data-ke-size=&quot;size26&quot;&gt;2. 테이블 관리&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DDL(Data Definition Language) : 테이블 생성, 구조 확인, 수정, 삭제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CREATE : 테이블 생성&lt;/li&gt;
&lt;li&gt;DESC (DESCRIBE) : 테이블 구조 확인&lt;/li&gt;
&lt;li&gt;ALTER : 테이블 구조 수정&lt;/li&gt;
&lt;li&gt;DROP : 테이블 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 테이블 생성 및 조회&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 현재 데이터베이스의 모든 테이블 목록 조회
SHOW TABLES;

-- 테이블 생성
CREATE TABLE users (
    id         INT AUTO_INCREMENT PRIMARY KEY,        -- 자동 증가 기본키
    name       VARCHAR(50) NOT NULL,                  -- 이름 (필수)
    email      VARCHAR(100) UNIQUE NOT NULL,           -- 이메일 (유니크 + 필수)
    age        INT DEFAULT 0,                          -- 나이 (기본값 0)
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    -- 생성 시각 (자동 기록)
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
               ON UPDATE CURRENT_TIMESTAMP             -- 수정 시각 (자동 갱신)
);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 테이블 구조 확인&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 테이블의 컬럼 정보(타입, NULL 여부, 키 등) 간단히 조회
DESCRIBE users;

-- 테이블 생성 쿼리 전체를 확인 (엔진, 문자셋 등 포함)
SHOW CREATE TABLE users;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 테이블 구조 변경 (ALTER TABLE)&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 컬럼 추가
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- 컬럼 삭제
ALTER TABLE users DROP COLUMN phone;

-- 컬럼 타입 변경 (이름은 유지)
ALTER TABLE users MODIFY age SMALLINT;

-- 컬럼 이름 + 타입 동시 변경
ALTER TABLE users CHANGE name full_name VARCHAR(100);

-- 테이블 이름 변경
ALTER TABLE users RENAME TO members;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 테이블 삭제&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 테이블 삭제 (IF EXISTS: 존재하지 않아도 에러 없음)
DROP TABLE IF EXISTS members;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️&lt;b&gt; DROP TABLE&lt;/b&gt; : 테이블 구조와 데이터 모두 삭제&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 3. 데이터 삽입 (INSERT) ==================== --&gt;
&lt;h2 id=&quot;section3&quot; data-ke-size=&quot;size26&quot;&gt;3. 데이터 삽입 (INSERT)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DML(Data Manipulation Language) : 데이터 삽입, 조회, 수정, 삭제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;INSERT : 데이터 삽입&lt;/li&gt;
&lt;li&gt;SELECT : 데이터 조회&lt;/li&gt;
&lt;li&gt;UPDATE : 데이터 수정&lt;/li&gt;
&lt;li&gt;DELETE : 데이터 삭제&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 여러 행 한 번에 삽입 (권장: 단건 INSERT보다 성능이 좋음)
INSERT INTO users (name, email, age) VALUES 
('홍길동', 'hong@example.com', 30),
('김철수', 'kim@example.com', 25),
('이영희', 'lee@example.com', 28);

-- SET 구문을 사용한 단건 삽입 (컬럼=값 형태로 직관적)
INSERT INTO users SET name='박민수', email='park@example.com', age=35;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  대량 데이터 삽입 시 &lt;code&gt;LOAD DATA INFILE&lt;/code&gt;이나 &lt;code&gt;INSERT INTO ... SELECT&lt;/code&gt; 구문 활용 (빠름)&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 4. 데이터 조회 (SELECT) ==================== --&gt;
&lt;h2 id=&quot;section4&quot; data-ke-size=&quot;size26&quot;&gt;4. 데이터 조회 (SELECT)&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 전체 데이터 조회
SELEC * ROM users;

-- 특정 컬럼만 조회 + 조건(WHERE) + 정렬(ORDER BY)
-- age가 25 이상인 사용자를 나이 내림차순으로 조회
SELECT name, email, age 
FROM users 
WHERE age &amp;gt;= 25 
ORDER BY age DESC;

-- 패턴 검색 (LIKE) + 다중 조건 (OR)
-- 이름에 '길'이 포함되거나 이메일에 'example'이 포함된 사용자
SELEC * ROM users 
WHERE name LIKE '%길%' OR email LIKE '%example%';

-- 집계 함수: 전체 행 수
SELECT COUNT(*) AS total FROM users;

-- 집계 함수: 평균 나이
SELECT AVG(age) AS avg_age FROM users;

-- 페이지네이션: 1페이지 (0번째부터 10개)
SELEC * ROM users LIMIT 10 OFFSET 0;

-- 중복 제거: 고유한 나이 값만 조회
SELECT DISTINCT age FROM users;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  OFFSET : 0부터 시작, N페이지 조회 시 &lt;code&gt;OFFSET = (N - 1 * IMIT&lt;/code&gt; 으로 계산&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 5. 조인 (JOIN) ==================== --&gt;
&lt;h2 id=&quot;section5&quot; data-ke-size=&quot;size26&quot;&gt;5. 조인 (JOIN)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JOIN (데이터 결합) : 다수 테이블 연결 및 조회&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 조인용 테이블 생성&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE orders (
    order_id   INT AUTO_INCREMENT PRIMARY KEY,
    user_id    INT,                              -- users 테이블의 id를 참조
    amount     DECIMAL(10,2),                    -- 주문 금액
    order_date DATE,                             -- 주문 일자
    FOREIGN KEY (user_id) REFERENCES users(id)   -- 외래키 설정
);

-- 주문 데이터 삽입
INSERT INTO orders (user_id, amount, order_date) 
VALUES (1, 100000, '2025-12-01');&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. INNER JOIN 실행&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- users와 orders를 user_id로 연결하여 조회
SELECT u.name, o.amount, o.order_date 
FROM users u 
JOIN orders o ON u.id = o.user_id;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;JOIN 종류 한눈에 보기&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead style=&quot;background-color: #e9e9e9;&quot;&gt;
&lt;tr&gt;
&lt;th&gt;종류&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INNER JOIN&lt;/td&gt;
&lt;td&gt;양쪽 테이블에 모두 일치하는 데이터만 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEFT JOIN&lt;/td&gt;
&lt;td&gt;왼쪽 테이블 전체 + 오른쪽 일치 데이터 (없으면 NULL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RIGHT JOIN&lt;/td&gt;
&lt;td&gt;오른쪽 테이블 전체 + 왼쪽 일치 데이터 (없으면 NULL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CROSS JOIN&lt;/td&gt;
&lt;td&gt;양쪽 테이블의 모든 조합 (카테시안 곱)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 6. 데이터 수정 (UPDATE) ==================== --&gt;
&lt;h2 id=&quot;section6&quot; data-ke-size=&quot;size26&quot;&gt;6. 데이터 수정 (UPDATE)&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 모든 사용자의 나이를 1 증가 (WHERE 조건 필수, 안전 모드 우회를 위해 id &amp;gt; 0 사용)
UPDATE users SET age = age + 1 WHERE id &amp;gt; 0;

-- 이메일이 NULL인 사용자에게 이름 기반 이메일 자동 설정
UPDATE users SET email = CONCAT(name, '@example.com') WHERE email IS NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;0&quot;&gt;MySQL Safe Updates 모드 (sql_safe_updates) 주의&lt;br /&gt;&lt;/b&gt;- 해당 모드 활성화 시, WHERE 절에 키(Key) 컬럼이 없는 UPDATE 및 DELETE 명령어 실행 불가&lt;br /&gt;- 의도적으로 전체 데이터를 수정하거나 삭제해야 할 경우 WHERE id &amp;gt; 0 등의 우회 조건 추가 필요&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 7. 데이터 삭제 (DELETE) ==================== --&gt;
&lt;h2 id=&quot;section7&quot; data-ke-size=&quot;size26&quot;&gt;7. 데이터 삭제 (DELETE)&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 특정 행 삭제
DELETE FROM users WHERE id = 1;

-- 조건에 맞는 행 삭제
DELETE FROM users WHERE age &amp;lt; 20;

-- 테이블의 모든 데이터 초기화 (구조는 유지, AUTO_INCREMENT도 초기화)
TRUNCATE TABLE users;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;DELETE vs TRUNCATE 차이점&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 70%;&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead style=&quot;background-color: #e9e9e9;&quot;&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 25.2326%;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;width: 22.907%;&quot;&gt;DELETE&lt;/th&gt;
&lt;th style=&quot;width: 21.7441%;&quot;&gt;TRUNCATE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;롤백 가능 여부&lt;/td&gt;
&lt;td style=&quot;width: 22.907%;&quot;&gt;✅ 가능 (트랜잭션 내)&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%;&quot;&gt;❌ 불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;WHERE 조건&lt;/td&gt;
&lt;td style=&quot;width: 22.907%;&quot;&gt;✅ 사용 가능&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%;&quot;&gt;❌ 사용 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;width: 22.907%;&quot;&gt;상대적으로 느림&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%;&quot;&gt;매우 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;AUTO_INCREMENT&lt;/td&gt;
&lt;td style=&quot;width: 22.907%;&quot;&gt;유지됨&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%;&quot;&gt;초기화됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 8. 인덱스 (INDEX) ==================== --&gt;
&lt;h2 id=&quot;section8&quot; data-ke-size=&quot;size26&quot;&gt;8. 인덱스 (INDEX)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;INDEX : 조회 성능 향상을 위한 데이터 색인 생성, 수정, 삭제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CREATE INDEX : 인덱스 생성&lt;/li&gt;
&lt;li&gt;SHOW INDEX : 테이블의 인덱스 정보 확인&lt;/li&gt;
&lt;li&gt;ALTER INDEX : 인덱스 이름 변경 및 구조 수정&lt;/li&gt;
&lt;li&gt;DROP INDEX : 인덱스 삭제&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 일반 인덱스 생성 (중복 허용)
CREATE INDEX idx_email ON users(email);

-- 유니크 인덱스 생성 (중복 불허)
CREATE UNIQUE INDEX idx_name ON users(name);

-- 테이블에 설정된 인덱스 목록 조회
SHOW INDEX FROM users;

-- 인덱스 삭제
DROP INDEX idx_email ON users;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;0&quot;&gt;인덱스 (Index)&lt;br /&gt;&lt;/b&gt;- SELECT 조회 성능 향상, 단 DML(INSERT/UPDATE/DELETE) 실행 시 갱신 비용 발생&lt;br /&gt;- 자주 조회하는 컬럼에 한해 선별적 적용&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 9. 그룹화 &amp; 집계 ==================== --&gt;
&lt;h2 id=&quot;section9&quot; data-ke-size=&quot;size26&quot;&gt;9. 그룹화 &amp;amp; 집계&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GROUP BY / HAVING : 데이터 그룹화 및 조건 필터링&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GROUP BY : 특정 컬럼을 기준으로 데이터 그룹화 (주로 COUNT, SUM, AVG 등 집계 함수와 함께 사용)&lt;/li&gt;
&lt;li&gt;HAVING : 그룹화된 데이터 결과에 대한 조건 필터링 (WHERE은 데이터 그룹화 전, HAVING은 그룹화 후 적용)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 나이별 그룹화 후, 인원이 2명 이상인 그룹만 조회
SELECT age, 
       COUNT(*) AS count, 
       AVG(age) AS avg 
FROM users 
GROUP BY age 
HAVING count &amp;gt; 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;WHERE vs HAVING&lt;/b&gt;&lt;br /&gt;&lt;b&gt;WHERE:&lt;/b&gt; 그룹화 이전에 개별 행을 필터링&lt;br /&gt;&lt;b&gt;HAVING:&lt;/b&gt; 그룹화 이후에 그룹 결과를 필터링&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 10. 뷰 (VIEW) ==================== --&gt;
&lt;h2 id=&quot;section10&quot; data-ke-size=&quot;size26&quot;&gt;10. 뷰 (VIEW)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VIEW : 자주 사용하는 쿼리를 가상 테이블로 저장 및 재사용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CREATE VIEW : 뷰 생성&lt;/li&gt;
&lt;li&gt;DROP VIEW : 뷰 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- 25세 이상 사용자만 보여주는 뷰 생성
CREATE VIEW user_summary AS 
SELECT name, age FROM users WHERE age &amp;gt;= 25;

-- 뷰 조회 (일반 테이블처럼 사용)
SELEC * ROM user_summary;

-- 뷰 삭제
DROP VIEW IF EXISTS user_summary;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;0&quot;&gt;뷰 (View)&lt;br /&gt;&lt;/b&gt;- 실제 데이터 저장 없이 쿼리 결과만 보여주는 가상 테이블&lt;br /&gt;- 원본 테이블 데이터 변경 시 뷰 결과 자동 반영&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 11. 저장 프로시저 ==================== --&gt;
&lt;h2 id=&quot;section11&quot; data-ke-size=&quot;size26&quot;&gt;11. 저장 프로시저 (Stored Procedure)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STORED PROCEDURE : 자주 사용하는 SQL 로직 서버 저장 및 호출&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CREATE PROCEDURE : 프로시저 생성&lt;/li&gt;
&lt;li&gt;CALL : 프로시저 호출 및 실행&lt;/li&gt;
&lt;li&gt;DROP PROCEDURE : 프로시저 삭제&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;-- 프로시저 생성: 입력받은 나이 이상의 사용자 조회
DELIMITER //
CREATE PROCEDURE GetUsersByAge(IN min_age INT)
BEGIN
    SELEC * ROM users WHERE age &amp;gt;= min_age;
END //
DELIMITER ;

-- 프로시저 호출
CALL GetUsersByAge(25);

-- 프로시저 삭제
DROP PROCEDURE IF EXISTS GetUsersByAge;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&lt;code&gt;DELIMITER //&lt;/code&gt; : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로시저 본문 내 세미콜론(;) 오인식 방지용 구분자 임시 변경&lt;/span&gt; &lt;br /&gt;- &lt;code&gt;DELIMITER ;&lt;/code&gt; : 프로시저 정의 완료 후 기본 구분자 복원&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 12. 트랜잭션 ==================== --&gt;
&lt;h2 id=&quot;section12&quot; data-ke-size=&quot;size26&quot;&gt;12. 트랜잭션 (Transaction)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TRANSACTION : 다수 SQL 문 단일 작업 단위 결합 및 무결성 보장&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;START TRANSACTION : 트랜잭션 시작&lt;/li&gt;
&lt;li&gt;COMMIT : 작업 결과 영구 반영&lt;/li&gt;
&lt;li&gt;ROLLBACK : 작업 취소 및 이전 상태 복구&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 트랜잭션 시작
START TRANSACTION;

-- 작업 1: 데이터 삽입
INSERT INTO users (name, email, age) VALUES ('테스트', 'test@example.com', 20);

-- 작업 2: 데이터 수정
UPDATE users SET age = 21 WHERE name = '테스트';

-- 모든 작업이 정상이면 확정
COMMIT;

-- 문제가 발생했다면 모든 작업을 되돌림
-- ROLLBACK;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  ACID 원칙&amp;nbsp; : 트랜잭션 정합성 보장 필수 속성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원자성(Atomicity)&lt;/b&gt; : 작업 단위 전체 성공 또는 전체 실패 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일관성(Consistency)&lt;/b&gt;&amp;nbsp;: 트랜잭션 전후 데이터 규칙 및 상태 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;격리성(Isolation)&lt;/b&gt;&amp;nbsp;: 트랜잭션 상호 간 간섭 및 영향 배제&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속성(Durability)&lt;/b&gt;&amp;nbsp;: 성공한 결과의 영구적 저장 및 보존&lt;/li&gt;
&lt;li&gt;활용 : 금융 거래, 재고 처리 등 데이터 무결성 중요 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 13. 백업 &amp; 복원 ==================== --&gt;
&lt;h2 id=&quot;section13&quot; data-ke-size=&quot;size26&quot;&gt;13. 백업 &amp;amp; 복원&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BACKUP &amp;amp; RESTORE : 데이터 유실 대비 터미널(CLI) 기반 백업 및 복원 &lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;# 데이터베이스 백업 (SQL 파일로 내보내기)
mysqldump -u root -p mydb &amp;gt; backup.sql

# 데이터베이스 복원 (SQL 파일 가져오기)
mysql -u root -p mydb &amp;lt; backup.sql&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백업 실행 : mysqldump -u root -p [DB명] &amp;gt; [파일명].sql&lt;/li&gt;
&lt;li&gt;복원 실행 : mysql -u root -p [DB명] &amp;lt; [파일명].sql&lt;/li&gt;
&lt;li&gt;전체 DB 백업 : mysqldump -u root -p --all-databases &amp;gt; all_backup.sql&lt;/li&gt;
&lt;li&gt;특정 테이블 백업 : mysqldump -u root -p mydb users &amp;gt; users_backup.sql&lt;/li&gt;
&lt;li&gt;자동화 : 운영 환경 내 crontab 활용 백업 스케줄링 적용 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 14. 사용자 관리 &amp; 권한 ==================== --&gt;
&lt;h2 id=&quot;section14&quot; data-ke-size=&quot;size26&quot;&gt;14. 사용자 관리 &amp;amp; 권한&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 사용자 생성
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'password123';

-- 특정 권한만 부여 (SELECT, INSERT, UPDATE)
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'dev'@'localhost';

-- 모든 권한 부여
GRANT ALL PRIVILEGES ON mydb.* TO 'dev'@'localhost';

-- 권한 변경 사항을 즉시 반영
FLUSH PRIVILEGES;

-- 사용자에게 부여된 권한 확인
SHOW GRANTS FOR 'dev'@'localhost';

-- 모든 권한 회수
REVOKE ALL PRIVILEGES ON mydb.* FROM 'dev'@'localhost';

-- 사용자 삭제
DROP USER 'dev'@'localhost';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;⚠️ DCL(Data Control Language) : 사용자 생성 및 권한 관리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CREATE USER : 사용자 생성&lt;/li&gt;
&lt;li&gt;GRANT : 권한 부여&lt;/li&gt;
&lt;li&gt;REVOKE : 권한 회수&lt;/li&gt;
&lt;li&gt;DROP USER : 사용자 삭제&lt;/li&gt;
&lt;li&gt;보안 팁 : 최소 권한 원칙(Principle of Least Privilege) 준수 및 운영 환경 내 ALL PRIVILEGES 남용 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 15. 상태 확인 &amp; 시스템 ==================== --&gt;
&lt;h2 id=&quot;section15&quot; data-ke-size=&quot;size26&quot;&gt;15. 상태 확인 &amp;amp; 시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SERVER MONITORING : 서버 상태 및 시스템 정보 확인&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;top / htop : 실시간 CPU 및 메모리 점유율 모니터링&lt;/li&gt;
&lt;li&gt;df -h : 디스크 여유 공간 및 사용 현황 확인&lt;/li&gt;
&lt;li&gt;du -sh : 디렉토리별 디스크 사용량 합계 조회&lt;/li&gt;
&lt;li&gt;free -m : 물리 메모리 및 스왑 메모리 상태 확인&lt;/li&gt;
&lt;li&gt;uptime : 시스템 가동 시간 및 평균 부하 확인&lt;/li&gt;
&lt;li&gt;ps aux : 전체 프로세스 실행 현황 및 자원 점유 조회&lt;/li&gt;
&lt;li&gt;netstat -ntlp / ss -ntlp : 네트워크 포트 활성화 및 연결 상태 확인&lt;/li&gt;
&lt;li&gt;lscpu : CPU 아키텍처 및 상세 정보 조회&lt;/li&gt;
&lt;li&gt;uname -a : 운영체제 버전 및 커널 정보 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 현재까지의 연결 수 등 상태 변수 조회
SHOW STATUS LIKE 'Connections%';

-- MySQL 버전 관련 시스템 변수 조회
SHOW VARIABLES LIKE 'version%';

-- MySQL 버전 확인
SELECT VERSION();

-- 현재 사용 중인 데이터베이스 확인
SELECT DATABASE();

-- 서버 상태 요약 정보 (연결 정보, 버전, 스레드 등)
STATUS;

-- MySQL 종료
EXIT;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;
&lt;!-- ==================== 마무리 ==================== --&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 카테고리별 요약&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 74.7674%;&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead style=&quot;background-color: #e9e9e9;&quot;&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 26.5116%;&quot;&gt;카테고리&lt;/th&gt;
&lt;th style=&quot;width: 48.1395%;&quot;&gt;핵심 키워드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.5116%;&quot;&gt;데이터베이스/테이블 관리&lt;/td&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;CREATE, ALTER, DROP, SHOW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.5116%;&quot;&gt;데이터 조작 (CRUD)&lt;/td&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;INSERT, SELECT, UPDATE, DELETE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.5116%;&quot;&gt;조회 심화&lt;/td&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;JOIN, GROUP BY, HAVING, LIKE, LIMIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.5116%;&quot;&gt;성능 &amp;amp; 재사용&lt;/td&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;INDEX, VIEW, Stored Procedure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.5116%;&quot;&gt;안정성 &amp;amp; 보안&lt;/td&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;TRANSACTION, GRANT, REVOKE, mysqldump&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#top&quot;&gt;⬆ 목차로 돌아가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>  Tech Note</category>
      <category>JOIN</category>
      <category>MySQL</category>
      <category>mysql명령어</category>
      <category>SQL</category>
      <category>sql정리</category>
      <category>데이터베이스</category>
      <category>인덱스</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/79</guid>
      <comments>https://learn-run.tistory.com/entry/MySQL-%ED%95%B5%EC%8B%AC-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EC%9E%85%EB%AC%B8%EB%B6%80%ED%84%B0-%EC%8B%A4%EB%AC%B4%EA%B9%8C%EC%A7%80#entry79comment</comments>
      <pubDate>Mon, 13 Apr 2026 14:06:40 +0900</pubDate>
    </item>
    <item>
      <title>Git 명령어</title>
      <link>https://learn-run.tistory.com/entry/Git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95%EB%B6%80%ED%84%B0-%ED%98%91%EC%97%85%EA%B9%8C%EC%A7%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본 명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 업로드 흐름&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git add .
git commit -m &quot;커밋 메시지&quot;
git push origin main&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상태 확인 및 파일 생성&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;현재 작업 디렉토리 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;touch README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빈 README.md 파일 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;add 취소&lt;/h3&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;git reset              # 전체 add 취소
git reset 파일명        # 특정 파일만 add 취소&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파일 단일 업로드&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git add src/App.java
git commit -m &quot;Update App.java&quot;
git push origin main&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 커밋 관리&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git commit --amend -m &quot;수정 메시지&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;가장 최근 커밋 메시지 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;최근 커밋 목록을 한 줄씩 간결하게 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git rebase -i HEAD~2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;마지막 2개 커밋 합치기 (squash)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커밋한 파일 제거&lt;/h3&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;code&gt;git filter-branch&lt;/code&gt;: Git 내장 명령어 (느리지만 별도 설치 불필요)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BFG Repo-Cleaner&lt;/b&gt;: 외부 도구 (빠르고 간편)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 브랜치 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;브랜치 확인&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;로컬 브랜치 목록 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git branch -r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;원격 브랜치 목록 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git branch -a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;전체(로컬 + 원격) 브랜치 목록 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;브랜치 이동 및 생성&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;git checkout feature-shy    # 해당 브랜치로 이동 (없으면 생성)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 동기화 및 충돌 해결&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원격 저장소 강제 동기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 변경사항을 버리고 원격 저장소 상태로 완전히 맞출 때 사용&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;git fetch origin              # 원격의 최신 변경사항을 가져옴 (병합 없이 포인터만 업데이트)
git reset --hard origin/main  # 로컬을 원격 main 상태로 강제 이동 (로컬 변경사항 영구 삭제)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;강제 Push&lt;/h3&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;git push -f origin main&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ GIT FORCE PUSH 주의 : 팀원 작업 덮어쓰기 방지용 사전 공유 필수&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;병합 충돌 해결&lt;/h3&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;git stash          # 현재 변경사항을 임시 저장
git pull           # 원격 변경사항 가져오기
git stash pop      # 임시 저장한 변경사항 다시 적용&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존 변경사항 완벽 제거&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GIT CLEAN &amp;amp; RESET : 원격 저장소와 동일 상태 동기화 및 미추적 파일 제거&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;git fetch origin
git reset --hard origin/main
git clean -fd                # -f(강제), -d(디렉토리 포함) 미추적 파일 및 폴더 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;강제 Pull (가장 확실한 동기화)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git fetch --all
git reset --hard origin/main
git pull origin main&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 캐시 및 성능 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Git 캐시 클리어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.gitignore&lt;/code&gt; 무시 규칙 재적용을 위한 인덱스 초기화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git rm -r --cached . : 전체 캐시 삭제 및 파일 추적 중단&lt;/li&gt;
&lt;li&gt;git add . : 변경된 무시 규칙 반영 및 등록&lt;/li&gt;
&lt;li&gt;git commit -m &quot;fix gitignore&quot; : 캐시 초기화 내역 반영 완료&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git rm -r --cached .
git add .
git commit -m &quot;cache cleared&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Git 저장소 느려질 때&lt;/h3&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;git gc --aggressive    # 저장소 최적화 (가비지 컬렉션)
git prune              # 불필요한 객체 제거&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 빌드 및 배포 (GitHub Pages)&lt;/h2&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;npm install -D gh-pages        # gh-pages 패키지 설치
npm run build                  # 프로젝트 빌드
npx gh-pages -d dist -b gh-pages   # dist 폴더를 gh-pages 브랜치로 배포&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 초기 설정 가이드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 초기화 및 원격 저장소 연동&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git init : 로컬 저장소 생성 및 초기화&lt;/li&gt;
&lt;li&gt;git add . : 전체 파일 스테이징 영역 추가&lt;/li&gt;
&lt;li&gt;git commit -m &quot;message&quot; : 작업 내역 기록 및 커밋 생성&lt;/li&gt;
&lt;li&gt;git branch -M main : 기본 브랜치명을 main으로 변경&lt;/li&gt;
&lt;li&gt;git remote add origin [URL] : GitHub 원격 저장소 주소 등록&lt;/li&gt;
&lt;li&gt;git push -u origin main : 원격 저장소 데이터 업로드 및 스트림 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;echo &quot;프로젝트 설명&quot; &amp;gt;&amp;gt; README.md           # README 파일 생성
git init                                    # 현재 폴더를 Git 저장소로 초기화
git branch -M main                          # 기본 브랜치 이름을 main으로 변경
git remote add origin [레포URL]              # 원격 저장소 연결
git pull origin main --allow-unrelated-histories  # 원격 초기 파일 병합 (README 있으면 필수)
git status
git add .
git commit -m &quot;Initial commit&quot;
git push -u origin main                     # 첫 푸시 및 업스트림 설정 (브랜치 추적)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 협업 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;작업 및 Push 흐름&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;git add .
git commit -m &quot;커밋 메시지 작성&quot;
git push origin feature-shy&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pull Request&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 내역 병합 요청&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub 웹 저장소 접속&lt;/li&gt;
&lt;li&gt;Compare &amp;amp; pull request 버튼 클릭&lt;/li&gt;
&lt;li&gt;변경 내역 확인 및 메시지 작성&lt;/li&gt;
&lt;li&gt;Create pull request 선택을 통한 최종 요청 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;팀 커뮤니케이션 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공용 파일 수정 시 충돌 방지를 위한 팀 사전 공지 필수&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[공지] ActionFactory 수정할게요. 5분간 Pull 금지
[완료] ActionFactory 수정 끝! Pull 받으세요~&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Tech Note</category>
      <category>git</category>
      <category>github</category>
      <category>git명령어</category>
      <author>this.Serena</author>
      <guid isPermaLink="true">https://learn-run.tistory.com/78</guid>
      <comments>https://learn-run.tistory.com/entry/Git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95%EB%B6%80%ED%84%B0-%ED%98%91%EC%97%85%EA%B9%8C%EC%A7%80#entry78comment</comments>
      <pubDate>Mon, 13 Apr 2026 14:06:28 +0900</pubDate>
    </item>
  </channel>
</rss>