<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>MyoungChae0_0.log</title>
        <link>https://velog.io/</link>
        <description>Alessandro Nesta</description>
        <lastBuildDate>Wed, 08 Mar 2023 18:58:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>MyoungChae0_0.log</title>
            <url>https://velog.velcdn.com/images/myoungchae0_0/profile/de7df1f7-61dc-4abc-b390-cecb258bb233/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. MyoungChae0_0.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/myoungchae0_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[10월 1차 프로젝트(내손안에 새싹)]]></title>
            <link>https://velog.io/@myoungchae0_0/10%EC%9B%94-1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@myoungchae0_0/10%EC%9B%94-1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Wed, 08 Mar 2023 18:58:19 GMT</pubDate>
            <description><![CDATA[<h1 id="프로젝트명--내손안에-새싹app">프로젝트명 : 내손안에 새싹(App)</h1>
<blockquote>
</blockquote>
<h2 id="기술스택">기술스택</h2>
<ul>
<li>Android Studio(Java), Firebase, Arduino IDE<h2 id="팀구성">팀구성</h2>
</li>
<li>하드웨어1명, 어플리케이션2명<h2 id="역할">역할</h2>
</li>
<li>어플리케이션 구현 및 Firebase DB연동<h2 id="프로젝트-설명">프로젝트 설명</h2>
</li>
<li>하드웨어로 화분 토양의 온도, 습도 빛의양 등을 체크하고 이것을 Wifi통신으로 DB에 전달한다.
어플에서는 회원의 화분 Serial Number 하위노드에 실시간으로 저장된 토양의 온도, 습도 빛의양 등의 DB를 받아서 보여준다.</li>
</ul>
<h1 id="상세역할">상세역할</h1>
<blockquote>
<ul>
<li>회원가입 구현
Firebase Realtime과 FIrebase Auth를 이용해서 회원가입 구현
✅이메일 형식이 아닌데 회원가입을 누르면 Toast메세지 출력
✅비밀번호,비밀번호 확인 비밀번호가 일치하지않으면 Toast메세지 출력<br></li>
<li>로그인 구현
✅Firebase Realtime과 FIrebase Auth를 이용해서 로그인 구현<br></li>
<li>Adapter를 이용한 화분관리, 등록, 삭제 ListView 구현
✅처음에는 아무것도없는데 등록하기 버튼을 누르면 등록한 화분 표시<br>
✅화분을 등록할때는 화분의 고유 Serial Number를 입력후 등록이가능<br>
✅정해진 Serial Number가 아닌 다른것을 입력했을 경우 Toast메세지 출력,이미 사용한 Serial Number를 다른 사람이 사용하는경우 이미 사용중인 Serial Number Toast메세지 출력 - Serial Number의 중복사용 방지(사전에 등록한 Serial Number하위 노드에 able, unable을 만들어 사용여부를 확인할 수 있도록 하였음)<br>
✅화분등록) 고객이 Serial Number 입력하여 화분 생성 -&gt; DB의 Serial Number하위노드에 able이 unable로 바뀜<br>
✅화분삭제) 고객이 화분을 삭제 -&gt;DB의 Serial Number 하위노드에 unable이 able로 바뀜<br>
✅화분 등록에 사진을 올렸을 경우 올린 사진이 반영되도록 Glide를 사용<br>
✅화분 등록에 성공하면 사진을 Firebase Storage에 사용자의 Uid폴더에 저장<br>
✅화분 등록에 입력한 정보들을 Firebase Realtime 사용자의 Uid하위 노드에 저장</li>
</ul>
</blockquote>
<h1 id="느낀점">느낀점</h1>
<blockquote>
</blockquote>
<p>Android Studio를 사용하여 처음 앱을 만들어 보았다. Java와 Kotlin이 있었는데 수업 시간에 Java를 사용하여서 Kotlin이 아닌 Java를 사용하여 앱 개발을 진행하였다.<br>
DB에 대한 이해가 부족하였고 DB를 사용한 프로젝트는 처음 하여 보았는데, 입문자에게는 Firebase가 사용하기 편하였다. 하지만 Firebase는 등록과 삭제 두 가지 기능밖에 없고 수정이 따로 되지 않아서 화분의 정보수정과, Serial Number를 등록하면 다른 사람이 중복된 Serial Number를 사용하여 화분등록을 하는 것을 막아주도록 Serial Number 값을 Able, Unable로 수정하는 부분에 있어서 시간을 오래 잡아먹게 되었고, 결국 내린 결론은 수정알고리즘을 삭제 후 등록으로 바꾸어 해결할 수 있었다.<br>
Google의 firebase는 어느 정도 용량을 초과하면 결제를 해야 하는데 테스트를 하다 보니 용량을 초과한 적이 있었다. 애플리케이션의 완성도도 중요하지만, 사용자의 관점에서 데이터를 많이 먹는 앱이라면 사용하지 않을 것이다.
또한 내가 소비자라면 이 앱을 사용할 것인지, 수익모델은 어떤 것이 있는지 이러한 부분도 개발을 할 때 고려하도록 해야겠다.<br>
액티비티 간에 화면전환에서 값을 서로 넘겨주어야 하는 상황이 있었는데 청처음에는 어떻게 그 값을 넘겨주어야 할지 막막하였다 그래서 다시 DB에 접근하여 그 값을 찾아서 빼오는 방식으로 생각하였는데 Intent를 통하여 DB접근없이 전 화면의 넘겨주어야 할 값을 넘겨줄 수 있어서 수월하게 진행 할 수 있었다.<br>
혼자 개발하는 것이 아닌, 팀원과 함께 개발하게 되는 경우 팀원과 소통을 많이 해야 한다는 것을 알았고, HuStar ICT 6기에서의 첫 프로젝트다 보니 처음 보는 사람들에게 나의 의견을 고집하는 것이 조금 조심스러워서 팀원의 의견에 묻혀가는 상황이 많이 있었다. 이러한 부분들과, 보여줄 수 있는 것들이 많았는데 시간이 부족하였던 부분들은 매우 아쉬웠다. Java보다 Kotlin이 더 장점들이 많다고 들었다. 이번 프로젝트를 따로 Kotlin으로 바꾸고, 기능들도 보완해 보아야겠다.</p>
<ul>
<li>프로젝트 : <a href="https://velog.io/@myoungchae0_0/%EB%82%B4%EC%86%90%EC%95%88%EC%9D%98-%EC%83%88%EC%8B%B9App">https://velog.io/@myoungchae0_0/%EB%82%B4%EC%86%90%EC%95%88%EC%9D%98-%EC%83%88%EC%8B%B9App</a><br></li>
<li>수정전 Git주소 : <a href="https://github.com/Myoungchae/Smartplant">https://github.com/Myoungchae/Smartplant</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[아이텀2(iTerm2)]]></title>
            <link>https://velog.io/@myoungchae0_0/Iterm2</link>
            <guid>https://velog.io/@myoungchae0_0/Iterm2</guid>
            <pubDate>Mon, 20 Feb 2023 17:10:42 GMT</pubDate>
            <description><![CDATA[<h2 id="iterm2">iTerm2</h2>
<blockquote>
<p>iTern2는 맥OS에서 공식 터미널 애플리케이션 대신에 사용 할 수 있는 가상 터미널 애플리케이션이다.
맥을 사용하면서 기본 터미널을 사용하였는데, 노마드 코더의 수업을 들으면서 관심이 생겨 설치하게 되었다.
아래 링크로 들어가서 공식사이트에서 다운이 가능하다.
<a href="https://iterm2.com">https://iterm2.com</a></p>
</blockquote>
<h2 id="커맨드라인-인터페이스">커맨드라인 인터페이스</h2>
<blockquote>
</blockquote>
<p>커맨드라인 인터페이스(Command-line Interface, CLI)란 사용자가 텍스트로 명령어를 입력하고 다시 텍스트로 결과를 화면에 출력해주는 인터페이스를 가진 컴퓨팅 인터페이스를 의미한다.<br>
좁은 의미에서 커맨드라인(명령줄)에서 명령을 입력한다는 의미로 쓰이지만, 넓은 의미에서는 텍스트만으로 이루어진 인터페이스라는 뜻에서 문자 사용자 인터페이스(Character User Interface, CUI)라고도 불린다.
<br>커맨드라인 인터페이스는 구체적인 프로그램을 가리키는 단어는 아니며, 특정 방식의 애플리케이션 인터페이스에 대한 통칭이다.</p>
<h2 id="터미널">터미널</h2>
<blockquote>
</blockquote>
<p>입출력이 가능한 가상 터미널가 OS 커널을 연결하여 문자 입출력작업을 수행 할 수 있다. 터미널은 그 자체로 문자 사용자 인터페이스 이며, 셸과 같이 명령을 기반으로 하는 프로그램이 주로 사용되기 때문에 커맨드라인(명령줄) 인터페이스 라고도 한다.</p>
<h2 id="replread-eval-print-loop">REPL(Read-Eval-Print-Loop)</h2>
<blockquote>
</blockquote>
<p>REPL은 Read-eval-print loop의 줄임말로 사용자가 입력한 명령어를 읽어들이고(Read), 평가하고(eval), 결과를 출력하는(print) 과정을 반복(loop)하는 커맨드라인 인터페이스의 특징을 잘 나타내준다.</p>
<p>참고
<a href="https://www.44bits.io/ko/keyword/command-line-interface-cli-shell-and-terminal">https://www.44bits.io/ko/keyword/command-line-interface-cli-shell-and-terminal</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Github Desktop]]></title>
            <link>https://velog.io/@myoungchae0_0/Git-Github</link>
            <guid>https://velog.io/@myoungchae0_0/Git-Github</guid>
            <pubDate>Mon, 20 Feb 2023 13:37:42 GMT</pubDate>
            <description><![CDATA[<h2 id="git">Git</h2>
<blockquote>
</blockquote>
<p>Git은 Distributed Version Controll System(분산 버전 관리 시스템)으로 파일들을 추적하는 방식이다.</p>
<h2 id="github-gitlab-bitbucket">GitHub, GitLab, Bitbucket</h2>
<blockquote>
</blockquote>
<p>Cloud Git Provider들로 우리가 작업한 git 파일(git 변경사항)들을 올리는 일종의 저장소이다.</p>
<h2 id="시작">시작</h2>
<blockquote>
</blockquote>
<ul>
<li><h4 id="git다운로드">git다운로드</h4>
<h4 id="httpsgit-scmcomdownloads"><a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a></h4>
</li>
<li><h4 id="github-desktop-다운로드">github desktop 다운로드</h4>
<h4 id="httpsdesktopgithubcom"><a href="https://desktop.github.com/">https://desktop.github.com/</a></h4>
github desktop은 64bit가 아니면 지원을 하지않는다.
git다운로드가 되지않으면 github desktop먼저 설치를 하자.
github desktop은 git이 설치가 안되어 있으면 git도 같이 설치를 해준다.
cmd창에 들어가서
git --version을 입력하고 git version을 확인하자<br>
<img src="https://velog.velcdn.com/images/myoungchae0_0/post/16870573-c726-4c0e-a45a-26952657070e/image.png" alt="">
위에서 부터 순서대로<br></li>
<li>인터넷에 있는 저장소 하나를 클론하는것<br></li>
<li>하드드라이브에 저장소 하나를 만드는것<br></li>
<li>이미 있는 저장소를 추가하는것</li>
</ul>
<h2 id="repository생성">Repository생성</h2>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/363ee717-5eb4-4af4-a4a8-ed67ca7e6829/image.png" alt="">
<br></p>
<ul>
<li>Name
repository이름적기<br></li>
<li>Description
설명적기<br></li>
<li>Local Path
경로설정<br></li>
<li>Git ignore
None<br></li>
<li>License
None<br></li>
<li>Create Repository를 눌러서 생성</li>
</ul>
<h2 id="repository">Repository</h2>
<blockquote>
</blockquote>
<ul>
<li>Repository는 사용자의 파일들이 위치한, 깃이 주시하고 있는 폴더이다.</li>
<li>Repository는 .git이라는 폴더를 가지게 되고, 이 폴더에는 깃에 관련된 명령어나 파일, 히스토리들이 있다.
깃은 해당 폴더를 통해 Repository 내부의 변경사항들을 추적할 수 있다.</li>
</ul>
<h2 id="commit">Commit</h2>
<blockquote>
</blockquote>
<ul>
<li>Commit 은 변화의시점을 정하기 위해 사용된다.</li>
<li>처음 commit 을 initial commit 이라고 부르기도 하는데 만약에 GitHub Desktop 을 사용할 경우 commit을 할 경우 Title과 Comment를 쓰는란과 Commit 버튼이 있기 때문에 쉽게 저장 할수 있다.</li>
<li>되도록이면 바뀐내용을 간추려서 Title과 Comment에 적는 습관을 들이는게 좋다.</li>
<li>변화 이후에 에러가 날경우 변화 이전의 시점으로 되돌릴수 있다.</li>
</ul>
<h2 id="git-workflowgit-area">Git workflow(Git Area)</h2>
<blockquote>
</blockquote>
<ul>
<li><h3 id="working-directoryunstage-area">Working Directory(Unstage Area)</h3>
우리가 현재 작업하고 있는 폴더로 생성, 수정, 삭제한 파일들이 있는 디렉토리<br></li>
<li><h3 id="staging-area">Staging Area</h3>
Index라고도 부르며 , 변경사항이 있는 파일들을 선택해 커밋할 수 있도록 지정하는 곳
(버전을 만들기 위해 준비 중인 파일들의 스냅샷 데이터가 저장된 곳)<br></li>
<li><h3 id="git-directorylocal-repository">Git Directory(Local Repository)</h3>
파일들이 커밋된 곳으로, 파일들의 변경사항에 대한 스냅샷을 가지고 있는 곳
(Staging Area를 거쳐 만들어진 버전들이 저장된 곳)<br>

</li>
</ul>
<h2 id="branch">Branch</h2>
<blockquote>
<ul>
<li>브랜치는 main 또는 master 브랜치의 마지막 커밋으로부터 다른 타임라인을 가지게 될 부분이다.</li>
</ul>
</blockquote>
<ul>
<li>독립적으로 어떤 작업을 진행하기 위한 개념으로, 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL]]></title>
            <link>https://velog.io/@myoungchae0_0/SQL</link>
            <guid>https://velog.io/@myoungchae0_0/SQL</guid>
            <pubDate>Mon, 20 Feb 2023 09:25:59 GMT</pubDate>
            <description><![CDATA[<h2 id="2023년-sql-시험일정">2023년 SQL 시험일정</h2>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/5663c33e-1d62-40b0-aa83-4f3b70f8d933/image.png" alt=""></p>
<h2 id="sqld-출제문항-및-배점">SQLD 출제문항 및 배점</h2>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/05a3b365-ee9c-4c98-9740-a0ad833cf195/image.png" alt=""></p>
<h2 id="sqld-합격기준">SQLD 합격기준</h2>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/50a90c33-c5b8-4921-bc29-6f2c987fa283/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[과목 1. 데이터 모델링의 이해-속성]]></title>
            <link>https://velog.io/@myoungchae0_0/%EA%B3%BC%EB%AA%A9-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4-%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@myoungchae0_0/%EA%B3%BC%EB%AA%A9-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4-%EC%86%8D%EC%84%B1</guid>
            <pubDate>Fri, 17 Feb 2023 09:52:46 GMT</pubDate>
            <description><![CDATA[<h2 id="속성이란">속성이란?</h2>
<blockquote>
</blockquote>
<p>업무에서 필요로 하는 인스턴스로 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위<br>
업무상 관리하기 위한 최소의 의미 단위<br>
엔터티를 설명<br>
인스턴스의 구성요소, 즉 인스턴스는 속성의 집합</p>
<h2 id="엔터티-인스턴스-속성-속성값의-관계">엔터티, 인스턴스, 속성, 속성값의 관계</h2>
<blockquote>
</blockquote>
<p>엔터티는 두 개 이상의 인스턴스와 고유의 성격을 표현하는 두 개 이상의 속성정보를 보유<br>
업무는 엔터티를 구성하는 특징과 인스턴스들은 어떤 성격의 데이터로 구성되는지 파악하는 작업 필요<br>
하나의 속성은 하나의 인스턴스에만 존재<br>
속성은 관계로 기술될 수 없고 자신이 속성을 가질 수도 없음<br>
엔터티 내의 하나의 인스턴스는 각각의 속성들에 대해 한 개의 속성값만 가짐<br>
속성은 엔터티에 대한 자세하고 구체적인 정보를 나타내며 각각의 속성은 구체적인 값을 지님</p>
<h2 id="속성의-표기법">속성의 표기법</h2>
<blockquote>
</blockquote>
<p>&lt;사진&gt;</p>
<h2 id="속성의-특징">속성의 특징</h2>
<blockquote>
</blockquote>
<p>엔터티와 마찬가지로 반드시 업무에서 필요하고 관리하고자 하는 정보여야 함<br>
정규화 이론에 근간하여 정해진 주식별자에 함수적 종속성을 지녀야 함<br>
하나의 속성에 하나의 값만 가져야 하며 다중값의 경우 별도의 엔터티를 이용하여 분리해야 함</p>
<h2 id="속성의-분류">속성의 분류</h2>
<blockquote>
</blockquote>
<ul>
<li><h3 id="기본속성--업무분석을-통해-바로-정의한-속성">기본속성 : 업무분석을 통해 바로 정의한 속성</h3>
업무로부터 추출한 모든 속성이 해당하며, 엔터티에 가장 일반적이고 많음<br>
코드성 데이터, 엔터티 식별을 위한 일련번호, 다른 속성을 계산 or 영향을 받아 생성된 속성을 제외한 모든 속성<br>
업무로부터 분석한 속성이라도 이미 업무상 코드로 정의한 속성이 많으며, 이는 속성 값이 원래 속성을 나타내지 못하기에 기본속성이 되지 못함<br></li>
<li><h3 id="설계속성--업무상-존재하지는-않지만-설계를-하면서-도출해내는-속성">설계속성 : 업무상 존재하지는 않지만 설계를 하면서 도출해내는 속성</h3>
기본속성 이외에 데이터 모델링, 업무 규칙화를 위해 속성을 새로 만들어간 변형하여 정의하는 속성<br>
코드성 속성은 원래 속성을 업무상 필요에 의해 변형하여 만든 설계속성<br>
일련번호 속성은 단일한 식별자를 부여하기 위해 모델 상에서 새로 정의하는 설계속성<br></li>
<li><h3 id="파생속성--다른-속성으로부터-계산-or-변형되어-생성되는-속성">파생속성 : 다른 속성으로부터 계산 or 변형되어 생성되는 속성</h3>
다른 속성에 영향을 받아 발생하는 속성으로 보통 계산된 값들이 해당
ex. 원금, 이자율, 예치기간이라는 속성이 이자라는 속성을 변화시킴<br>
프로세스 설계 시 데이터 정합성을 유지하기 위해 유의할 점이 많으며 가급적 파생속성을 적게 정의<br>
가지고있는 계산방법에 대해서 반드시 어떤 속성에 의해 어떤 엔티티가 영향을 받는지 속성정의서에 정의해야 함</li>
</ul>
<h2 id="엔터티-구성방식에-따른-분류">엔터티 구성방식에 따른 분류</h2>
<blockquote>
</blockquote>
<ul>
<li><h3 id="pk속성">PK속성</h3>
엔터티를 식별할 수 있는 속성<br></li>
<li><h3 id="fk속성">FK속성</h3>
다른 엔터티와의 관계에서 포함된 속성<br></li>
<li><h3 id="일반속성">일반속성</h3>
엔터티에 포함되어 있고 PK, FK에 포함되지 않은 속성<br></li>
<li><h3 id="복합속성">복합속성</h3>
여러 세부 속성들로 구성 속성<br></li>
<li><h3 id="단순속성">단순속성</h3>
더 이상 다른 속성들로 구성될 수 없는 속성<br></li>
<li><h3 id="단일값속성">단일값속성</h3>
반드시 하나의 값만 존재하는 속성<br></li>
<li><h3 id="다중값속성">다중값속성</h3>
여러 개의 값을 가진 속성<br>
하나의 엔터티에 포함될 수 없기에 1차 정규화를 하거나 별도의 엔터티를 만들어 관계로 연결해야 함
&lt;사진&gt;</li>
</ul>
<h2 id="도메인">도메인</h2>
<blockquote>
</blockquote>
<p>각 속성이 가질 수 있는 값의 범위<br>
도메인 이외의 값을 갖지 못함<br>
엔터티 내에서 속성에 대한 데이터 타입과 크기, 제약사항을 지정하는 것</p>
<h2 id="속성의-명명">속성의 명명</h2>
<blockquote>
</blockquote>
<p>속성명은 사용자 인터페이스에 나타나기 때문에 업무와 직결되는 항목<br>
정확한 속성 이름 부여와 용어의 혼란을 줄이기 위해 용어사전이라는 업무사전을 프로젝트에 사용<br>
각 속성이 가지는 값의 종류, 범위를 정확히 하기 위해 도메인을 미리 정의하여 용어사전과 같이 사용<br>
위 방법을 통해 용어적 표준과 데이터타입의 일관성을 확보</p>
<h2 id="속성의-명명-규칙">속성의 명명 규칙</h2>
<blockquote>
</blockquote>
<p>해당업무에서 사용하는 이름을 부여<br>
서술식, 소유격, 수식어 X<br>
약어사용 가급적 제한<br>
전체 데이터모델에서 유일성 확보, 이는 데이터 정합성과 반정규화에 도움</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[과목 1. 데이터 모델링의 이해-엔터티]]></title>
            <link>https://velog.io/@myoungchae0_0/%EA%B3%BC%EB%AA%A9-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4-%EC%97%94%ED%84%B0%ED%8B%B0</link>
            <guid>https://velog.io/@myoungchae0_0/%EA%B3%BC%EB%AA%A9-1.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4-%EC%97%94%ED%84%B0%ED%8B%B0</guid>
            <pubDate>Wed, 15 Feb 2023 09:35:21 GMT</pubDate>
            <description><![CDATA[<h2 id="엔터티란-무엇인가">엔터티란 무엇인가?</h2>
<blockquote>
</blockquote>
<p>엔터티 = 실체, 객체<br>
업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것<br>
업무 활동상 지속적인 관심을 가지고 있어야 하는 대상으로서 그 대상들 간에 동질성을 지닌 인스턴스들이나 그들이 행하는 행위의 집합으로 정의 가능<br>
그 집합에 속하는 개체들의 특성을 설명할 수 있는 속성을 지니고 있으며 이는 인스턴스 전체가 공유하는 공통 속성과 일부만 해당하는 개별 속성이 존재
ex. 학생 엔터티는 학번, 이름, 이수학점, 등록일자, 생일, 주소 등의 속성을 보유<br>
엔터티는 인스턴스의 집합, 인스턴스는 엔터티의 하나의 값이라 정의 가능<br>
눈에 보이지 않는 개념에 대해서도 엔터티로서 인식할 수 있어야 함<br></p>
<h2 id="엔터티와-인스턴스의-표기법">엔터티와 인스턴스의 표기법</h2>
<blockquote>
</blockquote>
<p>대부분 사각형으로 표현
&lt;사진&gt;</p>
<h2 id="엔터티의-조건">엔터티의 조건</h2>
<blockquote>
</blockquote>
<ul>
<li><h3 id="업무에서-필요로-하는-정보여야-함">업무에서 필요로 하는 정보여야 함</h3>
시스템을 구축하고자 하는 업무에서 필요, 관리하고자 하는 정보여야 함
엔터티를 도출할 때 업무영역 내에서 관리할 필요가 있는지를 먼저 판단<br></li>
<li><h3 id="식별자에-의해-식별이-가능해야-함">식별자에 의해 식별이 가능해야 함</h3>
엔터티를 도출할 경우 각각의 업무적으로 의미를 가지는 인스턴스가 식별자에 의해 한 개씩만 존재하는지 검증<br>
두 개 이상의 엔터티를 대변할 경우 잘못 설계된 식별자
ex. 이름의 경우 동명이인이 존재할 수 있으나 사원번호의 경우 유일한 식별자<br></li>
<li><h3 id="영속적으로-존재하는-인스턴스의-집합이어야-함">영속적으로 존재하는 인스턴스의 집합이어야 함</h3>
두 개 이상이라는 집합개념이 없으면 인스턴스 성립 불가
&lt;사진&gt;<br></li>
<li><h3 id="업무프로세스에-의해-이용되어야-함">업무프로세스에 의해 이용되어야 함</h3>
전혀 이용되지 않는다면 업무 분석이 정확하게 안되어 엔터티가 잘못 선정되거나 업무프로세스 도출이 적절하게 이루어지지 않았음을 의미<br>
프로세스 모델링을 하며 데이터 모델과 검증할 때 문제점 도출<br>
상관 모델링을 할 때 엔터티와 단위프로세스를 교차 점검하면서 문제점 도출<br>
이렇게 고립된 엔터티는 제거하거나 누락된 프로세스를 추가해서 해결<br></li>
<li><h3 id="속성을-포함해야-함">속성을 포함해야 함</h3>
속성이 없고 엔터티의 이름만 가지고 있을 경우 관계가 생략되었거나 업무 분석이 미진하여 속성정보가 누락된 것<br>
주식별자만 존재하고 일반속성이 전혀 없는 경우 역시 부적절한 엔터티<br>
단, 관계엔터티의 경우 주식별자 속성만 있어도 엔터티로 인정<br>
&lt;사진&gt;<br></li>
<li><h3 id="다른-엔터티와-최소-한-개-이상의-관계가-존재해야-함">다른 엔터티와 최소 한 개 이상의 관계가 존재해야 함</h3>
관계가 설정되지 않은 엔터티의 도출은 부적절한 엔터티가 도출되었거나 다른 엔터티와 적절한 관계를 찾기 못했을 가능성 존재<br>
통계성 엔터티 도출, 코드성 엔터티 도출, 시스템 처리시 내부 필요에 의한 엔터티 도출과 같은 경우 관계를 생략하여 표현<br>
&lt;사진&gt;</li>
</ul>
<h2 id="문제">문제</h2>
<blockquote>
<h3 id="다음-중-아래-시나리오에서-엔터티로-가장-적절한-것은">다음 중 아래 시나리오에서 엔터티로 가장 적절한 것은?</h3>
</blockquote>
<pre><code>S 병원은 여러 명의 환자가 존재하고 각 환자에 대한 이름, 주소 등을 관리해야한다.
(단, 업무 범위와 데이터의 특성은 상기 시나리오에 기술되어 있는 사항만을 근거하여 판단해야 함)</code></pre><p>① 병
② 환자
③ 이름
③ 주소<br>
정답 : ②<br>
병원은 S 병원1개이므로 엔터티로 성립되지 않으며, 이름, 주소는 엔터티의 속성으로 인실 될 수 있다. 엔터티는 2개 이상의 속성과 2개 이상의 인스턴스를 가져 소위 면적으로 표현될 수 있어야 비로소 기본적인 엔터티의 자격을 갖췄다 할 수 있으므로 &#39;여러 명&#39;의 복수 인스턴스와 이름, 주소 등의 복수 속성을 가진 &#39;환자&#39;가 엔터티로 가장 적합 할 수 있다.</p>
<h2 id="다음-중-엔터티의-특징으로-가장-부적절한-것은">다음 중 엔터티의 특징으로 가장 부적절한 것은?</h2>
<blockquote>
</blockquote>
<p>① 속성이 없는 엔터티는 있을 수 없다. 엔터티는 반드시 속성을 가져야한다.
② 엔터티는 다른 엔터티와 관계가 있을 수 밖에 없다. 단, 통계성 엔터티나, 코드성 엔터티의 경우 관계를 생략 할 수 있다.
③ 객체지향의 디자인 패턴에는 싱글턴패턴이 있어 하나의 인스턴스를 가지는 클래스가 존재한다. 이와 유사하게 엔터티는 한 개의 인스턴스를 가지는 것만으로도 충분한 의미를 부여 할 수 있다.
④ 데이터로서 존재하지만 업무에서 필요로 하지 않으면 해당 업무의 엔터티로 성립 될 수 없다.<br>
정답 : ②<br></p>
<h3 id="엔터티의-특징">엔터티의 특징</h3>
<ul>
<li><h4 id="반드시-해당-업무에서-필요하고-관리하고자-하는-정보이어야-한다">반드시 해당 업무에서 필요하고 관리하고자 하는 정보이어야 한다.</h4>
ex)환자, 토익의 응시횟수...<br></li>
<li><h4 id="유일한-식별자에-의해-식별이-가능해야-한다">유일한 식별자에 의해 식별이 가능해야 한다.</h4>
<br></li>
<li><h4 id="영속적으로-존재하는-두-개-이상의-인스턴스의-집합이어야-한다">영속적으로 존재하는 (두 개 이상의) 인스턴스의 집합이어야 한다.</h4>
(&quot;한 개&quot;가 아니라 &quot;두 개 이상&quot;)<br></li>
<li><h4 id="엔터티는-업무-프로세스에-의해-이용되어야-한다">엔터티는 업무 프로세스에 의해 이용되어야 한다.</h4>
<br></li>
<li><h4 id="엔터티는-반드시-속성이-있어야-한다">엔터티는 반드시 속성이 있어야 한다.</h4>
<br></li>
<li><h4 id="엔터티는-다른-엔터티와-최소-한-개-이상의-관계가-있어야-한다">엔터티는 다른 엔터티와 최소 한 개 이상의 관계가 있어야 한다.</h4>
</li>
</ul>
<h2 id="문제-1">문제</h2>
<blockquote>
</blockquote>
<h3 id="다음-중-엔터티의-일반적인-특징으로-가장-부적절한-것은">다음 중 엔터티의 일반적인 특징으로 가장 부적절한 것은?</h3>
<p>① 다른 엔터티와의 관계를 가지지 않는다. 
② 유일한 식별자에 의해 식별이 가능해야한다. 
③ 엔터티는 입무 프로세스에 의해 이용되어야한다.<br>④ 엔터터는 반드시 속성을 포함해야 한다.<br>
정답 : ①<br>
엔터티의 중요한 특징의 하나는 다른 엔터티와 관계를 가져야 한다는 것이다. 그러나 공통코드, 통계성 엔터티의 경우는 관계를 생략할 수 있다.</p>
<h2 id="엔터티의-분류-방법">엔터티의 분류 방법</h2>
<blockquote>
</blockquote>
<ul>
<li><h3 id="엔터티-자신의-성격에-의해-실체유형에-따라-구분하거나-업무를-구성하는-모습에-따라-구분이-되는-발생시점에-의해-분류">엔터티 자신의 성격에 의해 실체유형에 따라 구분하거나 업무를 구성하는 모습에 따라 구분이 되는 발생시점에 의해 분류</h3>
<br></li>
<li><h3 id="유무형에-따른-분류">유무형에 따른 분류</h3>
<ul>
<li><h4 id="유형엔터티">유형엔터티</h4>
물리적 형태, 안정적, 지속적으로 활용되는 엔터티<br>
업무로부터 엔터티를 구분하기가 가장 용이<br>
사원, 물품, 강사<br></li>
<li><h4 id="개념엔터티">개념엔터티</h4>
물리적 형태x, 관리해야 할 개념정 정보로 구분이 되는 엔터티<br>
조직, 보험상품<br></li>
<li><h4 id="사건엔터티">사건엔터티</h4>
업무를 수행함에 따라 발생하는 엔터티<br>
발생량이 많고 통계에 이용<br>
주문, 청구, 미납<br></li>
</ul>
</li>
<li><h3 id="발생시점에-따른-분류">발생시점에 따른 분류</h3>
<ul>
<li><h4 id="기본키엔터티">기본/키엔터티</h4>
그 업무에 원래 존재하는 엔터티<br>
다른 엔터티와 관계에서 생성되지 않고 독립적으로 생성 가능<br>
다른 엔터티의 부모 역할<br>
다른 엔터티의 주식별자를 상속받지 않고 고유 주식별자 보유<br>
사원, 부서, 고객, 상품, 자재<br></li>
<li><h4 id="중심엔터티">중심엔터티</h4>
기본엔터티로부터 발생되어 그 업무에 있어 중심적인 역할<br>
발생량이 많고 다른 엔터티와의 관계를 통해 행위엔터티를 생성<br>
계약, 사고, 예금원장, 청구, 주문, 매출<br></li>
<li><h4 id="행위엔터티">행위엔터티</h4>
두 개 이상의 부모엔터티로부터 발생<br>
자주 내용이 바뀌거나 데이터량이 증가<br>
분석초기에 잘 나타나지 않으며 상세 설계단게, 프로스스와 상관<br>
모델링 진행에서 도출<br>
주문목록, 사원변경이력<br></li>
<li><h4 id="그-외-엔터티의-스스로-생성-여부에-따라-독립의존엔터티로-구분-가능">그 외 엔터티의 스스로 생성 여부에 따라 독립/의존엔터티로 구분 가능</h4>
&lt;사진&gt;</li>
</ul>
</li>
</ul>
<h2 id="문제-2">문제</h2>
<blockquote>
</blockquote>
<h3 id="다음-중-다른-엔터티로부터-주-식별자를-상속받지-않고-자신의-고유한-주식별자를-가지며-사원-부서-고객-상품-자재-등이-예가-될-수있는-엔터티로-가장-적절한-것은">다음 중 다른 엔터티로부터 주 식별자를 상속받지 않고 자신의 고유한 주식별자를 가지며 사원, 부서, 고객, 상품, 자재 등이 예가 될 수있는 엔터티로 가장 적절한 것은?</h3>
<p>① 기본 엔터티 (키엔터티)
② 중심 엔터티 (메인엔터티)
③ 행위 엔터티
④ 개념 엔터티<br>
정답 : ① <br>
기본엔터티(키엔터티)란 그 업무에 원래 존재하는 정보로서 다른 엔터티와의 관계에 의해 생성되지 않고 독립적으로 생성이 가능하고 자신은 타 엔터티의 부모의 역할을 하게 된다. 다른 엔터티로부터 주식별자를 상속받지 않고 자신의 고유한 주식별자를 가지게 된다. 예를 들어 사원, 부서, 고객, 상품, 자재 등이 기본 엔터티가 될 수 있다.</p>
<h2 id="엔터티의-명명">엔터티의 명명</h2>
<blockquote>
</blockquote>
<p>가능하면 현업업무에서 쓰이는 용어 사용<br>
가능하면 약어 사용x<br>
가능하면 단순명사 사용<br>
모든 엔터티에서 유일하게 이름이 부여<br>
엔터티의 생성 의미대로 이름을 보여 자주 적절치 못한 이름이 발생<br>
ex. 고객제품 경우 고객이 주문한 제품인지 고객이 지닌 제품인지 알 수 없음<br></p>
<h2 id="문제-3">문제</h2>
<blockquote>
</blockquote>
<h3 id="다음-중-엔터티의-이름을-부여하는-방법으로서-가장-부적절한-것은">다음 중 엔터티의 이름을 부여하는 방법으로서 가장 부적절한 것은?</h3>
<p>① 가능하면 약어를 사용하여 엔터티의 이름을 간결하고 명확하게 한다.
② 현업의 업무 용어를 사용하여 업무상의 의미를 분명하게한다. 
③ 모든 엔터티에서 유일한 이름이 부여되어야 한다.
④ 엔터티가 생성되는 의미대로 자연스럽게 부여하도록한다.<br>
정답 : ①<br>
엔터티를 명명하는 일반적인 기준은 다음과 같다. 용어를 사용하는 모든 표기법이 다 그렇듯이 첫번째는 가능하면 현업업무에서 사용하는 용어를 사용한다. 두번째는 가능하면 약어를 사용하지 않는다. 세번째는 단수명사를 사용한다. 네번째는 모든 엔터티를 통틀어서 유일하게 이름이 부여되어야 한다. 다섯번째는 엔터티의 생성의미대로 이름을 부여한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[과목 1. 데이터 모델링의 이해 - 데이터모델의 이해]]></title>
            <link>https://velog.io/@myoungchae0_0/SQLD-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@myoungchae0_0/SQLD-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Wed, 15 Feb 2023 06:57:32 GMT</pubDate>
            <description><![CDATA[<h2 id="모델링이란">모델링이란?</h2>
<blockquote>
<ul>
<li>살아가며 나타날 수 있는 다양한 현상은 사람, 사물 개념 등에 의해 발생하며, 이것을 표기법에 의해 규칙을 가지고 표기하는것 자체를 의미<br>
</li>
</ul>
</blockquote>
<ul>
<li>현실세계를 추상화, 단순화, 명확화 하기위해 일정한 표기법에 의해 표현하는 기법</li>
</ul>
<h2 id="모델링의-특징">모델링의 특징</h2>
<blockquote>
<ul>
<li><h3 id="추상화">추상화</h3>
현실세계를 일정 형식에 맞추어 표현한다는 의미로, 다양한 현상을 일정 양식인 표기법에 의해 표현하는것<br>
</li>
</ul>
</blockquote>
<ul>
<li><h3 id="단순화">단순화</h3>
복잡한 현실세계를 약속된 규약에 의해 제한된 표기법이나 언어로 표현하여 쉽게 이해할 수 있도록 하는것<br></li>
<li><h3 id="명확화">명확화</h3>
누구나 이해하기 쉽게 하기 위해 대상에 대한 애매모호함을 제거하고 정확하게 현상을 기술하는것<br></li>
</ul>
<h2 id="문제">문제</h2>
<blockquote>
<h3 id="모델링은-현실세계에-대해서-표현하는-것으로-이해할-수-있다-다음-중-모델링의-특징으로-가장-부적절한-것은br">모델링은 현실세계에 대해서 표현하는 것으로 이해할 수 있다. 다음 중 모델링의 특징으로 가장 부적절한 것은?<br></h3>
<p>① 현실세계를 일정한 형식에 맞추어 표현하는 추상화의 의미를 가질 수 있음
② 시스템 구현만을 위해 진행하는 사전단계의 작업으로서 데이터베이스 구축을 위한 사전작업의 이해가 있음
③ 복잡한 현실을 제한된 언어나 표기법을 통해 이해하기 쉽게 하는 단순화의 의미를 가지고 있음
④ 애매모호함을 배제하고 누구나 이해가 가능하도록 정확하게 현상을 기술하는 정확화의 의미를 가짐
<br>
정답 : ②<br></p>
</blockquote>
<h3 id="모델링의-특징-1">모델링의 특징</h3>
<ul>
<li><h3 id="추상화-1">추상화</h3>
현실세계를 일정 형식에 맞추어 표현한다는 의미로, 다양한 현상을 일정 양식인 표기법에 의해 표현하는것<br></li>
<li><h3 id="단순화-1">단순화</h3>
복잡한 현실세계를 약속된 규약에 의해 제한된 표기법이나 언어로 표현하여 쉽게 이해할 수 있도록 하는것<br></li>
<li><h3 id="명확화-1">명확화</h3>
누구나 이해하기 쉽게 하기 위해 대상에 대한 애매모호함을 제거하고 정확하게 현상을 기술하는것
모델링은 시스템 구현만을 위해 진행하는  작업이 아니며, 시스템 구현을 포함한 업무분석 및 업무형상화를 하는 목적도 있음.<br></li>
</ul>
<h2 id="모델링의-세-가지-관점">모델링의 세 가지 관점</h2>
<blockquote>
<ul>
<li><h3 id="데이터-관점">데이터 관점</h3>
업무가 어떤 데이터와 관련 있으며 데이터간의 관계는 무엇인가?<br>
</li>
</ul>
</blockquote>
<ul>
<li><h3 id="프로세스-관점">프로세스 관점</h3>
업무가 실제 하고 있는 일은 무엇인가, 무엇을 해야 하는가<br></li>
<li><h3 id="데이터와-프로세스의-상관관점">데이터와 프로세스의 상관관점</h3>
업무가 처리하는 일의 방법에 따라 데이터는 어떤 영향을 받는가?</li>
</ul>
<h2 id="데이터-모델링의-정의">데이터 모델링의 정의</h2>
<blockquote>
<ul>
<li>업무에서 필요로 하는 데이터를 시스템 구축 방법론에 의해 분석하고 설계하여 정보시스템을 구축하는 과정<br>
</li>
</ul>
</blockquote>
<ul>
<li>정보시스템을 구축하기 위한 데이터 관점의 업무 분석 기법<br></li>
<li>현실세계의 데이터에 대해 약속된 표기법에 의해 표현하는 과정<br></li>
<li>데이터베이스를 구축하기 위한 분석/설계의 과정</li>
</ul>
<h2 id="데이터-모델링의-목적">데이터 모델링의 목적</h2>
<blockquote>
<ul>
<li>업무정보를 구성하는 기초가 되는 정보들을 일정한 표기법에 의해 표현함으로써 정보시스템 구축의 대상이 되는 업무 내용을 정확하게 분석하는것<br>
</li>
</ul>
</blockquote>
<ul>
<li>분석된 모델을 가지고 실제 데이터베이스를 생성하여 개발 및 데이터관리에 사용하기 위함</li>
</ul>
<h2 id="문제-1">문제</h2>
<blockquote>
<h3 id="다음-설명-중-데이터-모델링이-필요한-주요-이유로-가장-부적절한-것은br">다음 설명 중 데이터 모델링이 필요한 주요 이유로 가장 부적절한 것은?<br></h3>
<p>① 업무정보를 구성하는 기초가 되는 정보들에 대해 일정한 표기법에 의해 표현한다.
② 분석된 모델을 가지고 데이터베이스를 생성하여 개발 및 데이터관리에 사용하기 위한 것이다.
③ 데이터베이스를 구축하기 위한 용도를 위해 데이터모델링을 수행하고 업무에 대한 설명은 별도의 표기법을 이용한다.
④ 데이터모델링 자체로서 업무의 흐름을 설명하고 분석하는 부분에 의미를 가지고 있다.<br>
정답 : ③<br></p>
</blockquote>
<h3 id="데이터-모델링의-목적-1">데이터 모델링의 목적</h3>
<ul>
<li>업무정보를 구성하는 기초가 되는 정보들에 대해 일정한 표기법에 의해 표현함으로써 정보시스템 구축의 대상이 되는 업무 내용을 정확하게 분석하는것<br></li>
<li>분석된 모델을 가지고 실제 데이터베이스를 생성하여 개발 및 데이터관리에 사용하기 위한 것</li>
</ul>
<h2 id="데이터-모델이-제공하는-기능">데이터 모델이 제공하는 기능</h2>
<blockquote>
<ul>
<li>시스템을 현재 또는 원하는 모습으로 가시화<br>
</li>
</ul>
</blockquote>
<ul>
<li>시스템의 구조와 행동을 명세화<br></li>
<li>시스템을 구축하는 구조화된 틀을 제공<br></li>
<li>시스템을 구축하는 과정에서 결정한 것을 문서화<br></li>
<li>다양한 영역에 집중하기 위해 다른 영역의 세부 사항은 숨기는 다양한 관점<br></li>
<li>목표에 따라 구체화된 상세 수준의 표현방법을 제공</li>
</ul>
<h2 id="데이터-모델링의-유의점">데이터 모델링의 유의점</h2>
<blockquote>
<ul>
<li><h3 id="중복">중복</h3>
데이터 모델은 같은 데이터를 사용하는 사람, 시간, 그리고 장소 파악에 도움이 되며, 여러 장소에 같은 정보를 저장 하지 않도록 주의<br>
</li>
</ul>
</blockquote>
<ul>
<li><h3 id="비유연성">비유연성</h3>
데이터 모델을 어떻게 설계했는가에 따라 사소한 업무 변화에도 데이터 모델이 수시로 변경되어 유지보수의 어려움을 가중
데이터 정의를 데이터의 사용 프로세스와 분리하여 작은 변화가 애플리케이션과 데이터 베이스에 중대한 변화를 일으킬 수 있는 가능성을 감소<br></li>
<li><h3 id="비일관성">비일관성</h3>
다른 데이터와 모순된다는 고려 없이 일련의 데이터를 수정하는 등 데이터의 중복이 없더라도 비일관성이 발생하기 때문에 데이터와 데이터간 상호 연관 관계에대한 명확한 정의로 이러한 위협을 사전에 예방<br></li>
</ul>
<h2 id="문제-2">문제</h2>
<blockquote>
<h3 id="다음-중-데이터모델링을-할-때-유의해야-할-사항으로-가장-부적절한-것은">다음 중 데이터모델링을 할 때 유의해야 할 사항으로 가장 부적절한 것은?</h3>
<p>① 여러 장소의 데이터베이스에 같은 정보를 저장하지 않도록 하여 중복성을 최소화 한다.
② 데이터 정의를 데이터의 사용 프로세스와 분리하여 유연성을 높인다.
③ 사용자가 처리하는 프로세스나 장표 등에 따라 매핑이 될 수 있도록 프로그램과 테이블간의 연계성을 높인다.
④ 데이터간의 상호 연관관계를 명확하게 정의하여 일관성 있게 데이터가 유지되도록 한다.<br>
정답 : ③ <br></p>
</blockquote>
<h3 id="데이터모델링을-할-때-유의할-사항은-중복성-비유연성-비일관성-등이다br">데이터모델링을 할 때 유의할 사항은 중복성, 비유연성, 비일관성 등이다.<br></h3>
<ul>
<li><h3 id="중복duplication">중복(Duplication)</h3>
데이터 모델은 같은 데이터를 사용하는 사람, 시간, 그리고 장소를 파악하는데 도움을 줌으로써 데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다.<br></li>
<li><h3 id="비유연성inflexibility">비유연성(Inflexibility)</h3>
데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무변화에도 데이터 모델이 수시로 변경됨으로써 유지보수의 어려움을 가중시킬 수 있다. 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 수 있는 가능성을 줄인다.<br></li>
<li><h3 id="비일관성inconsistency">비일관성(Inconsistency)</h3>
데이터의 중복이 없더라도 비일관성은 발생할 수 있는데, 예를 들면 신용 상태에 대한 갱신 없이 고객의 납부 이력 정보를 갱신하는 경우이다. 개발자가 서로 연관된 다른 데이터와 모순된다는 고려 없이 일련의 데이터를 수정할 수 있기 때문에 이와 같은 문제가 발생할 수 있다. 데이터 모델링을 할 때 데이터와 데이터 간의 상호 연관 관계에 대해 명확하게 정의한다면 이러한 위험을 사전에 예방하는데 도움을 줄 수 있다. 사용자가 처리하는 프로세스 혹은 이와 관련된 프로그램과 테이블의 연계성을 높이는 것은 데이터 모델이 업무 변경에 대해 취약하게 만드는 단점에 해당된다.<br></li>
</ul>
<h2 id="문제-3">문제</h2>
<blockquote>
<h3 id="다음-중-아래-설명이-의미하는-데이터모델링의-유의점에-해당하는-특성은-무엇인가">다음 중 아래 설명이 의미하는 데이터모델링의 유의점에 해당하는 특성은 무엇인가?</h3>
</blockquote>
<pre><code>데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무변화에도 데이터 모델이 수시로 변경됨으로써 유지
보수의 어려움을 가중시킬 수 있다. 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모
델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 수
있는 가능성을 줄인다.</code></pre><p>① 중복
② 비유연성
③ 비일관성
④ 일관성<br>
정답 : ②<br></p>
<ul>
<li><h3 id="비유연성inflexibility-1">비유연성(Inflexibility)</h3>
데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무변화에도 데이터 모델이 수시로 변경됨으로써 유지보수의 어려움을 가중시킬 수 있다. 
<br>데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일이킬 수 있는 가능성을 줄인다.<br></li>
</ul>
<h2 id="데이터-모델링의-3단계-진행">데이터 모델링의 3단계 진행</h2>
<blockquote>
<ul>
<li><h3 id="개념적-데이터-모델">개념적 데이터 모델</h3>
</li>
</ul>
</blockquote>
<ol>
<li>추상화 수준이 높고 업무중심적이며 포괄적인 수준의 모델링</li>
<li>조직, 사용자의 데이터 욕구사항을 탐색, 분석하는데서 시작하며, 어떤 자료가 중요하고 유지되어야 하는지 결정하는것도 포함</li>
<li>핵심 엩너티와 그들관의 관계를 발견하고 그것을 표현하기 위해서 엔터티 - 관계 다이어그램을 생성하는것</li>
<li>사용자와 시스템 개발자가 데이터 요구사항을 발견하는것을 지원</li>
<li>현 시스템이 어떻게 변형되어야 하는가를 이해하는데 유용</li>
</ol>
<ul>
<li><h3 id="논리적-데이터-모델">논리적 데이터 모델</h3>
</li>
</ul>
<ol>
<li>업무의 구체적 모습과 흐름에 따른 구체화된 업무중심의 모델링</li>
<li>데이터베이스 설계 프로세스의 input으로써 비즈니스 정보의 논리적인 구조와 규칙을 명확하게 표현하는 기법</li>
<li>누가, 어떻게 그리고 전산화와는 별개로 비즈니스 데이터에 존재하는 사실들을 인식하여 기록하는것</li>
<li>시스템 구축을 위해 가장 먼저 시작할 기초적 업무조사를 하는 초기단계부터 해야 할 대부분의 사항을 모두 정의하는 시스템 설계의 전 과정을 지원하는 &#39;과정의 도구&#39;</li>
<li>논리 데이터 모델 상세화 과정의 대표적인 활동인 정규화는 논리 데이터 모델의 일관성을 확보하고 중복을 제거하여 속성들이 가장 적절한 엔터티에 배치되도록 함으로써 보다 신뢰성 있는 데이터 구조를 얻는게 목적</li>
</ol>
<ul>
<li><h3 id="물리적-데이터-모델">물리적 데이터 모델</h3>
</li>
</ul>
<ol>
<li>데이터베이스의 저장구조에 따른 테이블스페이스 등을 고려한 모델링</li>
<li>논리 데이터 모델이 데이터 저장소로서 어떻게 컴퓨터 하드웨어에 표현될 것인가를 다룸</li>
<li>데이터가 물리적으로 컴퓨터에 어떻게 저장될 것인가에 대한 정의를 물리적 스키마라고 하며 물리적 저장구조와 사용될 저장 장치, 자료를 추출하기 위해 사용될 접근 방법이 있음</li>
<li>많은 시간이 투자</li>
</ol>
<h2 id="문제-4">문제</h2>
<blockquote>
<h3 id="다음-중-아래-데이터모델링-개념에-대한-설명에서-㉠-㉡에-들어갈-단어로-가장-적절한-것은">다음 중 아래 데이터모델링 개념에 대한 설명에서 ㉠, ㉡에 들어갈 단어로 가장 적절한 것은?</h3>
</blockquote>
<pre><code>전사적 데이터 모델링을 수행할 때 많이 하며, 추상화 수준이 높고 업무 중심적으로 포괄적인 수준의 모델링을
진행하는 것을 ㉠ 데이터 모델링 이라고 한다. 이와 달리 실제로 데이터베이스에 이식할 수 있도록 성능, 저장
등의 물리적인 성격을 고려한 데이터 모델링은 ㉡ 데이터 모델링이라고 한다.</code></pre><p>① ㄱ-개념적, ㄴ-물리적
② ㄱ-논리적, ㄴ-개념적
③ ㄱ-논리적, ㄴ-물리적
④ ㄱ-개념적, ㄴ-논리적<br>
정답 : ①<br></p>
<ul>
<li><h3 id="개념적-데이터-모델-1">개념적 데이터 모델</h3>
</li>
</ul>
<ol>
<li>추상화 수준이 높고 업무중심적이며 포괄적인 수준의 모델링</li>
<li>조직, 사용자의 데이터 욕구사항을 탐색, 분석하는데서 시작하며, 어떤 자료가 중요하고 유지되어야 하는지 결정하는것도 포함</li>
<li>핵심 엩너티와 그들관의 관계를 발견하고 그것을 표현하기 위해서 엔터티 - 관계 다이어그램을 생성하는것</li>
<li>사용자와 시스템 개발자가 데이터 요구사항을 발견하는것을 지원</li>
<li>현 시스템이 어떻게 변형되어야 하는가를 이해하는데 유용</li>
<li>전사적 데이터 모델링이나 EA 수립 시에 많이 한다.</li>
</ol>
<ul>
<li><h3 id="물리적-데이터-모델-1">물리적 데이터 모델</h3>
</li>
</ul>
<ol>
<li>데이터베이스의 저장구조에 따른 테이블스페이스 등을 고려한 모델링</li>
<li>논리 데이터 모델이 데이터 저장소로서 어떻게 컴퓨터 하드웨어에 표현될 것인가를 다룸</li>
<li>데이터가 물리적으로 컴퓨터에 어떻게 저장될 것인가에 대한 정의를 물리적 스키마라고 하며 물리적 저장구조와 사용될 저장 장치, 자료를 추출하기 위해 사용될 접근 방법이 있음</li>
<li>많은 시간이 투자</li>
</ol>
<h2 id="프로젝트-생명주기에서-데이터-모델링">프로젝트 생명주기에서 데이터 모델링</h2>
<blockquote>
<ul>
<li>일반적으로 계획/분석 단계에서 개념적 데이터 모델링, 분석단계에서는 논리적 데이터 모델링, 설계단계에서 물리적 데이터 모델링이 수행, 그러나 현실에서는 개념적 데이터 모델링을 대부분 생략<br>
</li>
</ul>
</blockquote>
<ul>
<li>정보공학, 구조적 방법론은 분석단계애ㅔ서 논리적 데이터 모델을 수행하고 설계단계에서 물리적 데이터 모델을 수행<br></li>
<li>나선형 모델(RUF)에서는 업무크기에 따라 논리, 물리적 데이터 모델을 분석, 설계단계 양쪽에서 수행하며 분석단계에서는 논리적 데이터 모델이 더 많이 수행</li>
</ul>
<h2 id="데이터-독립성의-이해">데이터 독립성의 이해</h2>
<blockquote>
<ul>
<li>어떤 단위에 대해 독리적인 의미를 부여하고 이를 효과적으로 구현하게 되면 자신이 가지는 고유한 특징을 명확히 하고 다른 기능의 변경으로부터 쉽게 변경되지 않고 자신의 고유한 기능을 가지고 이를 제공하는 장점을 지님<br>
</li>
</ul>
</blockquote>
<ul>
<li>유지보수 비용 증가, 데이터 중복성 증가, 요구사항 대응 저하로 인해 데이터 독립성 필요성 증가</li>
</ul>
<h2 id="데이터베이스-3단계-구조">데이터베이스 3단계 구조</h2>
<blockquote>
<h3 id="외부단계-개념적-단계-내부적-단꼐로-구성된-서로-간섭되지-않는-모델">외부단계, 개념적 단계, 내부적 단꼐로 구성된 서로 간섭되지 않는 모델</h3>
<ul>
<li><h3 id="외부단계">외부단계</h3>
사용자와 가장 가까운 단계로 사용자 개개인이 보는 자료에 대한 관점과 관련이 있는 구조데이터 유형의 공통적인 사항을 처리하는 통합된 뷰를 스키마 구조로 디자인한 형태<br></li>
<li><h3 id="외부스키마">외부스키마</h3>
개인 사용자가 보는 개인적 DB스키마<br></li>
<li><h3 id="개념스키마">개념스키마</h3>
모든 사용자 관점을 통합한 조직 전체의 DB를 기술하는 것<br></li>
<li><h3 id="내부스키마">내부스키마</h3>
물리적 장치에서 데이터가 실제적으로 저장되는 방법을 표현하는 것<br></li>
<li><h3 id="요약">요약</h3>
</li>
</ul>
</blockquote>
<ol>
<li>데이터베이스 스키마 구조는 3단계로 구분되고 각각 상호 독립적 의미와 고유한 기능을 가짐</li>
<li>데이터 모델링은 통합관점의 뷰를 가지고 있는 개념 스키마를 만들어가는 과정<img src="https://velog.velcdn.com/images/myoungchae0_0/post/aacf2ad3-bcc1-472b-8333-4c289a71ee3a/image.jfif" alt=""></li>
</ol>
<h2 id="문제-5">문제</h2>
<blockquote>
<h3 id="다음-중-ansi-sparc에서-정의한-3단계구조three-level-architecture에서-아래-내용이-설명하는-스키마구조로-가장-적절한-것은">다음 중 ANSI-SPARC에서 정의한 3단계구조(three-level architecture)에서 아래 내용이 설명하는 스키마구조로 가장 적절한 것은?</h3>
</blockquote>
<pre><code>모든 사용자 관점을 통합한 조직 전체 관점의 통합적 표현
모든 응용시스템들이나 사용자들이 필요로 하는 데이터를 통합한 조직 전체의 DB를 기술한 것으로 DB에 저장되는
데이터와 그들간의 관계를 표현하는 스키마</code></pre><p>① 외부스키마(External Schema)
② 개념스키마(Conceptual Schema)
③ 내부스키마(Internal Schema)
④ 논리스키마(Logical Schema)<br>
정답 : ②<br>
데이터베이스 스키마 구조는 외부단계, 개념적 단계, 내부적 단계 3단계로 구분되고 각각은 상호 서로 간섭되지않는 독립적인 의미를 가지고 고유한 기능을 가진다.</p>
<blockquote>
<ul>
<li><h3 id="개념스키마-1">개념스키마</h3>
통합관점의 스키마구조를 표현한 것을 개념스키마(Conceptual Schema)라고 하며, 데이터 모델링은 통합관점의 뷰를 가지고 있는 개념스키마를 만들어가는 과정으로 이해할 수 있다.<br></li>
</ul>
</blockquote>
<h2 id="데이터베이스-독립성-요소">데이터베이스 독립성 요소</h2>
<blockquote>
<ul>
<li><h3 id="논리적-독립성">논리적 독립성</h3>
</li>
</ul>
</blockquote>
<ol>
<li>개념스키마가 변경되어도 외부 스키마에 영향을 미치지 않도록 지원</li>
<li>논리적인 데이터독립성은 외부의 변경에도 개념스키마가 변하지 않는 특성을 지님    </li>
<li>논리적 구조가 변경되어도  응용 프로그램에 영향 없음</li>
<li>사용자 특성에 맞는 변경이 가능하며 통합 구조 변경 가능</li>
</ol>
<ul>
<li><h3 id="물리적-독립성">물리적 독립성</h3>
</li>
</ul>
<ol>
<li>내부 스키마가 변경되어도 외부, 개념 스키마는 영향을 받지 않도록 지원하는 것</li>
<li>저장장치의 구조변경은 응용프로그램과 개념 스키마에 영향 없음</li>
<li>물리적 구조 영향 없이 개념구조 변경 가능하며, 개념구조 영향 없이 물리적 구조 변경가능</li>
</ol>
<h2 id="데이터베이스-사상">데이터베이스 사상</h2>
<blockquote>
<h3 id="상호-독립적인-개념을-연결시켜주는-다리로-논리적-사상과-물리적-사상이-존재">상호 독립적인 개념을 연결시켜주는 다리로, 논리적 사상과 물리적 사상이 존재</h3>
<ul>
<li><h3 id="논리적-사상">논리적 사상</h3>
외부적/개념적 사상
외부 화면과 사용자에게 인터페이스하기 위한 스키마 구조는 전체가 통합된 개념적 스키마와 연결되는 구조 
즉, 외부적 뷰와 개념적 뷰의 상호관련성<br></li>
<li><h3 id="물리적-사상">물리적 사상</h3>
개념적/내부적 사상
통합된 개념적 스키마 구조와 물리적으로 저장된 구조의 물리적인 테이블스페이스와 연결되는 구조
즉, 개념적뷰와 저장된 데이터베이스의 상호관련성
각 단계의 독립성을 보장하기 위해서 변경사항이 발생했을 때 DBA가 적절하게 작업을 해주기 때문에 독립성이 보장</li>
</ul>
</blockquote>
<h2 id="데이터-모델링의-중요한-세-가지-개념">데이터 모델링의 중요한 세 가지 개념</h2>
<blockquote>
<ul>
<li><h3 id="업무가-관여하는-어떤-것">업무가 관여하는 어떤 것</h3>
사물이나 사건 등을 바라볼 때 전체를 지칭하는 용어
엔터티 = 집합 
인스턴스 = 단수<br></li>
<li><h3 id="어떤-것이-가지는-성격">어떤 것이 가지는 성격</h3>
어떤 것이 가지는 세부적인 사항<br></li>
<li><h3 id="업무가-관여하는-어떤-것-간의-관계">업무가 관여하는 어떤 것 간의 관계</h3>
어떤 것이 다른 어떤 것과 가지는 연관성<br></li>
</ul>
</blockquote>
<h2 id="데이터-모델링의-이해관계자">데이터 모델링의 이해관계자</h2>
<blockquote>
<ul>
<li>데이터 모델링은 단순히 데이터베이스를 설계한다는 측면보다 업무를 이해, 분석, 표현하는 등 다양한 과정을 포함하며, 잘못된 데이터베이스 설계는 모든 트랜잭션에 영향을 미치기 때문에 이해관계자가 중요함<br>
</li>
</ul>
</blockquote>
<ul>
<li>정보시스템을 구축하는 모든 사람, 즉 IT기술자는 모두 데이터 모델링을 알아야 하며 정보화를 추진하는 위치에 있는 사람도 어느정도 파악하고 있어야 함<br></li>
<li>이해관계자가 잘 배정되어 있으면 좋은 의사소통과 잘못된 업무 해석으로 인한 위험을 감소시킬 수 있음<br></li>
<li>DBA, 프로젝트 개발자, 전문 모델러, 현업 업무 전문가 등</li>
</ul>
<h2 id="데이터-모델의-표기법-erd">데이터 모델의 표기법 ERD</h2>
<blockquote>
<ul>
<li>각 업무분석에서 도출된 엔터티와 엔터티간의 관계를 이해하기 쉽게 도식화된 다이어그램으로 표시하는 방법<br>
</li>
</ul>
</blockquote>
<ul>
<li>업무에서 데이터의 흐름과 프로세스와의 연관성을 이야기하는 데 가장 중요한 표기법이자 산출물 <br></li>
<li>일정한 규칙으로  그림으로써 데이터 모델을 누구나 공통된 시각으로 파악하고 의사소통을 원활하게 하는 장점<br></li>
<li>첸 표기법에서 엔터티는 사각형, 관계는 마름모, 속성은 타원형으로 표시</li>
</ul>
<h2 id="erd-작성-작업-순서">ERD 작성 작업 순서</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/90870705-6a71-400c-9f32-4766239b912a/image.png" alt=""></p>
</blockquote>
<ul>
<li><h3 id="엔터티-그리기-및-배치">엔터티 그리기 및 배치</h3>
가장 중요한 엔터티를 왼쪽상단에 배치
왼쪽 상단을 중심으로 다른 엔터티를 나열하며 사람의 눈이 따라가기 편하도록 작성
업무 흐름에 중심이 되는 엔터티는 타 엔터티와 많은 관계를 가지고 있기에 중앙에 배치
업무를 진행하는 중심엔터티와 관계를 갖는 엔터티들은 중심에 배치된 엔터티 주위에 배치<br></li>
<li><h3 id="엔터티-간의-관계-설정">엔터티 간의 관계 설정</h3>
초기에는 모두 Primaty key로 속성이 상속되는 식별자 관계를 설정
중복되는 관계가 발생하지 않도록 하고 Cicle 관계도 발생하지 않도록 유의
대부분의 관계는 엔터티의 성질과 주식별자를 보고 유추가 가능<br></li>
<li><h3 id="관계명-기술">관계명 기술</h3>
관계설정이 완료되면 연결된 관계에 관계이름을 부여
현재형을 사용하고 지나치게 포괄적인 용어(이다, 가진다 등)는 미사용<br></li>
<li><h3 id="관계의-참여도-기술">관계의 참여도 기술</h3>
관계가 참여하는 성격 중 엔터티내에 인스턴스들이 얼마나 관계에 참여하는지를 나타내는 관계차수를 표현
하나의 관계는 IE에서 실선, Barker에서는 점선과 실선을 혼합<br></li>
<li><h3 id="관계의-필수여부-기술">관계의 필수여부 기술</h3>
다수참여는 까마귀발, 관계의 필수/선택은 관계선에 원을 표현<br><img src="https://velog.velcdn.com/images/myoungchae0_0/post/a7bea3a3-6162-417f-8750-7b94a900d2e3/image.png" alt=""></li>
</ul>
<h2 id="좋은-데이터-모델의-요소">좋은 데이터 모델의 요소</h2>
<blockquote>
</blockquote>
<ul>
<li><h3 id="완전성">완전성</h3>
업무에서 필요로 하는 모든 데이터가 데이터 모델에 정의되어 있어야 함
데이터 모델 검증에서 가장 먼저 확인해야 할 부분이며, 미충족 시 다른 평가 기준도 의미가 없음<br></li>
<li><h3 id="중복배제">중복배제</h3>
하나의 데이터베이스 내에 동일한 사실은 반드시 한 번만 기록
데이터 중복 관리는 바람직하지 않은 형태의 데이터 관리비용을 지불<br></li>
<li><h3 id="업무규칙">업무규칙</h3>
데이터 모델링 과정에서 도출, 규명되는 많은 업무규칙을 데이터 모델에 표현하고 사용자가 공유할 수 있도록 제공
이를 통해 모든 사용자가 해당 규칙에 대해서 동일한 판단을 하고 데이터를 조작 가능<br></li>
<li><h3 id="데이터-재사용">데이터 재사용</h3>
재사용성을 향상시키고자 한다면 데이터의 통합성과 독립성에 충분히 고려해야 함
통합 모델이어야만 데이터 재사용성을 향상시킬 수 있음
데이터가 애플리케이션에 대해 독립적으로 설계되어야만 데이터 재사용성을 향상시킬 수 있음
구축하는 데이터 모델은 외부의 업무 환경 변화에 유연하게 대응할 수 있어야 함
잘 정돈된 방법으로 테이터를 통합하여 데이터의 집합을 정의, 이를 데이터 모델로 잘 표현하여 활용하면 웬만한 업무 변화에도 데이터모델이 영향을 받지 않고 운용 가능<br></li>
<li><h3 id="의사소통">의사소통</h3>
데이터 모델은 정보시스템을 운용, 관리하는 많은 관련자들이 설계자가 정의한 업무 규칙들을 동일한 의미로 받아들이고 정보시스템을 활용하게 하는 역할, 즉 의사소통의 도구로서 활용<br></li>
<li><h3 id="통합성">통합성</h3>
바람직한 데이터 구조의 형태는 동일한 데이터를 조직 전체에서 한 번만 정의하고 여러 영역에서 참조, 활용하는 것
동일한 성격의 데이터를 한 번만 정의하기 위해서는 공유 데이터에 대한 구조를 여러 업무 영역에서 공동으로 사용하기 용이하게 정의할 수 있어야 함</li>
</ul>
<h2 id="문제-6">문제</h2>
<blockquote>
<h3 id="다음-중-고객과-주문의-erd에-대한-설명으로-가장-부적절한-것은br">다음 중 고객과 주문의 ERD에 대한 설명으로 가장 부적절한 것은?<br></h3>
<p>사진&gt;
① 한 명의 고객은 여러 개의 제품을 주문 할 수 있다. 주문은 할 수도 있고 안 할수도 있다.
② 하나의 주문은 반드시 한 명의 고객에 의해 주문된다.
③ 주문에 데이터를 입력할 때는 반드시 고객데이터가 존재해야 한다.
④ 고객에 데이터를 입력할 때는 주문데이터가 존재하는 고객만을 입력할 수 있다.<br>
정답 : ④<br>
부모 엔터티에 데이터가 입력될 떄 자식 엔터티에 해당 값이 존재하는지의 여부와 상관없이 입력될 수 있는 구조로 표현이 되어있기 때문에, 고객 엔터티에 새로운 고객번호 데이터를 입력하는 것은 주문 엔터티에ㅐ 해당 고객번호가 존재하고 있는지의 여부와 상관없이 가능하다.</p>
</blockquote>
<h2 id="문제-7">문제</h2>
<blockquote>
</blockquote>
<h3 id="다음-중-erd에-대한-설명으로-가장-부적절-한것은br">다음 중 ERD에 대한 설명으로 가장 부적절 한것은?<br></h3>
<p>① 1976년 피터 첸(Peter Chen)에 의해 Entity-Relationship Model(E-R Model)이라는 표기법이 만들어졌다. 
② 일반적으로 ERD를 작성하는 방법은 엔터티 도출 -&gt; 엔터티 배치 -&gt; 관계 설정 -&gt; 관계명 기술의 흐름으로 작업을 진행한다.
③ 관계의 명칭은 관계 표현에 있어서 매우 중요한 부분에 해당한다.
④ 가장 중요한 엔터티를 오른쪽 상단에 배치하고 추가 발생되는 엔터티들을 왼쪽 편과 하단에 배치하는 것이 원칙이다. <br>
정답 : ④<br>
엔터티를 어디에 배치하는가에 대한 문제는 필수사항은 아니지만 데이터 모델링 툴 사용 여부와 상관없이 데이터 모델의 가독성 측면에서 중요한 문제이다. 일반적으로 사람의 눈은 왼쪽에서 오른쪽, 위쪽에서 아래쪽으로 이동하는 경향이 있기 때문에, 데이터 모델링에서도 가장 중요한 엔터티를 왼쪽 상단에 배치하고, 이것을 중심으로 다른 엔터티를 나열하면서 전개하면 사람의 눈이 따라가기에 편리한 데이터 모델을 작성할 수 있다. 해당 업무에서 가장 중요한 엔터티는 왼쪽 상단에서 조금 아래쪽 중앙에 배치하여 전체 엔터티와 어울릴 수 있도록 하면 향후 관련 엔터티와 관계선을 연결할 때 선이 꼬이지 않고 효과적으로 배치할 수 있게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[내손안에 새싹 코드 수정 작업]]></title>
            <link>https://velog.io/@myoungchae0_0/%EB%82%B4%EC%86%90%EC%95%88%EC%9D%98-%EC%83%88%EC%8B%B9App</link>
            <guid>https://velog.io/@myoungchae0_0/%EB%82%B4%EC%86%90%EC%95%88%EC%9D%98-%EC%83%88%EC%8B%B9App</guid>
            <pubDate>Tue, 07 Feb 2023 17:50:18 GMT</pubDate>
            <description><![CDATA[<h1 id="프로젝트명--내손안의-새싹app">프로젝트명 : 내손안의 새싹(App)</h1>
<blockquote>
<p>프로젝트 기간이 한 달 정도밖에 주어지지 않아 시간이 부족하였기 때문에 손봐야 할 부분들이 많다고 생각하여 수정하는 작업을 진행하였다.</p>
</blockquote>
<h2 id="앱-실행화면">앱 실행화면</h2>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/417dac99-3b92-425e-a379-094ec4f411da/image.png" alt=""></p>
<h2 id="activity_splashxml">Activity_Splash.xml</h2>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    tools:context=&quot;.SplashActivity&quot;
    android:background=&quot;#212025&quot;&gt;
    &lt;ImageView
        android:id=&quot;@+id/project_icon&quot;
        android:layout_width=&quot;150dp&quot;
        android:layout_height=&quot;150dp&quot;
        android:layout_centerInParent=&quot;true&quot;
        android:src=&quot;@drawable/plant&quot; /&gt;
    &lt;TextView
        android:layout_marginTop=&quot;16dp&quot;
        android:textColor=&quot;#43B05C&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_below=&quot;@+id/project_icon&quot;
        android:layout_centerInParent=&quot;true&quot;
        android:text=&quot;Loding&quot;
        android:textSize=&quot;24sp&quot;/&gt;
&lt;/RelativeLayout&gt;</code></pre><h2 id="splashactivityjava">SplashActivity.java</h2>
<pre><code class="language-java">package com.example.test000111;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class SplashActivity extends AppCompatActivity {

    private FirebaseAuth firebaseAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        firebaseAuth = FirebaseAuth.getInstance();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                checkUser();
            }
        },2000);

    }

    private void checkUser() {

        FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();

        if(firebaseUser == null) {
            startActivity(new Intent(SplashActivity.this, MainActivity.class));
            finish();

        } else {
            DatabaseReference ref = FirebaseDatabase.getInstance().getReference(&quot;Users&quot;);
            ref.child(firebaseUser.getUid())
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            String userType = &quot;&quot;+snapshot.child(&quot;userType&quot;).getValue();
                            if (userType.equals(&quot;user&quot;)){
                                startActivity(new Intent(SplashActivity.this,Test1.class));
                                finish();
                            } else if (userType.equals(&quot;admin&quot;)) {
                                startActivity(new Intent(SplashActivity.this,Test1.class));
                                finish();
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                    });

        }
    }
}</code></pre>
<h2 id="splashactivityjava-수정">SplashActivity.java 수정</h2>
<p>SplashActivity에서는 다른 기능은 필요 없고 SplashActivity에서 MainActivity에서 화면전환만 하면 되기 때문에 FirebaseAuth와 CheckUser로 사용자가 User인지 Admin인지 확인할 필요가 없다. 그래서 SplashActivity에서 딜레이를 주고 바로 MainActivity로 넘어가도록 수정하였다.</p>
<pre><code class="language-java">package com.example.test000111;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;


public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
            }
        }, 2000);
    }
}</code></pre>
<h2 id="메인-화면">메인 화면</h2>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/a14212ca-290d-426e-b245-97d51c136204/image.png" alt=""></p>
<h2 id="mainactivityxml">MainActivity.xml</h2>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:background=&quot;#212025&quot;
    android:padding=&quot;20dp&quot;
    tools:context=&quot;.MainActivity&quot;&gt;

    &lt;ImageView
        android:id=&quot;@+id/project_icon&quot;
        android:layout_width=&quot;130dp&quot;
        android:layout_height=&quot;130dp&quot;
        android:layout_centerHorizontal=&quot;true&quot;
        android:layout_marginTop=&quot;15dp&quot;
        android:src=&quot;@drawable/plant&quot; /&gt;

    &lt;TextView
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_below=&quot;@+id/project_icon&quot;
        android:layout_centerInParent=&quot;true&quot;
        android:layout_marginTop=&quot;16dp&quot;
        android:text=&quot;Wlcome to app&quot;
        android:textColor=&quot;@color/white&quot;
        android:textSize=&quot;24sp&quot;/&gt;

    &lt;Button
        android:id=&quot;@+id/login_Btn&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;35dp&quot;
        android:layout_above=&quot;@id/skip_Btn&quot;
        android:background=&quot;@drawable/button_bg&quot;
        android:text=&quot;  Login&quot;
        android:gravity=&quot;left&quot;
        android:textSize=&quot;18dp&quot;
        android:textColor=&quot;@color/white&quot; /&gt;

    &lt;Button
        android:id=&quot;@+id/skip_Btn&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;35dp&quot;
        android:layout_alignParentBottom=&quot;true&quot;
        android:layout_marginTop=&quot;10dp&quot;
        android:gravity=&quot;left&quot;
        android:layout_marginBottom=&quot;15dp&quot;
        android:textSize=&quot;15dp&quot;
        android:background=&quot;@drawable/button_bg_2&quot;
        android:text=&quot;  Continue without login&quot;
        android:textColor=&quot;@color/white&quot; /&gt;

