<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Dev_Choonsik_SEO.log</title>
        <link>https://velog.io/</link>
        <description>One step, Two step</description>
        <lastBuildDate>Thu, 01 May 2025 12:31:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Dev_Choonsik_SEO.log</title>
            <url>https://velog.velcdn.com/images/choonsik_seo/profile/0369d8e7-f38b-45fa-9a3e-fe7a7d81f040/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Dev_Choonsik_SEO.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/choonsik_seo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[github 명령어 branch 관련]]></title>
            <link>https://velog.io/@choonsik_seo/github-%EB%AA%85%EB%A0%B9%EC%96%B4-branch-%EA%B4%80%EB%A0%A8</link>
            <guid>https://velog.io/@choonsik_seo/github-%EB%AA%85%EB%A0%B9%EC%96%B4-branch-%EA%B4%80%EB%A0%A8</guid>
            <pubDate>Thu, 01 May 2025 12:31:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/f4cde7ae-47af-4eb1-b194-0b28f77d618f/image.png" alt=""></p>
<h3 id="현재-로컬-브랜치를-확인할-때">현재 로컬 브랜치를 확인할 때</h3>
<p><strong>git branch</strong></p>
<h3 id="로컬에-새로운-브랜치를-만들-때">로컬에 새로운 브랜치를 만들 때</h3>
<p>git <strong>branch</strong> Locatation/choonsik    &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&lt;&lt; 폴더명/브랜치명
git <strong>branch</strong> choonsik &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp &lt;&lt; 브랜치명</p>
<h3 id="로컬-브랜치를-체크아웃-할-때">로컬 브랜치를 체크아웃 할 때</h3>
<p>git <strong>checkout -b</strong> LocationHousing/choonsik
git <strong>checkout -b</strong> choonsik</p>
<h3 id="로컬-브랜치를-삭제할-때">로컬 브랜치를 삭제할 때</h3>
<p>git <strong>branch -d</strong> LocationHousing/choonsik
git <strong>branch -d</strong> choonsik</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ch.01) 02~04. 개발 도구 소개 & 도구 설치(window)]]></title>
            <link>https://velog.io/@choonsik_seo/Ch.01-0204.-%EA%B0%9C%EB%B0%9C-%EB%8F%84%EA%B5%AC-%EC%86%8C%EA%B0%9C</link>
            <guid>https://velog.io/@choonsik_seo/Ch.01-0204.-%EA%B0%9C%EB%B0%9C-%EB%8F%84%EA%B5%AC-%EC%86%8C%EA%B0%9C</guid>
            <pubDate>Thu, 13 Feb 2025 08:35:03 GMT</pubDate>
            <description><![CDATA[<h2 id="02-개발-도구-소개">02. 개발 도구 소개</h2>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/eed8d51a-2d5b-4312-987d-be57b642a6f1/image.png" alt=""></p>
<ul>
<li>자바 개발 도구(JDK) : Java11(영상기준)</li>
<li>통합개발 환경 : STS, IntelliJ</li>
<li>웹 서버 : Tomcat9</li>
<li>웹 브라우저 : Chrome</li>
<li>데이터베이스 : MySQL</li>
<li>기타 : VScode, Git, AWS, Maven</li>
</ul>
<h2 id="03-개발-도구-설치---window">03. 개발 도구 설치 - window</h2>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/5a6291ac-d7c9-433d-ad95-51b0d8b15706/image.png" alt=""></p>
<h3 id="1-vscode-설치">1. VScode 설치</h3>
<ul>
<li>마켓플레이스에서 추가<ul>
<li>Prettie</li>
<li>Code formatter<ul>
<li>open in browser<ul>
<li>Auto Rename Tag</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="2-git-설치">2. git 설치</h3>
<p><a href="https://git-scm.com/download/win">https://git-scm.com/download/win</a> 에서 다운로드 받고 설치하기</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/0b033e5d-d2d6-405d-be46-4971ff061f6f/image.png" alt="">Git설치완료</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/choonsik_seo/post/e110cdfd-9aa6-4faf-941a-f44c97269cd0/image.png" alt="">제대로 실행되었는지 한번 더 확인</td>
</tr>
<tr>
<td>---</td>
</tr>
</tbody></table>
<h3 id="3-jdk-설치">3. JDK 설치</h3>
<p>우선,</p>
<ul>
<li>[openjdk-11.0.2_windows-x75_bin.zip] 안에 [jdk-11.0.2] 폴더를 C드라이브에 옮김,</li>
<li>압축풀리고 이름을 [jdk11]로 변경</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/385825f8-a2b6-48b9-8511-59c259f4b4e3/image.png" alt=""> [제어판] - [시스템 환경 변수 편집] - [환경변수]클릭</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/f40aec18-136d-4fef-bbf5-0b1168a73adb/image.png" alt="">Path 편집 클릭</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/d393deff-170e-40ce-a8bf-9b450c1a63c7/image.png" alt="">[새로만들기] 클릭 - <code>C:\jdk11\bin</code> 입력</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/649bda5e-b62a-4359-a6d3-5e46f16fd1d2/image.png" alt="">변수 이름, 변수 값 작성하기 - [확인] 클릭</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/9b40a59b-3cc8-4582-9e6c-e2ecae49225a/image.png" alt="">cmd창에서 제대로 적용된 부분 확인</th>
</tr>
</thead>
</table>
<br>

<h3 id="4-tomcat9-설치">4. Tomcat9 설치</h3>
<p><a href="https://tomcat.apache.org/download/download-90.cgi">https://tomcat.apache.org/download/download-90.cgi</a>
다운로드 받은 파일 설치하고자 하는 디렉토리로 이동 후 아래 명령을 실행하기</p>
<pre><code>$ tar -xvf apache-tomcat-9.0.50.tar.gz -C ~</code></pre><p>압축풀어서 사용자 홈 디렉토리(~)에 저장</p>
<p>설치가 완료되면
<img src="https://velog.velcdn.com/images/choonsik_seo/post/aa873f35-6a63-4da1-afd5-d74eae534048/image.png" alt="">
이런 이미지가 보여져야함</p>
<h3 id="5-sts-또는-intellij-다운로드">5. STS 또는 IntelliJ 다운로드</h3>
<p>인텔리제이는 JetBrain에서 다운받으면 됨,
STS는 하단 강사님의 git 링크 접속해서 다운 받으면 됨.</p>
<blockquote>
<p>남궁성 강사님 스프링 깃헙주소
<a href="https://github.com/castello/spring_basic">https://github.com/castello/spring_basic</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ch.01) 01. 강의 개요 및 Spring Framework는 무엇일까]]></title>
            <link>https://velog.io/@choonsik_seo/Ch.01-01.-%EA%B0%95%EC%9D%98-%EA%B0%9C%EC%9A%94-%EB%B0%8F-Spring-Framework%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</link>
            <guid>https://velog.io/@choonsik_seo/Ch.01-01.-%EA%B0%95%EC%9D%98-%EA%B0%9C%EC%9A%94-%EB%B0%8F-Spring-Framework%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</guid>
            <pubDate>Thu, 13 Feb 2025 05:54:02 GMT</pubDate>
            <description><![CDATA[<h3 id="1-강의-개요">1. 강의 개요</h3>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/8610c020-b009-46d6-aad7-708646ef18e9/image.png" alt=""></p>
<ul>
<li>스프링의 정석 기본편</li>
<li>Spring의 기본 원리 이해
Spring으로 웹 사이트 구축, AWS배포</li>
<li>자바 기본적으로 공부해놓고, HTML과 CSS는 얇은 책 하나 선정해서 공부하기</li>
</ul>
<br>

<h3 id="2-강의-내용">2. 강의 내용</h3>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/91947f7e-5c3b-4c04-bfc3-604ea2f8d781/image.png" alt=""></p>
<br>

<h3 id="3-spring-framework-공부-방법">3. Spring Framework 공부 방법</h3>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/5bac84ab-da8f-4fb1-aa82-2e0dde45c565/image.png" alt=""></p>
<ul>
<li>spring어렵다고 하면 자바 기본서를 많이 찾아보기</li>
<li>실습, 또 반복, 복습</li>
<li><strong>에러메시지</strong> 꼭꼭 읽기!!</li>
</ul>
<br>

<h3 id="4-spring-frameworkdml-역사">4. Spring Frameworkdml 역사</h3>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/58563f66-ac6e-449d-8dc9-1fc4007594aa/image.png" alt=""></p>
<ul>
<li><ol start="1995">
<li>JAVA 출시</li>
</ol>
</li>
<li><ol start="1999">
<li>EJB(Enterprise JavaBeans) 출시</li>
</ol>
</li>
<li><ol start="2004">
<li>Spring 출시 (EJB에 어려운사람들이 열광)
Framework가 인기 있는 이유 : 유지보수 때문</li>
</ol>
</li>
<li><ol start="2014">
<li>SpringBoot 출시
Spring을 배우는 이유 : Servlet &gt; Jsp &gt; Spring &gt;= SpringBoot 이 발전과정과 Spring의 원리를 파악하기 위함</li>
</ol>
</li>
</ul>
<br>


<h3 id="강사님의-당부의-말">강사님의 당부의 말</h3>
<blockquote>
<ol>
<li>자바 기본 꾸준히 복습</li>
<li>스프링 <strong>실습 &gt;&gt;&gt; 이론</strong>
&quot;<strong>반복 만이 살 길이다, 감잡힐 때까지</strong>&quot;</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[실습) Discord에 ChatGPT_Bot 만들어보기]]></title>
            <link>https://velog.io/@choonsik_seo/%EC%8B%A4%EC%8A%B5-Discord%EC%97%90-ChatGPTBot-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@choonsik_seo/%EC%8B%A4%EC%8A%B5-Discord%EC%97%90-ChatGPTBot-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 07 Feb 2025 02:06:31 GMT</pubDate>
            <description><![CDATA[<h2 id="-서론">** 서론</h2>
<p>학원에서 파이썬 수업을 듣고, upstage ai를 적용한 frompt로 LLM에게 질문하는 실습을 해보면서,</p>
<p><strong>&quot;현재 우리가 사용하는 ChatGPT를 어느툴이든 적용할 수 있지 않을까&quot;</strong></p>
<p>생각이 들었다.
찾아보니, 친숙한 <strong>Discord</strong> 프로그램에 <strong>ChatBot</strong>을 적용하는 사례가 있어서 실습을 해보려한다.
<br></p>
<hr>
<h2 id="-본론">** 본론</h2>
<br>

<h3 id="필요한-툴-기능-들">필요한 툴, 기능 들</h3>
<pre><code>Discord, ChatGPT OpenAI API KEY, MONEY</code></pre><p>AI모델은 개인의 취향에 맞게 선택가능하며, 과금이 발생할 수 있음. 참고로 필자는 OpenAI를 사용하면서 $5 지불함.
<br></p>
<h3 id="실습-1-openai-api">실습 1. OpenAI API</h3>
<h4 id="1-openai-사이트-접속">1. OpenAI 사이트 접속</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/8cf65d99-ed3a-4393-b8b7-da3d98915e01/image.png" alt=""><img src="https://velog.velcdn.com/images/choonsik_seo/post/774da949-d549-43fa-9830-5523f312cc20/image.png" alt=""><a href="https://platform.openai.com/docs/overview">https://platform.openai.com/docs/overview</a></th>
</tr>
</thead>
<tbody><tr>
<td><br></td>
</tr>
</tbody></table>
<h4 id="2-계정이-없으면-회원가입하기-로그인-한-후-5상품-결제하기">2. (계정이 없으면 회원가입하기) 로그인 한 후 $5상품 결제하기</h4>
<p>➡️ 본인의 API Key는 <strong>무조건</strong> 다른 곳에 복사해 놓기
<br><em>Key는 복사해서 다른 곳에 붙여놨지만, 캡처해 놓지 않은 건 아쉽네..</em>
<br></p>
<h4 id="3-결제-후-확인">3. 결제 후 확인!</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/e37da640-4db9-4437-919a-725e7b1d3996/image.png" alt=""><img src="https://velog.velcdn.com/images/choonsik_seo/post/fc557da2-ff27-46ed-b861-afb5df701c89/image.png" alt="">위 두 화면 잘 나오면 굿 👍🏻</th>
</tr>
</thead>
</table>
<br>
<br>

<h3 id="실습-2-discord">실습 2. Discord</h3>
<h4 id="1-서버-추가하기">1. 서버 추가하기<img src="https://velog.velcdn.com/images/choonsik_seo/post/ad7292e7-f775-43a7-8bf8-6d3517a1adb2/image.png" alt=""><img src="https://velog.velcdn.com/images/choonsik_seo/post/a118bc9a-d275-4d0e-a154-20e5e6466336/image.png" alt=""></h4>
<p>사진순서대로 <strong>[서버추가하기]</strong> &gt; <strong>[직접만들기]</strong> &gt; <strong>[나와 친구들을 위한 서버]</strong> &gt; 서버이름 작성 후 <strong>[만들기]</strong> 클릭</p>
<br>
<br>

<h4 id="2-discord-application-생성">2. Discord Application 생성</h4>
<p><a href="https://discord.com/developers/applications/">https://discord.com/developers/applications/</a></p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/0d7bc377-613d-4d40-830f-27bc07813e6c/image.png" alt="">[New Application]클릭하기</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/19954cd5-2992-4db3-ad3b-8927150b3d6f/image.png" alt="">NAME작성하고 체크, Create</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/32cb8420-cb24-488c-9ed4-1caff44599a7/image.png" alt="">Install Link에 None표시</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/choonsik_seo/post/2264e1b1-7771-45da-a0fe-9494b8bc977a/image.png" alt="">[PRESENCE INTENT], [SERVER MEMBERS INTENT], [MESSAGE CONTENT INTENT] 모두 활성화</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/8b35ef9d-0638-46d4-bc66-e80356b6b80e/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Bot successfully updated!</strong> 나오면 성공! 👍🏻</td>
</tr>
</tbody></table>
<br>
<br>


<h4 id="3-oauth2-셋팅">3. OAuth2 셋팅</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/e5a1df90-4f58-4b83-9cb7-d31f053b4c6d/image.png" alt="">bot 체크하기</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/choonsik_seo/post/8e99617e-947f-4f4d-84b4-c56175305c09/image.png" alt="">Send Messages 체크하기</td>
</tr>
<tr>
<td><img src="https://velog.velcdn.com/images/choonsik_seo/post/a5bed6b8-796b-4e3a-b9c5-180c76b77f01/image.png" alt="">Generated URL주소 복사</td>
</tr>
<tr>
<td><img src="https://velog.velcdn.com/images/choonsik_seo/post/048e505f-7821-429b-b7ba-ae06a697a8fb/image.png" alt="">입력창에 붙여넣기하고 엔터</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/fca7fb87-12fb-46ba-971d-c67126d44cb2/image.png" alt="">서버에 내가 생성한 챗봇추가</th>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/c4b268a1-4f0d-498a-addf-452286db1935/image.png" alt="">메시지보내기, 승인 클릭</th>
</tr>
</thead>
</table>
<br>
<br>



<h4 id="4-pycharm에-코드-입력하기">4. pycharm에 코드 입력하기</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/0f76e5b7-2d4f-4bb3-b035-937ac57a5e57/image.png" alt="">토큰 복사하기(까먹었으면 재설정눌러서 복사)</th>
</tr>
</thead>
<tbody><tr>
<td><br></td>
</tr>
</tbody></table>
<p><strong>[pycharm]</strong>에 새로 프로젝트를 만들고,</p>
<ul>
<li><p><code>pip install discord openai python-dotenv</code> 으로 discord, openai, python-dotenv 패키지 라이브러리 설치</p>
</li>
<li><p><strong><code>.env</code>와 <code>bot.py</code></strong> 파일 생성</p>
</li>
</ul>
<p><br><strong>.env 파일</strong>에서</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/ad9090c6-d4f2-44b6-9482-dbe4d651cd8c/image.png" alt="">DISCORD_TOKEN=&quot;디스코드에서 복사한 토큰 입력&quot;, OPENAI_KEY=&quot;실습1에서 복사한 API KEY 붙임&quot;</th>
</tr>
</thead>
<tbody><tr>
<td><br><strong>bot.py 파일</strong>에서</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/8c7bc5e6-efb5-49ca-b5d2-541bc915dc9c/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/choonsik_seo/post/d8e3c4aa-eb39-4a2b-9345-3e20419ae960/image.png" alt=""></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/17d37a57-3f54-496d-a981-2b6ae21417e9/image.png" alt=""></th>
</tr>
</thead>
</table>
<br>

<p>입력하고 bot.py 파일 실행하기
그럼 디스코드에 내가만든 챗봇이 온라인상태가 되어있을 것이며 ChatGPT처럼 대화가 가능하다.</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/choonsik_seo/post/e2286857-363a-48c0-982b-d75ac1aafe68/image.png" alt="">플러팅///</th>
</tr>
</thead>
</table>
<br>
<br> Discord에 챗봇만들어 적용하기 이것으로 끝.]]></description>
        </item>
        <item>
            <title><![CDATA[13. 리포지터리 - 데이터 업데이트]]></title>
            <link>https://velog.io/@choonsik_seo/13.-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@choonsik_seo/13.-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Tue, 04 Feb 2025 07:06:28 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">/*
[SQL]
UPDATE question
SET content = ?,
create_date = ?,
subject = ?,
WHERE id = ?;
*/
@Test
@DisplayName(&quot;데이터 수정하기&quot;)
void t007() {
    // SELECT * FROM question WHERE id=1;
    Optional&lt;Question&gt; oq = questionRepository.findById(1);  // 1.
    assertTrue(oq.isPresent());  // 2.
    Question q = oq.get();  // 3.
    q.setSubject(&quot;수정된 제목&quot;);  // 4.
    questionRepository.save(q);  // 5.
}</code></pre>
<h3 id="코드해석">코드해석</h3>
<ol>
<li>질문을 수정하려면 그 해당하는 질문을 찾아야지</li>
<li>그것이 존재하냐, 존재여부 확인</li>
<li>질문을 가져와라 (get해라)</li>
<li>그 질문을 setSubjectfh 다시 Setting해라</li>
<li>수정된 채로 다시 저장해라 ( save()는 데이터가 있으면 UPDATE, 없으면 INSERT로 실행)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[12. 리포지터리 - 질문 데이터 조회]]></title>
            <link>https://velog.io/@choonsik_seo/12.-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC-%EC%A7%88%EB%AC%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A1%B0%ED%9A%8C</link>
            <guid>https://velog.io/@choonsik_seo/12.-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC-%EC%A7%88%EB%AC%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A1%B0%ED%9A%8C</guid>
            <pubDate>Tue, 04 Feb 2025 07:02:30 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">@Test
@DisplayName(&quot;findAll&quot;)
void t002() {
    List&lt;Question&gt; all = questionRepository.findAll();
    assertEquals(2, all.size());

    Question q = all.get(0);
    assertEquals(&quot;sbb가 무엇인가요?&quot;, q.getSubject());
}</code></pre>
<h3 id="findall">findAll()</h3>
<p>JPA가 기본적으로 가지고 있는 메서드</p>
<p>SELECT * FROM question 문 실행</p>
<br>

<hr>
<pre><code class="language-java">@Test
@DisplayName(&quot;findById&quot;) // [SQL] select * from question where id = 1;
void t003() {
    Optional&lt;Question&gt; oq = questionRepository.findById(1);
    if (oq.isPresent()) {
        Question q = oq.get();
        assertEquals(&quot;sbb가 무엇인가요?&quot;, q.getSubject());
    }
}</code></pre>
<h3 id="ispresent">isPresent()</h3>
<p>값의 존재를 확인하는 메서드, 있으면 1 없으면 0</p>
<p>저 코드해석 : isPresent()통해 oq가 있어? 그럼 그 안에 코드 실행시켜</p>
<h3 id="findbyid1">findById(1)</h3>
<p>SELECT * FROM question WHERE id = 1;   // id = 1 인 question 조회</p>
<br>

<hr>
<pre><code class="language-java">@Test
@DisplayName(&quot;findBySubject&quot;) // [SQL] select * from question where subject = 1;
void t004() {
    Question q = questionRepository.findBySubject(&quot;sbb가 무엇인가요?&quot;);
    assertEquals(1, q.getId());
}</code></pre>
<h3 id="findbysubject-라는-메서드는-jpa에-없음">findBySubject() 라는 메서드는 JPA에 없음</h3>
<p>그래서 Repository에 만들어야함 (ex.  <code>Question findBySubject(String subject);</code> )</p>
<br>

<hr>
<pre><code>/*
[SQL]
SELECT *
FROM question
WHERE subject = &#39;sbb가 무엇인가요?&#39;
AND content = &#39;sbb에 대해서 알고 싶습니다.&#39;;
*/
@Test
@DisplayName(&quot;findBySubjectAndContent&quot;)
void t005() {
    Question q = questionRepository.findBySubjectAndContent(
            &quot;sbb가 무엇인가요?&quot;, &quot;sbb에 대해 알고 싶습니다.&quot;);
    assertEquals(1, q.getId());</code></pre><h3 id="findbysubjectandcontent">findBySubjectAndContent()</h3>
<p>이것도 Repository에 생성해야함
(<code>Question findBySubjectAndContent(String subject, String content);</code> )</p>
<br>

<hr>
<pre><code class="language-java">/*
[SQL]
SELECT *
FROM question
WHERE subject LIKE &#39;sbb%&#39;;
*/
@Test
@DisplayName(&quot;findBySubjectLike&quot;)
void t006() {
  List&lt;Question&gt; qList = questionRepository.findBySubjectLike(&quot;sbb%&quot;);
  Question q = qList.get(0);
  assertEquals(&quot;sbb가 무엇인가요?&quot;, q.getSubject());
}</code></pre>
<h3 id="findbysubjectlike">findBySubjectLike()</h3>
<p>괄호안에 있는 말이 들어가 있는지 찾기</p>
<h3 id="sbb">sbb%</h3>
<p>sbb로 시작하는 말</p>
<h3 id="sbb-1">%sbb%</h3>
<p>sbb가 있는 문장</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[11. 리포지터리와 프록시]]></title>
            <link>https://velog.io/@choonsik_seo/11.-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC</link>
            <guid>https://velog.io/@choonsik_seo/11.-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC</guid>
            <pubDate>Tue, 04 Feb 2025 06:51:32 GMT</pubDate>
            <description><![CDATA[<p>Question 있으면, QuestionRepository가 있어야 해</p>
<p>Answer 있으면, AnswerRepository가 있어야 해</p>
<h3 id="repository">Repository</h3>
<ul>
<li>쿼리 관련 코드를 날리면, DB에서 생성 삭제 수정 업뎃 이루어짐. 내가 직접 SQL을 짜지 않아도 돼.</li>
<li>클래스로 생성하지 말고, <strong>Interface</strong>로 만들어줘야 한다. 그럼 여기 Repository가 생략 되어 있는 것<ul>
<li>이유<ul>
<li>interface인 것 보고 스프링이 알아서 코드를 만들어준다. (<strong>프록시</strong> 구현체 자동생성)</li>
<li>만약 class로 만들면 스프링이 자동으로 기능을 만들지 못함.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>사용법<ul>
<li>public interface 엔티티Repository <strong>extends</strong> JpaRepository&lt;엔티티, Id타입&gt; { }</li>
</ul>
</li>
</ul>
<br>

<h3 id="jparepository-의-마법">JpaRepository 의 마법</h3>
<ul>
<li><code>findByName(String name)</code> 는 <code>SELECT * FROM 테이블 WHERE name = ?</code> 라는 SQL 자동 생성</li>
</ul>
<pre><code class="language-java">public interface QuestionRepository extends JpaRepository&lt;Question, Integer&gt; {

    Question findBySubject(String subject);

}</code></pre>
<br>

<hr>
<h3 id="test">@TEST</h3>
<p>: 테스트케이스</p>
<h3 id="displayname">@DisplayName</h3>
<p>테스트 의도를 사람이 읽기 쉬운 형태로 설정</p>
<h3 id="save">save()</h3>
<p>: INSERT 쿼리 실행</p>
<pre><code class="language-java">@Test
@DisplayName(&quot;데이터 저장하기&quot;)    // 테스트 의도를 사람이 읽기 쉬운형태로 설명
void t001() {
    Question q = new Question();
    q.setSubject(&quot;겨울 제철 음식으로는 무엇을 먹어야 하나요?&quot;);
    q.setContent(&quot;겨울 제철 음식을 알려주세요.&quot;);
    q.setCreateDate(LocalDateTime.now());
    questionRepository.save(q);   // 세번째 질문 저장
    // save() : INSERT 쿼리 실행

    assertEquals(&quot;겨울 제철 음식으로는 무엇을 먹어야 하나요?&quot;, questionRepository.findById(3).get().getSubject());
}</code></pre>
<br>

<h3 id="🤔-프록시">🤔 프록시?</h3>
<h4 id="정의--대리인">정의 : 대리인</h4>
<h4 id="역할">역할</h4>
<ul>
<li>진짜 객체 대신 일을 처리 or 필요할 때만 진짜 객체 사용</li>
<li>Lazy Loading(게으른 처리), 보안 or 추가 로직을 적용하기 위해 자주 사용<br>

</li>
</ul>
<h4 id="예시">예시</h4>
<ul>
<li><strong>프로그래밍에서의 프록시:</strong><ul>
<li><code>UserRepository</code>라는 JPA 인터페이스를 만듬</li>
<li>그런데 <code>findById()</code> 같은 메서드의 구현(코드 작성)을 하지 않음</li>
<li><strong>스프링이 프록시 객체</strong>를 만들어서 이 <code>findById()</code> 메서드가 동작하도록 대신 코드를 작성하고 처리해 줘.</li>
<li>직접 메서드 구현을 하지 않아도 프록시가 알아서 일을 처리해줌.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10. OneToMany]]></title>
            <link>https://velog.io/@choonsik_seo/10.-OneToMany</link>
            <guid>https://velog.io/@choonsik_seo/10.-OneToMany</guid>
            <pubDate>Tue, 04 Feb 2025 06:25:35 GMT</pubDate>
            <description><![CDATA[<h3 id="onetomany">@OneToMany</h3>
<p>: 질문에서 답변을 참조할 때 사용. 질문 1 : 답변 N,
  자바세상에서의 편의를 위해 필드 생성, 실제 DB테이블에 칼럼이 생성되지 않음.
  DB는 리스트나 배열을 만들 수 없다.</p>
<pre><code class="language-java">@OneToMany(mappedBy = &quot;question&quot;, cascade = CascadeType.REMOVE)
private List&lt;Answer&gt; answerList;</code></pre>
<ul>
<li><strong>mappedBy</strong> : 어떤 것에 대한 데이터냐, 여기서는 Answer엔티티에 대한 Question 변수</li>
<li><strong>CascadeType.REMOVE</strong> : 질문이 삭제되면, 답변도 같이 삭제해라, 이걸 하지않으면 외래키(FK. 현재 question_id) 때문에 질문이 삭제가 안됨.</li>
</ul>
<br>

<p>현재 answerList는 만들어도 되고 아니어도 된다.</p>
<p>다만, 만들면 좋은 것이 있음. 우리가 질문을 통해서 답변을 조회할 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[9. 엔티티 - 각 개체별 관계의 종류는 딱 3가지(1:1, 1:N, M:N)]]></title>
            <link>https://velog.io/@choonsik_seo/9.-%EC%97%94%ED%8B%B0%ED%8B%B0-%EA%B0%81-%EA%B0%9C%EC%B2%B4%EB%B3%84-%EA%B4%80%EA%B3%84%EC%9D%98-%EC%A2%85%EB%A5%98%EB%8A%94-%EB%94%B1-3%EA%B0%80%EC%A7%8011-1N-MN</link>
            <guid>https://velog.io/@choonsik_seo/9.-%EC%97%94%ED%8B%B0%ED%8B%B0-%EA%B0%81-%EA%B0%9C%EC%B2%B4%EB%B3%84-%EA%B4%80%EA%B3%84%EC%9D%98-%EC%A2%85%EB%A5%98%EB%8A%94-%EB%94%B1-3%EA%B0%80%EC%A7%8011-1N-MN</guid>
            <pubDate>Tue, 04 Feb 2025 06:21:56 GMT</pubDate>
            <description><![CDATA[<h3 id="엔티티의-종류">엔티티의 종류</h3>
<p><strong>1:1</strong> : 한 엔티티가 다른 엔티티와 하나의 관계를 맺는다.</p>
<ul>
<li>회원은 하나의 프로필을 갖는다</li>
<li>프로필은 1명의 사용자에게만 속한다.</li>
<li>한 명의 회원은 한 게시물에 좋아요 한 개만 누를 수 있다.<br>

</li>
</ul>
<p><strong>1:N</strong> (제일 흔 해) : 한 엔티티가 다른 여러 엔티티와 관계를 맺는다.</p>
<ul>
<li>한 질문에 여러개의 답변을 달 수 있다.</li>
<li>회원 1명은 게시글을 여러 개 작성 가능하다.</li>
<li>한 게시물에 좋아요가 여러 개 있을 수 있다.</li>
<li>N에 해당하는 객체 : 답변  /  1에 해당하는 객체 : 질문<br>

</li>
</ul>
<p><strong>M:N</strong> (Many To Many) : 여러 엔티티가 다수의 엔티티와 관계를 맺는다.</p>
<ul>
<li>한 학생은 여러 개의 수업을 들을 수 있다.</li>
<li>하나의 수업에는 여러 학생이 참여할 수 있다.<br>


</li>
</ul>
<h3 id="즉-모든-엔티티는-관계가-있다">즉, 모든 엔티티는 관계가 있다.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[7~8.]]></title>
            <link>https://velog.io/@choonsik_seo/78</link>
            <guid>https://velog.io/@choonsik_seo/78</guid>
            <pubDate>Tue, 04 Feb 2025 05:08:28 GMT</pubDate>
            <description><![CDATA[<h2 id="7-엔티티---question-answer-엔티티-추가">7. 엔티티 - Question, Answer 엔티티 추가</h2>
<br>
### 엔티티

<p>데이터베이스에 저장되는 객체</p>
<h3 id="객체">객체</h3>
<p>테이블로 매핑</p>
<h4 id="매핑이란">매핑이란?</h4>
<p>매핑(Mapping)은 <strong>두 개의 서로 다른 구조를 연결하는 과정</strong>
특히 <strong>ORM에서의 매핑</strong>은 <strong>객체(Object)와 데이터베이스(Table)를 연결</strong>하는 것을 의미</p>
<hr>
<h2 id="8-answer-클래스의-question-question-필드에-manytoone-적용">8. Answer 클래스의 Question question 필드에 @ManyToOne 적용</h2>
<br>
### @ManyToOne

<p>N : 1 관계 설정 (1개의 엔티티에 여러개의 엔티티가 연결할 수 있다)</p>
<p>→ 하나의 질문에 많은 답변을 달 수 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6. IntelliJ에서 MySQL로 세팅]]></title>
            <link>https://velog.io/@choonsik_seo/6.-IntelliJ%EC%97%90%EC%84%9C-MySQL%EB%A1%9C-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@choonsik_seo/6.-IntelliJ%EC%97%90%EC%84%9C-MySQL%EB%A1%9C-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Tue, 04 Feb 2025 00:23:48 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>영상에서 강사님은 MariaDB를 선택하셨지만 나는 <strong>MySQL</strong>과 연결했다.</p>
</blockquote>
<h4 id="buildgradle-에서">build.gradle 에서</h4>
<p>의존성 <code>**MySQL Driver**</code> 추가</p>
<pre><code>runtimeOnly &#39;com.mysql:mysql-connector-j&#39;</code></pre><h4 id="applicationproperties-에서">application.properties 에서</h4>
<pre><code>spring.application.name=qna_service


spring.datasource.url=jdbc:mysql://localhost:3306/qna_service
spring.datasource.username=SQL아이디이름
spring.datasource.password=SQL비밀번호
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.thymeleaf.check-template-location=false

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 정적 리소스 위치를 지정
spring.web.resources.static-locations=classpath:/static/

logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.web.servlet=TRACE```</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[5. JPA, ORM 개념 설명]]></title>
            <link>https://velog.io/@choonsik_seo/5.-JPA-ORM-%EA%B0%9C%EB%85%90-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@choonsik_seo/5.-JPA-ORM-%EA%B0%9C%EB%85%90-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Mon, 03 Feb 2025 23:22:14 GMT</pubDate>
            <description><![CDATA[<h3 id="jpa--db와-소통을-할-수-있도록-도와주는-도구">JPA : DB와 소통을 할 수 있도록 도와주는 도구</h3>
<ul>
<li><strong>하이버네이트</strong>(Hibernate, JPA 구현체 중 하나) 사용 → JDBC로 전달 → MySQL DB</li>
<li>데이터 저장을 위한 표준 규칙.</li>
<li>지침만 내림(”야 이렇게 정리해”), 역할수행은 MySQLDB가 함</li>
</ul>
<h3 id="spring-data-jpa">Spring Data JPA</h3>
<ul>
<li>추상화(사람이 이해하기 쉽다) 된 기술</li>
<li>ex) findById (= SELECT * FROM member WHERE id = 1;), findByUsername</li>
</ul>
<h3 id="orm-object-relational-mapping">ORM (Object Relational Mapping)</h3>
<ul>
<li>객체와 관계형DB(DBMS) 를 매핑해주는 기술</li>
<li>데이터 저장을 편리하게 해주는 도구</li>
<li>JPA가 자바에서 ORM 사용할 수 있게끔 도와줌</li>
<li>종류 개 많음</li>
<li>JPA도 하이버네이트도 ORM 사용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[4. HomeController 도입]]></title>
            <link>https://velog.io/@choonsik_seo/4.-HomeController-%EB%8F%84%EC%9E%85</link>
            <guid>https://velog.io/@choonsik_seo/4.-HomeController-%EB%8F%84%EC%9E%85</guid>
            <pubDate>Mon, 03 Feb 2025 14:31:04 GMT</pubDate>
            <description><![CDATA[<h2 id="도메인에-컨트롤러-만든-후-return-값-반환하기">도메인에 컨트롤러 만든 후 return 값 반환하기</h2>
<p><code>qna_service.boundedContext.home</code> 안에 <strong>HomeController.java</strong> 만들기</p>
<pre><code>@Controller
public class HomeController {

    @GetMapping(&quot;/home/main&quot;)
    @ResponseBody
    public String showHome() {
        return &quot;안녕&quot;;
    }</code></pre><p>이 코드를 작성 후 주소창에 <code>localhost:8080/home/main</code> 입력 시
&quot;안녕&quot;이 반환 된 것이 확인됨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2. 포트 충돌시 기존 포트를 킬하는 방법 설명]]></title>
            <link>https://velog.io/@choonsik_seo/2.-%ED%8F%AC%ED%8A%B8-%EC%B6%A9%EB%8F%8C%EC%8B%9C-%EA%B8%B0%EC%A1%B4-%ED%8F%AC%ED%8A%B8%EB%A5%BC-%ED%82%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@choonsik_seo/2.-%ED%8F%AC%ED%8A%B8-%EC%B6%A9%EB%8F%8C%EC%8B%9C-%EA%B8%B0%EC%A1%B4-%ED%8F%AC%ED%8A%B8%EB%A5%BC-%ED%82%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Mon, 03 Feb 2025 13:54:33 GMT</pubDate>
            <description><![CDATA[<h3 id="윈도우기준-">윈도우기준 )</h3>
<ol>
<li>cmd창을 연다</li>
<li><code>netstat -a -o</code> 입력</li>
<li>상단 0.0.0.0.8080 확인 후 PID 기억</li>
<li><code>taskkill /f /해당PID번호</code> 입력 후 실행</li>
<li>&quot;성공: 프로세스 PID(번호)가 종료되었습니다.&quot; 문장 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/ba94ea95-26f8-4319-85f0-fcc8f683cb86/image.png" alt=""></p>
<pre><code class="language-출처."></code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[1. 스프링부트 프로젝트 세팅]]></title>
            <link>https://velog.io/@choonsik_seo/1.-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@choonsik_seo/1.-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Mon, 03 Feb 2025 13:38:46 GMT</pubDate>
            <description><![CDATA[<h3 id="httpsstartspringio-사이트에-접속"><a href="https://start.spring.io/">https://start.spring.io/</a> 사이트에 접속</h3>
<p>gradle-groovy / Java / 3.4.0
Group : com.sbs
Artifact : qna_service
Name : qna_service
Description : Demo project for Spring Boot
Package name : com.sbs.qna_service
Packing : jar
java : 17</p>
<p>Dependencies</p>
<ul>
<li>Spring Web</li>
<li>Lombok</li>
<li>Spring Boot Dev Tools</li>
</ul>
<hr>
<h3 id="intellij-에서">IntelliJ 에서</h3>
<p><strong>1. 프로젝트를 자동으로 빌드하도록 설정하는 옵션</strong></p>
<p>[File] - [Settings] - [Build, Excution, Deployment] - [Compiler] - Build project automatically 체크</p>
<p>  ✅ <strong>언제 유용할까?</strong></p>
<ul>
<li>Spring Boot 프로젝트에서 개발 중 변경 사항을 바로 반영하고 싶을 때</li>
<li>프론트엔드 연동 개발 중 빠른 빌드가 필요할 때</li>
<li>테스트 코드 실행 시 코드 변경 사항을 즉시 반영하고 싶을 때</li>
</ul>
<p><strong>2. 컴파일러가 메서드의 매개변수 이름을 .class 파일에 저장</strong>하도록 설정</p>
<ul>
<li><p>[Compiler] - [Java Compiler] - Additional command line parameters에
<code>-parameters</code> 입력</p>
<p>✅ <strong>언제 유용할까?</strong></p>
<ul>
<li>**Spring의 @RequestParam, @PathVariable을 사용할 때<ul>
<li><code>parameters</code>가 없으면, 컴파일된 코드에서 매개변수 이름이 사라져서 Spring이 적절한 요청을 매핑하지 못할 수도 있어.</li>
</ul>
</li>
<li>**Jackson, Hibernate 같은 라이브러리가 매개변수 이름을 필요로 할 때</li>
<li><strong>리플렉션 API를 사용할 때</strong> (예: 런타임에 메서드의 매개변수 이름을 알아야 하는 경우)</li>
</ul>
</li>
</ul>
<p><strong>3. 애노테이션 프로세서(annotation processor)를 활성화하는 옵션</strong></p>
<ul>
<li><p>[Compiler] - [Annotation Processors] - Enable annotation processing 체크</p>
<p>✅ <strong>언제 유용할까?</strong></p>
<ul>
<li>Lombok 사용 시 (<code>@Getter</code>, <code>@Setter</code>, <code>@Data</code> 등)</li>
<li>Spring Boot의 @ConfigurationProperties, @AutoConfiguration 같은 기능 활용 시</li>
<li>JPA/Hibernate에서 <code>@Entity</code>와 함께 Metamodel 클래스 생성할 때</li>
<li>MapStruct 같은 매핑 라이브러리에서 DTO 변환 자동 생성할 때</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[스프링 개발에서 꼭 알아야 할 네이밍 스타일]]></title>
            <link>https://velog.io/@choonsik_seo/%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%9C%EB%B0%9C%EC%97%90%EC%84%9C-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%8A%A4%ED%83%80%EC%9D%BC</link>
            <guid>https://velog.io/@choonsik_seo/%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%9C%EB%B0%9C%EC%97%90%EC%84%9C-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%8A%A4%ED%83%80%EC%9D%BC</guid>
            <pubDate>Sun, 12 Jan 2025 14:25:57 GMT</pubDate>
            <description><![CDATA[<h3 id="1-camel-case-캐멀케이스">1. <strong>Camel Case (캐멀케이스)</strong></h3>
<ul>
<li><strong>형식</strong>: 단어들이 붙어있고, 첫 번째 단어는 소문자, 이후 단어는 대문자로 시작.</li>
<li><strong>예시</strong>: <code>firstName</code>, <code>getUserData</code>, <code>calculateSum</code>.</li>
</ul>
<p>스프링에서는 보통 변수명과 메서드명에 많이 사용돼.</p>
<hr>
<h3 id="2-pascal-case-파스칼케이스">2. <strong>Pascal Case (파스칼케이스)</strong></h3>
<ul>
<li><strong>형식</strong>: 모든 단어가 대문자로 시작.</li>
<li><strong>예시</strong>: <code>FirstName</code>, <code>GetUserData</code>, <code>CalculateSum</code>.</li>
</ul>
<p>스프링에서 클래스명, 인터페이스명 등에 주로 사용해.</p>
<hr>
<h3 id="3-snake-case-스네이크케이스">3. <strong>Snake Case (스네이크케이스)</strong></h3>
<ul>
<li><strong>형식</strong>: 단어를 소문자로 쓰고, <code>_</code>(언더스코어)로 구분.</li>
<li><strong>예시</strong>: <code>first_name</code>, <code>get_user_data</code>.</li>
</ul>
<p>데이터베이스 테이블이나 컬럼 이름으로 자주 쓰여.</p>
<hr>
<h3 id="4-kebab-case-케밥케이스">4. <strong>Kebab Case (케밥케이스)</strong></h3>
<ul>
<li><strong>형식</strong>: 단어를 소문자로 쓰고, -(하이픈) 으로 구분</li>
<li><strong>예시</strong>: <code>first-name</code>, <code>get-user-data</code>.</li>
</ul>
<p>URL 경로에서 자주 사용돼. (예: <code>/user-profile</code>)</p>
<hr>
<h3 id="5-upper-snake-case-대문자-스네이크케이스">5. <strong>Upper Snake Case (대문자 스네이크케이스)</strong></h3>
<ul>
<li><strong>형식</strong>: 단어를 대문자로 쓰고, <code>_</code>(언더스코어)로 구분.</li>
<li><strong>예시</strong>: <code>FIRST_NAME</code>, <code>GET_USER_DATA</code>.</li>
</ul>
<p>상수명 정의할 때 많이 써. (예: <code>public static final</code> 변수)</p>
<hr>
<h3 id="스프링에서의-활용">스프링에서의 활용:</h3>
<ul>
<li><strong>Camel Case</strong>: 메서드명, 변수명 (ex: <code>getUserById</code>)</li>
<li><strong>Pascal Case</strong>: 클래스명, 인터페이스명 (ex: <code>UserController</code>)</li>
<li><strong>Snake Case</strong>: 테이블명, JSON 필드명 (ex: <code>user_table</code>, <code>{ &quot;user_id&quot;: 1 }</code>)</li>
<li><strong>Kebab Case</strong>: URL (ex: <code>/api/v1/user-profile</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[githup 명령어 : 저장소 설정과 기본 작업 플로우 정리]]></title>
            <link>https://velog.io/@choonsik_seo/githup-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@choonsik_seo/githup-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Sat, 11 Jan 2025 06:02:26 GMT</pubDate>
            <description><![CDATA[<h2 id="-처음-github연결할-때">** 처음 github연결할 때</h2>
<h3 id="1-git-init">1. git init</h3>
<ol>
<li>작업중인 파일 내 터미널을 열기</li>
<li><code>git init</code> 입력 후 <code>Enter</code>클릭
(현재 프로젝트 폴더에 .git 디렉토리를 만들어 git 저장소를 생성하기)<br>
### 2. 개인 github에서 새로운 Repository생성하기</li>
<li>개인 github에서 로그인하기</li>
<li>새로운 <code>repository</code> 생성하기</li>
<li><code>repository</code> 이름 생성하기
<img src="https://velog.velcdn.com/images/choonsik_seo/post/81570032-3e61-421a-8513-fa251f1a75cb/image.png" alt=""></li>
<li><code>public</code> or <code>private</code> 중에 고르기
<img src="https://velog.velcdn.com/images/choonsik_seo/post/7ddcbf31-b5b1-412b-b651-e692d2f50c75/image.png" alt=""></li>
</ol>
<ol start="5">
<li><code>Create Repository</code> 클릭하기</li>
</ol>
<br>

<h3 id="3-원격-저장소remote-repository-연결">3. 원격 저장소(Remote Repository) 연결</h3>
<ol>
<li>생성된 Repository의 <strong><code>http://github.com/~~~~.git</code></strong>인 url을 복사
<img src="https://velog.velcdn.com/images/choonsik_seo/post/6de18cbe-4f46-4fe1-9be7-1f54fe476e11/image.png" alt=""></li>
<li><strong>터미널</strong>에서 <code>git remote add origin 복사한url주소</code> 입력 후 <code>Enter</code>클릭</li>
</ol>
<br>


<h3 id="4-변경사항-추적-및-커밋">4. 변경사항 추적 및 커밋</h3>
<ol>
<li>터미널에서<code>git add .</code> 입력 후 <code>Enter</code>클릭
(모든 파일을 Git의 추적 대상에 추가)</li>
<li><code>git commit -m &quot;...commit content...&quot;</code> 입력 후 <code>Enter</code>클릭
(첫 커밋 만들기, commit content는 커밋내용에 대한 설명)</li>
</ol>
<br>

<h3 id="5-원격저장소로-푸시">5. 원격저장소로 푸시</h3>
<ol>
<li>터미널에 <strong><code>git branch -M main</code></strong> 입력 후 <code>Enter</code>클릭</li>
<li>그 다음 <strong><code>git push -u origin main</code></strong> 입력 후 <code>Enter</code>클릭
(이 명령은 main 브랜치로 푸시하며, 이후 작업들은 git push만으로도 푸시 가능함, 원격브랜치 보여지고 제대로 푸시한 것도 보임)</li>
</ol>
<br>
<br>
처음에만 살짝 복잡하게 잘 셋팅해놓으면 다음엔 쉬움
<br>

<h2 id="-이후-작업할-때마다-반복">** 이후 작업할 때마다 반복</h2>
<h3 id="1-변경사항-추적">1. 변경사항 추적</h3>
<p><code>git add .</code></p>
<h3 id="2-커밋">2. 커밋</h3>
<p><code>git commit -m &quot;작업 내용 설명&quot;</code></p>
<h3 id="3-원격-저장소로-푸시">3. 원격 저장소로 푸시</h3>
<p><code>git push</code></p>
<br>

<hr>
<h3 id="-제대로-설정이-안될-시-확인해보기">** 제대로 설정이 안될 시 확인해보기</h3>
<ol>
<li><p>확인하기
git config --global user.name
git config --global user.email</p>
</li>
<li><p>(바꾸고 싶다면) 설정하기
git config --global user.name &quot;본인의 깃헙 닉네임&quot;
git config --global user.email &quot;본인의 깃헙 이메일&quot;</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터모델링) 3. 논리 모델링]]></title>
            <link>https://velog.io/@choonsik_seo/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8%EB%A7%81-3.-%EB%85%BC%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@choonsik_seo/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8%EB%A7%81-3.-%EB%85%BC%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Sat, 09 Nov 2024 14:55:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="1-논리-모델링이란">1. 논리 모델링이란</h2>
</blockquote>
<ul>
<li>명확하고 구체적</li>
<li>DBMS의 물리적인 특성까지 고려할 필요는 없음
<br><br></li>
</ul>
<blockquote>
<h2 id="2-엔티티-정의-및-상세화">2. 엔티티 정의 및 상세화</h2>
</blockquote>
<h3 id="핵심-엔티티-key-entity-기준정보">핵심 엔티티 (Key Entity, 기준정보)</h3>
<p>기준정보 : 기본정보</p>
<h4 id="데이터-성격에-따라-분류-4가지">데이터 성격에 따라 분류 4가지</h4>
<ul>
<li><strong>유형 및 분류</strong> (코드정보, 번호)</li>
<li><strong>업무규칙 및 지식</strong> (규칙정보)</li>
<li><strong>업무주체 및 대상</strong> (주어, 목적어)<ul>
<li>고객은 누구인가? 비회원도 고객인가?</li>
</ul>
</li>
<li><strong>장소</strong><ul>
<li>ex. 창고, 매장, 사무실</li>
</ul>
</li>
</ul>
<br>

<h3 id="중요-엔티티-main-entity-업무기본">중요 엔티티 (Main Entity, 업무기본)</h3>
<p>업무기본 : 업무행위 (동사)
업무주체 및 대상 간의 거래나 업무행위에 의해 발생</p>
<br>


<h3 id="행위-엔티티-action-entity-업무상세">행위 엔티티 (Action Entity, 업무상세)</h3>
<h4 id="행위엔티티-유형-⭐⭐⭐">행위엔티티 유형 ⭐⭐⭐</h4>
<img src = https://velog.velcdn.com/images/choonsik_seo/post/1ef4d789-f468-467b-b2c1-0dd8cc70f192/image.jpg>

<ul>
<li><p><strong>상세/내역</strong></p>
</li>
<li><p><strong>상태</strong></p>
</li>
<li><p><strong>이력</strong> (일부분이든 전체든 상관이 없음)⭐⭐⭐</p>
<ul>
<li><strong>전체항목 이력관리</strong> (과거history 데이터이력만)</li>
<li><strong>변경 항목만 이력관리</strong></li>
<li><strong>점이력</strong> (이벤트)</li>
<li><strong>선분이력</strong> (변경시작일자 ~ 변경종료일자)</li>
<li><strong>최종데이터 포함 이력</strong> (과거history + 현재이력)</li>
</ul>
</li>
</ul>
<br>

<h3 id="엔티티-도출-및-식별">엔티티 도출 및 식별</h3>
<ul>
<li>속성명 (논리) : 용어는 최대한 detail하게
  ex) 진행상태 &gt; <strong>예산</strong>진행상태<strong>코드</strong></li>
<li>컬럼명 (물리) : 물리모델링은 간단하게(논리가 남아있어서 디테이하지않아도 됨)
<br><br></li>
</ul>
<blockquote>
<h2 id="3-관계-도출-및-정의">3. 관계 도출 및 정의</h2>
</blockquote>
<h3 id="관계-정의">관계 정의</h3>
<p>M : N 관계</p>
<ul>
<li>교차엔티티 설계하여 1 : M관계로 표현한다<br>

</li>
</ul>
<p>해소해야할 부분</p>
<ul>
<li>M : N 관계 일때,</li>
<li>병렬관계 복잡할 때</li>
</ul>
<p><br><br></p>
<blockquote>
<h2 id="4-속성-도출-및-정의">4. 속성 도출 및 정의</h2>
</blockquote>
<h3 id="속성명-부여">속성명 부여</h3>
<p>자명성(self-evidence) </p>
<ul>
<li>속성명을 명확하게 설명할 수 있는 명칭</li>
<li>불필요한 의논시간 줄여줌<br>


</li>
</ul>
<h3 id="속성-정의">속성 정의</h3>
<p>속성에 대한 설명이나 데이터 발생 규칙 등을 기술</p>
<br>

<h3 id="식별자-지정">식별자 지정</h3>
<p>유일하게 식별 가능한, 최소속성으로, 변하지 않고, 반드시 존재하는 값</p>
<br>

<h3 id="인조-식별자를-정의하는-경우">인조 식별자를 정의하는 경우</h3>
<p>Table 통합할 때</p>
<p>복잡한 본질 식별자상속 대체</p>
<br>

<h3 id="도메인-지정--속성이-가지는-타입범위⭐">도메인 지정 : 속성이 가지는 타입/범위⭐</h3>
<h3 id="옵셔널리티not-null-지정⭐">옵셔널리티(Not Null) 지정⭐</h3>
<h3 id="default값-지정⭐">Default값 지정⭐</h3>
<h3 id="데이터-모델-검토⭐">데이터 모델 검토⭐</h3>
<p><br><br></p>
<blockquote>
<h2 id="5-데이터-표준화">5. 데이터 표준화</h2>
</blockquote>
<h3 id="코드-표준화">코드 표준화</h3>
<img src = https://velog.velcdn.com/images/choonsik_seo/post/7eff55b4-ff16-4150-990a-97ecf07f280d/image.jpg>

<p>&lt;코드사전&gt;</p>
<ul>
<li>정렬순서 : 우리 마음대로 변경이 가능</li>
<li>사용여부 : data join이 어려움<br>

</li>
</ul>
<p>&lt;코드부여&gt;</p>
<ul>
<li><p>분류형 : 자기코드가 부모코드를 가지고 있음
ex) 파일경로</p>
</li>
<li><p>약어형
ex) M : 남자 / F : 여자</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터모델링) 2. 개념 모델링]]></title>
            <link>https://velog.io/@choonsik_seo/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8%EB%A7%81-2.-%EA%B0%9C%EB%85%90-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@choonsik_seo/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8%EB%A7%81-2.-%EA%B0%9C%EB%85%90-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Fri, 08 Nov 2024 01:03:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="1-데이터모델링-접근방법">1. 데이터모델링 접근방법</h2>
</blockquote>
<br>
기업이 수행하고자 하는 사업의 본질은 잘 변하지 않으며, 조직에서 보유하고 있는 데이터의 본질도 큰 틀에서는 동일함
<br>

<p><img src="https://velog.velcdn.com/images/choonsik_seo/post/a79dc478-6f9e-40c1-8158-90f899c8e812/image.png" alt=""></p>
<pre><code>출처 https://user-images.githubusercontent.com/103868639/225921418-45489b00-4aa7-49bc-8f58-2f89de4dcc29.png
필자가 출처사진에 조금 더 수정함.</code></pre><p><strong>리버스 모델</strong></p>
<ul>
<li>활용 : 현행 ERD가 없거나 현행화가 이루어지지 않은 경우,
물리모델 -&gt; 논리모델로 돌아감</li>
<li>리버스 작업은 Erwin의 ‘리버스 엔지니어’기능처럼 데이터 모델링 툴에서 제공하는 기능을 활용</li>
</ul>
<p><br><br></p>
<blockquote>
<h2 id="2-개념모델링">2. 개념모델링</h2>
</blockquote>
<p>개략적인, 자세하게 할 수 없음, 대략적인. ⇔ 논리모델링 : 구체적이고 명확한</p>
<p>절차 : 개념을 도출 &gt; 개념을 구체화 &gt; 엔티티 식별함
구체적으로는
<strong>1. 주제영역 도출</strong> ⭐️⭐️⭐️
<strong>2. 주제영역 분류 및 정의</strong> ⭐️⭐️⭐️ (도출한 것들을 그룹핑)
<strong>3. 핵심 엔티티 정의</strong> ⭐️⭐️⭐️
<br></p>
<h3 id="주제영역">주제영역</h3>
<p>은행 사이트 상단 큰 메뉴
<img src = https://velog.velcdn.com/images/choonsik_seo/post/f9fc9241-f3fa-4393-9950-ba22e93a8a5e/image.png width=70%></p>
<br>

<h3 id="주제영역도출">주제영역도출</h3>
<p>하위 주제 영역
<img src = https://velog.velcdn.com/images/choonsik_seo/post/267776fc-2231-4747-8228-d215c9257939/image.png width = 70%></p>
<br>

<h3 id="주제영역-정의">주제영역 정의</h3>
<p><strong>주제에 대한 정의</strong></p>
<ul>
<li>ex)고객에 대한 정의. 어디까지 고객으로 봐야하는지, 비회원도 고객인지?</li>
<li>주제영역을 정의하는 과정에서 현업 담당자가 적극적으로 참여하는 경우, 주제 영역에 관해 설명하고 같이 검토하는 과정을 거친다.</li>
<li>정의는 법에 위배되지 않는 선에서 정의내린다.</li>
</ul>
<p>주제영역 분류하고 검토하다보면 ‘이게 업무 분류인지 데이터분류인지 모르겠다’는 생각이 들 때 있음.
<br></p>
<p><strong>주제영역을 정의할 때 어려운 점</strong></p>
<ul>
<li>개념부족 : 현업담당자의 주제영역 개념에 대한 이해도가 낮아. 의사소통하는데 어려움</li>
<li>확신부족 : 주제영역을 어떻게 나누면 좋을지 몰라 &gt; 책임 회피경향이 있음</li>
<li>오너십 : 주제영역 나눌 때 이해관계자의 동의를 얻는 데 어려움을 겪을 수도 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터모델링) 1. 데이터 모델링 이론]]></title>
            <link>https://velog.io/@choonsik_seo/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8%EB%A7%81-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%9D%B4%EB%A1%A0</link>
            <guid>https://velog.io/@choonsik_seo/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8%EB%A7%81-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%9D%B4%EB%A1%A0</guid>
            <pubDate>Thu, 07 Nov 2024 14:34:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="1-데이터-모델링이란">1. 데이터 모델링이란</h2>
</blockquote>
<p><strong>모델</strong> : 작품을 만들기 전에 미리 만든 물건. 완성된 작품의 대표적인 보기. 일종의 ‘추상화’</p>
<p><strong>모델링</strong> : 모델을 만드는 것, 그룹핑하고, 관계를 맺는 것</p>
<p><strong>데이터 모델링</strong> : (업무)데이터 모델을 만드는 것</p>
<ul>
<li><strong>개념적</strong>⭐⭐⭐ : 식별(구별, 인지, 분류)하는 과정 </li>
<li><strong>논리적</strong>⭐⭐⭐ : 추상화로 표현</li>
<li><strong>물리적</strong>⭐⭐⭐ : 추상화 모델을 구체화된 형태로 변환<br>

</li>
</ul>
<h3 id="er모델-entity-relationship-model">ER모델 (Entity-Relationship Model)</h3>
<ul>
<li>개체관계모델</li>
<li>가장 대표적인 데이터모델</li>
<li>그룹핑하고 관계끼리 줄 긋는 것</li>
<li>영수증 종이 데이터 통째로 나열, 저장 -&gt; 쪼개서 분류하기 &gt; 줄긋기 =  RDB</li>
<li>ERD(Entity-Relationship Diagram) : 객체를 그리고 관계를 줄 그어 맺음(DB구조를 그림으로 나타낸 것)
  ex. 레고조립을 보고 다시 설명서를 작성해 보는 것</li>
</ul>
<br>

<h3 id="er모델의-질적-특성">ER모델의 질적 특성</h3>
<ul>
<li>완전성 (업무에 빠진 곳이 있으면 안됨)</li>
<li>정확성</li>
<li>최소성 (너무 불필요하게 복잡해서 안됨)</li>
<li>자명성 (스스로 이해하기 쉬워야 함)</li>
<li>확장성 (시스템 확장에 무리가 없어야 함)</li>
<li>표현성</li>
<li>가독성</li>
</ul>
<p><br><br></p>
<blockquote>
<h2 id="2-er-모델-구성-요소">2. ER 모델 구성 요소</h2>
</blockquote>
<br>

<h3 id="엔티티entity">엔티티(Entity)</h3>
<ul>
<li><p><strong>table</strong>⭐⭐⭐</p>
</li>
<li><p><strong>엔티티 표기법</strong></p>
<img src = https://velog.velcdn.com/images/choonsik_seo/post/f6a1faee-d931-4818-93bc-c8f273836351/image.png>

<p>  출처 <a href="https://brunch.co.kr/@yoongg59/5">https://brunch.co.kr/@yoongg59/5</a></p>
</li>
<li><p>엔티티 <strong>슈퍼타입/서브타입 표기법</strong></p>
<img src = https://velog.velcdn.com/images/chosj1526/post/e5dcc09b-e63c-4748-b688-dbf971d8c1a7/image.png width = 50%>

<p>  출처 <a href="https://velog.io/@chosj1526/DB-%EC%8A%88%ED%8D%BC-%EC%84%9C%EB%B8%8C%ED%83%80%EC%9E%85-%EB%AA%A8%EB%8D%B8%EB%A7%81">https://velog.io/@chosj1526/DB-%EC%8A%88%ED%8D%BC-%EC%84%9C%EB%B8%8C%ED%83%80%EC%9E%85-%EB%AA%A8%EB%8D%B8%EB%A7%81</a></p>
</li>
<li><p><strong>상위수준과 하위수준 엔티티</strong>의 일반화</p>
<img src = https://velog.velcdn.com/images/choonsik_seo/post/86ec65ba-ab49-4597-b7da-da3871097e50/image.png>

<p>  출처 <a href="https://blog.naver.com/sanguineous/222280719741">https://blog.naver.com/sanguineous/222280719741</a></p>
</li>
</ul>
<p><em>시스템만들 때 UNION, Outer Join 이용하는데 두 그룹을 잘 합쳐서 한 테이블 만들면 Join할 필요 없게되고, 개발이 쉽고 성능이 좋아져. But,  &#39;개인정보&#39;와 &#39;법인정보&#39;가 같은 테이블에 있으면 정보의 의미를 구분하기 어려워져서 FK조건, Not Null적용이 어렵고 무결성에 문제생김</em></p>
<ul>
<li>제약조건(if문) 많이 걸면 걸수록 데이터 품질이 좋아지고, 제약조건이 없으면 성능이 좋아짐</li>
</ul>
<br>

<h4 id="엔티티-형태">엔티티 형태</h4>
<ul>
<li><p><strong>독립 엔티티</strong> : 강의, 수강생</p>
</li>
<li><p><strong>업무중심 엔티티</strong> : 주문, 결제</p>
</li>
<li><p><strong>종속 엔티티</strong> : 다른 엔티티 꼭 필수</p>
</li>
</ul>
<p><br><br></p>
<h3 id="관계relationship">관계(Relationship)</h3>
<h4 id="관계-구성요소⭐⭐⭐">관계 구성요소⭐⭐⭐</h4>
<ul>
<li><p><strong>관계수</strong> : 1:1, 1:多, 多:多</p>
</li>
<li><p><strong>선택성</strong> : 선택 or 필수</p>
</li>
<li><p><strong>식별자상속</strong> : PK이면서 FK인 것</p>
<br>

</li>
</ul>
<h4 id="관계-유형">관계 유형</h4>
<ul>
<li><p>병렬관계 (join)</p>
</li>
<li><p>엔티티 추가 설계 (join많으면 엔티티 추가함)</p>
<br>

</li>
</ul>
<h4 id="관계-차원">관계 차원</h4>
<ul>
<li><p>단항관계(Self join) : table 1개</p>
</li>
<li><p>이항관계 : 두 개 엔티티간의 관계</p>
<br>

</li>
</ul>
<h4 id="속성">속성</h4>
<ul>
<li><p>도메인 : 문자형, 숫자형, 날짜형 등이 있음 (Type)</p>
</li>
<li><p>분류</p>
<ul>
<li>단순속성(단일함, 1개), 복합속성(단순속성들 조합)</li>
<li>저장속성(cache쓰는 것과 비슷, 성능 높음), 파생속성(저장하지 않는 속성)</li>
<li>단일 값, 다중 값<br>

</li>
</ul>
</li>
</ul>
<h4 id="식별자의-특징">식별자의 특징</h4>
<ul>
<li><p><strong>유일성</strong> : Not Null(Null이 아니다)</p>
</li>
<li><p><strong>최소성</strong> : 너무 불필요하게 복잡해서 안됨</p>
</li>
<li><p><strong>불변성</strong> : 식별자의 값은 변하지 않아야 함</p>
</li>
<li><p>존재성 : 반드시 데이터 값이 존재</p>
</li>
</ul>
<p><br><br></p>
<blockquote>
<h2 id="3-관계형-데이터-모델-이론">3. 관계형 데이터 모델 이론</h2>
</blockquote>
<br>

<h3 id="관계형-모델의-키">관계형 모델의 키</h3>
<ul>
<li>슈퍼키 (최소성 보장X, 유일성 보장)</li>
<li>후보키 : 식별할 수 있는 최소한의 속성집합 (최소성 보장)</li>
<li>기본키 : 후보키 중 하나만 기본키 가능, 유일성, 최소성가짐</li>
<li>대체키 : 후보키 중 기본키 外</li>
<li>외래키 : 다른 릴레이션(table)에 속한 어트리뷰트(필드)의 기본키를 참조하는 경우</li>
</ul>
<img src = https://velog.velcdn.com/images/choonsik_seo/post/e50de161-8c77-4e55-b046-9f7cfaf16d0e/image.png>

<pre><code>출처 https://meteorfish.blog/m/145</code></pre><br>

<h3 id="제약조건⭐⭐⭐">제약조건⭐⭐⭐</h3>
<ul>
<li><strong>키 제약조건</strong> (PK)</li>
<li><strong>실체 무결성</strong> (Not Null) : 데이터가 null값이면 안된다(데이터가 있어야 한다.)</li>
<li><strong>영역 무결성</strong> (Check, type)</li>
<li><strong>참조 무결성</strong> (FK)</li>
</ul>
<br>

<h3 id="함수-종속">함수 종속</h3>
<p>함수에 키를 넣었을 때 키에 해당하는 내용</p>
<br>

<h3 id="정규화normalization">정규화(Normalization)</h3>
<ul>
<li>테이블 쪼개기</li>
<li>역정규화(반정규화) : 너무 과하게 정규화가 된 경우에 다시 붙임</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>