&lt;/RelativeLayout&gt;</code></pre><h2 id="mainactivityjava">MainActivity.java</h2>
<pre><code class="language-java">package com.example.test000111;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import com.example.test000111.R;
import com.example.test000111.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,LoginActivity.class));
            }
        });

        binding.skipBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,Test1.class));
            }
        });

    }
}</code></pre>
<h2 id="mainactivityxml-수정">MainActivity.xml 수정</h2>
<p>화분을 산 사람만 앱을 사용할 수 있도록 만들어 앱은 무료이나 화분에서 수익을 얻을 수 있도록 계획하였다. 따라서 로그인 없이도 들어갈 수 있는 버튼보다는 회원가입 버튼을 만들어 회원가입으로 넘어갈 수 있도록 수정 하였다.</p>
<pre><code></code></pre><h2 id="mainactivityjava-수정">MainActivity.java 수정</h2>
<pre><code class="language-java"></code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[HuStar ICT 6기-수정중]]></title>
            <link>https://velog.io/@myoungchae0_0/HuStar-ICT-6%EA%B8%B0</link>
            <guid>https://velog.io/@myoungchae0_0/HuStar-ICT-6%EA%B8%B0</guid>
            <pubDate>Mon, 06 Feb 2023 18:36:19 GMT</pubDate>
            <description><![CDATA[<h1 id="hustar-대경혁신인재양성프로젝트">HuStar 대경혁신인재양성프로젝트</h1>
<blockquote>
<p>대구·경북의 미래 신산업을 이끌어 갈 혁신인재(Human Star) 양성 프로젝트!
HuStar 대경혁신인재양성프로젝트는 전국 최초로 지자체 주도로 기업이 원하는 혁신인재를 함께 키우고, 취업을 지원하여 지역이 함께 성장하기 위한 사업입니다.
대구시와 경상북도, 지역기업, 대학·연구기관이 함께 혁신인재를 키우고, 함께 성장하며, 함께 미래를 만들어가는 프로젝트 입니다.</p>
</blockquote>
<h1 id="진행기간">진행기간</h1>
<blockquote>
</blockquote>
<p> 2022년 8월 말 ~ 2023년 1월 말</p>
<h1 id="일정">일정</h1>
<h3 id="8월">8월</h3>
<ul>
<li>프리스쿨 (프로그래밍 기초문법)<h3 id="9월">9월</h3>
</li>
<li>인공지능, 머신러닝&amp;딥러닝 이해</li>
<li>Jetson Nano 활용 인공지능 모델 실습</li>
<li>인공지능 플랫폼 활용 프로젝트<h3 id="10월">10월</h3>
</li>
<li>안드로이드 및 자바 프로그래밍</li>
<li>다양한 데이터 활용 앱 화면 구현<h3 id="11월">11월</h3>
</li>
<li>데이터베이스 기획 및 구현</li>
<li>JSP / 스프링 프로그래밍이해</li>
<li>전자정부 프레임워크 실무</li>
<li>Web프로젝트 기획 및 구현<h3 id="12월">12월</h3>
</li>
<li>App, Web을 이용한 프로젝트 기획 및 구현<h3 id="1월">1월</h3>
</li>
<li>프로젝트 최종발표 및 수료</li>
</ul>
<h1 id="10월-첫-프로젝트">10월 첫 프로젝트</h1>
<blockquote>
</blockquote>
<h2 id="프로젝트명--내손안의-새싹app">프로젝트명 : 내손안의 새싹(App)</h2>
<h3 id="기술스택--android-studiojava-firebase">기술스택 : Android Studio(Java), Firebase</h3>
<ul>
<li>팀구성 : 하드웨어1명, 어플리케이션2명<br></li>
<li>역할 : 어플리케이션 구현 및 Firebase DB연동<br></li>
<li>프로젝트 설명
하드웨어로 화분 토양의 온도, 습도 빛의양 등을 체크하고 이것을 Wifi통신으로 DB에 전달한다.
어플에서는 회원의 화분 Serial Number 하위노드에 실시간으로 저장된 토양의 온도, 습도 빛의양 등의 DB를 받아서 보여준다.<br></li>
<li>상세역할<blockquote>
<blockquote>
<ul>
<li>회원가입 구현
Firebase Realtime과 FIrebase Auth를 이용해서 회원가입 구현
✅이메일 형식이 아닌데 회원가입을 누르면 Toast메세지 출력<br>
✅비밀번호,비밀번호 확인 비밀번호가 일치하지않으면 Toast메세지 출력<br></li>
<li>로그인 구현
✅Firebase Realtime과 FIrebase Auth를 이용해서 로그인 구현<br></li>
<li>Adapter를 이용한 화분관리, 등록, 삭제 ListView 구현
✅처음에는 아무것도없는데 등록하기 버튼을 누르면 등록한 화분 표시<br>
✅화분을 등록할때는 화분의 고유 Serial Number를 입력후 등록이가능<br>
✅정해진 Serial Number가 아닌 다른것을 입력했을 경우 Toast메세지 출력,이미 사용한 Serial Number를 다른 사람이 사용하는경우 이미 사용중인 Serial Number Toast메세지 출력 - Serial Number의 중복사용 방지(사전에 등록한 Serial Number하위 노드에 able, unable을 만들어 사용여부를 확인할 수 있도록 하였음)<br>
✅화분등록) 고객이 Serial Number 입력하여 화분 생성 -&gt; DB의 Serial Number하위노드에 able이 unable로 바뀜<br>
✅화분삭제) 고객이 화분을 삭제 -&gt;DB의 Serial Number 하위노드에 unable이 able로 바뀜<br>
✅화분 등록에 사진을 올렸을 경우 올린 사진이 반영되도록 Glide를 사용<br>
✅화분 등록에 성공하면 사진을 Firebase Storage에 사용자의 Uid폴더에 저장<br>
✅화분 등록에 입력한 정보들을 Firebase Realtime 사용자의 Uid하위 노드에 저장<br></li>
</ul>
</blockquote>
</blockquote>
</li>
<li>느낀점
Android Studio를 사용하여 처음 앱을 만들어 보았다. Java와 Kotlin이 있었는데 수업 시간에 Java를 사용하여서 Kotlin이 아닌 Java를 사용하여 앱 개발을 진행하였다.<br>
DB에 대한 이해가 부족하였고 DB를 사용한 프로젝트는 처음 하여 보았는데, 입문자에게는 Firebase가 사용하기 편하였다. 하지만 Firebase는 등록과 삭제 두 가지 기능밖에 없고 수정이 따로 되지 않아서 화분의 정보수정과, Serial Number를 등록하면 다른 사람이 중복된 Serial Number를 사용하여 화분등록을 하는 것을 막아주도록 Serial Number 값을 Able, Unable로 수정하는 부분에 있어서 시간을 오래 잡아먹게 되었고, 결국 내린 결론은 수정알고리즘을 삭제 후 등록으로 바꾸어 해결할 수 있었다.<br>
Google의 firebase는 어느 정도 용량을 초과하면 결제를 해야 하는데 테스트를 하다 보니 용량을 초과한 적이 있었다. 애플리케이션의 완성도도 중요하지만, 사용자의 관점에서 데이터를 많이 먹는 앱이라면 사용하지 않을 것이다.
또한 내가 소비자라면 이 앱을 사용할 것인지, 수익모델은 어떤 것이 있는지 이러한 부분도 개발을 할 때 고려하도록 해야겠다.<br>
액티비티 간에 화면전환에서 값을 서로 넘겨주어야 하는 상황이 있었는데 청처음에는 어떻게 그 값을 넘겨주어야 할지 막막하였다 그래서 다시 DB에 접근하여 그 값을 찾아서 빼오는 방식으로 생각하였는데 Intent를 통하여 DB접근없이 전 화면의 넘겨주어야 할 값을 넘겨줄 수 있어서 수월하게 진행 할 수 있었다.<br>
혼자 개발하는 것이 아닌, 팀원과 함께 개발하게 되는 경우 팀원과 소통을 많이 해야 한다는 것을 알았고, HuStar ICT 6기에서의 첫 프로젝트다 보니 처음 보는 사람들에게 나의 의견을 고집하는 것이 조금 조심스러워서 팀원의 의견에 묻혀가는 상황이 많이 있었다. 이러한 부분들과, 보여줄 수 있는 것들이 많았는데 시간이 부족하였던 부분들은 매우 아쉬웠다. Java보다 Kotlin이 더 장점들이 많다고 들었다. 이번 프로젝트를 따로 Kotlin으로 바꾸고, 기능들도 보완해 보아야겠다.<br></li>
<li>프로젝트 : <a href="https://velog.io/@myoungchae0_0/%EB%82%B4%EC%86%90%EC%95%88%EC%9D%98-%EC%83%88%EC%8B%B9App">https://velog.io/@myoungchae0_0/%EB%82%B4%EC%86%90%EC%95%88%EC%9D%98-%EC%83%88%EC%8B%B9App</a><br></li>
<li>수정전 Git주소 : <a href="https://github.com/Myoungchae/Smartplant">https://github.com/Myoungchae/Smartplant</a><br></li>
<li>수정후 Git주소 : <a href="https://github.com/Myoungchae/Smartplant---%EC%88%98%EC%A0%95%EC%A4%91">https://github.com/Myoungchae/Smartplant---수정중</a></li>
</ul>
<h1 id="11월-두번째-프로젝트">11월 두번째 프로젝트</h1>
<blockquote>
</blockquote>
<h2 id="프로젝트명--fort-web">프로젝트명 : ForT (Web)</h2>
<h3 id="기술스택--html-css-bootstrap">기술스택 : Html, Css, BootStrap</h3>
<ul>
<li>팀구성 : 웹4명</li>
<li>역할 : Html과 Css</li>
<li>상세역할 : 어플리케이션 구현 및 Firebase DB연동</li>
</ul>
<h1 id="12월-세번째-프로젝트">12월 세번째 프로젝트</h1>
<blockquote>
</blockquote>
<h2 id="골든타임app">골든타임(App)</h2>
<h3 id="기술스택--android-studio-firebase-mariadb-php">기술스택 : Android Studio, Firebase, MariaDB, PHP</h3>
<ul>
<li>팀구성 : 하드웨어1명, 어플리케이션2명, 웹1명</li>
<li>역할 : 어플리케이션 구현 및 Php Firebase DB연동</li>
<li>상세역할 : 어플리케이션 구현 및 Firebase DB연동</li>
<li>프로젝트 설명 : 골든타임 미아방지 앱은 놀이공원처럼 한정된 장소에서 아동을 잃어버렸을때 쉽게 찾을 수 있게 도와주는 어플입니다.사용자는 아이의 정보를 어플을 이용하여 NFC가 들어있는 목걸이에 등록합니다.아이를 잃어버렸을 경우, 어플에서 버튼을 누르면 아이의 위치값을 받아옵니다.</li>
</ul>
<h1 id="1월-세번째-프로젝트-최종발표-수료">1월 세번째 프로젝트 최종발표, 수료</h1>
<blockquote>
<h3 id="1월-20일-최종발표후-hustar-ict-6기-마무리🥳">1월 20일 최종발표후 HuStar ICT 6기 마무리!🥳</h3>
<p><img src="https://velog.velcdn.com/images/myoungchae0_0/post/26f2735c-24fc-4993-ab1b-a29100748823/image.jpg" alt="">
6개월이 참 긴 시간 같았으나 매달 프로젝트를 준비하고 발표하다보니 어느덧 수료를 앞두고 있다.
처음 HuStar를 시작하였을때는 지푸라기라도 잡는 심정으로 지원하였으나, 프로젝트를 하나씩 진행해 나가면서 막히는 부분들을 해결해 나가는것에 엄청난 성취감을 느꼈고, 진로의 방향을 찾았다!
비록 수료후에도 아직 취준생이지만 HuStar를 하면서 좋은사람들과 많은것들을 배우고 느꼈기때문에 HuStar ICT6기에 합격한것이 참 감사하다.<br>
수료후 Git에 저장된 프로젝트들은 Read.me를 만들어 프로젝트에 대한 설명을 만들고, 미흡한 부분들에 대해서는 다시한번 고쳐 업로드 하여야겠다.
Notion사용법을 익히고, 폴트폴리오를 만들어 깔끔하게 정리하여 취업준비를 하도록 해야겠다.</p>
</blockquote>
<h2 id="다들-멋진-개발자가-될때까지-화이팅🙂">다들 멋진 개발자가 될때까지 화이팅!🙂</h2>
]]></description>
        </item>
    </channel>
</rss>